LoongArch: ld: Add support for linker relaxation.
authormengqinggang <mengqinggang@loongson.cn>
Thu, 1 Dec 2022 09:17:09 +0000 (17:17 +0800)
committerliuzhensong <liuzhensong@loongson.cn>
Tue, 30 May 2023 11:56:48 +0000 (19:56 +0800)
Add ld relax support and testsuits.

ld/ChangeLog:

* emultempl/loongarchelf.em: Regenerated.
* testsuite/ld-elf/compressed1d.d: Xfail loongarch*-*.
* testsuite/ld-elf/pr26936.d: Likewise.
* testsuite/ld-loongarch-elf/disas-jirl.d: Regenerated.
* testsuite/ld-loongarch-elf/disas-jirl-32.d: Regenerated.
* testsuite/ld-loongarch-elf/jmp_op.d: Likewise.
* testsuite/ld-loongarch-elf/macro_op.d: Likewise.
* testsuite/ld-loongarch-elf/macro_op_32.d: Likewise.
* testsuite/ld-loongarch-elf/relax-align.dd: New test.
* testsuite/ld-loongarch-elf/relax-align.s: New test.
* testsuite/ld-loongarch-elf/relax.exp: New test.
* testsuite/ld-loongarch-elf/relax.s: New test.
* testsuite/ld-loongarch-elf/uleb128.dd: New test.
* testsuite/ld-loongarch-elf/uleb128.s: New test.

