.macro start, sym .type \sym, @function .pushsection .opd, "aw" \sym: .quad .L.\sym, .TOC.@tocbase, 0 .popsection .L.\sym: mflr 0 std 31, -8(1) std 0, 16(1) stdu 1, -128(1) mr 31, 1 .endm .macro end, sym addi 1,31,128 ld 0, 16(1) mtlr 0 ld 31, -8(1) blr .size \sym, . - .L.\sym .endm .macro forward, from, to start \from bl \to nop end \from .endm .macro usegot, sym .pushsection .data \sym\@: .quad \@ .popsection .pushsection .toc, "aw" .LT\@: .tc \sym\@[TC], \sym\@ .popsection ld 3,.LT\@@toc(2) .endm .macro in123 .pushsection .toc, "aw" .LThello: .tc hello[TC],hello .popsection .pushsection .rodata hello: .asciz "Hello, world!\n" .popsection .pushsection .text.in123, "axG", @progbits, in123, comdat .weak in123 start in123 ld 3, .LThello@toc(2) #bl printf nop end in123 .popsection .endm .macro in23 .pushsection .text forward local, in123 .popsection .pushsection .text.in23, "axG", @progbits, in23, comdat .weak in23 forward in23, local .popsection .endm .macro gobblegot, sym .pushsection .text .globl \sym start \sym .rept 5000 usegot a .endr end \sym .popsection .endm |