Add support machinery for ARM hosts.
[catacomb] / base / asm-common.h
index 8745ea4..0af9cb5 100644 (file)
@@ -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.