Skip to content

Commit 9539a77

Browse files
committed
[MC] Export llvm::WinCOFFObjectWriter and access it from MCWinCOFFStreamer
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).
1 parent 6db2465 commit 9539a77

File tree

7 files changed

+57
-51
lines changed

7 files changed

+57
-51
lines changed

llvm/include/llvm/MC/MCAssembler.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ class MCAssembler {
8484
bool HasLayout = false;
8585
bool RelaxAll = false;
8686
bool SubsectionsViaSymbols = false;
87-
bool IncrementalLinkerCompatible = false;
8887

8988
SectionListType Sections;
9089

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

301-
bool isIncrementalLinkerCompatible() const {
302-
return IncrementalLinkerCompatible;
303-
}
304-
void setIncrementalLinkerCompatible(bool Value) {
305-
IncrementalLinkerCompatible = Value;
306-
}
307-
308300
bool hasLayout() const { return HasLayout; }
309301
bool getRelaxAll() const { return RelaxAll; }
310302
void setRelaxAll(bool Value) { RelaxAll = Value; }

llvm/include/llvm/MC/MCWinCOFFObjectWriter.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,37 @@ class MCWinCOFFObjectTargetWriter : public MCObjectTargetWriter {
4343
virtual bool recordRelocation(const MCFixup &) const { return true; }
4444
};
4545

46+
class WinCOFFWriter;
47+
48+
class WinCOFFObjectWriter : public MCObjectWriter {
49+
friend class WinCOFFWriter;
50+
51+
std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
52+
std::unique_ptr<WinCOFFWriter> ObjWriter, DwoWriter;
53+
bool IncrementalLinkerCompatible = false;
54+
55+
public:
56+
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
57+
raw_pwrite_stream &OS);
58+
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
59+
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS);
60+
61+
// MCObjectWriter interface implementation.
62+
void reset() override;
63+
void setIncrementalLinkerCompatible(bool Value) {
64+
IncrementalLinkerCompatible = Value;
65+
}
66+
void executePostLayoutBinding(MCAssembler &Asm) override;
67+
bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
68+
const MCSymbol &SymA,
69+
const MCFragment &FB, bool InSet,
70+
bool IsPCRel) const override;
71+
void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
72+
const MCFixup &Fixup, MCValue Target,
73+
uint64_t &FixedValue) override;
74+
uint64_t writeObject(MCAssembler &Asm) override;
75+
};
76+
4677
/// Construct a new Win COFF writer instance.
4778
///
4879
/// \param MOTW - The target specific WinCOFF writer subclass.

llvm/include/llvm/MC/MCWinCOFFStreamer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class MCSection;
2222
class MCSubtargetInfo;
2323
class MCSymbol;
2424
class StringRef;
25+
class WinCOFFObjectWriter;
2526
class raw_pwrite_stream;
2627

2728
class MCWinCOFFStreamer : public MCObjectStreamer {
@@ -36,6 +37,8 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
3637
MCObjectStreamer::reset();
3738
}
3839

40+
WinCOFFObjectWriter &getWriter();
41+
3942
/// \name MCStreamer interface
4043
/// \{
4144

