[llvm] 6957e44 - [LoongArch][MC] Refine conditions for emitting ALIGN relocations (#153365)

via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 17 23:54:30 PDT 2025


Author: ZhaoQi
Date: 2025-08-18T14:54:27+08:00
New Revision: 6957e44d8e4e17614af4c2c6426853f6b980b746

URL: https://github.com/llvm/llvm-project/commit/6957e44d8e4e17614af4c2c6426853f6b980b746
DIFF: https://github.com/llvm/llvm-project/commit/6957e44d8e4e17614af4c2c6426853f6b980b746.diff

LOG: [LoongArch][MC] Refine conditions for emitting ALIGN relocations (#153365)

According to the suggestions in
https://github.com/llvm/llvm-project/pull/150816, this commit refine the
conditions for emitting R_LARCH_ALIGN relocations.

Some existing tests are updated to avoid being affected by this
optimization. New tests are added to verify: removal of redundant ALIGN
relocations, ALIGN emitted after the first linker-relaxable instruction,
and conservatively emitted ALIGN in lower-numbered subsections.

Added: 
    llvm/test/MC/LoongArch/Relocations/align-after-relax.s
    llvm/test/MC/LoongArch/Relocations/relax-align-in-subsection.s

Modified: 
    llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
    llvm/test/CodeGen/LoongArch/linker-relaxation.ll
    llvm/test/MC/LoongArch/Misc/cfi-advance.s
    llvm/test/MC/LoongArch/Relocations/relax-addsub.s
    llvm/test/MC/LoongArch/Relocations/relax-align.s
    llvm/test/MC/LoongArch/Relocations/sub-expr.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
index ca5d27d54bb81..cb0014450702f 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
@@ -216,10 +216,19 @@ getRelocPairForSize(unsigned Size) {
 // size, the fixup encodes MaxBytesToEmit in the higher bits and references a
 // per-section marker symbol.
 bool LoongArchAsmBackend::relaxAlign(MCFragment &F, unsigned &Size) {
+  // Alignments before the first linker-relaxable instruction have fixed sizes
+  // and do not require relocations. Alignments after a linker-relaxable
+  // instruction require a relocation, even if the STI specifies norelax.
+  //
+  // firstLinkerRelaxable is the layout order within the subsection, which may
+  // be smaller than the section's order. Therefore, alignments in a
+  // lower-numbered subsection may be unnecessarily treated as linker-relaxable.
+  auto *Sec = F.getParent();
+  if (F.getLayoutOrder() <= Sec->firstLinkerRelaxable())
+    return false;
+
   // Use default handling unless linker relaxation is enabled and the
   // MaxBytesToEmit >= the nop size.
-  if (!F.getSubtargetInfo()->hasFeature(LoongArch::FeatureRelax))
-    return false;
   const unsigned MinNopLen = 4;
   unsigned MaxBytesToEmit = F.getAlignMaxBytesToEmit();
   if (MaxBytesToEmit < MinNopLen)
@@ -254,8 +263,6 @@ bool LoongArchAsmBackend::relaxAlign(MCFragment &F, unsigned &Size) {
       MCFixup::create(0, Expr, FirstLiteralRelocationKind + ELF::R_LARCH_ALIGN);
   F.setVarFixups({Fixup});
   F.setLinkerRelaxable();
-  if (!F.getParent()->isLinkerRelaxable())
-    F.getParent()->setFirstLinkerRelaxable(F.getLayoutOrder());
   return true;
 }
 

diff  --git a/llvm/test/CodeGen/LoongArch/linker-relaxation.ll b/llvm/test/CodeGen/LoongArch/linker-relaxation.ll
index 2827a95547903..3bb83193ce7ac 100644
--- a/llvm/test/CodeGen/LoongArch/linker-relaxation.ll
+++ b/llvm/test/CodeGen/LoongArch/linker-relaxation.ll
@@ -29,10 +29,8 @@ declare void @callee1() nounwind
 declare dso_local void @callee2() nounwind
 declare dso_local void @callee3() nounwind
 
-define ptr @caller() nounwind {
-; RELAX:            R_LARCH_ALIGN - 0x1C
 ; CHECK-RELOC:      R_LARCH_GOT_PC_HI20 g_e 0x0
-; RELAX-NEXT:       R_LARCH_RELAX - 0x0
+; RELAX:            R_LARCH_RELAX - 0x0
 ; CHECK-RELOC-NEXT: R_LARCH_GOT_PC_LO12 g_e 0x0
 ; RELAX-NEXT:       R_LARCH_RELAX - 0x0
 ; PCALA-RELOC:      R_LARCH_PCALA_HI20 .bss 0x0
@@ -77,26 +75,35 @@ define ptr @caller() nounwind {
 ; RELAX-NEXT:       R_LARCH_RELAX - 0x0
 ; CHECK-RELOC-NEXT: R_LARCH_TLS_LE_LO12_R t_le 0x0
 ; RELAX-NEXT:       R_LARCH_RELAX - 0x0
-; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee1 0x0
-; RELAX-NEXT:       R_LARCH_RELAX - 0x0
-; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee2 0x0
-; RELAX-NEXT:       R_LARCH_RELAX - 0x0
-; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee3 0x0
-; RELAX-NEXT:       R_LARCH_RELAX - 0x0
 ; PCALA-RELOC:      R_LARCH_PCALA_HI20 .data 0x0
 ; RELAX-NEXT:       R_LARCH_PCALA_HI20 g_i1 0x0
 ; RELAX-NEXT:       R_LARCH_RELAX - 0x0
 ; PCALA-RELOC:      R_LARCH_PCALA_LO12 .data 0x0
 ; RELAX-NEXT:       R_LARCH_PCALA_LO12 g_i1 0x0
 ; RELAX-NEXT:       R_LARCH_RELAX - 0x0
+; RELAX-NEXT:       R_LARCH_ALIGN - 0x1C
+; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee1 0x0
+; RELAX-NEXT:       R_LARCH_RELAX - 0x0
+; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee2 0x0
+; RELAX-NEXT:       R_LARCH_RELAX - 0x0
+; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee3 0x0
+; RELAX-NEXT:       R_LARCH_RELAX - 0x0
+
+;; No ALIGN reloc will emit before the first linker-relaxable instruction.
+define ptr @loader() nounwind {
   %a = load volatile i32, ptr @g_e
   %b = load volatile i32, ptr @g_i
   %c = load volatile i32, ptr @t_un
   %d = load volatile i32, ptr @t_ld
   %e = load volatile i32, ptr @t_ie
   %f = load volatile i32, ptr @t_le
+  ret ptr @g_i1
+}
+
+;; ALIGN reloc will be emitted here.
+define void @caller() nounwind {
   call i32 @callee1()
   call i32 @callee2()
   tail call i32 @callee3()
-  ret ptr @g_i1
+  ret void
 }

diff  --git a/llvm/test/MC/LoongArch/Misc/cfi-advance.s b/llvm/test/MC/LoongArch/Misc/cfi-advance.s
index 38eba7caf6106..494b8af21064b 100644
--- a/llvm/test/MC/LoongArch/Misc/cfi-advance.s
+++ b/llvm/test/MC/LoongArch/Misc/cfi-advance.s
@@ -5,13 +5,13 @@
 # RUN:     | llvm-readobj -r - | FileCheck --check-prefix=RELAX %s
 
 # RELOC:       Relocations [
-# RELOC-NEXT:    .rela.eh_frame {
+# RELOC:         .rela.eh_frame {
 # RELOC-NEXT:       0x1C R_LARCH_32_PCREL .text 0x0
 # RELOC-NEXT:    }
 # RELOC-NEXT:  ]
-# DWARFDUMP:       DW_CFA_advance_loc: 4
+# DWARFDUMP:       DW_CFA_advance_loc: 8
 # DWARFDUMP-NEXT:  DW_CFA_def_cfa_offset: +8
-# DWARFDUMP-NEXT:  DW_CFA_advance_loc: 8
+# DWARFDUMP-NEXT:  DW_CFA_advance_loc: 4
 # DWARFDUMP-NEXT:  DW_CFA_def_cfa_offset: +8
 
 # RELAX:       Relocations [
@@ -19,6 +19,8 @@
 # RELAX-NEXT:       0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
 # RELAX-NEXT:       0x20 R_LARCH_ADD32 .L{{.*}} 0x0
 # RELAX-NEXT:       0x20 R_LARCH_SUB32 .L{{.*}} 0x0
+# RELAX-NEXT:       0x25 R_LARCH_ADD6 .L{{.*}} 0x0
+# RELAX-NEXT:       0x25 R_LARCH_SUB6 .L{{.*}} 0x0
 # RELAX-NEXT:       0x28 R_LARCH_ADD6 .L{{.*}} 0x0
 # RELAX-NEXT:       0x28 R_LARCH_SUB6 .L{{.*}} 0x0
 # RELAX-NEXT:    }
@@ -30,7 +32,7 @@
         .type   test, at function
 test:
         .cfi_startproc
-        nop
+        call36 foo
         .cfi_def_cfa_offset 8
         .p2align 3
         nop

diff  --git a/llvm/test/MC/LoongArch/Relocations/align-after-relax.s b/llvm/test/MC/LoongArch/Relocations/align-after-relax.s
new file mode 100644
index 0000000000000..199c3fcfa0afd
--- /dev/null
+++ b/llvm/test/MC/LoongArch/Relocations/align-after-relax.s
@@ -0,0 +1,57 @@
+## The file testing R_LARCH_ALIGN emitting when linker-relaxation enabled.
+
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax %s -o %t.n
+# RUN: llvm-objdump -dr %t.n | FileCheck %s --check-prefix=NORELAX
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.r
+# RUN: llvm-objdump -dr %t.r | FileCheck %s --check-prefix=RELAX
+
+# NORELAX:         pcaddu18i $ra, 0
+# NORELAX-NEXT:        R_LARCH_CALL36 f
+# NORELAX-NEXT:    jirl $ra, $ra, 0
+# NORELAX-COUNT-6: nop
+# NORELAX:         pcaddu18i $ra, 0
+# NORELAX-NEXT:        R_LARCH_CALL36 f
+# NORELAX-NEXT:    jirl $ra, $ra, 0
+# NORELAX-COUNT-6: nop
+# NORELAX:         pcaddu18i $ra, 0
+# NORELAX-NEXT:        R_LARCH_CALL36 f
+# NORELAX-NEXT:    jirl $ra, $ra, 0
+
+# RELAX:         pcaddu18i $ra, 0
+# RELAX-NEXT:        R_LARCH_CALL36 f
+# RELAX-NEXT:        R_LARCH_RELAX *ABS*
+# RELAX-NEXT:    jirl $ra, $ra, 0
+# RELAX-NEXT:    nop
+# RELAX-NEXT:        R_LARCH_ALIGN *ABS*+0x1c
+# RELAX-COUNT-6: nop
+# RELAX:         pcaddu18i $ra, 0
+# RELAX-NEXT:        R_LARCH_CALL36 f
+# RELAX-NEXT:        R_LARCH_RELAX *ABS*
+# RELAX-NEXT:    jirl $ra, $ra, 0
+# RELAX-NEXT:    nop
+# RELAX-NEXT:        R_LARCH_ALIGN *ABS*+0x1c
+# RELAX-COUNT-6: nop
+# RELAX:         pcaddu18i $ra, 0
+# RELAX-NEXT:        R_LARCH_CALL36 f
+# RELAX-NEXT:    jirl $ra, $ra, 0
+
+.text
+## No R_LARCH_ALIGN before the first linker-relaxable instruction.
+.p2align 5
+foo:
+  call36 f
+
+## R_LARCH_ALIGN is required after the first linker-relaxable instruction.
+.p2align 5
+bar:
+  call36 f
+
+.option push
+.option norelax
+## R_LARCH_ALIGN is required even if norelax, because it is after a
+## linker-relaxable instruction. No R_LARCH_RELAX for call36 because
+## of the norelax.
+.p2align 5
+baz:
+  call36 f
+.option pop

diff  --git a/llvm/test/MC/LoongArch/Relocations/relax-addsub.s b/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
index f2524b29d230b..da3f655e9a31e 100644
--- a/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
+++ b/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
@@ -5,8 +5,9 @@
 
 # NORELAX:       Relocations [
 # NORELAX-NEXT:    Section ({{.*}}) .rela.text {
-# NORELAX-NEXT:      0x10 R_LARCH_PCALA_HI20 .text 0x0
-# NORELAX-NEXT:      0x14 R_LARCH_PCALA_LO12 .text 0x0
+# NORELAX-NEXT:      0x0 R_LARCH_CALL36 foo 0x0
+# NORELAX-NEXT:      0x10 R_LARCH_PCALA_HI20 .text 0x8
+# NORELAX-NEXT:      0x14 R_LARCH_PCALA_LO12 .text 0x8
 # NORELAX-NEXT:    }
 # NORELAX-NEXT:    Section ({{.*}}) .rela.data {
 # NORELAX-NEXT:      0x30 R_LARCH_ADD8 foo 0x0
@@ -22,17 +23,19 @@
 
 # NORELAX:      Hex dump of section '.data':
 # NORELAX-NEXT: 0x00000000 04040004 00000004 00000000 00000004
-# NORELAX-NEXT: 0x00000010 0c0c000c 0000000c 00000000 0000000c
+# NORELAX-NEXT: 0x00000010 04040004 00000004 00000000 00000004
 # NORELAX-NEXT: 0x00000020 08080008 00000008 00000000 00000008
 # NORELAX-NEXT: 0x00000030 00000000 00000000 00000000 000000
 
 # RELAX:       Relocations [
 # RELAX-NEXT:    Section ({{.*}}) .rela.text {
-# RELAX-NEXT:      0x4 R_LARCH_ALIGN - 0xC
-# RELAX-NEXT:      0x10 R_LARCH_PCALA_HI20 .L1 0x0
-# RELAX-NEXT:      0x10 R_LARCH_RELAX - 0x0
-# RELAX-NEXT:      0x14 R_LARCH_PCALA_LO12 .L1 0x0
-# RELAX-NEXT:      0x14 R_LARCH_RELAX - 0x0
+# RELAX-NEXT:      0x0 R_LARCH_CALL36 foo 0x0
+# RELAX-NEXT:      0x0 R_LARCH_RELAX - 0x0
+# RELAX-NEXT:      0xC R_LARCH_ALIGN - 0xC
+# RELAX-NEXT:      0x18 R_LARCH_PCALA_HI20 .L1 0x0
+# RELAX-NEXT:      0x18 R_LARCH_RELAX - 0x0
+# RELAX-NEXT:      0x1C R_LARCH_PCALA_LO12 .L1 0x0
+# RELAX-NEXT:      0x1C R_LARCH_RELAX - 0x0
 # RELAX-NEXT:    }
 # RELAX-NEXT:    Section ({{.*}}) .rela.data {
 # RELAX-NEXT:      0x10 R_LARCH_ADD8 .L3 0x0
@@ -73,6 +76,7 @@
 # RELAX-NEXT: 0x00000030 00000000 00000000 00000000 000000
 
 .text
+  call36 foo
 .L1:
   nop
 .L2:

diff  --git a/llvm/test/MC/LoongArch/Relocations/relax-align-in-subsection.s b/llvm/test/MC/LoongArch/Relocations/relax-align-in-subsection.s
new file mode 100644
index 0000000000000..92fceeb14faee
--- /dev/null
+++ b/llvm/test/MC/LoongArch/Relocations/relax-align-in-subsection.s
@@ -0,0 +1,35 @@
+## The file testing R_LARCH_ALIGN emitting when linker-relaxation enabled.
+
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.n
+# RUN: llvm-objdump -dr %t.n | FileCheck %s --check-prefix=RELAX
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax --defsym FILL=1 %s -o %t.f
+# RUN: llvm-objdump -dr %t.f | FileCheck %s --check-prefixes=RELAX,ALIGN
+
+# ALIGN:         nop
+# ALIGN-NEXT:        R_LARCH_ALIGN *ABS*+0x1c
+# ALIGN-COUNT-6: nop
+# RELAX:         ret
+# RELAX:         pcaddu18i $ra, 0
+# RELAX-NEXT:        R_LARCH_CALL36 f
+# RELAX-NEXT:        R_LARCH_RELAX *ABS*
+# RELAX-NEXT:    jirl $ra, $ra, 0
+
+.text
+.option push
+.option norelax
+## When FILL is defined, the order of Alignment directive in this lower-numbered
+## subsection will be larger, and even larger than the section order of the first
+## linker-relaxable call36 instruction. It should conservatively be treated as
+## linker-relaxable even has norelax.
+.ifdef FILL
+  .space 0
+.endif
+.p2align 5
+foo:
+  ret
+.option pop
+
+.text 1
+  .space 0
+bar:
+  call36 f

diff  --git a/llvm/test/MC/LoongArch/Relocations/relax-align.s b/llvm/test/MC/LoongArch/Relocations/relax-align.s
index 477d5ca24ec7d..e9d7f31b68393 100644
--- a/llvm/test/MC/LoongArch/Relocations/relax-align.s
+++ b/llvm/test/MC/LoongArch/Relocations/relax-align.s
@@ -8,8 +8,9 @@
 # RUN: llvm-readobj -r %t.r | FileCheck %s --check-prefixes=RELOC,RELAX-RELOC
 
 .text
-break 0
-# INSTR: break 0
+call36 foo
+# INSTR:      pcaddu18i $ra, 0
+# INSTR-NEXT: jirl $ra, $ra, 0
 
 ## Not emit R_LARCH_ALIGN if alignment directive is less than or equal to
 ## minimum code alignment(a.k.a 4).
@@ -24,8 +25,8 @@ break 0
 ## The behavior is the same as GNU assembler.
 break 1
 .p2align 4, 1
-# INSTR-NEXT:    break 1
-# INSTR-COUNT-2: 01 01 01 01
+# INSTR-NEXT: break 1
+# INSTR-NEXT: 01 01 01 01
 
 break 2
 .p2align 4, 1, 12
@@ -62,20 +63,25 @@ ret
 
 ## Test the symbol index is 
diff erent from .text.
 .section .text2, "ax"
+call36 foo
 .p2align 4
 .p2align 4, , 4
 break 7
 
 # RELOC:            Relocations [
-# RELAX-RELOC-NEXT:   Section ({{.*}}) .rela.text {
+# RELOC-NEXT:         Section ({{.*}}) .rela.text {
+# RELOC-NEXT:           0x0 R_LARCH_CALL36 foo 0x0
+# RELAX-RELOC-NEXT:     0x0 R_LARCH_RELAX - 0x0
 # RELAX-RELOC-NEXT:     0x24 R_LARCH_ALIGN - 0xC
 # RELAX-RELOC-NEXT:     0x34 R_LARCH_ALIGN - 0x1C
 # RELAX-RELOC-NEXT:     0x50 R_LARCH_ALIGN - 0xC
 # RELAX-RELOC-NEXT:     0x60 R_LARCH_ALIGN .Lla-relax-align0 0xB04
 # RELAX-RELOC-NEXT:     0x70 R_LARCH_ALIGN - 0xC
-# RELAX-RELOC-NEXT:   }
-# RELAX-RELOC-NEXT:   Section ({{.*}}) .rela.text2 {
-# RELAX-RELOC-NEXT:     0x0 R_LARCH_ALIGN - 0xC
-# RELAX-RELOC-NEXT:     0xC R_LARCH_ALIGN .Lla-relax-align1 0x404
-# RELAX-RELOC-NEXT:   }
+# RELOC-NEXT:         }
+# RELOC-NEXT:         Section ({{.*}}) .rela.text2 {
+# RELOC-NEXT:           0x0 R_LARCH_CALL36 foo 0x0
+# RELAX-RELOC-NEXT:     0x0 R_LARCH_RELAX - 0x0
+# RELAX-RELOC-NEXT:     0x8 R_LARCH_ALIGN - 0xC
+# RELAX-RELOC-NEXT:     0x14 R_LARCH_ALIGN .Lla-relax-align1 0x404
+# RELOC-NEXT:         }
 # RELOC-NEXT:       ]

diff  --git a/llvm/test/MC/LoongArch/Relocations/sub-expr.s b/llvm/test/MC/LoongArch/Relocations/sub-expr.s
index 8bf046acc6975..2d439194eb932 100644
--- a/llvm/test/MC/LoongArch/Relocations/sub-expr.s
+++ b/llvm/test/MC/LoongArch/Relocations/sub-expr.s
@@ -11,28 +11,29 @@
 # CHECK-NEXT:     Section ({{.*}}) .rela.sx {
 # CHECK-NEXT:       0x4 R_LARCH_PCALA_HI20 z 0x0
 # CHECK-NEXT:       0x8 R_LARCH_PCALA_LO12 z 0x0
-# CHECK-NEXT:       0xC R_LARCH_32_PCREL .sy 0xC
+# CHECK-NEXT:       0xC R_LARCH_32_PCREL .sy 0x10
 # CHECK-NEXT:     }
 # CHECK-NEXT:     Section ({{.*}}) .rela.data {
 # CHECK-NEXT:       0x0 R_LARCH_64_PCREL .sx 0x4
-# CHECK-NEXT:       0x8 R_LARCH_64_PCREL .sy 0x4
+# CHECK-NEXT:       0x8 R_LARCH_64_PCREL .sy 0x8
 # CHECK-NEXT:       0x10 R_LARCH_32_PCREL .sx 0x4
-# CHECK-NEXT:       0x14 R_LARCH_32_PCREL .sy 0x4
+# CHECK-NEXT:       0x14 R_LARCH_32_PCREL .sy 0x8
 # CHECK-NEXT:       0x18 R_LARCH_ADD64 .sx 0x4
-# CHECK-NEXT:       0x18 R_LARCH_SUB64 .sy 0x4
-# CHECK-NEXT:       0x20 R_LARCH_ADD64 .sy 0x4
+# CHECK-NEXT:       0x18 R_LARCH_SUB64 .sy 0x8
+# CHECK-NEXT:       0x20 R_LARCH_ADD64 .sy 0x8
 # CHECK-NEXT:       0x20 R_LARCH_SUB64 .sx 0x4
 # CHECK-NEXT:       0x28 R_LARCH_ADD32 .sx 0x4
-# CHECK-NEXT:       0x28 R_LARCH_SUB32 .sy 0x4
-# CHECK-NEXT:       0x2C R_LARCH_ADD32 .sy 0x4
+# CHECK-NEXT:       0x28 R_LARCH_SUB32 .sy 0x8
+# CHECK-NEXT:       0x2C R_LARCH_ADD32 .sy 0x8
 # CHECK-NEXT:       0x2C R_LARCH_SUB32 .sx 0x4
 # CHECK-NEXT:       0x30 R_LARCH_ADD64 .data 0x30
 # CHECK-NEXT:       0x30 R_LARCH_SUB64 .sx 0x4
 # CHECK-NEXT:       0x38 R_LARCH_ADD32 .data 0x38
-# CHECK-NEXT:       0x38 R_LARCH_SUB32 .sy 0x4
+# CHECK-NEXT:       0x38 R_LARCH_SUB32 .sy 0x8
 # CHECK-NEXT:     }
 # CHECK-NEXT:     Section ({{.*}}) .rela.sy {
-# CHECK-NEXT:       0x10 R_LARCH_32_PCREL .sx 0x10
+# CHECK-NEXT:       0x0 R_LARCH_CALL36 foo 0x0
+# CHECK-NEXT:       0x10 R_LARCH_32_PCREL .sx 0xC
 # CHECK-NEXT:     }
 # CHECK-NEXT:   ]
 
@@ -64,9 +65,11 @@
 # RELAX-NEXT:     0x38 R_LARCH_SUB32 y 0x0
 # RELAX-NEXT:   }
 # RELAX-NEXT:   Section ({{.*}}) .rela.sy {
-# RELAX-NEXT:     0x4 R_LARCH_ALIGN - 0xC
-# RELAX-NEXT:     0x10 R_LARCH_ADD32 x 0x0
-# RELAX-NEXT:     0x10 R_LARCH_SUB32 y 0x0
+# RELAX-NEXT:     0x0 R_LARCH_CALL36 foo 0x0
+# RELAX-NEXT:     0x0 R_LARCH_RELAX - 0x0
+# RELAX-NEXT:     0x8 R_LARCH_ALIGN - 0xC
+# RELAX-NEXT:     0x14 R_LARCH_ADD32 x 0x0
+# RELAX-NEXT:     0x14 R_LARCH_SUB32 y 0x0
 # RELAX-NEXT:   }
 # RELAX-NEXT: ]
 
@@ -89,7 +92,7 @@ la.pcrel $a0, z
 .4byte .-y
 
 .section .sy,"ax"
-nop
+call36 foo
 y:
 .p2align 4
 .4byte x-y


        


More information about the llvm-commits mailing list