Skip to content

Commit

Permalink
[MC] Export llvm::WinCOFFObjectWriter and access it from MCWinCOFFStr…
Browse files Browse the repository at this point in the history
…eamer

Similar to commit 28fcafb (2011) for
MachObjectWriter. MCWinCOFFStreamer can now access WinCOFFObjectWriter
directly without holding object file format specific inforamtion in
MCAssembler (e.g. IncrementalLinkerCompatible).
  • Loading branch information
MaskRay committed Jul 21, 2024
1 parent 6db2465 commit 9539a77
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 51 deletions.
8 changes: 0 additions & 8 deletions llvm/include/llvm/MC/MCAssembler.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ class MCAssembler {
bool HasLayout = false;
bool RelaxAll = false;
bool SubsectionsViaSymbols = false;
bool IncrementalLinkerCompatible = false;

SectionListType Sections;

Expand Down Expand Up @@ -298,13 +297,6 @@ class MCAssembler {
bool getSubsectionsViaSymbols() const { return SubsectionsViaSymbols; }
void setSubsectionsViaSymbols(bool Value) { SubsectionsViaSymbols = Value; }

bool isIncrementalLinkerCompatible() const {
return IncrementalLinkerCompatible;
}
void setIncrementalLinkerCompatible(bool Value) {
IncrementalLinkerCompatible = Value;
}

bool hasLayout() const { return HasLayout; }
bool getRelaxAll() const { return RelaxAll; }
void setRelaxAll(bool Value) { RelaxAll = Value; }
Expand Down
31 changes: 31 additions & 0 deletions llvm/include/llvm/MC/MCWinCOFFObjectWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,37 @@ class MCWinCOFFObjectTargetWriter : public MCObjectTargetWriter {
virtual bool recordRelocation(const MCFixup &) const { return true; }
};

class WinCOFFWriter;

class WinCOFFObjectWriter : public MCObjectWriter {
friend class WinCOFFWriter;

std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
std::unique_ptr<WinCOFFWriter> ObjWriter, DwoWriter;
bool IncrementalLinkerCompatible = false;

public:
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS);
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS);

// MCObjectWriter interface implementation.
void reset() override;
void setIncrementalLinkerCompatible(bool Value) {
IncrementalLinkerCompatible = Value;
}
void executePostLayoutBinding(MCAssembler &Asm) override;
bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
const MCSymbol &SymA,
const MCFragment &FB, bool InSet,
bool IsPCRel) const override;
void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
const MCFixup &Fixup, MCValue Target,
uint64_t &FixedValue) override;
uint64_t writeObject(MCAssembler &Asm) override;
};

/// Construct a new Win COFF writer instance.
///
/// \param MOTW - The target specific WinCOFF writer subclass.
Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/MC/MCWinCOFFStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class MCSection;
class MCSubtargetInfo;
class MCSymbol;
class StringRef;
class WinCOFFObjectWriter;
class raw_pwrite_stream;

class MCWinCOFFStreamer : public MCObjectStreamer {
Expand All @@ -36,6 +37,8 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
MCObjectStreamer::reset();
}

WinCOFFObjectWriter &getWriter();

/// \name MCStreamer interface
/// \{

