Skip to content

Commit de28325

Browse files
MaskRayyuxuanchen1997
authored andcommitted
ELFObjectWriter: Remove unneeded subclasses
Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251038
1 parent 2433115 commit de28325

File tree

3 files changed

+53
-92
lines changed

3 files changed

+53
-92
lines changed

llvm/include/llvm/MC/MCELFObjectWriter.h

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,12 @@ class ELFObjectWriter : public MCObjectWriter {
159159

160160
public:
161161
std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter;
162+
raw_pwrite_stream &OS;
163+
raw_pwrite_stream *DwoOS = nullptr;
164+
162165
DenseMap<const MCSectionELF *, std::vector<ELFRelocationEntry>> Relocations;
163166
DenseMap<const MCSymbolELF *, const MCSymbolELF *> Renames;
167+
bool IsLittleEndian = false;
164168
bool SeenGnuAbi = false;
165169
std::optional<uint8_t> OverrideABIVersion;
166170

@@ -173,8 +177,11 @@ class ELFObjectWriter : public MCObjectWriter {
173177
};
174178
SmallVector<Symver, 0> Symvers;
175179

176-
ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW)
177-
: TargetObjectWriter(std::move(MOTW)) {}
180+
ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
181+
raw_pwrite_stream &OS, bool IsLittleEndian);
182+
ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
183+
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
184+
bool IsLittleEndian);
178185

179186
void reset() override;
180187
void executePostLayoutBinding(MCAssembler &Asm) override;
@@ -185,6 +192,7 @@ class ELFObjectWriter : public MCObjectWriter {
185192
const MCSymbol &SymA,
186193
const MCFragment &FB, bool InSet,
187194
bool IsPCRel) const override;
195+
uint64_t writeObject(MCAssembler &Asm) override;
188196

189197
bool hasRelocationAddend() const;
190198
bool usesRela(const MCTargetOptions *TO, const MCSectionELF &Sec) const;
@@ -193,11 +201,8 @@ class ELFObjectWriter : public MCObjectWriter {
193201
const MCSymbolELF *Sym, uint64_t C,
194202
unsigned Type) const;
195203

196-
virtual bool checkRelocation(MCContext &Ctx, SMLoc Loc,
197-
const MCSectionELF *From,
198-
const MCSectionELF *To) {
199-
return true;
200-
}
204+
bool checkRelocation(MCContext &Ctx, SMLoc Loc, const MCSectionELF *From,
205+
const MCSectionELF *To);
201206

202207
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
203208
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }
@@ -209,21 +214,6 @@ class ELFObjectWriter : public MCObjectWriter {
209214
// Override the default e_ident[EI_ABIVERSION] in the ELF header.
210215
void setOverrideABIVersion(uint8_t V) { OverrideABIVersion = V; }
211216
};
212-
213-
/// Construct a new ELF writer instance.
214-
///
215-
/// \param MOTW - The target specific ELF writer subclass.
216-
/// \param OS - The stream to write to.
217-
/// \returns The constructed object writer.
218-
std::unique_ptr<MCObjectWriter>
219-
createELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
220-
raw_pwrite_stream &OS, bool IsLittleEndian);
221-
222-
std::unique_ptr<MCObjectWriter>
223-
createELFDwoObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
224-
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
225-
bool IsLittleEndian);
226-
227217
} // end namespace llvm
228218

229219
#endif // LLVM_MC_MCELFOBJECTWRITER_H

llvm/lib/MC/ELFObjectWriter.cpp

Lines changed: 35 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -198,58 +198,6 @@ struct ELFWriter {
198198
void writeSection(uint32_t GroupSymbolIndex, uint64_t Offset, uint64_t Size,
199199
const MCSectionELF &Section);
200200
};
201-
202-
class ELFSingleObjectWriter : public ELFObjectWriter {
203-
raw_pwrite_stream &OS;
204-
bool IsLittleEndian;
205-
206-
public:
207-
ELFSingleObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
208-
raw_pwrite_stream &OS, bool IsLittleEndian)
209-
: ELFObjectWriter(std::move(MOTW)), OS(OS),
210-
IsLittleEndian(IsLittleEndian) {}
211-
212-
uint64_t writeObject(MCAssembler &Asm) override {
213-
return ELFWriter(*this, OS, IsLittleEndian, ELFWriter::AllSections)
214-
.writeObject(Asm);
215-
}
216-
217-
friend struct ELFWriter;
218-
};
219-
220-
class ELFDwoObjectWriter : public ELFObjectWriter {
221-
raw_pwrite_stream &OS, &DwoOS;
222-
bool IsLittleEndian;
223-
224-
public:
225-
ELFDwoObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
226-
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
227-
bool IsLittleEndian)
228-
: ELFObjectWriter(std::move(MOTW)), OS(OS), DwoOS(DwoOS),
229-
IsLittleEndian(IsLittleEndian) {}
230-
231-
bool checkRelocation(MCContext &Ctx, SMLoc Loc, const MCSectionELF *From,
232-
const MCSectionELF *To) override {
233-
if (isDwoSection(*From)) {
234-
Ctx.reportError(Loc, "A dwo section may not contain relocations");
235-
return false;
236-
}
237-
if (To && isDwoSection(*To)) {
238-
Ctx.reportError(Loc, "A relocation may not refer to a dwo section");
239-
return false;
240-
}
241-
return true;
242-
}
243-
244-
uint64_t writeObject(MCAssembler &Asm) override {
245-
uint64_t Size = ELFWriter(*this, OS, IsLittleEndian, ELFWriter::NonDwoOnly)
246-
.writeObject(Asm);
247-
Size += ELFWriter(*this, DwoOS, IsLittleEndian, ELFWriter::DwoOnly)
248-
.writeObject(Asm);
249-
return Size;
250-
}
251-
};
252-
253201
} // end anonymous namespace
254202

