]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - ld/testsuite/ld-mips-elf/mips16-pic-1.inc
Imported binutils-2.20
[msp430-binutils.git] / ld / testsuite / ld-mips-elf / mips16-pic-1.inc
diff --git a/ld/testsuite/ld-mips-elf/mips16-pic-1.inc b/ld/testsuite/ld-mips-elf/mips16-pic-1.inc
new file mode 100644 (file)
index 0000000..9268a07
--- /dev/null
@@ -0,0 +1,147 @@
+       # Declare a function called NAME and an __fn_NAME stub for it.
+       # Make the stub use la_TYPE to load the the target address into $2.
+       .macro  stub,name,type
+       .set    nomips16
+       .section .mips16.fn.\name, "ax", @progbits
+       .ent    __fn_\name
+__fn_\name:
+       la_\type \name
+       mfc1    $4,$f12
+       jr      $2
+       nop
+       .end    __fn_\name
+
+       .set    mips16
+       .text
+       .ent    \name
+\name:
+__fn_local_\name:
+       jr      $31
+       nop
+       .end    \name
+       .endm
+
+       # Like stub, but ensure NAME is a local symbol.
+       .macro  lstub,name,type
+       stub    \name, \type
+       .equ    local_\name,1
+       .endm
+
+       # Like stub, but ensure NAME is a hidden symbol.
+       .macro  hstub,name,type
+       .globl  \name
+       .hidden \name
+       stub    \name, \type
+       .endm
+
+       # Like lstub, but make the MIPS16 function global rather than local.
+       .macro  gstub,name,type
+       .globl  \name
+       stub    \name, \type
+       .endm
+
+       # Use an absolute sequence to load NAME into a register.
+       .macro  la_noshared,name
+       lui     $2,%hi(\name)
+       addiu   $2,$2,%lo(\name)
+       .endm
+
+       # Use the normal PIC sequence to load __fn_local_NAME into $2
+       # and emit a dummy relocation against NAME.  This macro is always
+       # used at the start of a function.
+       .macro  la_shared,name
+       .reloc  0,R_MIPS_NONE,\name
+       .cpload $25
+       la      $2,__fn_local_\name
+       .endm
+
+       # Use TYPE (either LSTUB, HSTUB or GSTUB) to define functions
+       # called a_NAME and b_NAME.  The former uses absolute accesses
+       # and the latter uses PIC accesses.
+       .macro  decl,name,type
+       \type   a_\name, noshared
+       \type   b_\name, shared
+       .endm
+
+       # Emit the MIPS16 PIC sequence for setting $28 from $25.
+       # Make the value of $25 available in $2 as well.
+       .macro  cpload_mips16
+       li      $2,%hi(_gp_disp)
+       addiu   $3,$pc,%lo(_gp_disp)
+       sll     $2,16
+       addu    $2,$2,$3
+       move    $28,$2
+       .endm
+
+       # Likewise, but for non-MIPS16 code.
+       .macro  cpload_nomips16
+       .cpload $25
+       move    $2,$28
+       .endm
+
+       # Start a PIC function in ISA mode MODE, which is either "mips16"
+       # or "nomips16".
+       .macro  pic_prologue,mode
+       cpload_\mode
+       addiu   $sp,$sp,-32
+       sw      $2,16($sp)
+       sw      $31,20($sp)
+       .endm
+
+       # Use a PIC function to call NAME.
+       .macro  pic_call,name,mode
+       .ifdef  local_\name
+       .ifc    \mode,mips16
+       lw      $2,%got(__fn_local_\name)($2)
+       addiu   $2,%lo(__fn_local_\name)
+       .else
+       lw      $2,%got(\name)($2)
+       addiu   $2,%lo(\name)
+       .endif
+       .else
+       lw      $2,%call16(\name)($2)
+       .endif
+       jalr    $2
+       move    $25,$2
+       lw      $2,16($sp)
+       move    $28,$2
+       .endm
+
+       # Finish a PIC function started by pic_prologue.
+       .macro  pic_epilogue
+       lw      $2,20($sp)
+       jr      $2
+       addiu   $sp,$sp,32
+       .endm
+
+       # Use PIC %call16 sequences to call a_NAME and b_NAME.
+       # MODE selects the ISA mode of the code: either "mips16"
+       # or "nomips16".
+       .macro  callpic,name,mode
+       .text
+       .set    \mode
+       .ent    callpic_\name\()_\mode
+callpic_\name\()_\mode:
+       pic_prologue \mode
+       pic_call     a_\name,\mode
+       pic_call     b_\name,\mode
+       pic_epilogue
+       .end    callpic_\name\()_\mode
+       .endm
+
+       # Use absolute jals to call a_NAME and b_NAME.  MODE selects the
+       # ISA mode of the code: either "mips16" or "nomips16".
+       .macro  jals,name,mode
+       .text
+       .set    \mode
+       .ent    jals_\name\()_\mode
+jals_\name\()_\mode:
+       .option pic0
+       jal     a_\name
+       nop
+
+       jal     b_\name
+       nop
+       .option pic2
+       .end    jals_\name\()_\mode
+       .endm