chiark / gitweb /
base/asm-common.h: Use new literal-pool stuff for ARM PIC macros.
[catacomb] / base / asm-common.h
index 0af9cb58fbf58d07659a157610837f3338a0d1e2..32c054301364decce6f7bf9090bd5c9cf128c7dc 100644 (file)
 ///--------------------------------------------------------------------------
 /// General definitions.
 
+// Some useful variables.
+       .L$_subsec = 0
+
+// Literal pools done the hard way.
+#define _LIT .text .L$_subsec + 1
+#define _ENDLIT .text .L$_subsec
+
 // Announcing an external function.
 #define FUNC(name)                                                     \
        .globl  F(name);                                                \
@@ -40,7 +47,9 @@ F(name):                                                              \
 #define _ENDFUNC(name)                                                 \
        .purgem ENDFUNC;                                                \
        SIZE_OBJ(name);                                                 \
-       ENDFUNC_HOOK(name)
+       ENDFUNC_HOOK(name);                                             \
+       .L$_subsec = .L$_subsec + 2;                                    \
+       .text .L$_subsec
 
 ///--------------------------------------------------------------------------
 /// ELF-specific hacking.
@@ -173,20 +182,31 @@ _where_am_i.\got :
 #define GOTREG r9
 
 // Maybe load GOT address into GOT.
-       .macro  ldgot   got=r9
+       .macro  ldgot   cond=, got=GOTREG
 #if WANT_PIC
-       ldr     \got, =_GLOBAL_OFFSET_TABLE_ - . - 12
-       add     \got, pc, \got
+       ldr\cond \got, .L$_ldgot$\@
+.L$_ldgot_pc$\@:
+       add\cond \got, pc, \got
+       _LIT
+       .balign 4
+.L$_ldgot$\@:
+       .word   _GLOBAL_OFFSET_TABLE_ - .L$_ldgot_pc$\@ - 8
+       _ENDLIT
 #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]
+       ldr\cond \reg, .L$_leaext$\@
+       ldr\cond \reg, [\got, \reg]
+       _LIT
+       .balign 4
+.L$_leaext$\@:
+       .word   \addr(GOT)
+       _ENDLIT
 #else
-       ldr     \reg, =\addr
+       ldr\cond \reg, =\addr
 #endif
        .endm