[llvm] r199630 - Fix a DenseMap iterator invalidation bug causing lots of crashes when

Chandler Carruth chandlerc at gmail.com
Mon Jan 20 00:07:07 PST 2014


Author: chandlerc
Date: Mon Jan 20 02:07:07 2014
New Revision: 199630

URL: http://llvm.org/viewvc/llvm-project?rev=199630&view=rev
Log:
Fix a DenseMap iterator invalidation bug causing lots of crashes when
type units were enabled. The crux of the issue is that the
addDwarfTypeUnitType routine can end up being indirectly recursive. In
this case, the reference into the dense map (TU) became invalid by the
time we popped all the way back and used it to add the DIE type
signature.

Instead, use early return in the case where we can bypass the recursive
step and creating a type unit. Then use the pointer to the new type unit
to set up the DIE type signature in the case where we have to.

I tried really hard to reduce a testcase for this, but it's really
annoying. You have to get this to be mid-recursion when the densemap
grows. Even if we got a test case for this today, it'd be very unlikely
to continue exercising this pattern.

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=199630&r1=199629&r2=199630&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Jan 20 02:07:07 2014
@@ -3027,36 +3027,40 @@ void DwarfDebug::emitDebugStrDWO() {
 void DwarfDebug::addDwarfTypeUnitType(DICompileUnit CUNode,
                                       StringRef Identifier, DIE *RefDie,
                                       DICompositeType CTy) {
+
   const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
-  if (!TU) {
-    DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
-    DwarfTypeUnit *NewTU = new DwarfTypeUnit(
-        InfoHolder.getUnits().size(), UnitDie, CUNode, Asm, this, &InfoHolder);
-    TU = NewTU;
-    InfoHolder.addUnit(NewTU);
-
-    NewTU->addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
-                   CUNode.getLanguage());
-
-    MD5 Hash;
-    Hash.update(Identifier);
-    // ... take the least significant 8 bytes and return those. Our MD5
-    // implementation always returns its results in little endian, swap bytes
-    // appropriately.
-    MD5::MD5Result Result;
-    Hash.final(Result);
-    uint64_t Signature = *reinterpret_cast<support::ulittle64_t *>(Result + 8);
-    NewTU->setTypeSignature(Signature);
-    if (useSplitDwarf())
-      NewTU->setSkeleton(constructSkeletonTU(NewTU));
-
-    NewTU->setType(NewTU->createTypeDIE(CTy));
-
-    NewTU->initSection(
-        useSplitDwarf()
-            ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
-            : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
+  if (TU) {
+    CUMap.begin()->second->addDIETypeSignature(RefDie, *TU);
+    return;
   }
 
-  CUMap.begin()->second->addDIETypeSignature(RefDie, *TU);
+  DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
+  DwarfTypeUnit *NewTU = new DwarfTypeUnit(
+      InfoHolder.getUnits().size(), UnitDie, CUNode, Asm, this, &InfoHolder);
+  TU = NewTU;
+  InfoHolder.addUnit(NewTU);
+
+  NewTU->addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
+                 CUNode.getLanguage());
+
+  MD5 Hash;
+  Hash.update(Identifier);
+  // ... take the least significant 8 bytes and return those. Our MD5
+  // implementation always returns its results in little endian, swap bytes
+  // appropriately.
+  MD5::MD5Result Result;
+  Hash.final(Result);
+  uint64_t Signature = *reinterpret_cast<support::ulittle64_t *>(Result + 8);
+  NewTU->setTypeSignature(Signature);
+  if (useSplitDwarf())
+    NewTU->setSkeleton(constructSkeletonTU(NewTU));
+
+  NewTU->setType(NewTU->createTypeDIE(CTy));
+
+  NewTU->initSection(
+      useSplitDwarf()
+          ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
+          : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
+
+  CUMap.begin()->second->addDIETypeSignature(RefDie, *NewTU);
 }





More information about the llvm-commits mailing list