Skip to content

Commit d335054

Browse files
committed
[GOFF] Introduce GOFFWriter class
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.
1 parent 37d99e9 commit d335054

File tree

1 file changed

+41
-23
lines changed

1 file changed

+41
-23
lines changed

llvm/lib/MC/GOFFObjectWriter.cpp

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -223,34 +223,23 @@ 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;
228+
[[maybe_unused]] MCAssembler &Asm;
233229

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.
242230
void writeHeader();
243231
void writeEnd();
244232

245-
// Implementation of the MCObjectWriter interface.
246-
void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
247-
const MCFixup &Fixup, MCValue Target,
248-
uint64_t &FixedValue) override {}
249-
uint64_t writeObject(MCAssembler &Asm) override;
233+
public:
234+
GOFFWriter(raw_pwrite_stream &OS, MCAssembler &Asm);
235+
uint64_t writeObject();
250236
};
251-
} // end anonymous namespace
237+
} // namespace
238+
239+
GOFFWriter::GOFFWriter(raw_pwrite_stream &OS, MCAssembler &Asm)
240+
: OS(OS), Asm(Asm) {}
252241

253-
void GOFFObjectWriter::writeHeader() {
242+
void GOFFWriter::writeHeader() {
254243
OS.newRecord(GOFF::RT_HDR);
255244
OS.write_zeros(1); // Reserved
256245
OS.writebe<uint32_t>(0); // Target Hardware Environment
@@ -264,7 +253,7 @@ void GOFFObjectWriter::writeHeader() {
264253
OS.write_zeros(6); // Reserved
265254
}
266255

267-
void GOFFObjectWriter::writeEnd() {
256+
void GOFFWriter::writeEnd() {
268257
uint8_t F = GOFF::END_EPR_None;
269258
uint8_t AMODE = 0;
270259
uint32_t ESDID = 0;
@@ -282,7 +271,7 @@ void GOFFObjectWriter::writeEnd() {
282271
OS.writebe<uint32_t>(ESDID); // ESDID (of entry point)
283272
}
284273

285-
uint64_t GOFFObjectWriter::writeObject(MCAssembler &Asm) {
274+
uint64_t GOFFWriter::writeObject() {
286275
writeHeader();
287276
writeEnd();
288277

@@ -295,6 +284,35 @@ uint64_t GOFFObjectWriter::writeObject(MCAssembler &Asm) {
295284
return OS.getWrittenSize();
296285
}
297286

287+
namespace {
288+
289+
class GOFFObjectWriter : public MCObjectWriter {
290+
// The target specific GOFF writer instance.
291+
std::unique_ptr<MCGOFFObjectTargetWriter> TargetObjectWriter;
292+
293+
// The stream used to write the GOFF records.
294+
raw_pwrite_stream &OS;
295+
296+
public:
297+
GOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
298+
raw_pwrite_stream &OS)
299+
: TargetObjectWriter(std::move(MOTW)), OS(OS) {}
300+
301+
~GOFFObjectWriter() override {}
302+
303+
// Implementation of the MCObjectWriter interface.
304+
void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment,
305+
const MCFixup &Fixup, MCValue Target,
306+
uint64_t &FixedValue) override {}
307+
uint64_t writeObject(MCAssembler &Asm) override;
308+
};
309+
} // end anonymous namespace
310+
311+
uint64_t GOFFObjectWriter::writeObject(MCAssembler &Asm) {
312+
uint64_t Size = GOFFWriter(OS, Asm).writeObject();
313+
return Size;
314+
}
315+
298316
std::unique_ptr<MCObjectWriter>
299317
llvm::createGOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
300318
raw_pwrite_stream &OS) {

0 commit comments

Comments
 (0)