Make sure we don't emit an ODR hash for types with no name and make
authorEric Christopher <echristo@gmail.com>
Mon, 29 Jul 2013 23:53:05 +0000 (23:53 +0000)
committerEric Christopher <echristo@gmail.com>
Mon, 29 Jul 2013 23:53:05 +0000 (23:53 +0000)
sure the comments for each testcase are a bit easier to distinguish.

llvm-svn: 187392

llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
llvm/test/DebugInfo/generate-odr-hash.ll

index 33d18db..8735442 100644 (file)
@@ -1104,10 +1104,12 @@ void DwarfDebug::finalizeModuleInfo() {
   for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
     MD5 Hash;
     DIE *Die = TypeUnits[i];
-    // If we've requested ODR hashes, the current language is C++, and the type
-    // isn't located inside a C++ anonymous namespace then add the attribute now.
+    // If we've requested ODR hashes, the current language is C++, the type is
+    // named, and the type isn't located inside a C++ anonymous namespace then
+    // add the ODR signature attribute now.
     if (GenerateODRHash &&
         CUMap.begin()->second->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
+        (getDIEStringAttr(Die, dwarf::DW_AT_name) != "") &&
         !isContainedInAnonNamespace(Die))
       addDIEODRSignature(Hash, CUMap.begin()->second, Die);
   }
index dcd748c..c3bcb4f 100644 (file)
 ; struct walrus {};
 ; }
 ; walrus w;
+; struct wombat {
+;   struct {
+;     int  a;
+;     int  b;
+;   } a_b;
+; };
+; wombat wom;
 
-; Check that we generate a hash for bar, that it is a particular value and
-; that we don't generate a hash for baz or walrus.
+; Check that we generate a hash for bar and the value.
 ; CHECK: DW_TAG_structure_type
 ; CHECK-NEXT: debug_str{{.*}}"bar"
 ; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x200520c0d5b90eff)
 ; CHECK: DW_TAG_class_type
 ; CHECK-NEXT: debug_str{{.*}}"fluffy"
 ; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8]   (0x9a0124d5a0c21c52)
+
+; Check that we generate a hash for wombat and the value, but not for the
+; anonymous type contained within.
+; CHECK: DW_TAG_structure_type
+; CHECK-NEXT: debug_str{{.*}}wombat
+; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7)
+; CHECK: DW_TAG_structure_type
+; CHECK-NEXT: DW_AT_byte_size
+; CHECK-NEXT: DW_AT_decl_file
+; CHECK-NEXT: DW_AT_decl_line
+; CHECK: DW_TAG_member
+; CHECK-NEXT: debug_str{{.*}}"a"
+
+; Check that we don't generate a hash for baz.
 ; CHECK: DW_TAG_structure_type
 ; CHECK-NEXT: debug_str{{.*}}"baz"
 ; CHECK-NOT: DW_AT_GNU_odr_signature
+
 ; FIXME: PR16740 we may want to generate debug info for walrus, but still no hash since
 ; the type is contained in an anonymous namespace and not visible externally even if
 ; the variable is...
 ; CHECK-NOT: debug_str{{.*}}"walrus"
 
-
 %struct.bar = type { i8 }
 %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
+%struct.wombat = type { %struct.anon }
+%struct.anon = type { i32, i32 }
 %struct.baz = type { i8 }
 
 @b = global %struct.bar zeroinitializer, align 1
 @_ZN7echidna8capybara8mongoose6animalE = global %"class.echidna::capybara::mongoose::fluffy" zeroinitializer, align 4
+@wom = global %struct.wombat zeroinitializer, align 4
 
 ; Function Attrs: nounwind uwtable
 define void @_Z3foov() #0 {
 entry:
   %b = alloca %struct.baz, align 1
-  call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !32), !dbg !40
-  ret void, !dbg !41
+  call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !50), !dbg !58
+  ret void, !dbg !59
 }
 
 ; Function Attrs: nounwind readnone
@@ -72,9 +95,9 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe
 attributes #1 = { nounwind readnone }
 
 !llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!31}
+!llvm.module.flags = !{!49}
 
-!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 187152) (llvm/trunk 187150)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !8, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/bar.cpp] [DW_LANG_C_plus_plus]
+!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 187387) (llvm/trunk 187385)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !8, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/bar.cpp] [DW_LANG_C_plus_plus]
 !1 = metadata !{metadata !"bar.cpp", metadata !"/usr/local/google/home/echristo/tmp"}
 !2 = metadata !{i32 0}
 !3 = metadata !{metadata !4}
@@ -82,7 +105,7 @@ attributes #1 = { nounwind readnone }
 !5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/bar.cpp]
 !6 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
 !7 = metadata !{null}
-!8 = metadata !{metadata !9, metadata !17}
+!8 = metadata !{metadata !9, metadata !17, metadata !31}
 !9 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !5, i32 4, metadata !10, i32 0, i32 1, %struct.bar* @b, null} ; [ DW_TAG_variable ] [b] [line 4] [def]
 !10 = metadata !{i32 786451, metadata !1, null, metadata !"bar", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !11, i32 0, null, null} ; [ DW_TAG_structure_type ] [bar] [line 1, size 8, align 8, offset 0] [def] [from ]
 !11 = metadata !{metadata !12}
