[llvm] [LoongArch] Allow difference across sections (PR #141722)
via llvm-commits
llvm-commits at lists.llvm.org
Wed May 28 00:33:34 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: Jinyang He (MQ-mengqing)
<details>
<summary>Changes</summary>
For SecA != SecB but SecB is current section, fallback for pcrel{64,32} relocations. For linker relaxation being disabled and SecA == SecB, return directly for avoid record relocations. In other cases, record relocations which also allows across sections.
---
Full diff: https://github.com/llvm/llvm-project/pull/141722.diff
4 Files Affected:
- (modified) llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp (+7-10)
- (modified) llvm/test/MC/LoongArch/Misc/cfi-advance.s (+8)
- (modified) llvm/test/MC/LoongArch/Relocations/fde-reloc.s (+6-1)
- (modified) llvm/test/MC/LoongArch/Relocations/sub-expr.s (+48-6)
``````````diff
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
index d7569ab0ea597..9566fd0b163da 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
@@ -447,19 +447,16 @@ bool LoongArchAsmBackend::addReloc(const MCFragment &F, const MCFixup &Fixup,
if (!force) {
const MCSection &SecA = SA.getSection();
const MCSection &SecB = SB.getSection();
+ const MCSection &SecCur = *F.getParent();
- // We need record relocation if SecA != SecB. Usually SecB is same as the
- // section of Fixup, which will be record the relocation as PCRel. If SecB
- // is not same as the section of Fixup, it will report error. Just return
- // false and then this work can be finished by handleFixup.
- if (&SecA != &SecB)
+ // Fallback for PCRel relocations.
+ if ((&SecA != &SecB) && (&SecB == &SecCur))
return Fallback();
- // In SecA == SecB case. If the linker relaxation is enabled, we need
- // record the ADD, SUB relocations. Otherwise the FixedValue has already
- // been calc- ulated out in evaluateFixup, return true and avoid record
- // relocations.
- if (!STI.hasFeature(LoongArch::FeatureRelax))
+ // In SecA == SecB case. If the linker relaxation is disabled, the
+ // FixedValue has already been calculated out in evaluateFixup,
+ // return true and avoid record relocations.
+ if ((&SecA == &SecB) && !STI.hasFeature(LoongArch::FeatureRelax))
return true;
}
diff --git a/llvm/test/MC/LoongArch/Misc/cfi-advance.s b/llvm/test/MC/LoongArch/Misc/cfi-advance.s
index 662c43e6bceaf..faec615c0b6d4 100644
--- a/llvm/test/MC/LoongArch/Misc/cfi-advance.s
+++ b/llvm/test/MC/LoongArch/Misc/cfi-advance.s
@@ -1,6 +1,8 @@
# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=-relax %s -o %t.o
# RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=RELOC %s
# RUN: llvm-dwarfdump --debug-frame %t.o | FileCheck --check-prefix=DWARFDUMP %s
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=+relax %s \
+# RUN: | llvm-readobj -r - | FileCheck --check-prefix=RELAX %s
# RELOC: Relocations [
# RELOC-NEXT: .rela.eh_frame {
@@ -12,6 +14,12 @@
# DWARFDUMP-NEXT: DW_CFA_advance_loc: 8
# DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
+# RELAX: Relocations [
+# RELAX: .rela.eh_frame {
+# RELAX-NEXT: 0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
+# RELAX-NEXT: }
+# RELAX-NEXT: ]
+
.text
.globl test
.p2align 2
diff --git a/llvm/test/MC/LoongArch/Relocations/fde-reloc.s b/llvm/test/MC/LoongArch/Relocations/fde-reloc.s
index 990e07c7f00bd..ab911d1853a87 100644
--- a/llvm/test/MC/LoongArch/Relocations/fde-reloc.s
+++ b/llvm/test/MC/LoongArch/Relocations/fde-reloc.s
@@ -1,5 +1,7 @@
-# RUN: llvm-mc --filetype=obj --triple=loongarch64 < %s \
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax < %s \
# RUN: | llvm-readobj -r - | FileCheck %s
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax < %s \
+# RUN: | llvm-readobj -r - | FileCheck %s --check-prefix=RELAX
## Ensure that the eh_frame records the symbolic difference with
## the R_LARCH_32_PCREL relocation.
@@ -12,3 +14,6 @@ func:
# CHECK: Section (4) .rela.eh_frame {
# CHECK-NEXT: 0x1C R_LARCH_32_PCREL .text 0x0
# CHECK-NEXT: }
+# RELAX: Section ({{.*}}) .rela.eh_frame {
+# RELAX-NEXT: 0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
+# RELAX-NEXT: }
diff --git a/llvm/test/MC/LoongArch/Relocations/sub-expr.s b/llvm/test/MC/LoongArch/Relocations/sub-expr.s
index 0179e1027af8f..b8d24b91ca1a8 100644
--- a/llvm/test/MC/LoongArch/Relocations/sub-expr.s
+++ b/llvm/test/MC/LoongArch/Relocations/sub-expr.s
@@ -1,5 +1,7 @@
-# RUN: llvm-mc --filetype=obj --triple=loongarch64 %s -o %t
-# RUN: llvm-readobj -r %t | FileCheck %s
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax %s \
+# RUN: | llvm-readobj -r - | FileCheck %s
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s \
+# RUN: | llvm-readobj -r - | FileCheck %s --check-prefix=RELAX
## Check that subtraction expressions emit R_LARCH_32_PCREL and R_LARCH_64_PCREL relocations.
@@ -7,13 +9,46 @@
# CHECK: Relocations [
# CHECK-NEXT: Section ({{.*}}) .rela.data {
-# CHECK-NEXT: 0x0 R_LARCH_64_PCREL sx 0x0
-# CHECK-NEXT: 0x8 R_LARCH_64_PCREL sy 0x0
-# CHECK-NEXT: 0x10 R_LARCH_32_PCREL sx 0x0
-# CHECK-NEXT: 0x14 R_LARCH_32_PCREL sy 0x0
+# CHECK-NEXT: 0x0 R_LARCH_64_PCREL sx 0x4
+# CHECK-NEXT: 0x8 R_LARCH_64_PCREL sy 0x4
+# CHECK-NEXT: 0x10 R_LARCH_32_PCREL sx 0x4
+# CHECK-NEXT: 0x14 R_LARCH_32_PCREL sy 0x4
+# 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: 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: 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: }
+# RELAX: Relocations [
+# RELAX-NEXT: Section ({{.*}}) .rela.data {
+# RELAX-NEXT: 0x0 R_LARCH_64_PCREL x 0x0
+# RELAX-NEXT: 0x8 R_LARCH_64_PCREL y 0x0
+# RELAX-NEXT: 0x10 R_LARCH_32_PCREL x 0x0
+# RELAX-NEXT: 0x14 R_LARCH_32_PCREL y 0x0
+# RELAX-NEXT: 0x18 R_LARCH_ADD64 x 0x0
+# RELAX-NEXT: 0x18 R_LARCH_SUB64 y 0x0
+# RELAX-NEXT: 0x20 R_LARCH_ADD64 y 0x0
+# RELAX-NEXT: 0x20 R_LARCH_SUB64 x 0x0
+# RELAX-NEXT: 0x28 R_LARCH_ADD32 x 0x0
+# RELAX-NEXT: 0x28 R_LARCH_SUB32 y 0x0
+# RELAX-NEXT: 0x2C R_LARCH_ADD32 y 0x0
+# RELAX-NEXT: 0x2C R_LARCH_SUB32 x 0x0
+# RELAX-NEXT: 0x30 R_LARCH_ADD64 {{.*}} 0x0
+# RELAX-NEXT: 0x30 R_LARCH_SUB64 x 0x0
+# RELAX-NEXT: 0x38 R_LARCH_ADD32 {{.*}} 0x0
+# RELAX-NEXT: 0x38 R_LARCH_SUB32 y 0x0
+# RELAX-NEXT: }
+
.section sx,"a"
+nop
x:
nop
@@ -22,7 +57,14 @@ nop
.8byte y-.
.4byte x-.
.4byte y-.
+.8byte x-y
+.8byte y-x
+.4byte x-y
+.4byte y-x
+.8byte .-x
+.4byte .-y
.section sy,"a"
+nop
y:
nop
``````````
</details>
https://github.com/llvm/llvm-project/pull/141722
More information about the llvm-commits
mailing list