[PATCH] D83366: [MC] Simplify the logic of applying fixup for fragments, NFCI
Kan Shengchen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 7 20:30:50 PDT 2020
skan created this revision.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D83366
Files:
llvm/lib/MC/MCAssembler.cpp
Index: llvm/lib/MC/MCAssembler.cpp
===================================================================
--- llvm/lib/MC/MCAssembler.cpp
+++ llvm/lib/MC/MCAssembler.cpp
@@ -820,48 +820,58 @@
// Evaluate and apply the fixups, generating relocation entries as necessary.
for (MCSection &Sec : *this) {
for (MCFragment &Frag : Sec) {
- // Data and relaxable fragments both have fixups. So only process
- // those here.
- // FIXME: Is there a better way to do this? MCEncodedFragmentWithFixups
- // being templated makes this tricky.
- if (isa<MCEncodedFragment>(&Frag) &&
- isa<MCCompactEncodedInstFragment>(&Frag))
- continue;
- if (!isa<MCEncodedFragment>(&Frag) && !isa<MCCVDefRangeFragment>(&Frag) &&
- !isa<MCAlignFragment>(&Frag))
+ // Insert fixup type for code alignment if the target define
+ // shouldInsertFixupForCodeAlign target hook.
+ if (MCAlignFragment *AF = dyn_cast<MCAlignFragment>(&Frag)) {
+ if (Sec.UseCodeAlign() && AF->hasEmitNops()) {
+ getBackend().shouldInsertFixupForCodeAlign(*this, Layout, *AF);
+ }
continue;
+ }
+ // Only process MCEncodedFragmentWithFixups here.
ArrayRef<MCFixup> Fixups;
MutableArrayRef<char> Contents;
const MCSubtargetInfo *STI = nullptr;
- if (auto *FragWithFixups = dyn_cast<MCDataFragment>(&Frag)) {
- Fixups = FragWithFixups->getFixups();
- Contents = FragWithFixups->getContents();
- STI = FragWithFixups->getSubtargetInfo();
- assert(!FragWithFixups->hasInstructions() || STI != nullptr);
- } else if (auto *FragWithFixups = dyn_cast<MCRelaxableFragment>(&Frag)) {
- Fixups = FragWithFixups->getFixups();
- Contents = FragWithFixups->getContents();
- STI = FragWithFixups->getSubtargetInfo();
- assert(!FragWithFixups->hasInstructions() || STI != nullptr);
- } else if (auto *FragWithFixups = dyn_cast<MCCVDefRangeFragment>(&Frag)) {
- Fixups = FragWithFixups->getFixups();
- Contents = FragWithFixups->getContents();
- } else if (auto *FragWithFixups = dyn_cast<MCDwarfLineAddrFragment>(&Frag)) {
- Fixups = FragWithFixups->getFixups();
- Contents = FragWithFixups->getContents();
- } else if (auto *AF = dyn_cast<MCAlignFragment>(&Frag)) {
- // Insert fixup type for code alignment if the target define
- // shouldInsertFixupForCodeAlign target hook.
- if (Sec.UseCodeAlign() && AF->hasEmitNops()) {
- getBackend().shouldInsertFixupForCodeAlign(*this, Layout, *AF);
- }
+ switch (Frag.getKind()) {
+ default:
+ // We reach here when Frag is not neither a MCAlignFragment nor
+ // MCEncodedFragmentWithFixups.
continue;
- } else if (auto *FragWithFixups =
- dyn_cast<MCDwarfCallFrameFragment>(&Frag)) {
- Fixups = FragWithFixups->getFixups();
- Contents = FragWithFixups->getContents();
- } else
- llvm_unreachable("Unknown fragment with fixups!");
+ case MCFragment::FT_Data: {
+ MCDataFragment &DF = cast<MCDataFragment>(Frag);
+ Fixups = DF.getFixups();
+ Contents = DF.getContents();
+ STI = DF.getSubtargetInfo();
+ assert(!DF.hasInstructions() || STI != nullptr);
+ break;
+ }
+ case MCFragment::FT_Relaxable: {
+ MCRelaxableFragment &RF = cast<MCRelaxableFragment>(Frag);
+ Fixups = RF.getFixups();
+ Contents = RF.getContents();
+ STI = RF.getSubtargetInfo();
+ assert(!RF.hasInstructions() || STI != nullptr);
+ 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;
+ }
+ }
for (const MCFixup &Fixup : Fixups) {
uint64_t FixedValue;
bool IsResolved;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83366.276306.patch
Type: text/x-patch
Size: 4411 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200708/f1eb6bd0/attachment.bin>
More information about the llvm-commits
mailing list