@@ -138,71 +138,52 @@ Error EHFrameEdgeFixer::processBlock(ParseContext &PC, Block &B) {
138
138
BlockEdges[E.getOffset ()] = EdgeTarget (E);
139
139
}
140
140
141
- CIEInfosMap CIEInfos;
142
141
BinaryStreamReader BlockReader (
143
142
StringRef (B.getContent ().data (), B.getContent ().size ()),
144
143
PC.G .getEndianness ());
145
- while (!BlockReader.empty ()) {
146
- size_t RecordStartOffset = BlockReader.getOffset ();
147
144
148
- LLVM_DEBUG ({
149
- dbgs () << " Processing CFI record at "
150
- << (B.getAddress () + RecordStartOffset) << " \n " ;
151
- });
152
-
153
- // Get the record length.
154
- Expected<size_t > RecordRemaining = readCFIRecordLength (B, BlockReader);
155
- if (!RecordRemaining)
156
- return RecordRemaining.takeError ();
157
-
158
- if (BlockReader.bytesRemaining () < *RecordRemaining)
159
- return make_error<JITLinkError>(
160
- " Incomplete CFI record at " +
161
- formatv (" {0:x16}" , B.getAddress () + RecordStartOffset));
145
+ // Get the record length.
146
+ Expected<size_t > RecordRemaining = readCFIRecordLength (B, BlockReader);
147
+ if (!RecordRemaining)
148
+ return RecordRemaining.takeError ();
149
+
150
+ // We expect DWARFRecordSectionSplitter to split each CFI record into its own
151
+ // block.
152
+ if (BlockReader.bytesRemaining () != *RecordRemaining)
153
+ return make_error<JITLinkError>(" Incomplete CFI record at " +
154
+ formatv (" {0:x16}" , B.getAddress ()));
155
+
156
+ // Read the CIE delta for this record.
157
+ uint64_t CIEDeltaFieldOffset = BlockReader.getOffset ();
158
+ uint32_t CIEDelta;
159
+ if (auto Err = BlockReader.readInteger (CIEDelta))
160
+ return Err;
162
161
163
- // Read the CIE delta for this record.
164
- uint64_t CIEDeltaFieldOffset = BlockReader.getOffset () - RecordStartOffset;
165
- uint32_t CIEDelta;
166
- if (auto Err = BlockReader.readInteger (CIEDelta))
162
+ if (CIEDelta == 0 ) {
163
+ if (auto Err = processCIE (PC, B, CIEDeltaFieldOffset, BlockEdges))
164
+ return Err;
165
+ } else {
166
+ if (auto Err = processFDE (PC, B, CIEDeltaFieldOffset, CIEDelta, BlockEdges))
167
167
return Err;
168
-
169
- if (CIEDelta == 0 ) {
170
- if (auto Err = processCIE (PC, B, RecordStartOffset,
171
- CIEDeltaFieldOffset + *RecordRemaining,
172
- CIEDeltaFieldOffset, BlockEdges))
173
- return Err;
174
- } else {
175
- if (auto Err = processFDE (PC, B, RecordStartOffset,
176
- CIEDeltaFieldOffset + *RecordRemaining,
177
- CIEDeltaFieldOffset, CIEDelta, BlockEdges))
178
- return Err;
179
- }
180
-
181
- // Move to the next record.
182
- BlockReader.setOffset (RecordStartOffset + CIEDeltaFieldOffset +
183
- *RecordRemaining);
184
168
}
185
169
186
170
return Error::success ();
187
171
}
188
172
189
173
Error EHFrameEdgeFixer::processCIE (ParseContext &PC, Block &B,
190
- size_t RecordOffset, size_t RecordLength,
191
174
size_t CIEDeltaFieldOffset,
192
175
const BlockEdgeMap &BlockEdges) {
193
176
194
- LLVM_DEBUG (dbgs () << " Record is CIE\n " );
177
+ LLVM_DEBUG (dbgs () << " Record is CIE\n " );
195
178
196
- auto RecordContent = B.getContent ().slice (RecordOffset, RecordLength);
197
179
BinaryStreamReader RecordReader (
198
- StringRef (RecordContent. data (), RecordContent .size ()),
180
+ StringRef (B. getContent (). data (), B. getContent () .size ()),
199
181
PC.G .getEndianness ());
200
182
201
183
// Skip past the CIE delta field: we've already processed this far.
202
184
RecordReader.setOffset (CIEDeltaFieldOffset + 4 );
203
185
204
- auto &CIESymbol =
205
- PC.G .addAnonymousSymbol (B, RecordOffset, RecordLength, false , false );
186
+ auto &CIESymbol = PC.G .addAnonymousSymbol (B, 0 , B.getSize (), false , false );
206
187
CIEInformation CIEInfo (CIESymbol);
207
188
208
189
uint8_t Version = 0 ;
@@ -268,7 +249,7 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
268
249
if (auto Err =
269
250
getOrCreateEncodedPointerEdge (
270
251
PC, BlockEdges, *PersonalityPointerEncoding, RecordReader,
271
- B, RecordOffset + RecordReader.getOffset (), " personality" )
252
+ B, RecordReader.getOffset (), " personality" )
272
253
.takeError ())
273
254
return Err;
274
255
break ;
@@ -279,7 +260,7 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
279
260
if (CIEInfo.AddressEncoding == dwarf::DW_EH_PE_omit)
280
261
return make_error<JITLinkError>(
281
262
" Invalid address encoding DW_EH_PE_omit in CIE at " +
282
- formatv (" {0:x}" , ( B.getAddress () + RecordOffset ).getValue ()));
263
+ formatv (" {0:x}" , B.getAddress ().getValue ()));
283
264
} else
284
265
return PE.takeError ();
285
266
break ;
@@ -302,69 +283,50 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
302
283
}
303
284
304
285
Error EHFrameEdgeFixer::processFDE (ParseContext &PC, Block &B,
305
- size_t RecordOffset, size_t RecordLength,
306
286
size_t CIEDeltaFieldOffset,
307
287
uint32_t CIEDelta,
308
288
const BlockEdgeMap &BlockEdges) {
309
- LLVM_DEBUG (dbgs () << " Record is FDE\n " );
289
+ LLVM_DEBUG (dbgs () << " Record is FDE\n " );
310
290
311
- orc::ExecutorAddr RecordAddress = B.getAddress () + RecordOffset ;
291
+ orc::ExecutorAddr RecordAddress = B.getAddress ();
312
292
313
- auto RecordContent = B.getContent ().slice (RecordOffset, RecordLength);
314
293
BinaryStreamReader RecordReader (
315
- StringRef (RecordContent. data (), RecordContent .size ()),
294
+ StringRef (B. getContent (). data (), B. getContent () .size ()),
316
295
PC.G .getEndianness ());
317
296
318
297
// Skip past the CIE delta field: we've already read this far.
319
298
RecordReader.setOffset (CIEDeltaFieldOffset + 4 );
320
299
321
- auto &FDESymbol =
322
- PC.G .addAnonymousSymbol (B, RecordOffset, RecordLength, false , false );
300
+ auto &FDESymbol = PC.G .addAnonymousSymbol (B, 0 , B.getSize (), false , false );
323
301
324
302
CIEInformation *CIEInfo = nullptr ;
325
303
326
304
{
327
305
// Process the CIE pointer field.
328
- auto CIEEdgeItr = BlockEdges.find (RecordOffset + CIEDeltaFieldOffset);
306
+ auto CIEEdgeItr = BlockEdges.find (CIEDeltaFieldOffset);
307
+ if (CIEEdgeItr != BlockEdges.end ())
308
+ return make_error<JITLinkError>(
309
+ " CIE pointer field already has edge at " +
310
+ formatv (" {0:x16}" , RecordAddress + CIEDeltaFieldOffset));
311
+
329
312
orc::ExecutorAddr CIEAddress =
330
313
RecordAddress + orc::ExecutorAddrDiff (CIEDeltaFieldOffset) -
331
314
orc::ExecutorAddrDiff (CIEDelta);
332
- if (CIEEdgeItr == BlockEdges.end ()) {
333
-
334
- LLVM_DEBUG ({
335
- dbgs () << " Adding edge at "
336
- << (RecordAddress + CIEDeltaFieldOffset)
337
- << " to CIE at: " << CIEAddress << " \n " ;
338
- });
339
- if (auto CIEInfoOrErr = PC.findCIEInfo (CIEAddress))
340
- CIEInfo = *CIEInfoOrErr;
341
- else
342
- return CIEInfoOrErr.takeError ();
343
- assert (CIEInfo->CIESymbol && " CIEInfo has no CIE symbol set" );
344
- B.addEdge (NegDelta32, RecordOffset + CIEDeltaFieldOffset,
345
- *CIEInfo->CIESymbol , 0 );
346
- } else {
347
- LLVM_DEBUG ({
348
- dbgs () << " Already has edge at "
349
- << (RecordAddress + CIEDeltaFieldOffset) << " to CIE at "
350
- << CIEAddress << " \n " ;
351
- });
352
- auto &EI = CIEEdgeItr->second ;
353
- if (EI.Addend )
354
- return make_error<JITLinkError>(
355
- " CIE edge at " +
356
- formatv (" {0:x16}" , RecordAddress + CIEDeltaFieldOffset) +
357
- " has non-zero addend" );
358
- if (auto CIEInfoOrErr = PC.findCIEInfo (EI.Target ->getAddress ()))
359
- CIEInfo = *CIEInfoOrErr;
360
- else
361
- return CIEInfoOrErr.takeError ();
362
- }
315
+ LLVM_DEBUG ({
316
+ dbgs () << " Adding edge at " << (RecordAddress + CIEDeltaFieldOffset)
317
+ << " to CIE at: " << CIEAddress << " \n " ;
318
+ });
319
+ if (auto CIEInfoOrErr = PC.findCIEInfo (CIEAddress))
320
+ CIEInfo = *CIEInfoOrErr;
321
+ else
322
+ return CIEInfoOrErr.takeError ();
323
+ assert (CIEInfo->CIESymbol && " CIEInfo has no CIE symbol set" );
324
+ B.addEdge (NegDelta32, CIEDeltaFieldOffset, *CIEInfo->CIESymbol , 0 );
363
325
}
364
326
365
327
// Process the PC-Begin field.
366
328
LLVM_DEBUG ({
367
- dbgs () << " Processing PC-begin at "
329
+ dbgs () << " Processing PC-begin at "
368
330
<< (RecordAddress + RecordReader.getOffset ()) << " \n " ;
369
331
});
370
332
if (auto PCBegin = getOrCreateEncodedPointerEdge (
@@ -375,14 +337,14 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
375
337
// Add a keep-alive edge from the FDE target to the FDE to ensure that the
376
338
// FDE is kept alive if its target is.
377
339
LLVM_DEBUG ({
378
- dbgs () << " Adding keep-alive edge from target at "
340
+ dbgs () << " Adding keep-alive edge from target at "
379
341
<< (*PCBegin)->getBlock ().getAddress () << " to FDE at "
380
342
<< RecordAddress << " \n " ;
381
343
});
382
344
(*PCBegin)->getBlock ().addEdge (Edge::KeepAlive, 0 , FDESymbol, 0 );
383
345
} else {
384
346
LLVM_DEBUG ({
385
- dbgs () << " WARNING: Not adding keep-alive edge to FDE at "
347
+ dbgs () << " WARNING: Not adding keep-alive edge to FDE at "
386
348
<< RecordAddress << " , which points to "
387
349
<< ((*PCBegin)->isExternal () ? " external" : " absolute" )
388
350
<< " symbol \" " << (*PCBegin)->getName ()
@@ -409,7 +371,7 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
409
371
.takeError ())
410
372
return Err;
411
373
} else {
412
- LLVM_DEBUG (dbgs () << " Record does not have LSDA field.\n " );
374
+ LLVM_DEBUG (dbgs () << " Record does not have LSDA field.\n " );
413
375
}
414
376
415
377
return Error::success ();
@@ -534,7 +496,7 @@ Expected<Symbol *> EHFrameEdgeFixer::getOrCreateEncodedPointerEdge(
534
496
auto EdgeI = BlockEdges.find (PointerFieldOffset);
535
497
if (EdgeI != BlockEdges.end ()) {
536
498
LLVM_DEBUG ({
537
- dbgs () << " Existing edge at "
499
+ dbgs () << " Existing edge at "
538
500
<< (BlockToFix.getAddress () + PointerFieldOffset) << " to "
539
501
<< FieldName << " at " << EdgeI->second .Target ->getAddress ();
540
502
if (EdgeI->second .Target ->hasName ())
@@ -596,7 +558,7 @@ Expected<Symbol *> EHFrameEdgeFixer::getOrCreateEncodedPointerEdge(
596
558
BlockToFix.addEdge (PtrEdgeKind, PointerFieldOffset, *TargetSym, 0 );
597
559
598
560
LLVM_DEBUG ({
599
- dbgs () << " Adding edge at "
561
+ dbgs () << " Adding edge at "
600
562
<< (BlockToFix.getAddress () + PointerFieldOffset) << " to "
601
563
<< FieldName << " at " << TargetSym->getAddress ();
602
564
if (TargetSym->hasName ())
0 commit comments