Do not print empty DW_AT_comp_dir.
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfWriter.cpp
index 168b36c24425fcd02c0eef05446519acbbc29ee7..e41e4cbb6e0957bd4669a8b858189408b9ea20f0 100644 (file)
@@ -1559,7 +1559,7 @@ private:
                                           sizeof(int32_t));
 
         // Add subranges to array type.
-        for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
+        for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
           SubrangeDesc *SRD = cast<SubrangeDesc>(Elements[i]);
           int64_t Lo = SRD->getLo();
           int64_t Hi = SRD->getHi();
@@ -1580,12 +1580,11 @@ private:
       case DW_TAG_structure_type:
       case DW_TAG_union_type: {
         // Add elements to structure type.
-        for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
+        for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
           DebugInfoDesc *Element = Elements[i];
 
           if (DerivedTypeDesc *MemberDesc = dyn_cast<DerivedTypeDesc>(Element)){
             // Add field or base class.
-
             unsigned Tag = MemberDesc->getTag();
 
             // Extract the basic information.
@@ -1600,6 +1599,7 @@ private:
             // Add name if not "".
             if (!Name.empty())
               AddString(Member, DW_AT_name, DW_FORM_string, Name);
+
             // Add location if available.
             AddSourceLine(Member, MemberDesc->getFile(), MemberDesc->getLine());
 
@@ -1723,7 +1723,7 @@ private:
               }
 
               // Add arguments.
-              for(unsigned i = 1, N = Args.size(); i < N; ++i) {
+              for (unsigned i = 1, N = Args.size(); i < N; ++i) {
                 DIE *Arg = new DIE(DW_TAG_formal_parameter);
                 AddType(Arg, cast<TypeDesc>(Args[i]), Unit);
                 AddUInt(Arg, DW_AT_artificial, DW_FORM_flag, 1);
@@ -1743,7 +1743,7 @@ private:
       }
       case DW_TAG_enumeration_type: {
         // Add enumerators to enumeration type.
-        for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
+        for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
           EnumeratorDesc *ED = cast<EnumeratorDesc>(Elements[i]);
           const std::string &Name = ED->getName();
           int64_t Value = ED->getValue();
@@ -1762,7 +1762,7 @@ private:
         AddType(&Buffer, dyn_cast<TypeDesc>(Elements[0]), Unit);
 
         // Add arguments.
-        for(unsigned i = 1, N = Elements.size(); i < N; ++i) {
+        for (unsigned i = 1, N = Elements.size(); i < N; ++i) {
           DIE *Arg = new DIE(DW_TAG_formal_parameter);
           AddType(Arg, cast<TypeDesc>(Elements[i]), Unit);
           Buffer.AddChild(Arg);
@@ -1774,12 +1774,25 @@ private:
       }
     }
 
-    // Add size if non-zero (derived types don't have a size.)
-    if (Size) AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
     // Add name if not anonymous or intermediate type.
     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
-    // Add source line info if available.
-    AddSourceLine(&Buffer, TyDesc->getFile(), TyDesc->getLine());
+
+    // Add size if non-zero (derived types might be zero-sized.)
+    if (Size)
+      AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
+    else if (isa<CompositeTypeDesc>(TyDesc)) {
+      // If TyDesc is a composite type, then add size even if it's zero unless
+      // it's a forward declaration.
+      if (TyDesc->isForwardDecl())
+        AddUInt(&Buffer, DW_AT_declaration, DW_FORM_flag, 1);
+      else
+        AddUInt(&Buffer, DW_AT_byte_size, 0, 0);
+    }
+
+    // Add source line info if available and TyDesc is not a forward
+    // declaration.
+    if (!TyDesc->isForwardDecl())
+      AddSourceLine(&Buffer, TyDesc->getFile(), TyDesc->getLine());
   }
 
   /// NewCompileUnit - Create new compile unit and it's debug information entry.
@@ -1792,7 +1805,8 @@ private:
     AddString(Die, DW_AT_producer,  DW_FORM_string, UnitDesc->getProducer());
     AddUInt  (Die, DW_AT_language,  DW_FORM_data1,  UnitDesc->getLanguage());
     AddString(Die, DW_AT_name,      DW_FORM_string, UnitDesc->getFileName());
-    AddString(Die, DW_AT_comp_dir,  DW_FORM_string, UnitDesc->getDirectory());
+    if (!UnitDesc->getDirectory().empty())
+      AddString(Die, DW_AT_comp_dir,  DW_FORM_string, UnitDesc->getDirectory());
 
     // Construct compile unit.
     CompileUnit *Unit = new CompileUnit(UnitDesc, ID, Die);
@@ -2060,8 +2074,11 @@ private:
         return;
       }
     }
-
+#if 0
+    // FIXME: This is causing an abort because C++ mangled names are compared
+    // with their unmangled counterparts. See PR2885. Don't do this assert.
     assert(0 && "Couldn't find DIE for machine function!");
+#endif
   }
 
   /// EmitInitial - Emit initial Dwarf declarations.  This is necessary for cc
@@ -3430,8 +3447,8 @@ private:
 
     // Begin the exception table.
     Asm->SwitchToDataSection(TAI->getDwarfExceptionSection());
-    O << "GCC_except_table" << SubprogramCount << ":\n";
     Asm->EmitAlignment(2, 0, 0, false);
+    O << "GCC_except_table" << SubprogramCount << ":\n";
     for (unsigned i = 0; i != SizeAlign; ++i) {
       Asm->EmitInt8(0);
       Asm->EOL("Padding");