diff options
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DIEHash.cpp | 3 | ||||
| -rw-r--r-- | llvm/unittests/CodeGen/DIEHashTest.cpp | 63 | 
2 files changed, 59 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DIEHash.cpp b/llvm/lib/CodeGen/AsmPrinter/DIEHash.cpp index 9a26e727bd9..8409a7f56c2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DIEHash.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DIEHash.cpp @@ -466,6 +466,9 @@ uint64_t DIEHash::computeCUSignature(DIE *Die) {  /// standard.  uint64_t DIEHash::computeTypeSignature(DIE *Die) { +  if (DIE *Parent = Die->getParent()) +    addParentContext(Parent); +    // Hash the DIE.    computeHash(Die); diff --git a/llvm/unittests/CodeGen/DIEHashTest.cpp b/llvm/unittests/CodeGen/DIEHashTest.cpp index 92b6d7686cf..fd1845eb167 100644 --- a/llvm/unittests/CodeGen/DIEHashTest.cpp +++ b/llvm/unittests/CodeGen/DIEHashTest.cpp @@ -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); +}  }  | 