Expand Down
1 change: 0 additions & 1 deletion llvm/lib/MC/MCAssembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ MCAssembler::~MCAssembler() = default;
void MCAssembler::reset() {
RelaxAll = false;
SubsectionsViaSymbols = false;
IncrementalLinkerCompatible = false;
Sections.clear();
Symbols.clear();
LinkerOptions.clear();
Expand Down
7 changes: 6 additions & 1 deletion llvm/lib/MC/MCWinCOFFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCSymbolCOFF.h"
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/MCWinCOFFObjectWriter.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
Expand All @@ -49,7 +50,11 @@ MCWinCOFFStreamer::MCWinCOFFStreamer(MCContext &Context,
CurSymbol(nullptr) {
auto *TO = Context.getTargetOptions();
if (TO && TO->MCIncrementalLinkerCompatible)
getAssembler().setIncrementalLinkerCompatible(true);
getWriter().setIncrementalLinkerCompatible(true);
}

WinCOFFObjectWriter &MCWinCOFFStreamer::getWriter() {
return static_cast<WinCOFFObjectWriter &>(getAssembler().getWriter());
}

void MCWinCOFFStreamer::emitInstToData(const MCInst &Inst,
Expand Down
56 changes: 17 additions & 39 deletions llvm/lib/MC/WinCOFFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,9 @@ class COFFSection {

SmallVector<COFFSymbol *, 1> OffsetSymbols;
};
} // namespace

class WinCOFFObjectWriter;

class WinCOFFWriter {
class llvm::WinCOFFWriter {
WinCOFFObjectWriter &OWriter;
support::endian::Writer W;

Expand Down Expand Up @@ -196,41 +195,19 @@ class WinCOFFWriter {
void assignFileOffsets(MCAssembler &Asm);
};

class WinCOFFObjectWriter : public MCObjectWriter {
friend class WinCOFFWriter;

std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
std::unique_ptr<WinCOFFWriter> ObjWriter, DwoWriter;

public:
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS)
: TargetObjectWriter(std::move(MOTW)),
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
WinCOFFWriter::AllSections)) {
}
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS)
: TargetObjectWriter(std::move(MOTW)),
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
WinCOFFWriter::NonDwoOnly)),
DwoWriter(std::make_unique<WinCOFFWriter>(*this, DwoOS,
WinCOFFWriter::DwoOnly)) {}

// MCObjectWriter interface implementation.
void reset() override;
void executePostLayoutBinding(MCAssembler &Asm) override;
bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
const MCSymbol &SymA,
const MCFragment &FB, bool InSet,
bool IsPCRel) const override;
void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
const MCFixup &Fixup, MCValue Target,
uint64_t &FixedValue) override;
uint64_t writeObject(MCAssembler &Asm) override;
};

} // end anonymous namespace
WinCOFFObjectWriter::WinCOFFObjectWriter(
std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
: TargetObjectWriter(std::move(MOTW)),
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
WinCOFFWriter::AllSections)) {}
WinCOFFObjectWriter::WinCOFFObjectWriter(
std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS,
raw_pwrite_stream &DwoOS)
: TargetObjectWriter(std::move(MOTW)),
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
WinCOFFWriter::NonDwoOnly)),
DwoWriter(std::make_unique<WinCOFFWriter>(*this, DwoOS,
WinCOFFWriter::DwoOnly)) {}

static bool isDwoSection(const MCSection &Sec) {
return Sec.getName().ends_with(".dwo");
Expand Down Expand Up @@ -1125,7 +1102,7 @@ uint64_t WinCOFFWriter::writeObject(MCAssembler &Asm) {

// MS LINK expects to be able to use this timestamp to implement their
// /INCREMENTAL feature.
if (Asm.isIncrementalLinkerCompatible()) {
if (OWriter.IncrementalLinkerCompatible) {
Header.TimeDateStamp = getTime();
} else {
// Have deterministic output if /INCREMENTAL isn't needed. Also matches GNU.
Expand Down Expand Up @@ -1174,6 +1151,7 @@ uint64_t WinCOFFWriter::writeObject(MCAssembler &Asm) {
// MCObjectWriter interface implementations

void WinCOFFObjectWriter::reset() {
IncrementalLinkerCompatible = false;
ObjWriter->reset();
if (DwoWriter)
DwoWriter->reset();
Expand Down
2 changes: 0 additions & 2 deletions llvm/lib/MC/XCOFFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -825,8 +825,6 @@ uint64_t XCOFFObjectWriter::writeObject(MCAssembler &Asm) {
// We always emit a timestamp of 0 for reproducibility, so ensure incremental
// linking is not enabled, in case, like with Windows COFF, such a timestamp
// is incompatible with incremental linking of XCOFF.
if (Asm.isIncrementalLinkerCompatible())
report_fatal_error("Incremental linking not supported for XCOFF.");

finalizeSectionInfo();
uint64_t StartOffset = W.OS.tell();
Expand Down

0 comments on commit 9539a77

Please sign in to comment.