text: #ifndef _HEADERS_STABS_H
  #define _HEADERS_STABS_H
  
  /* These are some macros for handling of symboltable information
   */
  
  /* linker can use symbol b for symbol a if a is not defined */
  #define ALIAS(a,b) asm(".stabs \"_" #a "\",11,0,0,0;.stabs \"_" #b "\",1,0,0,0")
  
  /* add symbol a to list b (type c (22=text 24=data 26=bss)) */
  #define ADD2LIST(a,b,c) asm(".stabs \"_" #b "\"," #c ",0,0,_" #a )
  
  /* Install private constructors and destructors pri MUST be -127<=pri<=127 */
  #define ADD2INIT(a,pri) ADD2LIST(a,__INIT_LIST__,22); \
                          asm(".stabs \"___INIT_LIST__\",20,0,0," #pri "+128")
  #define ADD2EXIT(a,pri) ADD2LIST(a,__EXIT_LIST__,22); \
                          asm(".stabs \"___EXIT_LIST__\",20,0,0," #pri "+128")
  
  /* Add to library list */
  #define ADD2LIB(a) ADD2LIST(a,__LIB_LIST__,24)
  
  /* This one does not really handle symbol tables
   * it's just pointless to write a header file for one macro
   *
   * define a as a label for an absolute address b
   */
  #define ABSDEF(a,b) asm("_" #a "=" #b ";.globl _" #a )
  
  /* Generate assembler stub for a shared library entry
   * and add it to the jump table
   * ADDTABL_X(name,...)	means function with X arguments
   * ADDTABL_END()	ends the list
   * Usage: ADDTABL_2(AddHead,a0,a1);
   * No more than 4 arguments supported, use structures!
   */
   
  #define _ADDTABL_START(name)		\
  asm(".globl ___" #name);		\
  asm("___" #name ":\tmovel a4,sp@-")
  
  #define _ADDTABL_ARG(arg)		\
  asm("\tmovel " #arg ",sp@-")
  
  #define _ADDTABL_CALL(name)		\
  asm("\tmovel a6@(40:W),a4");		\
  asm("\tbsr _" #name)
  
  #define _ADDTABL_END0(name,numargs)	\
  asm("\tmovel sp@+,a4");			\
  asm("\trts");				\
  ADD2LIST(__##name,__FuncTable__,22)
  
  #define _ADDTABL_END2(name,numargs)	\
  asm("\taddqw #4*" #numargs ",sp");	\
  asm("\tmovel sp@+,a4");			\
  asm("\trts");				\
  ADD2LIST(__##name,__FuncTable__,22)
  
  #define _ADDTABL_ENDN(name,numargs)	\
  asm("\taddaw #4*" #numargs ",sp");	\
  asm("\tmovel sp@+,a4");			\
  asm("\trts");				\
  ADD2LIST(__##name,__FuncTable__,22)
  
  #define ADDTABL_0(name)			\
  _ADDTABL_START(name);			\
  _ADDTABL_CALL(name);			\
  _ADDTABL_END0(name,0)
  
  #define ADDTABL_1(name,arg1)		\
  _ADDTABL_START(name);			\
  _ADDTABL_ARG(arg1);			\
  _ADDTABL_CALL(name);			\
  _ADDTABL_END2(name,1)
  
  #define ADDTABL_2(name,arg1,arg2)	\
  _ADDTABL_START(name);			\
  _ADDTABL_ARG(arg2);			\
  _ADDTABL_ARG(arg1);			\
  _ADDTABL_CALL(name);			\
  _ADDTABL_END2(name,2)
  
  #define ADDTABL_3(name,arg1,arg2,arg3)	\
  _ADDTABL_START(name);			\
  _ADDTABL_ARG(arg3);			\
  _ADDTABL_ARG(arg2);			\
  _ADDTABL_ARG(arg1);			\
  _ADDTABL_CALL(name);			\
  _ADDTABL_ENDN(name,3)
  
  #define ADDTABL_4(name,arg1,arg2,arg3,arg4) \
  _ADDTABL_START(name);			\
  _ADDTABL_ARG(arg4);			\
  _ADDTABL_ARG(arg3);			\
  _ADDTABL_ARG(arg2);			\
  _ADDTABL_ARG(arg1);			\
  _ADDTABL_CALL(name);			\
  _ADDTABL_ENDN(name,4)
  
  #define ADDTABL_6(name,arg1,arg2,arg3,arg4,arg5,arg6) \
  _ADDTABL_START(name);			\
  _ADDTABL_ARG(arg6);			\
  _ADDTABL_ARG(arg5);			\
  _ADDTABL_ARG(arg4);			\
  _ADDTABL_ARG(arg3);			\
  _ADDTABL_ARG(arg2);			\
  _ADDTABL_ARG(arg1);			\
  _ADDTABL_CALL(name);			\
  _ADDTABL_ENDN(name,6)
  
  
  #define ADDTABL_END() asm(".stabs \"___FuncTable__\",20,0,0,-1")
  
  #endif /* _HEADERS_STABS_H */
  