@@ -198,58 +198,6 @@ struct ELFWriter {
198
198
void writeSection (uint32_t GroupSymbolIndex, uint64_t Offset, uint64_t Size,
199
199
const MCSectionELF &Section);
200
200
};
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
-
253
201
} // end anonymous namespace
254
202
255
203
uint64_t ELFWriter::align (Align Alignment) {
@@ -1156,6 +1104,16 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) {
1156
1104
return W.OS .tell () - StartOffset;
1157
1105
}
1158
1106
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
+
1159
1117
void ELFObjectWriter::reset () {
1160
1118
ELFHeaderEFlags = 0 ;
1161
1119
SeenGnuAbi = false ;
@@ -1357,6 +1315,22 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
1357
1315
return false ;
1358
1316
}
1359
1317
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
+
1360
1334
void ELFObjectWriter::recordRelocation (MCAssembler &Asm,
1361
1335
const MCFragment *Fragment,
1362
1336
const MCFixup &Fixup, MCValue Target,
@@ -1473,17 +1447,13 @@ bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
1473
1447
return &SymA.getSection () == FB.getParent ();
1474
1448
}
1475
1449
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;
1489
1459
}
0 commit comments