llvm/lib/MC/MCAssembler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ MCAssembler::~MCAssembler() = default;
9494
void MCAssembler::reset() {
9595
RelaxAll = false;
9696
SubsectionsViaSymbols = false;
97-
IncrementalLinkerCompatible = false;
9897
Sections.clear();
9998
Symbols.clear();
10099
LinkerOptions.clear();

llvm/lib/MC/MCWinCOFFStreamer.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "llvm/MC/MCSectionCOFF.h"
2929
#include "llvm/MC/MCSymbolCOFF.h"
3030
#include "llvm/MC/MCTargetOptions.h"
31+
#include "llvm/MC/MCWinCOFFObjectWriter.h"
3132
#include "llvm/Support/Casting.h"
3233
#include "llvm/Support/ErrorHandling.h"
3334
#include "llvm/Support/MathExtras.h"
@@ -49,7 +50,11 @@ MCWinCOFFStreamer::MCWinCOFFStreamer(MCContext &Context,
4950
CurSymbol(nullptr) {
5051
auto *TO = Context.getTargetOptions();
5152
if (TO && TO->MCIncrementalLinkerCompatible)
52-
getAssembler().setIncrementalLinkerCompatible(true);
53+
getWriter().setIncrementalLinkerCompatible(true);
54+
}
55+
56+
WinCOFFObjectWriter &MCWinCOFFStreamer::getWriter() {
57+
return static_cast<WinCOFFObjectWriter &>(getAssembler().getWriter());
5358
}
5459

5560
void MCWinCOFFStreamer::emitInstToData(const MCInst &Inst,

llvm/lib/MC/WinCOFFObjectWriter.cpp

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,9 @@ class COFFSection {
119119

120120
SmallVector<COFFSymbol *, 1> OffsetSymbols;
121121
};
122+
} // namespace
122123

123-
class WinCOFFObjectWriter;
124-
125-
class WinCOFFWriter {
124+
class llvm::WinCOFFWriter {
126125
WinCOFFObjectWriter &OWriter;
127126
support::endian::Writer W;
128127

@@ -196,41 +195,19 @@ class WinCOFFWriter {
196195
void assignFileOffsets(MCAssembler &Asm);
197196
};
198197

199-
class WinCOFFObjectWriter : public MCObjectWriter {
200-
friend class WinCOFFWriter;
201-
202-
std::unique_ptr<MCWinCOFFObjectTargetWriter> TargetObjectWriter;
203-
std::unique_ptr<WinCOFFWriter> ObjWriter, DwoWriter;
204-
205-
public:
206-
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
207-
raw_pwrite_stream &OS)
208-
: TargetObjectWriter(std::move(MOTW)),
209-
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
210-
WinCOFFWriter::AllSections)) {
211-
}
212-
WinCOFFObjectWriter(std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW,
213-
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS)
214-
: TargetObjectWriter(std::move(MOTW)),
215-
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
216-
WinCOFFWriter::NonDwoOnly)),
217-
DwoWriter(std::make_unique<WinCOFFWriter>(*this, DwoOS,
218-
WinCOFFWriter::DwoOnly)) {}
219-
220-
// MCObjectWriter interface implementation.
221-
void reset() override;
222-
void executePostLayoutBinding(MCAssembler &Asm) override;
223-
bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
224-
const MCSymbol &SymA,
225-
const MCFragment &FB, bool InSet,
226-
bool IsPCRel) const override;
227-
void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
228-
const MCFixup &Fixup, MCValue Target,
229-
uint64_t &FixedValue) override;
230-
uint64_t writeObject(MCAssembler &Asm) override;
231-
};
232-
233-
} // end anonymous namespace
198+
WinCOFFObjectWriter::WinCOFFObjectWriter(
199+
std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
200+
: TargetObjectWriter(std::move(MOTW)),
201+
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
202+
WinCOFFWriter::AllSections)) {}
203+
WinCOFFObjectWriter::WinCOFFObjectWriter(
204+
std::unique_ptr<MCWinCOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS,
205+
raw_pwrite_stream &DwoOS)
206+
: TargetObjectWriter(std::move(MOTW)),
207+
ObjWriter(std::make_unique<WinCOFFWriter>(*this, OS,
208+
WinCOFFWriter::NonDwoOnly)),
209+
DwoWriter(std::make_unique<WinCOFFWriter>(*this, DwoOS,
210+
WinCOFFWriter::DwoOnly)) {}
234211

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

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

11761153
void WinCOFFObjectWriter::reset() {
1154+
IncrementalLinkerCompatible = false;
11771155
ObjWriter->reset();
11781156
if (DwoWriter)
11791157
DwoWriter->reset();

llvm/lib/MC/XCOFFObjectWriter.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -825,8 +825,6 @@ uint64_t XCOFFObjectWriter::writeObject(MCAssembler &Asm) {
825825
// We always emit a timestamp of 0 for reproducibility, so ensure incremental
826826
// linking is not enabled, in case, like with Windows COFF, such a timestamp
827827
// is incompatible with incremental linking of XCOFF.
828-
if (Asm.isIncrementalLinkerCompatible())
829-
report_fatal_error("Incremental linking not supported for XCOFF.");
830828

831829
finalizeSectionInfo();
832830
uint64_t StartOffset = W.OS.tell();

0 commit comments

Comments
 (0)