[llvm] 2db576c - ELFObjectWriter: Remove unneeded subclasses
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 23 00:15:33 PDT 2024
Author: Fangrui Song
Date: 2024-07-23T00:15:29-07:00
New Revision: 2db576c8ef4184933aa8fed20dcf0240a89ffc49
URL: https://github.com/llvm/llvm-project/commit/2db576c8ef4184933aa8fed20dcf0240a89ffc49
DIFF: https://github.com/llvm/llvm-project/commit/2db576c8ef4184933aa8fed20dcf0240a89ffc49.diff
LOG: ELFObjectWriter: Remove unneeded subclasses
Added:
Modified:
llvm/include/llvm/MC/MCELFObjectWriter.h
llvm/lib/MC/ELFObjectWriter.cpp
llvm/lib/MC/MCAsmBackend.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCELFObjectWriter.h b/llvm/include/llvm/MC/MCELFObjectWriter.h
index a7cbd0a6d1c99..9b74cbc3d3a52 100644
--- a/llvm/include/llvm/MC/MCELFObjectWriter.h
+++ b/llvm/include/llvm/MC/MCELFObjectWriter.h
@@ -159,8 +159,12 @@ class ELFObjectWriter : public MCObjectWriter {
public:
std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter;
+ raw_pwrite_stream &OS;
+ raw_pwrite_stream *DwoOS = nullptr;
+
DenseMap<const MCSectionELF *, std::vector<ELFRelocationEntry>> Relocations;
DenseMap<const MCSymbolELF *, const MCSymbolELF *> Renames;
+ bool IsLittleEndian = false;
bool SeenGnuAbi = false;
std::optional<uint8_t> OverrideABIVersion;
@@ -173,8 +177,11 @@ class ELFObjectWriter : public MCObjectWriter {
};
SmallVector<Symver, 0> Symvers;
- ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW)
- : TargetObjectWriter(std::move(MOTW)) {}
+ ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
+ raw_pwrite_stream &OS, bool IsLittleEndian);
+ ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
+ raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
+ bool IsLittleEndian);
void reset() override;
void executePostLayoutBinding(MCAssembler &Asm) override;
@@ -185,6 +192,7 @@ class ELFObjectWriter : public MCObjectWriter {
const MCSymbol &SymA,
const MCFragment &FB, bool InSet,
bool IsPCRel) const override;
+ uint64_t writeObject(MCAssembler &Asm) override;
bool hasRelocationAddend() const;
bool usesRela(const MCTargetOptions *TO, const MCSectionELF &Sec) const;
@@ -193,11 +201,8 @@ class ELFObjectWriter : public MCObjectWriter {
const MCSymbolELF *Sym, uint64_t C,
unsigned Type) const;
- virtual bool checkRelocation(MCContext &Ctx, SMLoc Loc,
- const MCSectionELF *From,
- const MCSectionELF *To) {
- return true;
- }
+ bool checkRelocation(MCContext &Ctx, SMLoc Loc, const MCSectionELF *From,
+ const MCSectionELF *To);
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }
@@ -209,21 +214,6 @@ class ELFObjectWriter : public MCObjectWriter {
// Override the default e_ident[EI_ABIVERSION] in the ELF header.
void setOverrideABIVersion(uint8_t V) { OverrideABIVersion = V; }
};
-
-/// Construct a new ELF writer instance.
-///
-/// \param MOTW - The target specific ELF writer subclass.
-/// \param OS - The stream to write to.
-/// \returns The constructed object writer.
-std::unique_ptr<MCObjectWriter>
-createELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS, bool IsLittleEndian);
-
-std::unique_ptr<MCObjectWriter>
-createELFDwoObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
- bool IsLittleEndian);
-
} // end namespace llvm
#endif // LLVM_MC_MCELFOBJECTWRITER_H
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index e7a5601e136ec..f958905a26aa4 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -198,58 +198,6 @@ struct ELFWriter {
void writeSection(uint32_t GroupSymbolIndex, uint64_t Offset, uint64_t Size,
const MCSectionELF &Section);
};
-
-class ELFSingleObjectWriter : public ELFObjectWriter {
- raw_pwrite_stream &OS;
- bool IsLittleEndian;
-
-public:
- ELFSingleObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS, bool IsLittleEndian)
- : ELFObjectWriter(std::move(MOTW)), OS(OS),
- IsLittleEndian(IsLittleEndian) {}
-
- uint64_t writeObject(MCAssembler &Asm) override {
- return ELFWriter(*this, OS, IsLittleEndian, ELFWriter::AllSections)
- .writeObject(Asm);
- }
-
- friend struct ELFWriter;
-};
-
-class ELFDwoObjectWriter : public ELFObjectWriter {
- raw_pwrite_stream &OS, &DwoOS;
- bool IsLittleEndian;
-
-public:
- ELFDwoObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
- bool IsLittleEndian)
- : ELFObjectWriter(std::move(MOTW)), OS(OS), DwoOS(DwoOS),
- IsLittleEndian(IsLittleEndian) {}
-
- bool checkRelocation(MCContext &Ctx, SMLoc Loc, const MCSectionELF *From,
- const MCSectionELF *To) override {
- if (isDwoSection(*From)) {
- Ctx.reportError(Loc, "A dwo section may not contain relocations");
- return false;
- }
- if (To && isDwoSection(*To)) {
- Ctx.reportError(Loc, "A relocation may not refer to a dwo section");
- return false;
- }
- return true;
- }
-
- uint64_t writeObject(MCAssembler &Asm) override {
- uint64_t Size = ELFWriter(*this, OS, IsLittleEndian, ELFWriter::NonDwoOnly)
- .writeObject(Asm);
- Size += ELFWriter(*this, DwoOS, IsLittleEndian, ELFWriter::DwoOnly)
- .writeObject(Asm);
- return Size;
- }
-};
-
} // end anonymous namespace
uint64_t ELFWriter::align(Align Alignment) {
@@ -1156,6 +1104,16 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) {
return W.OS.tell() - StartOffset;
}
+ELFObjectWriter::ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
+ raw_pwrite_stream &OS, bool IsLittleEndian)
+ : TargetObjectWriter(std::move(MOTW)), OS(OS),
+ IsLittleEndian(IsLittleEndian) {}
+ELFObjectWriter::ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
+ raw_pwrite_stream &OS,
+ raw_pwrite_stream &DwoOS, bool IsLittleEndian)
+ : TargetObjectWriter(std::move(MOTW)), OS(OS), DwoOS(&DwoOS),
+ IsLittleEndian(IsLittleEndian) {}
+
void ELFObjectWriter::reset() {
ELFHeaderEFlags = 0;
SeenGnuAbi = false;
@@ -1357,6 +1315,22 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
return false;
}
+bool ELFObjectWriter::checkRelocation(MCContext &Ctx, SMLoc Loc,
+ const MCSectionELF *From,
+ const MCSectionELF *To) {
+ if (DwoOS) {
+ if (isDwoSection(*From)) {
+ Ctx.reportError(Loc, "A dwo section may not contain relocations");
+ return false;
+ }
+ if (To && isDwoSection(*To)) {
+ Ctx.reportError(Loc, "A relocation may not refer to a dwo section");
+ return false;
+ }
+ }
+ return true;
+}
+
void ELFObjectWriter::recordRelocation(MCAssembler &Asm,
const MCFragment *Fragment,
const MCFixup &Fixup, MCValue Target,
@@ -1473,17 +1447,13 @@ bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
return &SymA.getSection() == FB.getParent();
}
-std::unique_ptr<MCObjectWriter>
-llvm::createELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS, bool IsLittleEndian) {
- return std::make_unique<ELFSingleObjectWriter>(std::move(MOTW), OS,
- IsLittleEndian);
-}
-
-std::unique_ptr<MCObjectWriter>
-llvm::createELFDwoObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
- raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
- bool IsLittleEndian) {
- return std::make_unique<ELFDwoObjectWriter>(std::move(MOTW), OS, DwoOS,
- IsLittleEndian);
+uint64_t ELFObjectWriter::writeObject(MCAssembler &Asm) {
+ uint64_t Size =
+ ELFWriter(*this, OS, IsLittleEndian,
+ DwoOS ? ELFWriter::NonDwoOnly : ELFWriter::AllSections)
+ .writeObject(Asm);
+ if (DwoOS)
+ Size += ELFWriter(*this, *DwoOS, IsLittleEndian, ELFWriter::DwoOnly)
+ .writeObject(Asm);
+ return Size;
}
diff --git a/llvm/lib/MC/MCAsmBackend.cpp b/llvm/lib/MC/MCAsmBackend.cpp
index fc36f29a90339..7433f41c9e0fb 100644
--- a/llvm/lib/MC/MCAsmBackend.cpp
+++ b/llvm/lib/MC/MCAsmBackend.cpp
@@ -32,16 +32,17 @@ MCAsmBackend::~MCAsmBackend() = default;
std::unique_ptr<MCObjectWriter>
MCAsmBackend::createObjectWriter(raw_pwrite_stream &OS) const {
auto TW = createObjectTargetWriter();
+ bool IsLE = Endian == llvm::endianness::little;
switch (TW->getFormat()) {
- case Triple::ELF:
- return createELFObjectWriter(cast<MCELFObjectTargetWriter>(std::move(TW)),
- OS, Endian == llvm::endianness::little);
case Triple::MachO:
return createMachObjectWriter(cast<MCMachObjectTargetWriter>(std::move(TW)),
- OS, Endian == llvm::endianness::little);
+ OS, IsLE);
case Triple::COFF:
return createWinCOFFObjectWriter(
cast<MCWinCOFFObjectTargetWriter>(std::move(TW)), OS);
+ case Triple::ELF:
+ return std::make_unique<ELFObjectWriter>(
+ cast<MCELFObjectTargetWriter>(std::move(TW)), OS, IsLE);
case Triple::SPIRV:
return createSPIRVObjectWriter(
cast<MCSPIRVObjectTargetWriter>(std::move(TW)), OS);
@@ -71,7 +72,7 @@ MCAsmBackend::createDwoObjectWriter(raw_pwrite_stream &OS,
return createWinCOFFDwoObjectWriter(
cast<MCWinCOFFObjectTargetWriter>(std::move(TW)), OS, DwoOS);
case Triple::ELF:
- return createELFDwoObjectWriter(
+ return std::make_unique<ELFObjectWriter>(
cast<MCELFObjectTargetWriter>(std::move(TW)), OS, DwoOS,
Endian == llvm::endianness::little);
case Triple::Wasm:
More information about the llvm-commits
mailing list