[llvm] r192856 - DIEHash: Include the type's context in the type hash.

David Blaikie dblaikie at gmail.com
Wed Oct 16 17:10:34 PDT 2013


Author: dblaikie
Date: Wed Oct 16 19:10:34 2013
New Revision: 192856

URL: http://llvm.org/viewvc/llvm-project?rev=192856&view=rev
Log:
DIEHash: Include the type's context in the type hash.

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
    llvm/trunk/unittests/CodeGen/DIEHashTest.cpp

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp?rev=192856&r1=192855&r2=192856&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp Wed Oct 16 19:10:34 2013
@@ -466,6 +466,9 @@ uint64_t DIEHash::computeCUSignature(DIE
 /// standard.
 uint64_t DIEHash::computeTypeSignature(DIE *Die) {
 
+  if (DIE *Parent = Die->getParent())
+    addParentContext(Parent);
+
   // Hash the DIE.
   computeHash(Die);
 

Modified: llvm/trunk/unittests/CodeGen/DIEHashTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/DIEHashTest.cpp?rev=192856&r1=192855&r2=192856&view=diff
==============================================================================
--- llvm/trunk/unittests/CodeGen/DIEHashTest.cpp (original)
+++ llvm/trunk/unittests/CodeGen/DIEHashTest.cpp Wed Oct 16 19:10:34 2013
@@ -17,7 +17,7 @@
 using namespace llvm;
 
 namespace {
-TEST(DIEHashData1Test, DIEHash) {
+TEST(Data1, DIEHash) {
   DIEHash Hash;
   DIE Die(dwarf::DW_TAG_base_type);
   DIEInteger Size(4);
@@ -26,19 +26,68 @@ TEST(DIEHashData1Test, DIEHash) {
   ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res);
 }
 
-TEST(DIEHashTrivialTypeTest, DIEHash) {
+TEST(TrivialType, DIEHash) {
   // A complete, but simple, type containing no members and defined on the first
   // line of a file.
-  DIE FooType(dwarf::DW_TAG_structure_type);
+  DIE Unnamed(dwarf::DW_TAG_structure_type);
   DIEInteger One(1);
-  FooType.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
+  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
 
   // Line and file number are ignored.
-  FooType.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
-  FooType.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
-  uint64_t MD5Res = DIEHash().computeTypeSignature(&FooType);
+  Unnamed.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
+  Unnamed.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
+  uint64_t MD5Res = DIEHash().computeTypeSignature(&Unnamed);
 
   // The exact same hash GCC produces for this DIE.
   ASSERT_EQ(0x715305ce6cfd9ad1ULL, MD5Res);
 }
+
+TEST(NamedType, DIEHash) {
+  // A complete named type containing no members and defined on the first line
+  // of a file.
+  DIE Foo(dwarf::DW_TAG_structure_type);
+  DIEInteger One(1);
+  DIEString FooStr(&One, "foo");
+  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr);
+  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
+
+  // Line and file number are ignored.
+  Foo.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
+  Foo.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
+  uint64_t MD5Res = DIEHash().computeTypeSignature(&Foo);
+
+  // The exact same hash GCC produces for this DIE.
+  ASSERT_EQ(0xd566dbd2ca5265ffULL, MD5Res);
+}
+
+TEST(NamespacedType, DIEHash) {
+  // A complete named type containing no members and defined on the first line
+  // of a file.
+  DIE CU(dwarf::DW_TAG_compile_unit);
+
+  DIE *Space = new DIE(dwarf::DW_TAG_namespace);
+  DIEInteger One(1);
+  DIEString SpaceStr(&One, "space");
+  Space->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &SpaceStr);
+  // DW_AT_declaration is ignored.
+  Space->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One);
+  // sibling?
+
+  DIE *Foo = new DIE(dwarf::DW_TAG_structure_type);
+  DIEString FooStr(&One, "foo");
+  Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr);
+  Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
+
+  // Line and file number are ignored.
+  Foo->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
+  Foo->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
+
+  Space->addChild(Foo);
+  CU.addChild(Space);
+
+  uint64_t MD5Res = DIEHash().computeTypeSignature(Foo);
+
+  // The exact same hash GCC produces for this DIE.
+  ASSERT_EQ(0x7b80381fd17f1e33ULL, MD5Res);
+}
 }





More information about the llvm-commits mailing list