[llvm] [GOFF] Introduce GOFFWriter class (PR #131216)
Kai Nacke via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 25 08:55:04 PDT 2025
https://github.com/redstar updated https://github.com/llvm/llvm-project/pull/131216
>From 7e6a2e267560b81448dc84c72d653fd3d2384914 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Thu, 13 Mar 2025 09:30:22 -0400
Subject: [PATCH] [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.
This changes also makes the GOFFObjectWriter a public class.
---
llvm/include/llvm/MC/MCGOFFObjectWriter.h | 20 +++++++++++
llvm/include/llvm/MC/MCGOFFStreamer.h | 3 ++
llvm/lib/MC/GOFFObjectWriter.cpp | 43 +++++++++++------------
llvm/lib/MC/MCGOFFStreamer.cpp | 5 +++
4 files changed, 49 insertions(+), 22 deletions(-)
diff --git a/llvm/include/llvm/MC/MCGOFFObjectWriter.h b/llvm/include/llvm/MC/MCGOFFObjectWriter.h
index 85316a6fd5d0e..78a491522dbd6 100644
--- a/llvm/include/llvm/MC/MCGOFFObjectWriter.h
+++ b/llvm/include/llvm/MC/MCGOFFObjectWriter.h
@@ -10,6 +10,7 @@
#define LLVM_MC_MCGOFFOBJECTWRITER_H
#include "llvm/MC/MCObjectWriter.h"
+#include "llvm/MC/MCValue.h"
namespace llvm {
class MCObjectWriter;
@@ -29,6 +30,25 @@ class MCGOFFObjectTargetWriter : public MCObjectTargetWriter {
}
};
+class GOFFObjectWriter : public MCObjectWriter {
+ // The target specific GOFF writer instance.
+ std::unique_ptr<MCGOFFObjectTargetWriter> TargetObjectWriter;
+
+ // The stream used to write the GOFF records.
+ raw_pwrite_stream &OS;
+
+public:
+ GOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
+ raw_pwrite_stream &OS);
+ ~GOFFObjectWriter() override;
+
+ // Implementation of the MCObjectWriter interface.
+ void recordRelocation(const MCFragment &F, const MCFixup &Fixup,
+ MCValue Target, uint64_t &FixedValue) override {}
+
+ uint64_t writeObject() override;
+};
+
/// \brief Construct a new GOFF writer instance.
///
/// \param MOTW - The target-specific GOFF writer subclass.
diff --git a/llvm/include/llvm/MC/MCGOFFStreamer.h b/llvm/include/llvm/MC/MCGOFFStreamer.h
index 7f8f33d8ee4b0..28202f634f95a 100644
--- a/llvm/include/llvm/MC/MCGOFFStreamer.h
+++ b/llvm/include/llvm/MC/MCGOFFStreamer.h
@@ -13,6 +13,7 @@
#include "llvm/MC/MCObjectWriter.h"
namespace llvm {
+class GOFFObjectWriter;
class MCGOFFStreamer : public MCObjectStreamer {
public:
@@ -24,6 +25,8 @@ class MCGOFFStreamer : public MCObjectStreamer {
~MCGOFFStreamer() override;
+ GOFFObjectWriter &getWriter();
+
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
return false;
}
diff --git a/llvm/lib/MC/GOFFObjectWriter.cpp b/llvm/lib/MC/GOFFObjectWriter.cpp
index c17b2ed8101dc..dd249d3608566 100644
--- a/llvm/lib/MC/GOFFObjectWriter.cpp
+++ b/llvm/lib/MC/GOFFObjectWriter.cpp
@@ -223,33 +223,21 @@ void GOFFOstream::finalizeRecord() {
}
namespace {
-
-class GOFFObjectWriter : public MCObjectWriter {
- // The target specific GOFF writer instance.
- std::unique_ptr<MCGOFFObjectTargetWriter> TargetObjectWriter;
-
- // The stream used to write the GOFF records.
+class GOFFWriter {
GOFFOstream OS;
-public:
- GOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS)
- : TargetObjectWriter(std::move(MOTW)), OS(OS) {}
-
- ~GOFFObjectWriter() override {}
-
- // Write GOFF records.
void writeHeader();
void writeEnd();
- // Implementation of the MCObjectWriter interface.
- void recordRelocation(const MCFragment &F, const MCFixup &Fixup,
- MCValue Target, uint64_t &FixedValue) override {}
- uint64_t writeObject() override;
+public:
+ GOFFWriter(raw_pwrite_stream &OS);
+ uint64_t writeObject();
};
-} // end anonymous namespace
+} // namespace
-void GOFFObjectWriter::writeHeader() {
+GOFFWriter::GOFFWriter(raw_pwrite_stream &OS) : OS(OS) {}
+
+void GOFFWriter::writeHeader() {
OS.newRecord(GOFF::RT_HDR);
OS.write_zeros(1); // Reserved
OS.writebe<uint32_t>(0); // Target Hardware Environment
@@ -263,7 +251,7 @@ void GOFFObjectWriter::writeHeader() {
OS.write_zeros(6); // Reserved
}
-void GOFFObjectWriter::writeEnd() {
+void GOFFWriter::writeEnd() {
uint8_t F = GOFF::END_EPR_None;
uint8_t AMODE = 0;
uint32_t ESDID = 0;
@@ -281,7 +269,7 @@ void GOFFObjectWriter::writeEnd() {
OS.writebe<uint32_t>(ESDID); // ESDID (of entry point)
}
-uint64_t GOFFObjectWriter::writeObject() {
+uint64_t GOFFWriter::writeObject() {
writeHeader();
writeEnd();
@@ -294,6 +282,17 @@ uint64_t GOFFObjectWriter::writeObject() {
return OS.getWrittenSize();
}
+GOFFObjectWriter::GOFFObjectWriter(
+ std::unique_ptr<MCGOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
+ : TargetObjectWriter(std::move(MOTW)), OS(OS) {}
+
+GOFFObjectWriter::~GOFFObjectWriter() {}
+
+uint64_t GOFFObjectWriter::writeObject() {
+ uint64_t Size = GOFFWriter(OS).writeObject();
+ return Size;
+}
+
std::unique_ptr<MCObjectWriter>
llvm::createGOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS) {
diff --git a/llvm/lib/MC/MCGOFFStreamer.cpp b/llvm/lib/MC/MCGOFFStreamer.cpp
index 2b6d5c8e75a70..c9e4c21c857ce 100644
--- a/llvm/lib/MC/MCGOFFStreamer.cpp
+++ b/llvm/lib/MC/MCGOFFStreamer.cpp
@@ -15,12 +15,17 @@
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCGOFFObjectWriter.h"
#include "llvm/MC/TargetRegistry.h"
using namespace llvm;
MCGOFFStreamer::~MCGOFFStreamer() {}
+GOFFObjectWriter &MCGOFFStreamer::getWriter() {
+ return static_cast<GOFFObjectWriter &>(getAssembler().getWriter());
+}
+
MCStreamer *llvm::createGOFFStreamer(MCContext &Context,
std::unique_ptr<MCAsmBackend> &&MAB,
std::unique_ptr<MCObjectWriter> &&OW,
More information about the llvm-commits
mailing list