[llvm] 922dde3 - MCAssembler: Simplify fixup handling
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 2 20:08:01 PDT 2025
Author: Fangrui Song
Date: 2025-07-02T20:07:56-07:00
New Revision: 922dde3c6403c7ef61f3c21af485a7feeb931a09
URL: https://github.com/llvm/llvm-project/commit/922dde3c6403c7ef61f3c21af485a7feeb931a09
DIFF: https://github.com/llvm/llvm-project/commit/922dde3c6403c7ef61f3c21af485a7feeb931a09.diff
LOG: MCAssembler: Simplify fixup handling
Added:
Modified:
llvm/lib/MC/MCAssembler.cpp
llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
Removed:
################################################################################
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index f57fd08e50d53..5dd5a6b7b9fab 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -873,69 +873,20 @@ void MCAssembler::layout() {
// Evaluate and apply the fixups, generating relocation entries as necessary.
for (MCSection &Sec : *this) {
for (MCFragment &Frag : Sec) {
- MutableArrayRef<MCFixup> Fixups;
- MutableArrayRef<char> Contents;
-
- // Process MCAlignFragment and MCEncodedFragmentWithFixups here.
- switch (Frag.getKind()) {
- default:
- continue;
- case MCFragment::FT_Align: {
- MCAlignFragment &AF = cast<MCAlignFragment>(Frag);
- // Insert fixup type for code alignment if the target define
- // shouldInsertFixupForCodeAlign target hook.
- if (Sec.useCodeAlign() && AF.hasEmitNops())
- getBackend().shouldInsertFixupForCodeAlign(*this, AF);
- continue;
- }
- case MCFragment::FT_Data: {
- MCDataFragment &DF = cast<MCDataFragment>(Frag);
- Fixups = DF.getFixups();
- Contents = DF.getContents();
- break;
- }
- case MCFragment::FT_Relaxable: {
- MCRelaxableFragment &RF = cast<MCRelaxableFragment>(Frag);
- Fixups = RF.getFixups();
- Contents = RF.getContents();
- break;
- }
- case MCFragment::FT_CVDefRange: {
- MCCVDefRangeFragment &CF = cast<MCCVDefRangeFragment>(Frag);
- Fixups = CF.getFixups();
- Contents = CF.getContents();
- break;
- }
- case MCFragment::FT_Dwarf: {
- MCDwarfLineAddrFragment &DF = cast<MCDwarfLineAddrFragment>(Frag);
- Fixups = DF.getFixups();
- Contents = DF.getContents();
- break;
- }
- case MCFragment::FT_DwarfFrame: {
- MCDwarfCallFrameFragment &DF = cast<MCDwarfCallFrameFragment>(Frag);
- Fixups = DF.getFixups();
- Contents = DF.getContents();
- break;
- }
- case MCFragment::FT_LEB: {
- auto &LF = cast<MCLEBFragment>(Frag);
- Fixups = LF.getFixups();
- Contents = LF.getContents();
- break;
- }
- case MCFragment::FT_PseudoProbe: {
- MCPseudoProbeAddrFragment &PF = cast<MCPseudoProbeAddrFragment>(Frag);
- Fixups = PF.getFixups();
- Contents = PF.getContents();
- break;
- }
- }
- for (const MCFixup &Fixup : Fixups) {
- uint64_t FixedValue;
- MCValue Target;
- evaluateFixup(Frag, Fixup, Target, FixedValue,
- /*RecordReloc=*/true, Contents);
+ // Process fragments with fixups here.
+ if (auto *F = dyn_cast<MCEncodedFragment>(&Frag)) {
+ auto Contents = F->getContents();
+ for (const MCFixup &Fixup : F->getFixups()) {
+ uint64_t FixedValue;
+ MCValue Target;
+ evaluateFixup(Frag, Fixup, Target, FixedValue,
+ /*RecordReloc=*/true, Contents);
+ }
+ } else if (auto *AF = dyn_cast<MCAlignFragment>(&Frag)) {
+ // For RISC-V linker relaxation, an alignment relocation might be
+ // needed.
+ if (AF->hasEmitNops())
+ getBackend().shouldInsertFixupForCodeAlign(*this, *AF);
}
}
}
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
index 75ef861d58a1c..57f1a6295a704 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
@@ -885,7 +885,6 @@ bool RISCVAsmBackend::shouldInsertFixupForCodeAlign(MCAssembler &Asm,
MCContext &Ctx = getContext();
const MCExpr *Dummy = MCConstantExpr::create(0, Ctx);
- // Create fixup_riscv_align fixup.
MCFixup Fixup = MCFixup::create(0, Dummy, ELF::R_RISCV_ALIGN, SMLoc());
uint64_t FixedValue = 0;
More information about the llvm-commits
mailing list