X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/a02a22d4b55d233ada2e030a44065f464b79f137..61bd904b61ef893246791746517ef7a38ed732db:/base/asm-common.h diff --git a/base/asm-common.h b/base/asm-common.h index 8745ea43..0af9cb58 100644 --- a/base/asm-common.h +++ b/base/asm-common.h @@ -149,6 +149,50 @@ _where_am_i.\got : #endif ///-------------------------------------------------------------------------- +/// ARM-specific hacking. + +#if CPUFAM_ARM + +// Set the function hooks. +#define FUNC_PREHOOK(_) .balign 4 +#define ENDFUNC_HOOK(name) .ltorg + +// Call external subroutine at ADDR, possibly via PLT. + .macro callext addr, cond= +#if WANT_PIC + bl\cond \addr(PLT) +#else + bl\cond \addr +#endif + .endm + +// Do I need to arrange a spare GOT register? +#if WANT_PIC +# define NEED_GOT 1 +#endif +#define GOTREG r9 + +// Maybe load GOT address into GOT. + .macro ldgot got=r9 +#if WANT_PIC + ldr \got, =_GLOBAL_OFFSET_TABLE_ - . - 12 + add \got, pc, \got +#endif + .endm + +// Load address of external symbol ADDR into REG, maybe using GOT. + .macro leaext reg, addr, cond=, got=GOTREG +#if WANT_PIC + ldr \reg, =\addr(GOT) + ldr \reg, [\got, \reg] +#else + ldr \reg, =\addr +#endif + .endm + +#endif + +///-------------------------------------------------------------------------- /// Final stuff. // Default values for the various hooks.