mirror of https://github.com/diegocr/libnix.git
134 lines
3.6 KiB
C
134 lines
3.6 KiB
C
#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")
|
|
|
|
#define CTOR_P -4
|
|
|
|
#if __GNUC__ >= 3
|
|
#define CONSTRUCTOR_P( function, Pri ) \
|
|
static void function ( void ) \
|
|
__attribute__((used)); \
|
|
ADD2INIT( function, Pri ); \
|
|
static void function ( void )
|
|
|
|
#define DESTRUCTOR_P( function, Pri ) \
|
|
static void function ( void ) \
|
|
__attribute__((used)); \
|
|
ADD2EXIT( function, Pri ); \
|
|
static void function ( void )
|
|
#else
|
|
#define CONSTRUCTOR_P( function, Pri ) \
|
|
void __nCTOR_##function ( void ); \
|
|
ADD2INIT(__nCTOR_##function, Pri ); \
|
|
void __nCTOR_##function ( void )
|
|
|
|
#define DESTRUCTOR_P( function, Pri ) \
|
|
void __nDTOR_##function ( void ); \
|
|
ADD2EXIT(__nDTOR_##function, Pri ); \
|
|
void __nDTOR_##function ( void )
|
|
#endif
|
|
|
|
#define CONSTRUCTOR(func) \
|
|
CONSTRUCTOR_P(func,-4)
|
|
#define DESTRUCTOR(func) \
|
|
DESTRUCTOR_P(func,-4)
|
|
|
|
/* 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_END() asm(".stabs \"___FuncTable__\",20,0,0,-1")
|
|
|
|
#endif /* _HEADERS_STABS_H */
|