@@ -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
255203uint64_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+
11591117void 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+
13601334void 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}
0 commit comments