aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2024-07-22 16:18:25 -0700
committerFangrui Song <i@maskray.me>2024-07-22 16:18:25 -0700
commit70c52b62c5669993e341664a63bfbe5245e32884 (patch)
tree122a2a8771070c48f9feb88fe7362901ca2a4c0a /llvm/lib/MC/ELFObjectWriter.cpp
parentdb1d88137212fec6c884dcb0f76a8dfab4fcab98 (diff)
downloadllvm-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.cpp77
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();
}