[llvm] 6ebc423 - MCStreamer: Move fragment-related functions to MCObjectStreamer
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 20 21:15:39 PDT 2025
Author: Fangrui Song
Date: 2025-07-20T21:15:34-07:00
New Revision: 6ebc42322ca7bd0261c1faa6e2d785057ab95c5f
URL: https://github.com/llvm/llvm-project/commit/6ebc42322ca7bd0261c1faa6e2d785057ab95c5f
DIFF: https://github.com/llvm/llvm-project/commit/6ebc42322ca7bd0261c1faa6e2d785057ab95c5f.diff
LOG: MCStreamer: Move fragment-related functions to MCObjectStreamer
They are specific to MCObjectStreamer and unneeded by MCAsmStreamer.
Add isObj() so that MCTargetAsmParser can determine whether the streamer
is MCObjectStreamer and conditionally call newFragment.
Added:
Modified:
llvm/include/llvm/MC/MCObjectStreamer.h
llvm/include/llvm/MC/MCStreamer.h
llvm/lib/MC/MCObjectStreamer.cpp
llvm/lib/MC/MCParser/MCTargetAsmParser.cpp
llvm/lib/MC/MCStreamer.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCObjectStreamer.h b/llvm/include/llvm/MC/MCObjectStreamer.h
index e06bfb287da0e..c19053fa48e86 100644
--- a/llvm/include/llvm/MC/MCObjectStreamer.h
+++ b/llvm/include/llvm/MC/MCObjectStreamer.h
@@ -80,6 +80,13 @@ class MCObjectStreamer : public MCStreamer {
/// \name MCStreamer Interface
/// @{
+ // Add a fragment with a variable-size tail and start a new empty fragment.
+ void insert(MCFragment *F);
+
+ void addFixup(const MCExpr *Value, MCFixupKind Kind, uint32_t Offset = 0);
+ // Add a new fragment to the current section without a variable-size tail.
+ void newFragment();
+
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment &F,
uint64_t Offset);
diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h
index bdee9ea8452e0..ca6166e415a5f 100644
--- a/llvm/include/llvm/MC/MCStreamer.h
+++ b/llvm/include/llvm/MC/MCStreamer.h
@@ -259,6 +259,8 @@ class LLVM_ABI MCStreamer {
bool AllowAutoPadding = false;
protected:
+ bool IsObj = false;
+
// Symbol of the current epilog for which we are processing SEH directives.
WinEH::FrameInfo::Epilog *CurrentWinEpilog = nullptr;
@@ -310,6 +312,7 @@ class LLVM_ABI MCStreamer {
virtual void reset();
MCContext &getContext() const { return Context; }
+ bool isObj() const { return IsObj; }
// MCObjectStreamer has an MCAssembler and allows more expression folding at
// parse time.
@@ -462,11 +465,6 @@ class LLVM_ABI MCStreamer {
MCSymbol *endSection(MCSection *Section);
- /// Add a new fragment to the current section without a variable-size tail.
- void newFragment();
- /// Add a fragment with a variable-size tail and start a new empty fragment.
- void insert(MCFragment *F);
-
/// Returns the mnemonic for \p MI, if the streamer has access to a
/// instruction printer and returns an empty string otherwise.
virtual StringRef getMnemonic(const MCInst &MI) const { return ""; }
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index bf6ebb4cd660e..7087c95dd04b1 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -33,6 +33,7 @@ MCObjectStreamer::MCObjectStreamer(MCContext &Context,
Context, std::move(TAB), std::move(Emitter), std::move(OW))),
EmitEHFrame(true), EmitDebugFrame(false) {
assert(Assembler->getBackendPtr() && Assembler->getEmitterPtr());
+ IsObj = true;
setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
if (Context.getTargetOptions() && Context.getTargetOptions()->MCRelaxAll)
Assembler->setRelaxAll(true);
@@ -46,6 +47,23 @@ MCAssembler *MCObjectStreamer::getAssemblerPtr() {
return nullptr;
}
+void MCObjectStreamer::newFragment() {
+ addFragment(getContext().allocFragment<MCFragment>());
+}
+
+void MCObjectStreamer::insert(MCFragment *F) {
+ assert(F->getKind() != MCFragment::FT_Data &&
+ "F should have a variable-size tail");
+ addFragment(F);
+ newFragment();
+}
+
+void MCObjectStreamer::addFixup(const MCExpr *Value, MCFixupKind Kind,
+ uint32_t Offset) {
+ CurFrag->addFixup(
+ MCFixup::create(CurFrag->getFixedSize() + Offset, Value, Kind));
+}
+
// As a compile-time optimization, avoid allocating and evaluating an MCExpr
// tree for (Hi - Lo) when Hi and Lo are offsets into the same fragment's fixed
// part.
diff --git a/llvm/lib/MC/MCParser/MCTargetAsmParser.cpp b/llvm/lib/MC/MCParser/MCTargetAsmParser.cpp
index 7f0934971b27c..d7b0546d70558 100644
--- a/llvm/lib/MC/MCParser/MCTargetAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/MCTargetAsmParser.cpp
@@ -8,8 +8,8 @@
#include "llvm/MC/MCParser/MCTargetAsmParser.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCRegister.h"
-#include "llvm/MC/MCStreamer.h"
using namespace llvm;
@@ -25,8 +25,9 @@ MCSubtargetInfo &MCTargetAsmParser::copySTI() {
STI = &STICopy;
// The returned STI will likely be modified. Create a new fragment to prevent
// mixing STI values within a fragment.
- if (getStreamer().getCurrentFragment())
- getStreamer().newFragment();
+ auto &S = getStreamer();
+ if (S.isObj() && S.getCurrentFragment())
+ static_cast<MCObjectStreamer &>(S).newFragment();
return STICopy;
}
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index b0e52bf511ba4..30198c97d8ab9 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -1413,17 +1413,6 @@ void MCStreamer::addFragment(MCFragment *F) {
Sec->curFragList()->Tail = F;
}
-void MCStreamer::newFragment() {
- addFragment(getContext().allocFragment<MCFragment>());
-}
-
-void MCStreamer::insert(MCFragment *F) {
- assert(F->getKind() != MCFragment::FT_Data &&
- "F should have a variable-size tail");
- addFragment(F);
- newFragment();
-}
-
static VersionTuple
targetVersionOrMinimumSupportedOSVersion(const Triple &Target,
VersionTuple TargetVersion) {
More information about the llvm-commits
mailing list