@@ -257,17 +257,33 @@ class AppleAccelTableData : public AccelTableData {
257
257
258
258
// / Helper class to identify an entry in DWARF5AccelTable based on their DIE
259
259
// / offset and UnitID.
260
- struct OffsetAndUnitID : std::pair<uint64_t , uint32_t > {
261
- using Base = std::pair<uint64_t , uint32_t >;
262
- OffsetAndUnitID (Base B) : Base(B) {}
263
-
264
- OffsetAndUnitID (uint64_t Offset, uint32_t UnitID) : Base(Offset, UnitID) {}
265
- uint64_t offset () const { return first; };
266
- uint32_t unitID () const { return second; };
260
+ struct OffsetAndUnitID {
261
+ uint64_t Offset = 0 ;
262
+ uint32_t UnitID = 0 ;
263
+ bool IsTU = false ;
264
+ OffsetAndUnitID () = delete ;
265
+ OffsetAndUnitID (uint64_t Offset, uint32_t UnitID, bool IsTU)
266
+ : Offset(Offset), UnitID(UnitID), IsTU(IsTU) {}
267
+ uint64_t offset () const { return Offset; };
268
+ uint32_t unitID () const { return UnitID; };
269
+ bool isTU () const { return IsTU; }
267
270
};
268
271
269
- template <>
270
- struct DenseMapInfo <OffsetAndUnitID> : DenseMapInfo<OffsetAndUnitID::Base> {};
272
+ template <> struct DenseMapInfo <OffsetAndUnitID> {
273
+ static inline OffsetAndUnitID getEmptyKey () {
274
+ return OffsetAndUnitID (-1 , -1 , false );
275
+ }
276
+ static inline OffsetAndUnitID getTombstoneKey () {
277
+ return OffsetAndUnitID (-2 , -2 , false );
278
+ }
279
+ static unsigned getHashValue (const OffsetAndUnitID &Val) {
280
+ return (unsigned )llvm::hash_combine (Val.offset (), Val.unitID (), Val.IsTU );
281
+ }
282
+ static bool isEqual (const OffsetAndUnitID &LHS, const OffsetAndUnitID &RHS) {
283
+ return LHS.offset () == RHS.offset () && LHS.unitID () == RHS.unitID () &&
284
+ LHS.IsTU == RHS.isTU ();
285
+ }
286
+ };
271
287
272
288
// / The Data class implementation for DWARF v5 accelerator table. Unlike the
273
289
// / Apple Data classes, this class is just a DIE wrapper, and does not know to
@@ -277,12 +293,11 @@ class DWARF5AccelTableData : public AccelTableData {
277
293
public:
278
294
static uint32_t hash (StringRef Name) { return caseFoldingDjbHash (Name); }
279
295
280
- DWARF5AccelTableData (const DIE &Die, const uint32_t UnitID,
281
- const bool IsTU = false );
296
+ DWARF5AccelTableData (const DIE &Die, const uint32_t UnitID, const bool IsTU);
282
297
DWARF5AccelTableData (const uint64_t DieOffset,
283
298
const std::optional<uint64_t > DefiningParentOffset,
284
299
const unsigned DieTag, const unsigned UnitID,
285
- const bool IsTU = false )
300
+ const bool IsTU)
286
301
: OffsetVal(DieOffset), ParentOffset(DefiningParentOffset),
287
302
DieTag (DieTag), AbbrevNumber(0 ), IsTU(IsTU), UnitID(UnitID) {}
288
303
@@ -296,7 +311,7 @@ class DWARF5AccelTableData : public AccelTableData {
296
311
}
297
312
298
313
OffsetAndUnitID getDieOffsetAndUnitID () const {
299
- return {getDieOffset (), UnitID };
314
+ return {getDieOffset (), getUnitID (), isTU () };
300
315
}
301
316
302
317
unsigned getDieTag () const { return DieTag; }
@@ -322,7 +337,7 @@ class DWARF5AccelTableData : public AccelTableData {
322
337
assert (isNormalized () && " Accessing DIE Offset before normalizing." );
323
338
if (!ParentOffset)
324
339
return std::nullopt;
325
- return OffsetAndUnitID (*ParentOffset, getUnitID ());
340
+ return OffsetAndUnitID (*ParentOffset, getUnitID (), isTU () );
326
341
}
327
342
328
343
// / Sets AbbrevIndex for an Entry.
@@ -416,7 +431,7 @@ class DWARF5AccelTable : public AccelTable<DWARF5AccelTableData> {
416
431
for (auto *Data : Entry.second .getValues <DWARF5AccelTableData *>()) {
417
432
addName (Entry.second .Name , Data->getDieOffset (),
418
433
Data->getParentDieOffset (), Data->getDieTag (),
419
- Data->getUnitID (), true );
434
+ Data->getUnitID (), Data-> isTU () );
420
435
}
421
436
}
422
437
}
0 commit comments