@@ -257,17 +257,33 @@ class AppleAccelTableData : public AccelTableData {
257257
258258// / Helper class to identify an entry in DWARF5AccelTable based on their DIE
259259// / 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; }
267270};
268271
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+ };
271287
272288// / The Data class implementation for DWARF v5 accelerator table. Unlike the
273289// / Apple Data classes, this class is just a DIE wrapper, and does not know to
@@ -277,12 +293,11 @@ class DWARF5AccelTableData : public AccelTableData {
277293public:
278294 static uint32_t hash (StringRef Name) { return caseFoldingDjbHash (Name); }
279295
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);
282297 DWARF5AccelTableData (const uint64_t DieOffset,
283298 const std::optional<uint64_t > DefiningParentOffset,
284299 const unsigned DieTag, const unsigned UnitID,
285- const bool IsTU = false )
300+ const bool IsTU)
286301 : OffsetVal(DieOffset), ParentOffset(DefiningParentOffset),
287302 DieTag (DieTag), AbbrevNumber(0 ), IsTU(IsTU), UnitID(UnitID) {}
288303
@@ -296,7 +311,7 @@ class DWARF5AccelTableData : public AccelTableData {
296311 }
297312
298313 OffsetAndUnitID getDieOffsetAndUnitID () const {
299- return {getDieOffset (), UnitID };
314+ return {getDieOffset (), getUnitID (), isTU () };
300315 }
301316
302317 unsigned getDieTag () const { return DieTag; }
@@ -322,7 +337,7 @@ class DWARF5AccelTableData : public AccelTableData {
322337 assert (isNormalized () && " Accessing DIE Offset before normalizing." );
323338 if (!ParentOffset)
324339 return std::nullopt ;
325- return OffsetAndUnitID (*ParentOffset, getUnitID ());
340+ return OffsetAndUnitID (*ParentOffset, getUnitID (), isTU () );
326341 }
327342
328343 // / Sets AbbrevIndex for an Entry.
@@ -416,7 +431,7 @@ class DWARF5AccelTable : public AccelTable<DWARF5AccelTableData> {
416431 for (auto *Data : Entry.second .getValues <DWARF5AccelTableData *>()) {
417432 addName (Entry.second .Name , Data->getDieOffset (),
418433 Data->getParentDieOffset (), Data->getDieTag (),
419- Data->getUnitID (), true );
434+ Data->getUnitID (), Data-> isTU () );
420435 }
421436 }
422437 }
0 commit comments