From 88a68cbbb57aa9caef60dbd2f63d908983e77465 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Thu, 17 Oct 2013 00:10:34 +0000 Subject: DIEHash: Include the type's context in the type hash. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192856 91177308-0d34-0410-b5e6-96231b3b80d8 --- unittests/CodeGen/DIEHashTest.cpp | 63 ++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 7 deletions(-) (limited to 'unittests') diff --git a/unittests/CodeGen/DIEHashTest.cpp b/unittests/CodeGen/DIEHashTest.cpp index 92b6d7686c..fd1845eb16 100644 --- a/unittests/CodeGen/DIEHashTest.cpp +++ b/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); +} } -- cgit v1.2.3