MIPS/BFD: Handle branches in PLT compression selection
authorMaciej W. Rozycki <macro@imgtec.com>
Tue, 26 Jul 2016 16:45:00 +0000 (17:45 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Tue, 26 Jul 2016 19:00:48 +0000 (20:00 +0100)
Complement:

commit 1bbce132647e6d72aaa065cce5c1d5dd6585c2b2
Author: Maciej W. Rozycki <macro@linux-mips.org>
Date:   Mon Jun 24 23:55:46 2013 +0000

<https://sourceware.org/ml/binutils/2013-06/msg00077.html>, ("MIPS:
Compressed PLT/stubs support"), and also choose between regular and
compressed PLT entries as appropriate for any branches referring.

bfd/
* elfxx-mips.c (mips_elf_calculate_relocation): Handle branches
in PLT compression selection.
(_bfd_mips_elf_check_relocs): Likewise.

ld/
* testsuite/ld-mips-elf/compressed-plt-1.s: Add branch support.
* testsuite/ld-mips-elf/compressed-plt-1a.s: Likewise.
* testsuite/ld-mips-elf/compressed-plt-1b.s: Likewise.
* testsuite/ld-mips-elf/compressed-plt-1-o32-branch.od: New
test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-branch.rd: New
test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.od:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.rd:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.od:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.rd:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.od:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.rd:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.od:
New test.
* testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.rd:
New test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.

17 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
ld/ChangeLog
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-branch.od [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-branch.rd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.od [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.rd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.od [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.rd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.od [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.rd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.od [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.rd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/compressed-plt-1.s
ld/testsuite/ld-mips-elf/compressed-plt-1a.s
ld/testsuite/ld-mips-elf/compressed-plt-1b.s
ld/testsuite/ld-mips-elf/mips-elf.exp

index ab92c6ca4d4573ae8e32e8aa90c3a91a88bd8740..077917801b1c4fc143b164d0c4ea20180b1d22c1 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-26  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * elfxx-mips.c (mips_elf_calculate_relocation): Handle branches
+       in PLT compression selection.
+       (_bfd_mips_elf_check_relocs): Likewise.
+
 2016-07-22  Cupertino Miranda  <cmiranda@synopsys.com>
 
        * arc-got.h (relocate_fix_got_relocs_for_got_info): Handle the
index 5dcbcf99b8b4342747e708d7bdf599ba06e32293..cdc5d962897c48c31703c6908c32d1a0e2d34a6e 100644 (file)
@@ -5585,7 +5585,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
      case the symbol will have been set by mips_elf_set_plt_sym_value
      to point to the standard PLT entry, so redirect to the compressed
      one.  */
-  else if ((r_type == R_MIPS16_26 || r_type == R_MICROMIPS_26_S1)
+  else if ((mips16_branch_reloc_p (r_type)
+           || micromips_branch_reloc_p (r_type))
           && !bfd_link_relocatable (info)
           && h != NULL
           && h->use_plt_entry
@@ -8795,7 +8796,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
          a PLT entry is not created because the symbol is satisfied
          locally.  */
       if (h != NULL
-         && jal_reloc_p (r_type)
+         && (branch_reloc_p (r_type)
+             || mips16_branch_reloc_p (r_type)
+             || micromips_branch_reloc_p (r_type))
          && !SYMBOL_CALLS_LOCAL (info, h))
        {
          if (h->plt.plist == NULL)
@@ -8803,7 +8806,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
          if (h->plt.plist == NULL)
            return FALSE;
 
-         if (r_type == R_MIPS_26)
+         if (branch_reloc_p (r_type))
            h->plt.plist->need_mips = TRUE;
          else
            h->plt.plist->need_comp = TRUE;
index e0e9d32cb518b8607522ee6f22cae54bc908458c..5765509749313985f1c58888280416033b20b971 100644 (file)
@@ -1,3 +1,30 @@
+2016-07-26  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/ld-mips-elf/compressed-plt-1.s: Add branch support.
+       * testsuite/ld-mips-elf/compressed-plt-1a.s: Likewise.
+       * testsuite/ld-mips-elf/compressed-plt-1b.s: Likewise.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-branch.od: New
+       test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-branch.rd: New
+       test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.od:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.rd:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.od:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.rd:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.od:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.rd:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.od:
+       New test.
+       * testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.rd:
+       New test.
+       * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
+
 2016-07-26  Igor Kudrin  <ikudrin@accesssoftek.com>
 
        * ldbuildid.c: Changes for MinGW32:
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-branch.od b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-branch.od
new file mode 100644 (file)
index 0000000..d88dbcc
--- /dev/null
@@ -0,0 +1,30 @@
+
+.* file format .*
+
+
+Disassembly of section \.plt:
+
+10100000 <_PROCEDURE_LINKAGE_TABLE_>:
+.*:    3c1c1020        lui     \$28,0x1020
+.*:    8f990000        lw      \$25,0\(\$28\)
+.*:    279c0000        addiu   \$28,\$28,0
+.*:    031cc023        subu    \$24,\$24,\$28
+.*:    03e07825        move    \$15,\$31
+.*:    0018c082        srl     \$24,\$24,0x2
+.*:    0320f809        jalr    \$25
+.*:    2718fffe        addiu   \$24,\$24,-2
+
+10100020 <f_bu@plt>:
+.*:    3c0f1020        lui     \$15,0x1020
+.*:    8df90008        lw      \$25,8\(\$15\)
+.*:    03200008        jr      \$25
+.*:    25f80008        addiu   \$24,\$15,8
+
+Disassembly of section \.text\.b:
+
+10101000 <testu>:
+.*:    0411fc07        bal     10100020 <f_bu@plt>
+.*:    00000000        nop
+.*:    1000fc05        b       10100020 <f_bu@plt>
+.*:    00000000        nop
+.*:    03e00008        jr      \$31
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-branch.rd b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-branch.rd
new file mode 100644 (file)
index 0000000..372db52
--- /dev/null
@@ -0,0 +1,44 @@
+
+Dynamic section .*
+#...
+ 0x00000003 \(PLTGOT\)                     0x10201000
+#...
+ 0x70000013 \(MIPS_GOTSYM\)                0x4
+ 0x00000014 \(PLTREL\)                     REL
+ 0x00000017 \(JMPREL\)                     0x10004000
+ 0x00000002 \(PLTRELSZ\)                   8 \(bytes\)
+ 0x70000032 \(MIPS_PLTGOT\)                0x10200000
+#...
+Relocation section '\.rel\.plt' .*
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+10200008  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bu
+
+Symbol table '\.dynsym' .*
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+#...
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bu
+
+Symbol table '\.symtab' .*
+#...
+Primary GOT:
+ Canonical gp value: 10208ff0
+
+ Reserved entries:
+   Address     Access  Initial Purpose
+  10201000 -32752\(gp\) 00000000 Lazy resolver
+  10201004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
+
+
+PLT GOT:
+
+ Reserved entries:
+   Address  Initial Purpose
+  10200000 00000000 PLT lazy resolver
+  10200004 00000000 Module pointer
+
+ Entries:
+   Address  Initial Sym\.Val\. Type    Ndx Name
+  10200008 10100000 00000000 FUNC    UND f_bu
+
+
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.od b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.od
new file mode 100644 (file)
index 0000000..f195b93
--- /dev/null
@@ -0,0 +1,69 @@
+
+.* file format .*
+
+
+Disassembly of section \.plt:
+
+# Only _bc (branch from compressed code) functions should have a
+# MIPS16 PLT.
+10100000 <_PROCEDURE_LINKAGE_TABLE_>:
+.*:    3c1c1020        lui     \$28,0x1020
+.*:    8f990000        lw      \$25,0\(\$28\)
+.*:    279c0000        addiu   \$28,\$28,0
+.*:    031cc023        subu    \$24,\$24,\$28
+.*:    03e07825        move    \$15,\$31
+.*:    0018c082        srl     \$24,\$24,0x2
+.*:    0320f809        jalr    \$25
+.*:    2718fffe        addiu   \$24,\$24,-2
+
+10100020 <f_bu_bc@plt>:
+.*:    3c0f1020        lui     \$15,0x1020
+.*:    8df90008        lw      \$25,8\(\$15\)
+.*:    03200008        jr      \$25
+.*:    25f80008        addiu   \$24,\$15,8
+
+10100030 <f_bu@plt>:
+.*:    3c0f1020        lui     \$15,0x1020
+.*:    8df9000c        lw      \$25,12\(\$15\)
+.*:    03200008        jr      \$25
+.*:    25f8000c        addiu   \$24,\$15,12
+
+10100040 <f_bu_bc@mips16plt>:
+.*:    b203            lw      \$2,1010004c <f_bu_bc@mips16plt\+0xc>
+.*:    9a60            lw      \$3,0\(\$2\)
+.*:    651a            move    \$24,\$2
+.*:    eb00            jr      \$3
+.*:    653b            move    \$25,\$3
+.*:    6500            nop
+.*:    .... ....       \.word  0x10200008
+
+10100050 <f_bc@mips16plt>:
+.*:    b203            lw      \$2,1010005c <f_bc@mips16plt\+0xc>
+.*:    9a60            lw      \$3,0\(\$2\)
+.*:    651a            move    \$24,\$2
+.*:    eb00            jr      \$3
+.*:    653b            move    \$25,\$3
+.*:    6500            nop
+.*:    .... ....       \.word  0x10200010
+
+Disassembly of section \.text\.a:
+
+10101000 <testc>:
+.*:    f03f 1006       b       10100050 <f_bc@mips16plt>
+.*:    6500            nop
+.*:    f01f 101b       b       10100040 <f_bu_bc@mips16plt>
+.*:    6500            nop
+.*:    e820            jr      \$31
+
+Disassembly of section \.text\.b:
+
+10102000 <testu>:
+.*:    0411f80b        bal     10100030 <f_bu@plt>
+.*:    00000000        nop
+.*:    1000f809        b       10100030 <f_bu@plt>
+.*:    00000000        nop
+.*:    0411f803        bal     10100020 <f_bu_bc@plt>
+.*:    00000000        nop
+.*:    1000f801        b       10100020 <f_bu_bc@plt>
+.*:    00000000        nop
+.*:    03e00008        jr      \$31
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.rd b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-branch.rd
new file mode 100644 (file)
index 0000000..86cc3c8
--- /dev/null
@@ -0,0 +1,49 @@
+
+Dynamic section .*
+#...
+ 0x00000003 \(PLTGOT\)                     0x10201000
+#...
+ 0x70000013 \(MIPS_GOTSYM\)                0x6
+ 0x00000014 \(PLTREL\)                     REL
+ 0x00000017 \(JMPREL\)                     0x10004000
+ 0x00000002 \(PLTRELSZ\)                   24 \(bytes\)
+ 0x70000032 \(MIPS_PLTGOT\)                0x10200000
+#...
+Relocation section '\.rel\.plt' .*
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+10200008  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bu_bc
+1020000c  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bu
+10200010  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bc
+
+Symbol table '\.dynsym' .*
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+#...
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bu_bc
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bu
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bc
+
+Symbol table '\.symtab' .*
+#...
+Primary GOT:
+ Canonical gp value: 10208ff0
+
+ Reserved entries:
+   Address     Access  Initial Purpose
+  10201000 -32752\(gp\) 00000000 Lazy resolver
+  10201004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
+
+
+PLT GOT:
+
+ Reserved entries:
+   Address  Initial Purpose
+  10200000 00000000 PLT lazy resolver
+  10200004 00000000 Module pointer
+
+ Entries:
+   Address  Initial Sym\.Val\. Type    Ndx Name
+  10200008 10100000 00000000 FUNC    UND f_bu_bc
+  1020000c 10100000 00000000 FUNC    UND f_bu
+  10200010 10100000 00000000 FUNC    UND f_bc
+
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.od b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.od
new file mode 100644 (file)
index 0000000..4022a19
--- /dev/null
@@ -0,0 +1,32 @@
+
+.* file format .*
+
+
+Disassembly of section \.plt:
+
+# Direct branches must have a MIPS16 PLT.
+10100000 <_PROCEDURE_LINKAGE_TABLE_>:
+.*:    3c1c1020        lui     \$28,0x1020
+.*:    8f990000        lw      \$25,0\(\$28\)
+.*:    279c0000        addiu   \$28,\$28,0
+.*:    031cc023        subu    \$24,\$24,\$28
+.*:    03e07825        move    \$15,\$31
+.*:    0018c082        srl     \$24,\$24,0x2
+.*:    0320f809        jalr    \$25
+.*:    2718fffe        addiu   \$24,\$24,-2
+
+10100020 <f_bc@mips16plt>:
+.*:    b203            lw      \$2,1010002c <f_bc@mips16plt\+0xc>
+.*:    9a60            lw      \$3,0\(\$2\)
+.*:    651a            move    \$24,\$2
+.*:    eb00            jr      \$3
+.*:    653b            move    \$25,\$3
+.*:    6500            nop
+.*:    .... ....       \.word  0x10200008
+
+Disassembly of section \.text\.a:
+
+10101000 <testc>:
+.*:    f01f 100e       b       10100020 <f_bc@mips16plt>
+.*:    6500            nop
+.*:    e820            jr      \$31
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.rd b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-mips16-bronly.rd
new file mode 100644 (file)
index 0000000..648159e
--- /dev/null
@@ -0,0 +1,43 @@
+
+Dynamic section .*
+#...
+ 0x00000003 \(PLTGOT\)                     0x10201000
+#...
+ 0x70000013 \(MIPS_GOTSYM\)                0x4
+ 0x00000014 \(PLTREL\)                     REL
+ 0x00000017 \(JMPREL\)                     0x10004000
+ 0x00000002 \(PLTRELSZ\)                   8 \(bytes\)
+ 0x70000032 \(MIPS_PLTGOT\)                0x10200000
+#...
+Relocation section '\.rel\.plt' .*
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+10200008  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bc
+
+Symbol table '\.dynsym' .*
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+#...
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bc
+
+Symbol table '\.symtab' contains 34 entries:
+#...
+Primary GOT:
+ Canonical gp value: 10208ff0
+
+ Reserved entries:
+   Address     Access  Initial Purpose
+  10201000 -32752\(gp\) 00000000 Lazy resolver
+  10201004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
+
+
+PLT GOT:
+
+ Reserved entries:
+   Address  Initial Purpose
+  10200000 00000000 PLT lazy resolver
+  10200004 00000000 Module pointer
+
+ Entries:
+   Address  Initial Sym\.Val\. Type    Ndx Name
+  10200008 10100000 00000000 FUNC    UND f_bc
+
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.od b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.od
new file mode 100644 (file)
index 0000000..5fa5e7d
--- /dev/null
@@ -0,0 +1,69 @@
+
+.* file format .*
+
+
+Disassembly of section \.plt:
+
+# Only _bc (branch from compressed code) functions should have a
+# microMIPS PLT.
+10100000 <_PROCEDURE_LINKAGE_TABLE_>:
+.*:    3c1c1020        lui     \$28,0x1020
+.*:    8f990000        lw      \$25,0\(\$28\)
+.*:    279c0000        addiu   \$28,\$28,0
+.*:    031cc023        subu    \$24,\$24,\$28
+.*:    03e07825        move    \$15,\$31
+.*:    0018c082        srl     \$24,\$24,0x2
+.*:    0320f809        jalr    \$25
+.*:    2718fffe        addiu   \$24,\$24,-2
+
+10100020 <f_bu_bc@plt>:
+.*:    3c0f1020        lui     \$15,0x1020
+.*:    8df90008        lw      \$25,8\(\$15\)
+.*:    03200008        jr      \$25
+.*:    25f80008        addiu   \$24,\$15,8
+
+10100030 <f_bu@plt>:
+.*:    3c0f1020        lui     \$15,0x1020
+.*:    8df9000c        lw      \$25,12\(\$15\)
+.*:    03200008        jr      \$25
+.*:    25f8000c        addiu   \$24,\$15,12
+
+10100040 <f_bu_bc@micromipsplt>:
+.*:    7903 fff2       addiu   \$2,\$pc,1048520
+#                                  ^ 0x10200008
+.*:    ff22 0000       lw      \$25,0\(\$2\)
+.*:    4599            jr      \$25
+.*:    0f02            move    \$24,\$2
+
+1010004c <f_bc@micromipsplt>:
+.*:    7903 fff1       addiu   \$2,\$pc,1048516
+#                                  ^ 0x10200010
+.*:    ff22 0000       lw      \$25,0\(\$2\)
+.*:    4599            jr      \$25
+.*:    0f02            move    \$24,\$2
+
+Disassembly of section \.text\.a:
+
+10101000 <testc>:
+.*:    4060 f824       bal     1010004c <f_bc@micromipsplt>
+.*:    0000 0000       nop
+.*:    9400 f820       b       1010004c <f_bc@micromipsplt>
+.*:    0c00            nop
+.*:    4060 f817       bal     10100040 <f_bu_bc@micromipsplt>
+.*:    0000 0000       nop
+.*:    9400 f813       b       10100040 <f_bu_bc@micromipsplt>
+.*:    0c00            nop
+.*:    459f            jr      \$31
+
+Disassembly of section \.text\.b:
+
+10102000 <testu>:
+.*:    0411f80b        bal     10100030 <f_bu@plt>
+.*:    00000000        nop
+.*:    1000f809        b       10100030 <f_bu@plt>
+.*:    00000000        nop
+.*:    0411f803        bal     10100020 <f_bu_bc@plt>
+.*:    00000000        nop
+.*:    1000f801        b       10100020 <f_bu_bc@plt>
+.*:    00000000        nop
+.*:    03e00008        jr      \$31
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.rd b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-branch.rd
new file mode 100644 (file)
index 0000000..86cc3c8
--- /dev/null
@@ -0,0 +1,49 @@
+
+Dynamic section .*
+#...
+ 0x00000003 \(PLTGOT\)                     0x10201000
+#...
+ 0x70000013 \(MIPS_GOTSYM\)                0x6
+ 0x00000014 \(PLTREL\)                     REL
+ 0x00000017 \(JMPREL\)                     0x10004000
+ 0x00000002 \(PLTRELSZ\)                   24 \(bytes\)
+ 0x70000032 \(MIPS_PLTGOT\)                0x10200000
+#...
+Relocation section '\.rel\.plt' .*
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+10200008  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bu_bc
+1020000c  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bu
+10200010  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bc
+
+Symbol table '\.dynsym' .*
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+#...
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bu_bc
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bu
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bc
+
+Symbol table '\.symtab' .*
+#...
+Primary GOT:
+ Canonical gp value: 10208ff0
+
+ Reserved entries:
+   Address     Access  Initial Purpose
+  10201000 -32752\(gp\) 00000000 Lazy resolver
+  10201004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
+
+
+PLT GOT:
+
+ Reserved entries:
+   Address  Initial Purpose
+  10200000 00000000 PLT lazy resolver
+  10200004 00000000 Module pointer
+
+ Entries:
+   Address  Initial Sym\.Val\. Type    Ndx Name
+  10200008 10100000 00000000 FUNC    UND f_bu_bc
+  1020000c 10100000 00000000 FUNC    UND f_bu
+  10200010 10100000 00000000 FUNC    UND f_bc
+
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.od b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.od
new file mode 100644 (file)
index 0000000..2290852
--- /dev/null
@@ -0,0 +1,33 @@
+
+.* file format .*
+
+
+Disassembly of section \.plt:
+
+# All entries must be microMIPS.
+10100000 <_PROCEDURE_LINKAGE_TABLE_>:
+.*:    7984 0000       addiu   \$3,\$pc,1048576
+.*:    ff23 0000       lw      \$25,0\(\$3\)
+.*:    0535            subu    \$2,\$2,\$3
+.*:    2525            srl     \$2,\$2,2
+.*:    3302 fffe       addiu   \$24,\$2,-2
+.*:    0dff            move    \$15,\$31
+.*:    45f9            jalrs   \$25
+.*:    0f83            move    \$28,\$3
+.*:    0c00            nop
+
+10100018 <f_bc@micromipsplt>:
+.*:    7903 fffc       addiu   \$2,\$pc,1048560
+#                                  ^ 0x10200008
+.*:    ff22 0000       lw      \$25,0\(\$2\)
+.*:    4599            jr      \$25
+.*:    0f02            move    \$24,\$2
+
+Disassembly of section \.text\.a:
+
+10101000 <testc>:
+.*:    4060 f80a       bal     10100018 <f_bc@micromipsplt>
+.*:    0000 0000       nop
+.*:    9400 f806       b       10100018 <f_bc@micromipsplt>
+.*:    0c00            nop
+.*:    459f            jr      \$31
diff --git a/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.rd b/ld/testsuite/ld-mips-elf/compressed-plt-1-o32-umips-bronly.rd
new file mode 100644 (file)
index 0000000..9b02330
--- /dev/null
@@ -0,0 +1,43 @@
+
+Dynamic section .*
+#...
+ 0x00000003 \(PLTGOT\)                     0x10201000
+#...
+ 0x70000013 \(MIPS_GOTSYM\)                0x4
+ 0x00000014 \(PLTREL\)                     REL
+ 0x00000017 \(JMPREL\)                     0x10004000
+ 0x00000002 \(PLTRELSZ\)                   8 \(bytes\)
+ 0x70000032 \(MIPS_PLTGOT\)                0x10200000
+#...
+Relocation section '\.rel\.plt' .*
+ Offset     Info    Type            Sym\.Value  Sym\. Name
+10200008  [^ ]+ R_MIPS_JUMP_SLOT  00000000   f_bc
+
+Symbol table '\.dynsym' .*
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+#...
+    .*: 00000000     0 FUNC    GLOBAL DEFAULT  UND f_bc
+
+Symbol table '\.symtab' .*
+#...
+Primary GOT:
+ Canonical gp value: 10208ff0
+
+ Reserved entries:
+   Address     Access  Initial Purpose
+  10201000 -32752\(gp\) 00000000 Lazy resolver
+  10201004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
+
+
+PLT GOT:
+
+ Reserved entries:
+   Address  Initial Purpose
+  10200000 00000000 PLT lazy resolver
+  10200004 00000000 Module pointer
+
+ Entries:
+   Address  Initial Sym\.Val\. Type    Ndx Name
+  10200008 10100001 00000000 FUNC    UND f_bc
+
index aa0b497db32efcdc28e5d7533293155305d92903..7e7bdaa26028a3a3f41228a9ff3f56645c4f9b82 100644 (file)
@@ -13,10 +13,12 @@ __call_stub_\name:
        # Flags to specify how a particular function is referenced
 
        .equ    DC, 1           # Direct call from "compressed" code
-       .equ    IC, 2           # Indirect call from "compressed" code
-       .equ    DU, 4           # Direct call from "uncompressed" code
-       .equ    IU, 8           # Indirect call from "uncompressed" code
-       .equ    LO, 16          # Direct address reference (%lo)
+       .equ    BC, 2           # Branch from "compressed" code
+       .equ    IC, 4           # Indirect call from "compressed" code
+       .equ    DU, 8           # Direct call from "uncompressed" code
+       .equ    BU, 16          # Branch from "uncompressed" code
+       .equ    IU, 32          # Indirect call from "uncompressed" code
+       .equ    LO, 64          # Direct address reference (%lo)
 
        # A wrapper around a macro called test_one, which is defined by
        # the file that includes this one.  NAME is the name of a function
@@ -35,9 +37,14 @@ __call_stub_\name:
        test_filter \name\()_dc, (\flags | DC)
        .endm
 
-       .macro  test_all_ic, name, flags
+       .macro  test_all_bc, name, flags
        test_all_dc \name, \flags
-       test_all_dc \name\()_ic, (\flags | IC)
+       test_all_dc \name\()_bc, (\flags | BC)
+       .endm
+
+       .macro  test_all_ic, name, flags
+       test_all_bc \name, \flags
+       test_all_bc \name\()_ic, (\flags | IC)
        .endm
 
        .macro  test_all_du, name, flags
@@ -45,9 +52,14 @@ __call_stub_\name:
        test_all_ic \name\()_du, (\flags | DU)
        .endm
 
-       .macro  test_all_iu, name, flags
+       .macro  test_all_bu, name, flags
        test_all_du \name, \flags
-       test_all_du \name\()_iu, (\flags | IU)
+       test_all_du \name\()_bu, (\flags | BU)
+       .endm
+
+       .macro  test_all_iu, name, flags
+       test_all_bu \name, \flags
+       test_all_bu \name\()_iu, (\flags | IU)
        .endm
 
        .macro  test_all_lo, name, flags
index d5c6b4f34a0594dbd8c2f09b27c399473f4ed369..ad2ae7922f3563d4519b4682483e7d861645a901 100644 (file)
@@ -1,4 +1,4 @@
-# Define a function with all "compressed" (dc and ic) references.
+# Define a function with all "compressed" (dc, bc and ic) references.
 
        .abicalls
        .option pic0
        .endif
        .endif
        .endif
+       .if     (\types) & BC
+       .if     micromips
+       bal     \name
+       nop
+       .endif
+       .ifdef  o32
+       b       \name
+       nop
+       .endif
+       .endif
        .if     (\types) & IC
        lw      $2, %call16(\name)($3)
        .endif
index 33deccb8584c0b2ffcaa30f2ee40b84134fc0039..5a3f45471b0672e68c55647b4822b8768236340a 100644 (file)
@@ -1,4 +1,4 @@
-# Define a function with all "uncompressed" (du and iu) references.
+# Define a function with all "uncompressed" (du, bu and iu) references.
 
        .abicalls
        .option pic0
        j       \name
        nop
        .endif
+       .if     (\types) & BU
+       bal     \name
+       nop
+       b       \name
+       nop
+       .endif
        .if     (\types) & IU
        lw      $2, %call16(\name)($3)
        .endif
index 10a4339c67f28ccc4aab53364f2ad9c8e7571192..731f419915643916b210d61c3d51ed602561f8ba 100644 (file)
@@ -974,13 +974,13 @@ proc run_mips_plt_test { name abi filter micromips suffix {extra {}} } {
     set ld_flags "$abi_ldflags($abi) -T compressed-plt-1.ld"
     set dynobj "tmpdir/compressed-plt-1-${abi}-dyn.so"
     set files [list]
-    if { $filter & 3 } {
+    if { $filter & 7 } {
        lappend files compressed-plt-1a.s
     }
-    if { $filter & 12 } {
+    if { $filter & 56 } {
        lappend files compressed-plt-1b.s
     }
-    if { $filter & 16 } {
+    if { $filter & 64 } {
        lappend files compressed-plt-1c.s
     }
     eval [list lappend files] $extra
@@ -1000,28 +1000,35 @@ proc run_mips_plt_test { name abi filter micromips suffix {extra {}} } {
 
 if { $linux_gnu } {
     build_mips_plt_lib o32
-    run_mips_plt_test "o32 PLTs for standard encoding" o32 28 0 se
-    run_mips_plt_test "o32 PLTs for MIPS16 encoding" o32 19 0 mips16-only
-    run_mips_plt_test "o32 PLTs for microMIPS encoding" o32 19 1 umips-only
+    run_mips_plt_test "o32 PLTs for standard encoding" o32 104 0 se
+    run_mips_plt_test "o32 PLTs for standard branches" o32 16 0 branch
+    run_mips_plt_test "o32 PLTs for MIPS16 encoding" o32 69 0 mips16-only
+    run_mips_plt_test "o32 PLTs for MIPS16 branches" o32 2 0 mips16-bronly
+    run_mips_plt_test "o32 PLTs for microMIPS encoding" o32 69 1 umips-only
+    run_mips_plt_test "o32 PLTs for microMIPS branches" o32 2 1 umips-bronly
     run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16" \
-       o32 -1 0 mips16
+       o32 109 0 mips16
+    run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16 branches" \
+       o32 18 0 mips16-branch
     run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16 with %got" \
-       o32 -1 0 mips16-got compressed-plt-1d.s
+       o32 109 0 mips16-got compressed-plt-1d.s
     run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16 with .word" \
-       o32 -1 0 mips16-word compressed-plt-1e.s
+       o32 109 0 mips16-word compressed-plt-1e.s
     run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS" \
-       o32 -1 1 umips
+       o32 109 1 umips
+    run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS branches" \
+       o32 18 1 umips-branch
     run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS with %got" \
-       o32 -1 1 umips-got compressed-plt-1d.s
+       o32 109 1 umips-got compressed-plt-1d.s
     run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS with .word" \
-       o32 -1 1 umips-word compressed-plt-1e.s
+       o32 109 1 umips-word compressed-plt-1e.s
 
     if $has_newabi {
        build_mips_plt_lib n32
        run_mips_plt_test "n32 PLTs for mixed MIPS and MIPS16" \
-           n32 -1 0 mips16
+           n32 109 0 mips16
        run_mips_plt_test "n32 PLTs for mixed MIPS and microMIPS" \
-           n32 -1 1 umips
+           n32 109 1 umips
     }
 }
 
This page took 0.04624 seconds and 4 git commands to generate.