14 files changed:
ld/emultempl/loongarchelf.em
ld/testsuite/ld-elf/compressed1d.d
ld/testsuite/ld-elf/pr26936.d
ld/testsuite/ld-loongarch-elf/disas-jirl-32.d
ld/testsuite/ld-loongarch-elf/disas-jirl.d
ld/testsuite/ld-loongarch-elf/jmp_op.d
ld/testsuite/ld-loongarch-elf/macro_op.d
ld/testsuite/ld-loongarch-elf/macro_op_32.d
ld/testsuite/ld-loongarch-elf/relax-align.dd [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/relax-align.s [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/relax.exp [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/relax.s [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/uleb128.dd [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/uleb128.s [new file with mode: 0644]

index b790f645c9bbc0165aa889863c0aecffa6bd6f30..4850feb87670b63d3696f8b60feb3fc94b7d7d2e 100644 (file)
@@ -23,6 +23,7 @@ fragment <<EOF
 #include "ldmain.h"
 #include "ldctor.h"
 #include "elf/loongarch.h"
+#include "elfxx-loongarch.h"
 
 static void
 larch_elf_before_allocation (void)
@@ -61,6 +62,8 @@ gld${EMULATION_NAME}_after_allocation (void)
        }
     }
 
+  enum phase_enum *phase = &(expld.dataseg.phase);
+  bfd_elf${ELFSIZE}_loongarch_set_data_segment_info (&link_info, (int *) phase);
   /* gld${EMULATION_NAME}_map_segments (need_layout); */
   ldelf_map_segments (need_layout);
 }
index 9d891c1933f0d9072b56d54d1f510508c169afba..b178695e23fb37eb8c0d7eec96223cc88a7966d6 100644 (file)
@@ -4,10 +4,13 @@
 #readelf: -SW
 #xfail: [uses_genelf]
 #xfail: [riscv_little_endian]
+#xfail: loongarch*-*-*
 # Not all ELF targets use the elf.em emulation...
 # RISC-V has linker relaxations that delete code, so text label subtractions
 # do not get resolved at assembly time, which results in a compressed section
 # for little endian targets; but it is uncompressed for big endian targets.
+# LoongArch has linker relaxations that delete code, so text label subtractions
+# do not get resolved at assembly time, which results in a compressed section.
 
 #failif
 #...
index c479f475829b7d3cc21298dee9ddb056c160e720..26c80ab90dce44254807335fa3ac414ba0b624f2 100644 (file)
@@ -6,10 +6,10 @@
 #readelf: -wL -W
 #target: [check_shared_lib_support]
 # Assembly source file for the HPPA assembler is renamed and modifed by
-# sed.  mn10300 and riscv put different numbers of local symbols in
+# sed. loongarch and mn10300 and riscv put different numbers of local symbols in
 # linkonce section and comdat sections.  xtensa has more than one member
 # in comdat groups.
-#xfail: am33_2.0-*-* hppa*-*-hpux* mn10300-*-* riscv*-*-* xtensa*-*-*
+#xfail: am33_2.0-*-* hppa*-*-hpux* loongarch*-*-* mn10300-*-* riscv*-*-* xtensa*-*-*
 
 #...
 CU: .*/pr26936c.s:
index 2f2a41afe750f0cb44149280576e0a4e22ccace4..cab7a5d4c99268baebe287c0ff20fad5d0207f13 100644 (file)
@@ -10,6 +10,8 @@ Disassembly of section .text:
 00000000.* <_start>:
 [      ]+0:[   ]+1a000014[     ]+pcalau12i[    ]+\$t8,[        ]+0
 [      ]+0:[   ]+R_LARCH_PCALA_HI20[   ]+_start
+[      ]+0:[   ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+4:[   ]+02800294[     ]+addi.w[       ]+\$t8,[        ]+\$t8,[        ]+0
 [      ]+4:[   ]+R_LARCH_PCALA_LO12[   ]+_start
+[      ]+4:[   ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+8:[   ]+4c000281[     ]+jirl[         ]+\$ra,[        ]+\$t8,[        ]+0
index 595c30c73611a189372d8f1d034776b8de944a4f..eeb8dd05092d6c0a722693fbf3791f925975a09a 100644 (file)
@@ -6,9 +6,11 @@
 
 Disassembly of section .text:
 
-00000000.*:
+00000000.* <_start>:
 [      ]+0:[   ]+1a000014[     ]+pcalau12i[    ]+\$t8,[        ]+0
 [      ]+0:[   ]+R_LARCH_PCALA_HI20[   ]+_start
+[      ]+0:[   ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+4:[   ]+02c00294[     ]+addi.d[       ]+\$t8,[        ]+\$t8,[        ]+0
 [      ]+4:[   ]+R_LARCH_PCALA_LO12[   ]+_start
+[      ]+4:[   ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+8:[   ]+4c000281[     ]+jirl[         ]+\$ra,[        ]+\$t8,[        ]+0
index 218c13f939882d925f3d191234e28b2d181e19b3..09f891001959104113e0d36b97e86a4c94a04cbc 100644 (file)
@@ -6,26 +6,45 @@
 
 Disassembly of section .text:
 
-00000000.* <.text>:
-[      ]+0:[   ]+03400000[     ]+[     ]+andi[         ]+\$zero, \$zero, 0x0
-[      ]+4:[   ]+63fffc04[     ]+[     ]+blt[  ]+\$zero, \$a0, -4\(0x3fffc\)[  ]+# 0x0
-[      ]+8:[   ]+67fff880[     ]+[     ]+bge[  ]+\$a0, \$zero, -8\(0x3fff8\)[  ]+# 0x0
-[      ]+c:[   ]+67fff404[     ]+[     ]+bge[  ]+\$zero, \$a0, -12\(0x3fff4\)[         ]+# 0x0
-[      ]+10:[  ]+43fff09f[     ]+[     ]+beqz[         ]+\$a0, -16\(0x7ffff0\)[        ]+# 0x0
-[      ]+14:[  ]+47ffec9f[     ]+[     ]+bnez[         ]+\$a0, -20\(0x7fffec\)[        ]+# 0x0
-[      ]+18:[  ]+4bffe81f[     ]+[     ]+bceqz[        ]+\$fcc0, -24\(0x7fffe8\)[      ]+# 0x0
-[      ]+1c:[  ]+4bffe51f[     ]+[     ]+bcnez[        ]+\$fcc0, -28\(0x7fffe4\)[      ]+# 0x0
-[      ]+20:[  ]+4c000080[     ]+[     ]+jirl[         ]+\$zero, \$a0, 0
-[      ]+24:[  ]+53ffdfff[     ]+[     ]+b[    ]+-36\(0xfffffdc\)[     ]+# 0x0
-[      ]+28:[  ]+57ffdbff[     ]+[     ]+bl[   ]+-40\(0xfffffd8\)[     ]+# 0x0
-[      ]+2c:[  ]+5bffd485[     ]+[     ]+beq[  ]+\$a0, \$a1, -44\(0x3ffd4\)[   ]+# 0x0
-[      ]+30:[  ]+5fffd085[     ]+[     ]+bne[  ]+\$a0, \$a1, -48\(0x3ffd0\)[   ]+# 0x0
-[      ]+34:[  ]+63ffcc85[     ]+[     ]+blt[  ]+\$a0, \$a1, -52\(0x3ffcc\)[   ]+# 0x0
-[      ]+38:[  ]+63ffc8a4[     ]+[     ]+blt[  ]+\$a1, \$a0, -56\(0x3ffc8\)[   ]+# 0x0
-[      ]+3c:[  ]+67ffc485[     ]+[     ]+bge[  ]+\$a0, \$a1, -60\(0x3ffc4\)[   ]+# 0x0
-[      ]+40:[  ]+67ffc0a4[     ]+[     ]+bge[  ]+\$a1, \$a0, -64\(0x3ffc0\)[   ]+# 0x0
-[      ]+44:[  ]+6bffbc85[     ]+[     ]+bltu[         ]+\$a0, \$a1, -68\(0x3ffbc\)[   ]+# 0x0
-[      ]+48:[  ]+6bffb8a4[     ]+[     ]+bltu[         ]+\$a1, \$a0, -72\(0x3ffb8\)[   ]+# 0x0
-[      ]+4c:[  ]+6fffb485[     ]+[     ]+bgeu[         ]+\$a0, \$a1, -76\(0x3ffb4\)[   ]+# 0x0
-[      ]+50:[  ]+6fffb0a4[     ]+[     ]+bgeu[         ]+\$a1, \$a0, -80\(0x3ffb0\)[   ]+# 0x0
-[      ]+54:[  ]+4c000020[     ]+[     ]+jirl[         ]+\$zero, \$ra, 0
+00000000.* <.L1>:
+[      ]+0:[   ]+03400000[     ]+andi[         ]+\$zero,[      ]+\$zero,[      ]+0x0
+[      ]+4:[   ]+63fffc04[     ]+blt[  ]+\$zero,[      ]+\$a0,[        ]+-4\(0x3fffc\)[        ]+#[    ]+0[    ]+<.L1>
+[      ]+4:[   ]+R_LARCH_B16[  ]+.L1
+[      ]+8:[   ]+67fff880[     ]+bge[  ]+\$a0,[        ]+\$zero,[      ]+-8\(0x3fff8\)[        ]+#[    ]+0[    ]+<.L1>
+[      ]+8:[   ]+R_LARCH_B16[  ]+.L1
+[      ]+c:[   ]+67fff404[     ]+bge[  ]+\$zero,[      ]+\$a0,[        ]+-12\(0x3fff4\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+c:[   ]+R_LARCH_B16[  ]+.L1
+[      ]+10:[  ]+43fff09f[     ]+beqz[         ]+\$a0,[        ]+-16\(0x7ffff0\)[      ]+#[    ]+0[    ]+<.L1>
+[      ]+10:[  ]+R_LARCH_B21[  ]+.L1
+[      ]+14:[  ]+47ffec9f[     ]+bnez[         ]+\$a0,[        ]+-20\(0x7fffec\)[      ]+#[    ]+0[    ]+<.L1>
+[      ]+14:[  ]+R_LARCH_B21[  ]+.L1
+[      ]+18:[  ]+4bffe81f[     ]+bceqz[        ]+\$fcc0,[      ]+-24\(0x7fffe8\)[      ]+#[    ]+0[    ]+<.L1>
+[      ]+18:[  ]+R_LARCH_B21[  ]+.L1
+[      ]+1c:[  ]+4bffe51f[     ]+bcnez[        ]+\$fcc0,[      ]+-28\(0x7fffe4\)[      ]+#[    ]+0[    ]+<.L1>
+[      ]+1c:[  ]+R_LARCH_B21[  ]+.L1
+[      ]+20:[  ]+4c000080[     ]+jirl[         ]+\$zero,[      ]+\$a0,[        ]+0
+[      ]+24:[  ]+53ffdfff[     ]+b[    ]+-36\(0xfffffdc\)[     ]+#[    ]+0[    ]+<.L1>
+[      ]+24:[  ]+R_LARCH_B26[  ]+.L1
+[      ]+28:[  ]+57ffdbff[     ]+bl[   ]+-40\(0xfffffd8\)[     ]+#[    ]+0[    ]+<.L1>
+[      ]+28:[  ]+R_LARCH_B26[  ]+.L1
+[      ]+2c:[  ]+5bffd485[     ]+beq[  ]+\$a0,[        ]+\$a1,[        ]+-44\(0x3ffd4\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+2c:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+30:[  ]+5fffd085[     ]+bne[  ]+\$a0,[        ]+\$a1,[        ]+-48\(0x3ffd0\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+30:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+34:[  ]+63ffcc85[     ]+blt[  ]+\$a0,[        ]+\$a1,[        ]+-52\(0x3ffcc\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+34:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+38:[  ]+63ffc8a4[     ]+blt[  ]+\$a1,[        ]+\$a0,[        ]+-56\(0x3ffc8\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+38:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+3c:[  ]+67ffc485[     ]+bge[  ]+\$a0,[        ]+\$a1,[        ]+-60\(0x3ffc4\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+3c:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+40:[  ]+67ffc0a4[     ]+bge[  ]+\$a1,[        ]+\$a0,[        ]+-64\(0x3ffc0\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+40:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+44:[  ]+6bffbc85[     ]+bltu[         ]+\$a0,[        ]+\$a1,[        ]+-68\(0x3ffbc\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+44:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+48:[  ]+6bffb8a4[     ]+bltu[         ]+\$a1,[        ]+\$a0,[        ]+-72\(0x3ffb8\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+48:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+4c:[  ]+6fffb485[     ]+bgeu[         ]+\$a0,[        ]+\$a1,[        ]+-76\(0x3ffb4\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+4c:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+50:[  ]+6fffb0a4[     ]+bgeu[         ]+\$a1,[        ]+\$a0,[        ]+-80\(0x3ffb0\)[       ]+#[    ]+0[    ]+<.L1>
+[      ]+50:[  ]+R_LARCH_B16[  ]+.L1
+[      ]+54:[  ]+4c000020[     ]+jirl[         ]+\$zero,[      ]+\$ra,[        ]+0
index 39aa1fb929ff6cb2af079fc9ea139957dff2a6d5..2649f63e5660d82c83bb57d7b8d504c4c690b108 100644 (file)
@@ -13,16 +13,22 @@ Disassembly of section .text:
 [      ]+c:[   ]+02bffc04[     ]+addi.w[       ]+\$a0,[        ]+\$zero,[      ]+-1\(0xfff\)
 [      ]+10:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+10:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+10:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+14:[  ]+28c00084[     ]+ld.d[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+14:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+14:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+18:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+18:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+18:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+1c:[  ]+28c00084[     ]+ld.d[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+1c:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+1c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+20:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+20:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+20:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+24:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
 [      ]+24:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+24:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+28:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
 [      ]+28:[  ]+R_LARCH_GOT64_PC_LO20[        ]+.L1
 [      ]+2c:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
@@ -30,12 +36,16 @@ Disassembly of section .text:
 [      ]+30:[  ]+380c1484[     ]+ldx.d[        ]+\$a0,[        ]+\$a0,[        ]+\$a1
 [      ]+34:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+34:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+34:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+38:[  ]+28c00084[     ]+ld.d[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+38:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+38:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+3c:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+3c:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+3c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+40:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
 [      ]+40:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+40:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+44:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
 [      ]+44:[  ]+R_LARCH_GOT64_PC_LO20[        ]+.L1
 [      ]+48:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
@@ -43,77 +53,99 @@ Disassembly of section .text:
 [      ]+4c:[  ]+380c1484[     ]+ldx.d[        ]+\$a0,[        ]+\$a0,[        ]+\$a1
 [      ]+50:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+50:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+50:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+54:[  ]+28c00084[     ]+ld.d[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+54:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+54:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+58:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+58:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+58:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+5c:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
 [      ]+5c:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+5c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+60:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
 [      ]+60:[  ]+R_LARCH_GOT64_PC_LO20[        ]+.L1
 [      ]+64:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
 [      ]+64:[  ]+R_LARCH_GOT64_PC_HI12[        ]+.L1
 [      ]+68:[  ]+380c1484[     ]+ldx.d[        ]+\$a0,[        ]+\$a0,[        ]+\$a1
 [      ]+6c:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+6c:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+6c:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+6c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+70:[  ]+02c00084[     ]+addi.d[       ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+70:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+70:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+70:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+74:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+74:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+74:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+74:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+78:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
-[      ]+78:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+78:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+78:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+7c:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
-[      ]+7c:[  ]+R_LARCH_PCALA64_LO20[         ]+.text
+[      ]+7c:[  ]+R_LARCH_PCALA64_LO20[         ]+.L1
 [      ]+80:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
-[      ]+80:[  ]+R_LARCH_PCALA64_HI12[         ]+.text
+[      ]+80:[  ]+R_LARCH_PCALA64_HI12[         ]+.L1
 [      ]+84:[  ]+00109484[     ]+add.d[        ]+\$a0,[        ]+\$a0,[        ]+\$a1
 [      ]+88:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+88:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+88:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+88:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+8c:[  ]+02c00084[     ]+addi.d[       ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+8c:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+8c:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+8c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+90:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+90:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+90:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+90:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+94:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
-[      ]+94:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+94:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+94:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+98:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
-[      ]+98:[  ]+R_LARCH_PCALA64_LO20[         ]+.text
+[      ]+98:[  ]+R_LARCH_PCALA64_LO20[         ]+.L1
 [      ]+9c:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
-[      ]+9c:[  ]+R_LARCH_PCALA64_HI12[         ]+.text
+[      ]+9c:[  ]+R_LARCH_PCALA64_HI12[         ]+.L1
 [      ]+a0:[  ]+00109484[     ]+add.d[        ]+\$a0,[        ]+\$a0,[        ]+\$a1
 [      ]+a4:[  ]+14000004[     ]+lu12i.w[      ]+\$a0,[        ]+0
 [      ]+a4:[  ]+R_LARCH_MARK_LA[      ]+\*ABS\*
-[      ]+a4:[  ]+R_LARCH_ABS_HI20[     ]+.text
+[      ]+a4:[  ]+R_LARCH_ABS_HI20[     ]+.L1
 [      ]+a8:[  ]+03800084[     ]+ori[  ]+\$a0,[        ]+\$a0,[        ]+0x0
-[      ]+a8:[  ]+R_LARCH_ABS_LO12[     ]+.text
+[      ]+a8:[  ]+R_LARCH_ABS_LO12[     ]+.L1
 [      ]+ac:[  ]+16000004[     ]+lu32i.d[      ]+\$a0,[        ]+0
-[      ]+ac:[  ]+R_LARCH_ABS64_LO20[   ]+.text
+[      ]+ac:[  ]+R_LARCH_ABS64_LO20[   ]+.L1
 [      ]+b0:[  ]+03000084[     ]+lu52i.d[      ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+b0:[  ]+R_LARCH_ABS64_HI12[   ]+.text
+[      ]+b0:[  ]+R_LARCH_ABS64_HI12[   ]+.L1
 [      ]+b4:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+b4:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+b4:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+b4:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+b8:[  ]+02c00084[     ]+addi.d[       ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+b8:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+b8:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+b8:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+bc:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+bc:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+bc:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+bc:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+c0:[  ]+02c00084[     ]+addi.d[       ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+c0:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+c0:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+c0:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+c4:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+c4:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+c4:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+c4:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+c8:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
-[      ]+c8:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+c8:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+c8:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+cc:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
-[      ]+cc:[  ]+R_LARCH_PCALA64_LO20[         ]+.text
+[      ]+cc:[  ]+R_LARCH_PCALA64_LO20[         ]+.L1
 [      ]+d0:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
-[      ]+d0:[  ]+R_LARCH_PCALA64_HI12[         ]+.text
+[      ]+d0:[  ]+R_LARCH_PCALA64_HI12[         ]+.L1
 [      ]+d4:[  ]+00109484[     ]+add.d[        ]+\$a0,[        ]+\$a0,[        ]+\$a1
 [      ]+d8:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+d8:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+d8:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+dc:[  ]+28c00084[     ]+ld.d[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+dc:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+dc:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+e0:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+e0:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+e0:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+e4:[  ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
 [      ]+e4:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+e4:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+e8:[  ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
 [      ]+e8:[  ]+R_LARCH_GOT64_PC_LO20[        ]+.L1
 [      ]+ec:[  ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
@@ -140,10 +172,12 @@ Disassembly of section .text:
 [      ]+118:[         ]+R_LARCH_TLS_LD_PC_HI20[       ]+TLS1
 [      ]+11c:[         ]+02c00084[     ]+addi.d[       ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+11c:[         ]+R_LARCH_GOT_PC_LO12[  ]+TLS1
+[      ]+11c:[         ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+120:[         ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+120:[         ]+R_LARCH_TLS_LD_PC_HI20[       ]+TLS1
 [      ]+124:[         ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
 [      ]+124:[         ]+R_LARCH_GOT_PC_LO12[  ]+TLS1
+[      ]+124:[         ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+128:[         ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
 [      ]+128:[         ]+R_LARCH_GOT64_PC_LO20[        ]+TLS1
 [      ]+12c:[         ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
@@ -153,10 +187,12 @@ Disassembly of section .text:
 [      ]+134:[         ]+R_LARCH_TLS_GD_PC_HI20[       ]+TLS1
 [      ]+138:[         ]+02c00084[     ]+addi.d[       ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+138:[         ]+R_LARCH_GOT_PC_LO12[  ]+TLS1
+[      ]+138:[         ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+13c:[         ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+13c:[         ]+R_LARCH_TLS_GD_PC_HI20[       ]+TLS1
 [      ]+140:[         ]+02c00005[     ]+addi.d[       ]+\$a1,[        ]+\$zero,[      ]+0
 [      ]+140:[         ]+R_LARCH_GOT_PC_LO12[  ]+TLS1
+[      ]+140:[         ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+144:[         ]+16000005[     ]+lu32i.d[      ]+\$a1,[        ]+0
 [      ]+144:[         ]+R_LARCH_GOT64_PC_LO20[        ]+TLS1
 [      ]+148:[         ]+030000a5[     ]+lu52i.d[      ]+\$a1,[        ]+\$a1,[        ]+0
index a78c4579ee901931f4fe24f837d76908e1fd22b8..f5a2b54dd9bdda20c2879f1abd6f511c251bef02 100644 (file)
@@ -14,29 +14,39 @@ Disassembly of section .text:
 [      ]+c:[   ]+02bffc04[     ]+addi.w[       ]+\$a0,[        ]+\$zero,[      ]+-1\(0xfff\)
 [      ]+10:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+10:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+10:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+14:[  ]+28800084[     ]+ld.w[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+14:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+14:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+18:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+18:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+18:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+1c:[  ]+28800084[     ]+ld.w[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+1c:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+1c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+20:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+20:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+20:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+20:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+24:[  ]+02800084[     ]+addi.w[       ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+24:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+24:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+24:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+28:[  ]+14000004[     ]+lu12i.w[      ]+\$a0,[        ]+0
 [      ]+28:[  ]+R_LARCH_MARK_LA[      ]+\*ABS\*
-[      ]+28:[  ]+R_LARCH_ABS_HI20[     ]+.text
+[      ]+28:[  ]+R_LARCH_ABS_HI20[     ]+.L1
 [      ]+2c:[  ]+03800084[     ]+ori[  ]+\$a0,[        ]+\$a0,[        ]+0x0
-[      ]+2c:[  ]+R_LARCH_ABS_LO12[     ]+.text
+[      ]+2c:[  ]+R_LARCH_ABS_LO12[     ]+.L1
 [      ]+30:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
-[      ]+30:[  ]+R_LARCH_PCALA_HI20[   ]+.text
+[      ]+30:[  ]+R_LARCH_PCALA_HI20[   ]+.L1
+[      ]+30:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+34:[  ]+02800084[     ]+addi.w[       ]+\$a0,[        ]+\$a0,[        ]+0
-[      ]+34:[  ]+R_LARCH_PCALA_LO12[   ]+.text
+[      ]+34:[  ]+R_LARCH_PCALA_LO12[   ]+.L1
+[      ]+34:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+38:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+38:[  ]+R_LARCH_GOT_PC_HI20[  ]+.L1
+[      ]+38:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+3c:[  ]+28800084[     ]+ld.w[         ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+3c:[  ]+R_LARCH_GOT_PC_LO12[  ]+.L1
+[      ]+3c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+40:[  ]+14000004[     ]+lu12i.w[      ]+\$a0,[        ]+0
 [      ]+40:[  ]+R_LARCH_TLS_LE_HI20[  ]+TLS1
 [      ]+44:[  ]+03800084[     ]+ori[  ]+\$a0,[        ]+\$a0,[        ]+0x0
@@ -49,7 +59,9 @@ Disassembly of section .text:
 [      ]+50:[  ]+R_LARCH_TLS_LD_PC_HI20[       ]+TLS1
 [      ]+54:[  ]+02800084[     ]+addi.w[       ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+54:[  ]+R_LARCH_GOT_PC_LO12[  ]+TLS1
+[      ]+54:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
 [      ]+58:[  ]+1a000004[     ]+pcalau12i[    ]+\$a0,[        ]+0
 [      ]+58:[  ]+R_LARCH_TLS_GD_PC_HI20[       ]+TLS1
 [      ]+5c:[  ]+02800084[     ]+addi.w[       ]+\$a0,[        ]+\$a0,[        ]+0
 [      ]+5c:[  ]+R_LARCH_GOT_PC_LO12[  ]+TLS1
+[      ]+5c:[  ]+R_LARCH_RELAX[        ]+\*ABS\*
diff --git a/ld/testsuite/ld-loongarch-elf/relax-align.dd b/ld/testsuite/ld-loongarch-elf/relax-align.dd
new file mode 100644 (file)
index 0000000..3149738
--- /dev/null
@@ -0,0 +1,7 @@
+#...
+.*pcaddi.*
+.*pcaddi.*
+.*andi.*
+.*andi.*
+.*0:.*pcaddi.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/relax-align.s b/ld/testsuite/ld-loongarch-elf/relax-align.s
new file mode 100644 (file)
index 0000000..9617c02
--- /dev/null
@@ -0,0 +1,9 @@
+# relax-align.o has 3 andi(nop) insns.
+# relax-align has 2 andi insns, ld relax delete andi insns.
+# the last pcaddi 16 bytes align.
+  .text
+L1:
+  la.local $a0, L1
+  la.local $a0, L1
+  .align 4
+  la.local $a0, L1
diff --git a/ld/testsuite/ld-loongarch-elf/relax.exp b/ld/testsuite/ld-loongarch-elf/relax.exp
new file mode 100644 (file)
index 0000000..7ff876d
--- /dev/null
@@ -0,0 +1,77 @@
+# Expect script for LoongArch ELF linker tests
+#   Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+if [istarget loongarch64-*-*] {
+
+  if [isbuild loongarch64-*-*] {
+    set testname "loongarch relax build"
+    set pre_builds [list \
+      [list \
+       "$testname" \
+       "" \
+       "" \
+       {relax.s} \
+       {} \
+       "relax" \
+      ] \
+    ]
+
+    run_cc_link_tests $pre_builds
+
+    if [file exist "tmpdir/relax"] {
+      set objdump_output [run_host_cmd "objdump" "-d tmpdir/relax"]
+      if { [ regexp ".*pcaddi.*pcaddi.*" $objdump_output] } {
+       pass "loongarch relax"
+      } {
+       fail "loongarch relax"
+      }
+    }
+  }
+
+  run_ld_link_tests \
+      [list \
+         [list \
+             "relax-align" \
+             "-e 0x0 -z relro" "" \
+             "" \
+             {relax-align.s} \
+             [list \
+                 [list objdump -d relax-align.dd] \
+             ] \
+             "relax-align" \
+         ] \
+      ]
+
+  set objdump_flags "-s -j .data"
+  run_ld_link_tests \
+      [list \
+         [list \
+             "uleb128" \
+             "-e 0x0" "" \
+             "" \
+             {uleb128.s} \
+             [list \
+                 [list objdump $objdump_flags uleb128.dd] \
+             ] \
+             "uleb128" \
+         ] \
+      ]
+}
diff --git a/ld/testsuite/ld-loongarch-elf/relax.s b/ld/testsuite/ld-loongarch-elf/relax.s
new file mode 100644 (file)
index 0000000..2979ffa
--- /dev/null
@@ -0,0 +1,16 @@
+  .data
+  .global a
+  .type a, @object
+a:
+  .word 123
+
+  .text
+  .global main
+  .type main, @function
+main:
+  la.local $a0, a
+  ld.w $a1, $a0, 0
+  la.global $a0, a
+  ld.w $a0, $a0, 0
+  sub.d $a0, $a0, $a1
+  jr $ra
diff --git a/ld/testsuite/ld-loongarch-elf/uleb128.dd b/ld/testsuite/ld-loongarch-elf/uleb128.dd
new file mode 100644 (file)
index 0000000..c4ad307
--- /dev/null
@@ -0,0 +1,10 @@
+.*: .*
+
+Contents of section .*
+ [0-9a-f]+ 01020381 01000000 00000000 00000000.*
+#...
+ [0-9a-f]+ 00000004 ffff0500 06078380 01000000.*
+#...
+ [0-9a-f]+ 00000000 00000000 00000008 ffffffff.*
+ [0-9a-f]+ 09090909 09090909 09090909 09090909.*
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/uleb128.s b/ld/testsuite/ld-loongarch-elf/uleb128.s
new file mode 100644 (file)
index 0000000..7299fb9
--- /dev/null
@@ -0,0 +1,21 @@
+# From gas/all/relax.s, test ld process add_uleb128/sub_uleb128 reloc pair.
+ .data
+ .byte 1, 2, 3
+ .uleb128 L2 - L1
+L1:
+ .space 128 - 2
+ .byte 4
+ .p2align 1, 0xff
+L2:
+ .byte 5
+
+ .p2align 2
+ .byte 6, 7
+ .uleb128 L4 - L3
+L3:
+ .space 128*128 - 2
+ .byte 8
+ .p2align 2, 0xff
+L4:
+ .byte 9
+ .p2align 4, 9