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