1800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher//===- llvm/unittest/DebugInfo/DWARFFormValueTest.cpp ---------------------===// 2800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher// 3800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher// The LLVM Compiler Infrastructure 4800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher// 5800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher// This file is distributed under the University of Illinois Open Source 6800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher// License. See LICENSE.TXT for details. 7800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher// 8800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher//===----------------------------------------------------------------------===// 9800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher 10800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher#include "../lib/CodeGen/AsmPrinter/DIE.h" 11800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher#include "../lib/CodeGen/AsmPrinter/DIEHash.h" 12800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher#include "llvm/Support/Debug.h" 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Dwarf.h" 14800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher#include "llvm/Support/Format.h" 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/STLExtras.h" 16800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher#include "gtest/gtest.h" 17800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher 18800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopherusing namespace llvm; 19e4df43e36dbdca444a6e812bdd2c9ea93360a2ecDavid Blaikie 20e4df43e36dbdca444a6e812bdd2c9ea93360a2ecDavid Blaikienamespace { 21e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, Data1) { 22800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher DIEHash Hash; 23449a88e9a6279cc016d795e86e73c026675ab929Benjamin Kramer DIE Die(dwarf::DW_TAG_base_type); 24449a88e9a6279cc016d795e86e73c026675ab929Benjamin Kramer DIEInteger Size(4); 25449a88e9a6279cc016d795e86e73c026675ab929Benjamin Kramer Die.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Size); 26377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = Hash.computeTypeSignature(Die); 27c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res); 28c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie} 29c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie 30f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// struct {}; 31e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, TrivialType) { 3288a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIE Unnamed(dwarf::DW_TAG_structure_type); 33c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie DIEInteger One(1); 3488a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 35c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie 36c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie // Line and file number are ignored. 3788a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Unnamed.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 3888a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Unnamed.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One); 39377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); 40c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie 41c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie // The exact same hash GCC produces for this DIE. 42c0987082206d202c20ebe1d528c1b28a875160acDavid Blaikie ASSERT_EQ(0x715305ce6cfd9ad1ULL, MD5Res); 43800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher} 4488a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 45f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// struct foo { }; 46e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, NamedType) { 4788a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 4888a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIEInteger One(1); 4988a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIEString FooStr(&One, "foo"); 5088a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 5188a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 5288a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 53377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 5488a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 5588a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie // The exact same hash GCC produces for this DIE. 5688a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie ASSERT_EQ(0xd566dbd2ca5265ffULL, MD5Res); 5788a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie} 5888a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 59f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// namespace space { struct foo { }; } 60e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, NamespacedType) { 6188a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIE CU(dwarf::DW_TAG_compile_unit); 6288a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Space = make_unique<DIE>(dwarf::DW_TAG_namespace); 6488a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIEInteger One(1); 6588a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIEString SpaceStr(&One, "space"); 6688a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Space->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &SpaceStr); 6788a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie // DW_AT_declaration is ignored. 6888a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Space->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One); 6988a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie // sibling? 7088a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type); 7288a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie DIEString FooStr(&One, "foo"); 7388a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 7488a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 7588a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &N = *Foo; 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Space->addChild(std::move(Foo)); 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CU.addChild(std::move(Space)); 7988a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines uint64_t MD5Res = DIEHash().computeTypeSignature(N); 8188a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie 8288a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie // The exact same hash GCC produces for this DIE. 8388a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie ASSERT_EQ(0x7b80381fd17f1e33ULL, MD5Res); 8488a68cbbb57aa9caef60dbd2f63d908983e77465David Blaikie} 8547f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie 86f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// struct { int member; }; 87e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, TypeWithMember) { 8847f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie DIE Unnamed(dwarf::DW_TAG_structure_type); 8947f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie DIEInteger Four(4); 9047f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Four); 9147f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie 9247f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie DIE Int(dwarf::DW_TAG_base_type); 9347f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie DIEString IntStr(&Four, "int"); 9447f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &IntStr); 9547f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Four); 9647f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie DIEInteger Five(5); 9747f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, &Five); 9847f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry IntRef(Int); 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Member = make_unique<DIE>(dwarf::DW_TAG_member); 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEString MemberStr(&Four, "member"); 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Member->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemberStr); 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEInteger Zero(0); 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Member->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines &Zero); 10747f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie Member->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &IntRef); 10847f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unnamed.addChild(std::move(Member)); 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 111377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); 11247f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie 11347f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie ASSERT_EQ(0x5646aa436b7e07c6ULL, MD5Res); 11447f66d5a756d4eaeba9082ff4c82023a213daf45David Blaikie} 1153baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 116f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// struct foo { int mem1, mem2; }; 117e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, ReusedType) { 1183baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIE Unnamed(dwarf::DW_TAG_structure_type); 1193baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEInteger Eight(8); 1203baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 1213baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 1223baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEInteger Four(4); 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE Int(dwarf::DW_TAG_base_type); 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEString IntStr(&Four, "int"); 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &IntStr); 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Four); 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEInteger Five(5); 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, &Five); 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry IntRef(Int); 131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem1 = make_unique<DIE>(dwarf::DW_TAG_member); 1333baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEString Mem1Str(&Four, "mem1"); 1343baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Mem1->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &Mem1Str); 1353baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEInteger Zero(0); 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mem1->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines &Zero); 138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Mem1->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &IntRef); 1393baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unnamed.addChild(std::move(Mem1)); 1413baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem2 = make_unique<DIE>(dwarf::DW_TAG_member); 1433baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEString Mem2Str(&Four, "mem2"); 1443baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Mem2->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &Mem2Str); 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mem2->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines &Four); 1473baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Mem2->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &IntRef); 1483baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unnamed.addChild(std::move(Mem2)); 150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 151377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); 1523baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 1533baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie ASSERT_EQ(0x3a7dc3ed7b76b2f8ULL, MD5Res); 1543baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie} 1553baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 156f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// struct foo { static foo f; }; 157e46be7838a355c914fcbd405bf7f20ac20a3e5dcDavid BlaikieTEST(DIEHashTest, RecursiveType) { 1583baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 1593baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEInteger One(1); 1603baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 1613baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEString FooStr(&One, "foo"); 1623baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 1633baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 1653baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie DIEString MemStr(&One, "mem"); 1663baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooRef(Foo); 1683baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooRef); 1693baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie // DW_AT_external and DW_AT_declaration are ignored anyway, so skip them. 1703baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 1723baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 173377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 1743baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie 1753baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie ASSERT_EQ(0x73d8b25aef227b06ULL, MD5Res); 1763baa3c37ce2cd7db7a4840e66f22a08ce1702787David Blaikie} 177f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 178f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie// struct foo { foo *mem; }; 179f1545a219744c1ae66137e64d1c456cd8e924eb7David BlaikieTEST(DIEHashTest, Pointer) { 180f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 181f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie DIEInteger Eight(8); 182f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 183f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie DIEString FooStr(&Eight, "foo"); 184f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 185f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 187f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie DIEString MemStr(&Eight, "mem"); 188f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 189f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie DIEInteger Zero(0); 190f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, &Zero); 191f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 192f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie DIE FooPtr(dwarf::DW_TAG_pointer_type); 193f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie FooPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooRef(Foo); 195f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie FooPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooRef); 196f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooPtrRef(FooPtr); 198f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooPtrRef); 199f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 201f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 202377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 203f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie 204f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie ASSERT_EQ(0x74ea73862e8708d2ULL, MD5Res); 205f1545a219744c1ae66137e64d1c456cd8e924eb7David Blaikie} 206449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 207449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie// struct foo { foo &mem; }; 208449f036a8141b9032ff310ecbe0ab4433c5c307bDavid BlaikieTEST(DIEHashTest, Reference) { 209449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 210449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEInteger Eight(8); 211449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 212449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEString FooStr(&Eight, "foo"); 213449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 214449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 216449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEString MemStr(&Eight, "mem"); 217449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 218449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEInteger Zero(0); 219449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, &Zero); 220449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 221449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIE FooRef(dwarf::DW_TAG_reference_type); 222449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooEntry(Foo); 224449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooEntry); 225449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 226449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIE FooRefConst(dwarf::DW_TAG_const_type); 227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooRefRef(FooRef); 228449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooRefRef); 229449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooRefConstRef(FooRefConst); 231449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooRefConstRef); 232449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 234449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 235377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 236449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 237449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie ASSERT_EQ(0xa0b15f467ad4525bULL, MD5Res); 238449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie} 239449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 240449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie// struct foo { foo &&mem; }; 241449f036a8141b9032ff310ecbe0ab4433c5c307bDavid BlaikieTEST(DIEHashTest, RValueReference) { 242449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 243449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEInteger Eight(8); 244449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 245449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEString FooStr(&Eight, "foo"); 246449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 247449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 249449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEString MemStr(&Eight, "mem"); 250449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 251449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIEInteger Zero(0); 252449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, &Zero); 253449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 254449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIE FooRef(dwarf::DW_TAG_rvalue_reference_type); 255449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooEntry(Foo); 257449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooEntry); 258449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 259449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie DIE FooRefConst(dwarf::DW_TAG_const_type); 260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooRefRef(FooRef); 261449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooRefRef); 262449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooRefConstRef(FooRefConst); 264449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooRefConstRef); 265449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 267449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 268377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 269449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie 270449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie ASSERT_EQ(0xad211c8c3b31e57ULL, MD5Res); 271449f036a8141b9032ff310ecbe0ab4433c5c307bDavid Blaikie} 272f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 273f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// struct foo { foo foo::*mem; }; 274f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid BlaikieTEST(DIEHashTest, PtrToMember) { 275f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 276f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger Eight(8); 277f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 278f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString FooStr(&Eight, "foo"); 279f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 280f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 282f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString MemStr(&Eight, "mem"); 283f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 284f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger Zero(0); 285f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, &Zero); 286f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 287f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); 288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooEntry(Foo); 289f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FooEntry); 29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines &FooEntry); 292f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PtrToFooMemRef(PtrToFooMem); 294f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef); 295f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 297f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 298377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 299f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 300f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie ASSERT_EQ(0x852e0c9ff7c04ebULL, MD5Res); 301f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie} 302f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 303f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// Check that the hash for a pointer-to-member matches regardless of whether the 304f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// pointed-to type is a declaration or a definition. 305f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// 306f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// struct bar; // { }; 307f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// struct foo { bar foo::*mem; }; 308f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid BlaikieTEST(DIEHashTest, PtrToMemberDeclDefMatch) { 309f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger Zero(0); 310f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger One(1); 311f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger Eight(8); 312f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString FooStr(&Eight, "foo"); 313f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString BarStr(&Eight, "bar"); 314f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString MemStr(&Eight, "mem"); 315f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie uint64_t MD5ResDecl; 316f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie { 317f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Bar(dwarf::DW_TAG_structure_type); 318f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &BarStr); 319f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One); 320f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 321f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 322f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 323f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 324f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 326f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 327f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 328f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &Zero); 329f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 330f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); 331dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry BarEntry(Bar); 332f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &BarEntry); 333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooEntry(Foo); 334f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 335f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &FooEntry); 336f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PtrToFooMemRef(PtrToFooMem); 338f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef); 339f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 341f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 342377e83202cb40849d384ddede39f9468af197427David Blaikie MD5ResDecl = DIEHash().computeTypeSignature(Foo); 343f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie } 344f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie uint64_t MD5ResDef; 345f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie { 346f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Bar(dwarf::DW_TAG_structure_type); 347f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &BarStr); 348f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 349f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 350f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 351f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 352f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 353f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 355f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 356f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 357f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &Zero); 358f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 359f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); 360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry BarEntry(Bar); 361f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &BarEntry); 362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FooEntry(Foo); 363f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 364f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &FooEntry); 365f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PtrToFooMemRef(PtrToFooMem); 367f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef); 368f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 369dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 370f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 371377e83202cb40849d384ddede39f9468af197427David Blaikie MD5ResDef = DIEHash().computeTypeSignature(Foo); 372f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie } 373f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie ASSERT_EQ(MD5ResDef, MD5ResDecl); 374f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie} 375f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 376f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// Check that the hash for a pointer-to-member matches regardless of whether the 377f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// pointed-to type is a declaration or a definition. 378f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// 379f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// struct bar; // { }; 380f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie// struct foo { bar bar::*mem; }; 381f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid BlaikieTEST(DIEHashTest, PtrToMemberDeclDefMisMatch) { 382f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger Zero(0); 383f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger One(1); 384f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEInteger Eight(8); 385f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString FooStr(&Eight, "foo"); 386f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString BarStr(&Eight, "bar"); 387f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIEString MemStr(&Eight, "mem"); 388f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie uint64_t MD5ResDecl; 389f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie { 390f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Bar(dwarf::DW_TAG_structure_type); 391f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &BarStr); 392f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One); 393f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 394f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 395f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 396f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 397f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 399f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 400f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 401f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &Zero); 402f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 403f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); 404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry BarEntry(Bar); 405f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &BarEntry); 406f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 407f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &BarEntry); 408f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PtrToFooMemRef(PtrToFooMem); 410f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef); 411f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 412dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 413f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 414377e83202cb40849d384ddede39f9468af197427David Blaikie MD5ResDecl = DIEHash().computeTypeSignature(Foo); 415f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie } 416f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie uint64_t MD5ResDef; 417f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie { 418f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Bar(dwarf::DW_TAG_structure_type); 419f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &BarStr); 420f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 421f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 422f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 423f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 424f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 425f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 426dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 427f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 428f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, 429f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &Zero); 430f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 431f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); 432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry BarEntry(Bar); 433f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &BarEntry); 434f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 435f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie &BarEntry); 436f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 437dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PtrToFooMemRef(PtrToFooMem); 438f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef); 439f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 440dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 441f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie 442377e83202cb40849d384ddede39f9468af197427David Blaikie MD5ResDef = DIEHash().computeTypeSignature(Foo); 443f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie } 444f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie // FIXME: This seems to be a bug in the DWARF type hashing specification that 445f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie // only uses the brief name hashing for types referenced via DW_AT_type. In 446f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie // this case the type is referenced via DW_AT_containing_type and full hashing 447f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie // causes a hash to differ when the containing type is a declaration in one TU 448f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie // and a definition in another. 449f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie ASSERT_NE(MD5ResDef, MD5ResDecl); 450f196208900e690fe2d3bb1c6ca393d3fcd64226dDavid Blaikie} 4511d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 4521d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie// struct { } a; 4531d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie// struct foo { decltype(a) mem; }; 4541d7d8da4cb81aa3f149e1e80811d72525eee15e3David BlaikieTEST(DIEHashTest, RefUnnamedType) { 4551d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIEInteger Zero(0); 4561d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIEInteger One(1); 4571d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIEInteger Eight(8); 4581d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIEString FooStr(&Zero, "foo"); 4591d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIEString MemStr(&Zero, "mem"); 4601d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 4611d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIE Unnamed(dwarf::DW_TAG_structure_type); 4621d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 4631d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 4641d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIE Foo(dwarf::DW_TAG_structure_type); 4651d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 4661d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 4671d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 468dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); 4691d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &MemStr); 4701d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, &Zero); 4711d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 4721d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie DIE UnnamedPtr(dwarf::DW_TAG_pointer_type); 4731d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie UnnamedPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Eight); 474dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry UnnamedRef(Unnamed); 4751d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie UnnamedPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &UnnamedRef); 4761d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 477dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry UnnamedPtrRef(UnnamedPtr); 4781d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &UnnamedPtrRef); 4791d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 480dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Foo.addChild(std::move(Mem)); 4811d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 482377e83202cb40849d384ddede39f9468af197427David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); 4831d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie 4841d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie ASSERT_EQ(0x954e026f01c02529ULL, MD5Res); 4851d7d8da4cb81aa3f149e1e80811d72525eee15e3David Blaikie} 486a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// struct { struct foo { }; }; 488a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David BlaikieTEST(DIEHashTest, NestedType) { 489a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie DIE Unnamed(dwarf::DW_TAG_structure_type); 490a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie DIEInteger One(1); 491a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 492a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie 493dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type); 494a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie DIEString FooStr(&One, "foo"); 495a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr); 496a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 497a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie 498dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unnamed.addChild(std::move(Foo)); 499a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie 500a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); 501a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie 502a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie // The exact same hash GCC produces for this DIE. 503a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie ASSERT_EQ(0xde8a3b7b43807f4aULL, MD5Res); 504a954618c6e6c5f94d3cedc0b6bc19dbc49e56ac2David Blaikie} 5057c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie 5067c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie// struct { static void func(); }; 5077c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David BlaikieTEST(DIEHashTest, MemberFunc) { 5087c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie DIE Unnamed(dwarf::DW_TAG_structure_type); 5097c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie DIEInteger One(1); 5107c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 5117c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie 512dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram); 5137c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie DIEString FuncStr(&One, "func"); 5147c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FuncStr); 5157c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie 516dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Unnamed.addChild(std::move(Func)); 5177c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie 5187c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); 5197c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie 5207c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie // The exact same hash GCC produces for this DIE. 5217c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie ASSERT_EQ(0xd36a1b6dfb604ba0ULL, MD5Res); 5227c0c2e56b09fee406ca0bb6e3ac840a3a6ed1160David Blaikie} 52336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// struct A { 52536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// static void func(); 52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// }; 52736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST(DIEHashTest, MemberFuncFlag) { 52836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE A(dwarf::DW_TAG_structure_type); 52936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger One(1); 53036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString AStr(&One, "A"); 53136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &AStr); 53236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 53336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 53436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One); 53536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 536dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram); 53736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString FuncStr(&One, "func"); 53836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString FuncLinkage(&One, "_ZN1A4funcEv"); 53936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Two(2); 54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Func->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, &One); 54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FuncStr); 54236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Func->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Func->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &Two); 54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Func->addValue(dwarf::DW_AT_linkage_name, dwarf::DW_FORM_strp, &FuncLinkage); 54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Func->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One); 54636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 547dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A.addChild(std::move(Func)); 54836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t MD5Res = DIEHash().computeTypeSignature(A); 55036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The exact same hash GCC produces for this DIE. 55236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ASSERT_EQ(0x8f78211ddce3df10ULL, MD5Res); 55336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 55436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Derived from: 55636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// struct A { 55736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// const static int PI = -3; 55836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// }; 55936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// A a; 56036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST(DIEHashTest, MemberSdata) { 56136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE A(dwarf::DW_TAG_structure_type); 56236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger One(1); 56336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString AStr(&One, "A"); 56436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &AStr); 56536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 56736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One); 56836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 56936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Four(4); 57036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Five(5); 57136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString FStr(&One, "int"); 572dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE IntTyDIE(dwarf::DW_TAG_base_type); 573dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines IntTyDIE.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Four); 574dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines IntTyDIE.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, &Five); 575dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines IntTyDIE.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FStr); 57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 57736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEEntry IntTy(IntTyDIE); 578dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type); 57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &IntTy); 58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 581dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PITy(*PITyDIE); 582dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto PI = make_unique<DIE>(dwarf::DW_TAG_member); 58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString PIStr(&One, "PI"); 58436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Two(2); 58536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger NegThree(-3); 58636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &PIStr); 58736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 58836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &Two); 58936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PITy); 59036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, &One); 59136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One); 59236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, &NegThree); 59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 594dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A.addChild(std::move(PI)); 59536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 59636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t MD5Res = DIEHash().computeTypeSignature(A); 59736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ASSERT_EQ(0x9a216000dd3788a7ULL, MD5Res); 59836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 59936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 60036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Derived from: 60136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// struct A { 60236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// const static float PI = 3.14; 60336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// }; 60436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// A a; 60536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST(DIEHashTest, MemberBlock) { 60636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE A(dwarf::DW_TAG_structure_type); 60736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger One(1); 60836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString AStr(&One, "A"); 60936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &AStr); 61036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One); 61136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 61236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One); 61336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 61436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Four(4); 61536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString FStr(&One, "float"); 616dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto FloatTyDIE = make_unique<DIE>(dwarf::DW_TAG_base_type); 61736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FloatTyDIE->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &Four); 61836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FloatTyDIE->addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, &Four); 61936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FloatTyDIE->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FStr); 62036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 621dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry FloatTy(*FloatTyDIE); 622dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type); 62336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &FloatTy); 62436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 625dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry PITy(*PITyDIE); 626dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto PI = make_unique<DIE>(dwarf::DW_TAG_member); 62736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEString PIStr(&One, "PI"); 62836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Two(2); 62936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &PIStr); 63036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One); 63136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &Two); 63236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PITy); 63336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, &One); 63436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One); 63536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 636dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEBlock PIBlock; 63736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Blk1(0xc3); 63836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Blk2(0xf5); 63936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Blk3(0x48); 64036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger Blk4(0x40); 64136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 642dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, &Blk1); 643dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, &Blk2); 644dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, &Blk3); 645dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, &Blk4); 64636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 647dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_block1, &PIBlock); 64836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 649dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A.addChild(std::move(PI)); 65036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 65136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t MD5Res = DIEHash().computeTypeSignature(A); 65236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ASSERT_EQ(0x493af53ad3d3f651ULL, MD5Res); 65336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 654800a8761285a239bb82f7d1883a8398815cd2d8fEric Christopher} 655