Skip to content

Commit 02f5378

Browse files
redstarAnthony Tran
authored andcommitted
[GOFF] Introduce GOFFWriter class (llvm#131216)
The GOFFWriter has 2 purposes: - Simplify resource management - Enable writing of split DWARF files It follows the design of the other writer classes. No added functionality at this point. This changes also makes the GOFFObjectWriter a public class.
1 parent 176f8d7 commit 02f5378

File tree

4 files changed

+49
-22
lines changed

4 files changed

+49
-22
lines changed

llvm/include/llvm/MC/MCGOFFObjectWriter.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLVM_MC_MCGOFFOBJECTWRITER_H
1111

1212
#include "llvm/MC/MCObjectWriter.h"
13+
#include "llvm/MC/MCValue.h"
1314

1415
namespace llvm {
1516
class MCObjectWriter;
@@ -29,6 +30,25 @@ class MCGOFFObjectTargetWriter : public MCObjectTargetWriter {
2930
}
3031
};
3132

33+
class GOFFObjectWriter : public MCObjectWriter {
34+
// The target specific GOFF writer instance.
35+
std::unique_ptr<MCGOFFObjectTargetWriter> TargetObjectWriter;
36+
37+
// The stream used to write the GOFF records.
38+
raw_pwrite_stream &OS;
39+
40+
public:
41+
GOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
42+
raw_pwrite_stream &OS);
43+
~GOFFObjectWriter() override;
44+
45+
// Implementation of the MCObjectWriter interface.
46+
void recordRelocation(const MCFragment &F, const MCFixup &Fixup,
47+
MCValue Target, uint64_t &FixedValue) override {}
48+
49+
uint64_t writeObject() override;
50+
};
51+
3252
/// \brief Construct a new GOFF writer instance.
3353
///
3454
/// \param MOTW - The target-specific GOFF writer subclass.

llvm/include/llvm/MC/MCGOFFStreamer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "llvm/MC/MCObjectWriter.h"
1414

1515
namespace llvm {
16+
class GOFFObjectWriter;
1617

1718
class MCGOFFStreamer : public MCObjectStreamer {
1819
public:
@@ -24,6 +25,8 @@ class MCGOFFStreamer : public MCObjectStreamer {
2425

2526
~MCGOFFStreamer() override;
2627

28+
GOFFObjectWriter &getWriter();
29+
2730
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
2831
return false;
2932
}

llvm/lib/MC/GOFFObjectWriter.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -223,33 +223,21 @@ void GOFFOstream::finalizeRecord() {
223223
}
224224

225225
namespace {
226-
227-
class GOFFObjectWriter : public MCObjectWriter {
228-
// The target specific GOFF writer instance.
229-
std::unique_ptr<MCGOFFObjectTargetWriter> TargetObjectWriter;
230-
231-
// The stream used to write the GOFF records.
226+
class GOFFWriter {
232227
GOFFOstream OS;
233228

234-
public:
235-
GOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
236-
raw_pwrite_stream &OS)
237-
: TargetObjectWriter(std::move(MOTW)), OS(OS) {}
238-
239-
~GOFFObjectWriter() override {}
240-
241-
// Write GOFF records.
242229
void writeHeader();
243230
void writeEnd();
244231

245-
// Implementation of the MCObjectWriter interface.
246-
void recordRelocation(const MCFragment &F, const MCFixup &Fixup,
247-
MCValue Target, uint64_t &FixedValue) override {}
248-
uint64_t writeObject() override;
232+
public:
233+
GOFFWriter(raw_pwrite_stream &OS);
234+
uint64_t writeObject();
249235
};
250-
} // end anonymous namespace
236+
} // namespace
251237

252-
void GOFFObjectWriter::writeHeader() {
238+
GOFFWriter::GOFFWriter(raw_pwrite_stream &OS) : OS(OS) {}
239+
240+
void GOFFWriter::writeHeader() {
253241
OS.newRecord(GOFF::RT_HDR);
254242
OS.write_zeros(1); // Reserved
255243
OS.writebe<uint32_t>(0); // Target Hardware Environment
@@ -263,7 +251,7 @@ void GOFFObjectWriter::writeHeader() {
263251
OS.write_zeros(6); // Reserved
264252
}
265253

266-
void GOFFObjectWriter::writeEnd() {
254+
void GOFFWriter::writeEnd() {
267255
uint8_t F = GOFF::END_EPR_None;
268256
uint8_t AMODE = 0;
269257
uint32_t ESDID = 0;
@@ -281,7 +269,7 @@ void GOFFObjectWriter::writeEnd() {
281269
OS.writebe<uint32_t>(ESDID); // ESDID (of entry point)
282270
}
283271

284-
uint64_t GOFFObjectWriter::writeObject() {
272+
uint64_t GOFFWriter::writeObject() {
285273
writeHeader();
286274
writeEnd();
287275

@@ -294,6 +282,17 @@ uint64_t GOFFObjectWriter::writeObject() {
294282
return OS.getWrittenSize();
295283
}
296284

285+
GOFFObjectWriter::GOFFObjectWriter(
286+
std::unique_ptr<MCGOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
287+
: TargetObjectWriter(std::move(MOTW)), OS(OS) {}
288+
289+
GOFFObjectWriter::~GOFFObjectWriter() {}
290+
291+
uint64_t GOFFObjectWriter::writeObject() {
292+
uint64_t Size = GOFFWriter(OS).writeObject();
293+
return Size;
294+
}
295+
297296
std::unique_ptr<MCObjectWriter>
298297
llvm::createGOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
299298
raw_pwrite_stream &OS) {

llvm/lib/MC/MCGOFFStreamer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@
1515
#include "llvm/MC/MCAssembler.h"
1616
#include "llvm/MC/MCCodeEmitter.h"
1717
#include "llvm/MC/MCContext.h"
18+
#include "llvm/MC/MCGOFFObjectWriter.h"
1819
#include "llvm/MC/TargetRegistry.h"
1920

2021
using namespace llvm;
2122

2223
MCGOFFStreamer::~MCGOFFStreamer() {}
2324

25+
GOFFObjectWriter &MCGOFFStreamer::getWriter() {
26+
return static_cast<GOFFObjectWriter &>(getAssembler().getWriter());
27+
}
28+
2429
MCStreamer *llvm::createGOFFStreamer(MCContext &Context,
2530
std::unique_ptr<MCAsmBackend> &&MAB,
2631
std::unique_ptr<MCObjectWriter> &&OW,

0 commit comments

Comments
 (0)