@@ -105,14 +128,32 @@ attributes #1 = { nounwind readnone }
 !28 = metadata !{null, metadata !29}
 !29 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !21} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from fluffy]
 !30 = metadata !{i32 786468}
-!31 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
-!32 = metadata !{i32 786688, metadata !4, metadata !"b", metadata !5, i32 9, metadata !33, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 9]
-!33 = metadata !{i32 786451, metadata !1, metadata !4, metadata !"baz", i32 7, i64 8, i64 8, i32 0, i32 0, null, metadata !34, i32 0, null, null} ; [ DW_TAG_structure_type ] [baz] [line 7, size 8, align 8, offset 0] [def] [from ]
-!34 = metadata !{metadata !35}
-!35 = metadata !{i32 786478, metadata !1, metadata !33, metadata !"baz", metadata !"baz", metadata !"", i32 7, metadata !36, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !39, i32 7} ; [ DW_TAG_subprogram ] [line 7] [baz]
-!36 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !37, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
-!37 = metadata !{null, metadata !38}
-!38 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !33} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from baz]
-!39 = metadata !{i32 786468}
-!40 = metadata !{i32 9, i32 0, metadata !4, null}
-!41 = metadata !{i32 10, i32 0, metadata !4, null}
+!31 = metadata !{i32 786484, i32 0, null, metadata !"wom", metadata !"wom", metadata !"", metadata !5, i32 39, metadata !32, i32 0, i32 1, %struct.wombat* @wom, null} ; [ DW_TAG_variable ] [wom] [line 39] [def]
+!32 = metadata !{i32 786451, metadata !1, null, metadata !"wombat", i32 32, i64 64, i64 32, i32 0, i32 0, null, metadata !33, i32 0, null, null} ; [ DW_TAG_structure_type ] [wombat] [line 32, size 64, align 32, offset 0] [def] [from ]
+!33 = metadata !{metadata !34, metadata !44}
+!34 = metadata !{i32 786445, metadata !1, metadata !32, metadata !"a_b", i32 36, i64 64, i64 32, i64 0, i32 0, metadata !35} ; [ DW_TAG_member ] [a_b] [line 36, size 64, align 32, offset 0] [from ]
+!35 = metadata !{i32 786451, metadata !1, metadata !32, metadata !"", i32 33, i64 64, i64 32, i32 0, i32 0, null, metadata !36, i32 0, null, null} ; [ DW_TAG_structure_type ] [line 33, size 64, align 32, offset 0] [def] [from ]
+!36 = metadata !{metadata !37, metadata !38, metadata !39}
+!37 = metadata !{i32 786445, metadata !1, metadata !35, metadata !"a", i32 34, i64 32, i64 32, i64 0, i32 0, metadata !24} ; [ DW_TAG_member ] [a] [line 34, size 32, align 32, offset 0] [from int]
+!38 = metadata !{i32 786445, metadata !1, metadata !35, metadata !"b", i32 35, i64 32, i64 32, i64 32, i32 0, metadata !24} ; [ DW_TAG_member ] [b] [line 35, size 32, align 32, offset 32] [from int]
+!39 = metadata !{i32 786478, metadata !1, metadata !35, metadata !"", metadata !"", metadata !"", i32 33, metadata !40, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !43, i32 33} ; [ DW_TAG_subprogram ] [line 33]
+!40 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !41, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!41 = metadata !{null, metadata !42}
+!42 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !35} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from ]
+!43 = metadata !{i32 786468}
+!44 = metadata !{i32 786478, metadata !1, metadata !32, metadata !"wombat", metadata !"wombat", metadata !"", i32 32, metadata !45, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !48, i32 32} ; [ DW_TAG_subprogram ] [line 32] [wombat]
+!45 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !46, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!46 = metadata !{null, metadata !47}
+!47 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !32} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from wombat]
+!48 = metadata !{i32 786468}
+!49 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
+!50 = metadata !{i32 786688, metadata !4, metadata !"b", metadata !5, i32 9, metadata !51, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 9]
+!51 = metadata !{i32 786451, metadata !1, metadata !4, metadata !"baz", i32 7, i64 8, i64 8, i32 0, i32 0, null, metadata !52, i32 0, null, null} ; [ DW_TAG_structure_type ] [baz] [line 7, size 8, align 8, offset 0] [def] [from ]
+!52 = metadata !{metadata !53}
+!53 = metadata !{i32 786478, metadata !1, metadata !51, metadata !"baz", metadata !"baz", metadata !"", i32 7, metadata !54, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !57, i32 7} ; [ DW_TAG_subprogram ] [line 7] [baz]
+!54 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !55, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!55 = metadata !{null, metadata !56}
+!56 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !51} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from baz]
+!57 = metadata !{i32 786468}
+!58 = metadata !{i32 9, i32 0, metadata !4, null}
+!59 = metadata !{i32 10, i32 0, metadata !4, null}