aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCObjectStreamer.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2025-07-15 19:36:19 -0700
committerGitHub <noreply@github.com>2025-07-15 19:36:19 -0700
commit28e1473e8e523150914e8c7ea50b44fb0d2a8d65 (patch)
treec97e05aaa31885e87733f30ec742a71f5fda8f9c /llvm/lib/MC/MCObjectStreamer.cpp
parent0f6a2db2594f5ffaf9bcd03f8233a850aa7d32af (diff)
downloadllvm-28e1473e8e523150914e8c7ea50b44fb0d2a8d65.zip
llvm-28e1473e8e523150914e8c7ea50b44fb0d2a8d65.tar.gz
llvm-28e1473e8e523150914e8c7ea50b44fb0d2a8d65.tar.bz2
MC: Remove bundle alignment mode
The being-removed PNaCl has a Software Fault Isolation mechanism, which requires that certain instructions and groups of instructions do not cross a bundle boundary. When `.bundle_align_mode` is in effect, each instruction is placed in its own fragment, allowing flexible NOP padding. This feature has significantly complicated our refactoring of MCStreamer and MCFragment, leading to considerable effort spent untangling it (including flushPendingLabels (75006466296ed4b0f845cbbec4bf77c21de43b40), MCAssembler iteration improvement, and recent MCFragment refactoring). * Make MCObjectStreamer::emitInstToData non-virtual and delete MCELFStreamer::emitInstTodata * Delete MCELFStreamer::emitValueImpl and emitValueToAlignment Minor instructions:u decrease for both -O0 -g and -O3 builds https://llvm-compile-time-tracker.com/compare.php?from=c06d3a7b728293cbc53ff91239d6cd87c0982ffb&to=9b078c7f228bc5b6cdbfe839f751c9407f8aec3e&stat=instructions:u Pull Request: https://github.com/llvm/llvm-project/pull/148781
Diffstat (limited to 'llvm/lib/MC/MCObjectStreamer.cpp')
-rw-r--r--llvm/lib/MC/MCObjectStreamer.cpp57
1 files changed, 20 insertions, 37 deletions
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index 44a82f7..4ab5e3e 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -141,10 +141,6 @@ static bool canReuseDataFragment(const MCDataFragment &F,
// instruction cannot be resolved at assemble-time.
if (F.isLinkerRelaxable())
return false;
- // When bundling is enabled, we don't want to add data to a fragment that
- // already has instructions (see MCELFStreamer::emitInstToData for details)
- if (Assembler.isBundlingEnabled())
- return false;
// If the subtarget is changed mid fragment we start a new fragment to record
// the new STI.
return !STI || F.getSubtargetInfo() == STI;
@@ -359,13 +355,8 @@ void MCObjectStreamer::emitInstructionImpl(const MCInst &Inst,
return;
}
- // Otherwise, relax and emit it as data if either:
- // - The RelaxAll flag was passed
- // - Bundling is enabled and this instruction is inside a bundle-locked
- // group. We want to emit all such instructions into the same data
- // fragment.
- if (Assembler.getRelaxAll() ||
- (Assembler.isBundlingEnabled() && Sec->isBundleLocked())) {
+ // Otherwise, relax and emit it as data if RelaxAll is specified.
+ if (Assembler.getRelaxAll()) {
MCInst Relaxed = Inst;
while (Backend.mayNeedRelaxation(Relaxed.getOpcode(), Relaxed.getOperands(),
STI))
@@ -380,18 +371,27 @@ void MCObjectStreamer::emitInstructionImpl(const MCInst &Inst,
void MCObjectStreamer::emitInstToData(const MCInst &Inst,
const MCSubtargetInfo &STI) {
- MCDataFragment *DF = getOrCreateDataFragment();
+ MCDataFragment *F = getOrCreateDataFragment(&STI);
+
+ // Append the instruction to the data fragment.
+ size_t FixupStartIndex = F->getFixups().size();
+ size_t CodeOffset = F->getContents().size();
SmallVector<MCFixup, 1> Fixups;
- SmallString<256> Code;
- getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
+ getAssembler().getEmitter().encodeInstruction(
+ Inst, F->getContentsForAppending(), Fixups, STI);
+ F->doneAppending();
+ if (!Fixups.empty())
+ F->appendFixups(Fixups);
- auto CodeOffset = DF->getContents().size();
- for (MCFixup &Fixup : Fixups)
+ for (auto &Fixup : MutableArrayRef(F->getFixups()).slice(FixupStartIndex)) {
Fixup.setOffset(Fixup.getOffset() + CodeOffset);
- if (!Fixups.empty())
- DF->appendFixups(Fixups);
- DF->setHasInstructions(STI);
- DF->appendContents(Code);
+ if (Fixup.isLinkerRelaxable()) {
+ F->setLinkerRelaxable();
+ getCurrentSectionOnly()->setLinkerRelaxable();
+ }
+ }
+
+ F->setHasInstructions(STI);
}
void MCObjectStreamer::emitInstToFragment(const MCInst &Inst,
@@ -410,23 +410,6 @@ void MCObjectStreamer::emitInstToFragment(const MCInst &Inst,
IF->appendFixups(Fixups);
}
-#ifndef NDEBUG
-static const char *const BundlingNotImplementedMsg =
- "Aligned bundling is not implemented for this object format";
-#endif
-
-void MCObjectStreamer::emitBundleAlignMode(Align Alignment) {
- llvm_unreachable(BundlingNotImplementedMsg);
-}
-
-void MCObjectStreamer::emitBundleLock(bool AlignToEnd) {
- llvm_unreachable(BundlingNotImplementedMsg);
-}
-
-void MCObjectStreamer::emitBundleUnlock() {
- llvm_unreachable(BundlingNotImplementedMsg);
-}
-
void MCObjectStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
unsigned Column, unsigned Flags,
unsigned Isa,