diff options
author | Fangrui Song <i@maskray.me> | 2024-07-22 16:18:25 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2024-07-22 16:18:25 -0700 |
commit | 70c52b62c5669993e341664a63bfbe5245e32884 (patch) | |
tree | 122a2a8771070c48f9feb88fe7362901ca2a4c0a /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | db1d88137212fec6c884dcb0f76a8dfab4fcab98 (diff) | |
download | llvm-70c52b62c5669993e341664a63bfbe5245e32884.zip llvm-70c52b62c5669993e341664a63bfbe5245e32884.tar.gz llvm-70c52b62c5669993e341664a63bfbe5245e32884.tar.bz2 |
[MC] Export llvm::ELFObjectWriter
Similar to commit 28fcafb50274be2520117eacb0a886adafefe59d (2011) for
MachObjectWriter and commit 9539a7796094ff5fb59d9c685140ea2e214b945c for
WinCOFFObjectWriter.
MCELFStreamer can now access ELFObjectWriter directly without adding
ELF-specific markGnuAbi (https://reviews.llvm.org/D97976) and
setOverrideABIVersion to MCObjectWriter.
A few member variables have to be made public since we cannot use a
friend declaration for ELFWriter.
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 77 |
1 files changed, 13 insertions, 64 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 59d796b..21f481d 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -67,7 +67,6 @@ using namespace llvm; namespace { -class ELFObjectWriter; struct ELFWriter; bool isDwoSection(const MCSectionELF &Sec) { @@ -200,64 +199,6 @@ public: const MCSectionELF &Section); }; -class ELFObjectWriter : public MCObjectWriter { - /// The target specific ELF writer instance. - std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter; - - DenseMap<const MCSectionELF *, std::vector<ELFRelocationEntry>> Relocations; - - DenseMap<const MCSymbolELF *, const MCSymbolELF *> Renames; - - bool SeenGnuAbi = false; - - std::optional<uint8_t> OverrideABIVersion; - - bool hasRelocationAddend() const; - - bool shouldRelocateWithSymbol(const MCAssembler &Asm, const MCValue &Val, - const MCSymbolELF *Sym, uint64_t C, - unsigned Type) const; - -public: - ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW) - : TargetObjectWriter(std::move(MOTW)) {} - - void reset() override { - SeenGnuAbi = false; - OverrideABIVersion.reset(); - Relocations.clear(); - Renames.clear(); - MCObjectWriter::reset(); - } - - bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, - const MCSymbol &SymA, - const MCFragment &FB, bool InSet, - bool IsPCRel) const override; - - virtual bool checkRelocation(MCContext &Ctx, SMLoc Loc, - const MCSectionELF *From, - const MCSectionELF *To) { - return true; - } - - void recordRelocation(MCAssembler &Asm, const MCFragment *Fragment, - const MCFixup &Fixup, MCValue Target, - uint64_t &FixedValue) override; - bool usesRela(const MCTargetOptions *TO, const MCSectionELF &Sec) const; - - void executePostLayoutBinding(MCAssembler &Asm) override; - - void markGnuAbi() override { SeenGnuAbi = true; } - bool seenGnuAbi() const { return SeenGnuAbi; } - - bool seenOverrideABIVersion() const { return OverrideABIVersion.has_value(); } - uint8_t getOverrideABIVersion() const { return OverrideABIVersion.value(); } - void setOverrideABIVersion(uint8_t V) override { OverrideABIVersion = V; } - - friend struct ELFWriter; -}; - class ELFSingleObjectWriter : public ELFObjectWriter { raw_pwrite_stream &OS; bool IsLittleEndian; @@ -403,8 +344,8 @@ void ELFWriter::writeHeader(const MCAssembler &Asm) { ? int(ELF::ELFOSABI_GNU) : OSABI); // e_ident[EI_ABIVERSION] - W.OS << char(OWriter.seenOverrideABIVersion() - ? OWriter.getOverrideABIVersion() + W.OS << char(OWriter.OverrideABIVersion + ? *OWriter.OverrideABIVersion : OWriter.TargetObjectWriter->getABIVersion()); W.OS.write_zeros(ELF::EI_NIDENT - ELF::EI_PAD); @@ -779,7 +720,7 @@ void ELFWriter::computeSymbolTable(MCAssembler &Asm, } void ELFWriter::writeAddrsigSection() { - for (const MCSymbol *Sym : OWriter.AddrsigSyms) + for (const MCSymbol *Sym : OWriter.getAddrsigSyms()) if (Sym->getIndex() != 0) encodeULEB128(Sym->getIndex(), W.OS); } @@ -1150,7 +1091,7 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) { StrTabBuilder.finalize(); } else { MCSectionELF *AddrsigSection; - if (OWriter.EmitAddrsigSection) { + if (OWriter.getEmitAddrsigSection()) { AddrsigSection = Ctx.getELFSection(".llvm_addrsig", ELF::SHT_LLVM_ADDRSIG, ELF::SHF_EXCLUDE); addToSectionTable(AddrsigSection); @@ -1170,7 +1111,7 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) { RelSection->setOffsets(SecStart, SecEnd); } - if (OWriter.EmitAddrsigSection) { + if (OWriter.getEmitAddrsigSection()) { uint64_t SecStart = W.OS.tell(); writeAddrsigSection(); uint64_t SecEnd = W.OS.tell(); @@ -1215,6 +1156,14 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) { return W.OS.tell() - StartOffset; } +void ELFObjectWriter::reset() { + SeenGnuAbi = false; + OverrideABIVersion.reset(); + Relocations.clear(); + Renames.clear(); + MCObjectWriter::reset(); +} + bool ELFObjectWriter::hasRelocationAddend() const { return TargetObjectWriter->hasRelocationAddend(); } |