[llvm] RISCV, LoongArch: Encode RELAX relocation implicitly (PR #140494)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun May 18 20:54:05 PDT 2025
================
@@ -444,60 +444,72 @@ bool LoongArchAsmBackend::addReloc(MCAssembler &Asm, const MCFragment &F,
return MCAsmBackend::addReloc(Asm, F, Fixup, Target, FixedValue, IsResolved,
CurSTI);
};
- if (!Target.getSubSym())
- return Fallback();
- assert(Target.getSpecifier() == 0 &&
- "relocatable SymA-SymB cannot have relocation specifier");
- std::pair<MCFixupKind, MCFixupKind> FK;
uint64_t FixedValueA, FixedValueB;
- const MCSymbol &SA = *Target.getAddSym();
- const MCSymbol &SB = *Target.getSubSym();
-
- bool force = !SA.isInSection() || !SB.isInSection();
- if (!force) {
- const MCSection &SecA = SA.getSection();
- const MCSection &SecB = SB.getSection();
-
- // 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)
- 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))
- return true;
+ if (Target.getSubSym()) {
+ assert(Target.getSpecifier() == 0 &&
+ "relocatable SymA-SymB cannot have relocation specifier");
+ std::pair<MCFixupKind, MCFixupKind> FK;
+ const MCSymbol &SA = *Target.getAddSym();
+ const MCSymbol &SB = *Target.getSubSym();
+
+ bool force = !SA.isInSection() || !SB.isInSection();
+ if (!force) {
+ const MCSection &SecA = SA.getSection();
+ const MCSection &SecB = SB.getSection();
+
+ // 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)
+ 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))
----------------
MaskRay wrote:
LoongArch-specific: We should use the argument STI instead of the member variable STI. But I do not intend to fix this in this PR. It's unclear why this code block is more complex than the RISCV counterpart.
https://github.com/llvm/llvm-project/pull/140494
More information about the llvm-commits
mailing list