255203
uint64_t ELFWriter::align(Align Alignment) {
@@ -1156,6 +1104,16 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) {
11561104
return W.OS.tell() - StartOffset;
11571105
}
11581106

1107+
ELFObjectWriter::ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
1108+
raw_pwrite_stream &OS, bool IsLittleEndian)
1109+
: TargetObjectWriter(std::move(MOTW)), OS(OS),
1110+
IsLittleEndian(IsLittleEndian) {}
1111+
ELFObjectWriter::ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
1112+
raw_pwrite_stream &OS,
1113+
raw_pwrite_stream &DwoOS, bool IsLittleEndian)
1114+
: TargetObjectWriter(std::move(MOTW)), OS(OS), DwoOS(&DwoOS),
1115+
IsLittleEndian(IsLittleEndian) {}
1116+
11591117
void ELFObjectWriter::reset() {
11601118
ELFHeaderEFlags = 0;
11611119
SeenGnuAbi = false;
@@ -1357,6 +1315,22 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
13571315
return false;
13581316
}
13591317

1318+
bool ELFObjectWriter::checkRelocation(MCContext &Ctx, SMLoc Loc,
1319+
const MCSectionELF *From,
1320+
const MCSectionELF *To) {
1321+
if (DwoOS) {
1322+
if (isDwoSection(*From)) {
1323+
Ctx.reportError(Loc, "A dwo section may not contain relocations");
1324+
return false;
1325+
}
1326+
if (To && isDwoSection(*To)) {
1327+
Ctx.reportError(Loc, "A relocation may not refer to a dwo section");
1328+
return false;
1329+
}
1330+
}
1331+
return true;
1332+
}
1333+
13601334
void ELFObjectWriter::recordRelocation(MCAssembler &Asm,
13611335
const MCFragment *Fragment,
13621336
const MCFixup &Fixup, MCValue Target,
@@ -1473,17 +1447,13 @@ bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
14731447
return &SymA.getSection() == FB.getParent();
14741448
}
14751449

1476-
std::unique_ptr<MCObjectWriter>
1477-
llvm::createELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
1478-
raw_pwrite_stream &OS, bool IsLittleEndian) {
1479-
return std::make_unique<ELFSingleObjectWriter>(std::move(MOTW), OS,
1480-
IsLittleEndian);
1481-
}
1482-
1483-
std::unique_ptr<MCObjectWriter>
1484-
llvm::createELFDwoObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
1485-
raw_pwrite_stream &OS, raw_pwrite_stream &DwoOS,
1486-
bool IsLittleEndian) {
1487-
return std::make_unique<ELFDwoObjectWriter>(std::move(MOTW), OS, DwoOS,
1488-
IsLittleEndian);
1450+
uint64_t ELFObjectWriter::writeObject(MCAssembler &Asm) {
1451+
uint64_t Size =
1452+
ELFWriter(*this, OS, IsLittleEndian,
1453+
DwoOS ? ELFWriter::NonDwoOnly : ELFWriter::AllSections)
1454+
.writeObject(Asm);
1455+
if (DwoOS)
1456+
Size += ELFWriter(*this, *DwoOS, IsLittleEndian, ELFWriter::DwoOnly)
1457+
.writeObject(Asm);
1458+
return Size;
14891459
}

llvm/lib/MC/MCAsmBackend.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,17 @@ MCAsmBackend::~MCAsmBackend() = default;
3232
std::unique_ptr<MCObjectWriter>
3333
MCAsmBackend::createObjectWriter(raw_pwrite_stream &OS) const {
3434
auto TW = createObjectTargetWriter();
35+
bool IsLE = Endian == llvm::endianness::little;
3536
switch (TW->getFormat()) {
36-
case Triple::ELF:
37-
return createELFObjectWriter(cast<MCELFObjectTargetWriter>(std::move(TW)),
38-
OS, Endian == llvm::endianness::little);
3937
case Triple::MachO:
4038
return createMachObjectWriter(cast<MCMachObjectTargetWriter>(std::move(TW)),
41-
OS, Endian == llvm::endianness::little);
39+
OS, IsLE);
4240
case Triple::COFF:
4341
return createWinCOFFObjectWriter(
4442
cast<MCWinCOFFObjectTargetWriter>(std::move(TW)), OS);
43+
case Triple::ELF:
44+
return std::make_unique<ELFObjectWriter>(
45+
cast<MCELFObjectTargetWriter>(std::move(TW)), OS, IsLE);
4546
case Triple::SPIRV:
4647
return createSPIRVObjectWriter(
4748
cast<MCSPIRVObjectTargetWriter>(std::move(TW)), OS);
@@ -71,7 +72,7 @@ MCAsmBackend::createDwoObjectWriter(raw_pwrite_stream &OS,
7172
return createWinCOFFDwoObjectWriter(
7273
cast<MCWinCOFFObjectTargetWriter>(std::move(TW)), OS, DwoOS);
7374
case Triple::ELF:
74-
return createELFDwoObjectWriter(
75+
return std::make_unique<ELFObjectWriter>(
7576
cast<MCELFObjectTargetWriter>(std::move(TW)), OS, DwoOS,
7677
Endian == llvm::endianness::little);
7778
case Triple::Wasm:

0 commit comments

Comments
 (0)