Skip to content

Commit 8728e09

Browse files
committed
[MC] Allow MCAssembler to be constructed without all subcomponents. NFCI.
llvm-svn: 331047
1 parent 82dd99e commit 8728e09

File tree

4 files changed

+50
-27
lines changed

4 files changed

+50
-27
lines changed

llvm/include/llvm/MC/MCAssembler.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ class MCAssembler {
9999
private:
100100
MCContext &Context;
101101

102-
MCAsmBackend &Backend;
102+
std::unique_ptr<MCAsmBackend> Backend;
103103

104-
MCCodeEmitter &Emitter;
104+
std::unique_ptr<MCCodeEmitter> Emitter;
105105

106-
MCObjectWriter &Writer;
106+
std::unique_ptr<MCObjectWriter> Writer;
107107

108108
SectionListType Sections;
109109

@@ -214,8 +214,9 @@ class MCAssembler {
214214
// concrete and require clients to pass in a target like object. The other
215215
// option is to make this abstract, and have targets provide concrete
216216
// implementations as we do with AsmParser.
217-
MCAssembler(MCContext &Context, MCAsmBackend &Backend,
218-
MCCodeEmitter &Emitter, MCObjectWriter &Writer);
217+
MCAssembler(MCContext &Context, std::unique_ptr<MCAsmBackend> Backend,
218+
std::unique_ptr<MCCodeEmitter> Emitter,
219+
std::unique_ptr<MCObjectWriter> Writer);
219220
MCAssembler(const MCAssembler &) = delete;
220221
MCAssembler &operator=(const MCAssembler &) = delete;
221222
~MCAssembler();
@@ -274,11 +275,17 @@ class MCAssembler {
274275

275276
MCContext &getContext() const { return Context; }
276277

277-
MCAsmBackend &getBackend() const { return Backend; }
278+
MCAsmBackend *getBackendPtr() const { return Backend.get(); }
278279

279-
MCCodeEmitter &getEmitter() const { return Emitter; }
280+
MCCodeEmitter *getEmitterPtr() const { return Emitter.get(); }
280281

281-
MCObjectWriter &getWriter() const { return Writer; }
282+
MCObjectWriter *getWriterPtr() const { return Writer.get(); }
283+
284+
MCAsmBackend &getBackend() const { return *Backend; }
285+
286+
MCCodeEmitter &getEmitter() const { return *Emitter; }
287+
288+
MCObjectWriter &getWriter() const { return *Writer; }
282289

283290
MCDwarfLineTableParams getDWARFLinetableParams() const { return LTParams; }
284291
void setDWARFLinetableParams(MCDwarfLineTableParams P) { LTParams = P; }

llvm/include/llvm/MC/MCObjectStreamer.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ class raw_pwrite_stream;
3434
/// to that file format or custom semantics expected by the object writer
3535
/// implementation.
3636
class MCObjectStreamer : public MCStreamer {
37-
std::unique_ptr<MCObjectWriter> ObjectWriter;
38-
std::unique_ptr<MCAsmBackend> TAB;
39-
std::unique_ptr<MCCodeEmitter> Emitter;
4037
std::unique_ptr<MCAssembler> Assembler;
4138
MCSection::iterator CurInsertionPoint;
4239
bool EmitEHFrame;

llvm/lib/MC/MCAssembler.cpp

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,12 @@ STATISTIC(PaddingFragmentsBytes,
8383

8484
/* *** */
8585

86-
MCAssembler::MCAssembler(MCContext &Context, MCAsmBackend &Backend,
87-
MCCodeEmitter &Emitter, MCObjectWriter &Writer)
88-
: Context(Context), Backend(Backend), Emitter(Emitter), Writer(Writer),
86+
MCAssembler::MCAssembler(MCContext &Context,
87+
std::unique_ptr<MCAsmBackend> Backend,
88+
std::unique_ptr<MCCodeEmitter> Emitter,
89+
std::unique_ptr<MCObjectWriter> Writer)
90+
: Context(Context), Backend(std::move(Backend)),
91+
Emitter(std::move(Emitter)), Writer(std::move(Writer)),
8992
BundleAlignSize(0), RelaxAll(false), SubsectionsViaSymbols(false),
9093
IncrementalLinkerCompatible(false), ELFHeaderEFlags(0) {
9194
VersionInfo.Major = 0; // Major version == 0 for "none specified"
@@ -110,9 +113,12 @@ void MCAssembler::reset() {
110113
VersionInfo.Major = 0;
111114

112115
// reset objects owned by us
113-
getBackend().reset();
114-
getEmitter().reset();
115-
getWriter().reset();
116+
if (getBackendPtr())
117+
getBackendPtr()->reset();
118+
if (getEmitterPtr())
119+
getEmitterPtr()->reset();
120+
if (getWriterPtr())
121+
getWriterPtr()->reset();
116122
getLOHContainer().reset();
117123
}
118124

@@ -215,8 +221,9 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
215221
}
216222
}
217223

218-
bool IsPCRel = Backend.getFixupKindInfo(
219-
Fixup.getKind()).Flags & MCFixupKindInfo::FKF_IsPCRel;
224+
assert(getBackendPtr() && "Expected assembler backend");
225+
bool IsPCRel = getBackendPtr()->getFixupKindInfo(Fixup.getKind()).Flags &
226+
MCFixupKindInfo::FKF_IsPCRel;
220227

221228
bool IsResolved;
222229
if (IsPCRel) {
@@ -251,8 +258,8 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
251258
Value -= Layout.getSymbolOffset(Sym);
252259
}
253260

254-
bool ShouldAlignPC = Backend.getFixupKindInfo(Fixup.getKind()).Flags &
255-
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits;
261+
bool ShouldAlignPC = getBackend().getFixupKindInfo(Fixup.getKind()).Flags &
262+
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits;
256263
assert((ShouldAlignPC ? IsPCRel : true) &&
257264
"FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!");
258265

@@ -266,14 +273,15 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
266273
}
267274

268275
// Let the backend force a relocation if needed.
269-
if (IsResolved && Backend.shouldForceRelocation(*this, Fixup, Target))
276+
if (IsResolved && getBackend().shouldForceRelocation(*this, Fixup, Target))
270277
IsResolved = false;
271278

272279
return IsResolved;
273280
}
274281

275282
uint64_t MCAssembler::computeFragmentSize(const MCAsmLayout &Layout,
276283
const MCFragment &F) const {
284+
assert(getBackendPtr() && "Requires assembler backend");
277285
switch (F.getKind()) {
278286
case MCFragment::FT_Data:
279287
return cast<MCDataFragment>(F).getContents().size();
@@ -437,6 +445,7 @@ void MCAssembler::registerSymbol(const MCSymbol &Symbol, bool *Created) {
437445

438446
void MCAssembler::writeFragmentPadding(const MCFragment &F, uint64_t FSize,
439447
MCObjectWriter *OW) const {
448+
assert(getBackendPtr() && "Expected assembler backend");
440449
// Should NOP padding be written out before this fragment?
441450
unsigned BundlePadding = F.getBundlePadding();
442451
if (BundlePadding > 0) {
@@ -470,7 +479,8 @@ void MCAssembler::writeFragmentPadding(const MCFragment &F, uint64_t FSize,
470479
/// \brief Write the fragment \p F to the output file.
471480
static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,
472481
const MCFragment &F) {
473-
MCObjectWriter *OW = &Asm.getWriter();
482+
MCObjectWriter *OW = Asm.getWriterPtr();
483+
assert(OW && "Need ObjectWriter to write fragment");
474484

475485
// FIXME: Embed in fragments instead?
476486
uint64_t FragmentSize = Asm.computeFragmentSize(Layout, F);
@@ -619,6 +629,8 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,
619629

620630
void MCAssembler::writeSectionData(const MCSection *Sec,
621631
const MCAsmLayout &Layout) const {
632+
assert(getBackendPtr() && "Expected assembler backend");
633+
622634
// Ignore virtual sections.
623635
if (Sec->isVirtualSection()) {
624636
assert(Layout.getSectionFileSize(Sec) == 0 && "Invalid size for section!");
@@ -688,6 +700,7 @@ MCAssembler::handleFixup(const MCAsmLayout &Layout, MCFragment &F,
688700
}
689701

690702
void MCAssembler::layout(MCAsmLayout &Layout) {
703+
assert(getBackendPtr() && "Expected assembler backend");
691704
DEBUG_WITH_TYPE("mc-dump", {
692705
errs() << "assembler backend - pre-layout\n--\n";
693706
dump(); });
@@ -788,6 +801,7 @@ void MCAssembler::Finish() {
788801
bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
789802
const MCRelaxableFragment *DF,
790803
const MCAsmLayout &Layout) const {
804+
assert(getBackendPtr() && "Expected assembler backend");
791805
MCValue Target;
792806
uint64_t Value;
793807
bool Resolved = evaluateFixup(Layout, Fixup, DF, Target, Value);
@@ -801,6 +815,7 @@ bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
801815

802816
bool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F,
803817
const MCAsmLayout &Layout) const {
818+
assert(getBackendPtr() && "Expected assembler backend");
804819
// If this inst doesn't ever need relaxation, ignore it. This occurs when we
805820
// are intentionally pushing out inst fragments, or because we relaxed a
806821
// previous instruction to one that doesn't need relaxation.
@@ -816,6 +831,8 @@ bool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F,
816831

817832
bool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
818833
MCRelaxableFragment &F) {
834+
assert(getEmitterPtr() &&
835+
"Expected CodeEmitter defined for relaxInstruction");
819836
if (!fragmentNeedsRelaxation(&F, Layout))
820837
return false;
821838

@@ -848,6 +865,7 @@ bool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
848865

849866
bool MCAssembler::relaxPaddingFragment(MCAsmLayout &Layout,
850867
MCPaddingFragment &PF) {
868+
assert(getBackendPtr() && "Expected assembler backend");
851869
uint64_t OldSize = PF.getSize();
852870
if (!getBackend().relaxFragment(&PF, Layout))
853871
return false;
@@ -992,6 +1010,7 @@ bool MCAssembler::layoutOnce(MCAsmLayout &Layout) {
9921010
}
9931011

9941012
void MCAssembler::finishLayout(MCAsmLayout &Layout) {
1013+
assert(getBackendPtr() && "Expected assembler backend");
9951014
// The layout is done. Mark every fragment as valid.
9961015
for (unsigned int i = 0, n = Layout.getSectionOrder().size(); i != n; ++i) {
9971016
MCSection &Section = *Layout.getSectionOrder()[i];

llvm/lib/MC/MCObjectStreamer.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ MCObjectStreamer::MCObjectStreamer(MCContext &Context,
2727
std::unique_ptr<MCAsmBackend> TAB,
2828
raw_pwrite_stream &OS,
2929
std::unique_ptr<MCCodeEmitter> Emitter)
30-
: MCStreamer(Context), ObjectWriter(TAB->createObjectWriter(OS)),
31-
TAB(std::move(TAB)), Emitter(std::move(Emitter)),
32-
Assembler(llvm::make_unique<MCAssembler>(Context, *this->TAB,
33-
*this->Emitter, *ObjectWriter)),
30+
: MCStreamer(Context),
31+
Assembler(llvm::make_unique<MCAssembler>(Context, std::move(TAB),
32+
std::move(Emitter),
33+
TAB->createObjectWriter(OS))),
3434
EmitEHFrame(true), EmitDebugFrame(false) {}
3535

3636
MCObjectStreamer::~MCObjectStreamer() {}

0 commit comments

Comments
 (0)