Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 1 | //===- llvm/unittest/DebugInfo/DWARFFormValueTest.cpp ---------------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
Frederic Riss | e541e0b | 2015-01-05 21:29:41 +0000 | [diff] [blame] | 10 | #include "llvm/CodeGen/DIE.h" |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 11 | #include "../lib/CodeGen/AsmPrinter/DIEHash.h" |
Chandler Carruth | d990388 | 2015-01-14 11:23:27 +0000 | [diff] [blame] | 12 | #include "llvm/ADT/STLExtras.h" |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 13 | #include "llvm/CodeGen/DwarfStringPoolEntry.h" |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 14 | #include "llvm/Support/Debug.h" |
Chandler Carruth | 8a8cd2b | 2014-01-07 11:48:04 +0000 | [diff] [blame] | 15 | #include "llvm/Support/Dwarf.h" |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 16 | #include "llvm/Support/Format.h" |
| 17 | #include "gtest/gtest.h" |
| 18 | |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 19 | using namespace llvm; |
David Blaikie | 5980419 | 2013-10-15 23:00:17 +0000 | [diff] [blame] | 20 | |
| 21 | namespace { |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 22 | |
| 23 | // Test fixture |
| 24 | class DIEHashTest : public testing::Test { |
| 25 | StringMap<DwarfStringPoolEntry> Pool; |
| 26 | |
| 27 | public: |
| 28 | DIEString getString(StringRef S) { |
| 29 | DwarfStringPoolEntry Entry = {nullptr, 1, 1}; |
| 30 | return DIEString( |
| 31 | DwarfStringPoolEntryRef(*Pool.insert(std::make_pair(S, Entry)).first)); |
| 32 | } |
| 33 | }; |
| 34 | |
| 35 | TEST_F(DIEHashTest, Data1) { |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 36 | DIEHash Hash; |
Benjamin Kramer | 0f01d4e | 2013-09-29 11:29:20 +0000 | [diff] [blame] | 37 | DIE Die(dwarf::DW_TAG_base_type); |
| 38 | DIEInteger Size(4); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 39 | Die.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Size); |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 40 | uint64_t MD5Res = Hash.computeTypeSignature(Die); |
David Blaikie | 6316ca4 | 2013-10-16 23:36:20 +0000 | [diff] [blame] | 41 | ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res); |
| 42 | } |
| 43 | |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 44 | // struct {}; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 45 | TEST_F(DIEHashTest, TrivialType) { |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 46 | DIE Unnamed(dwarf::DW_TAG_structure_type); |
David Blaikie | 6316ca4 | 2013-10-16 23:36:20 +0000 | [diff] [blame] | 47 | DIEInteger One(1); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 48 | Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 6316ca4 | 2013-10-16 23:36:20 +0000 | [diff] [blame] | 49 | |
| 50 | // Line and file number are ignored. |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 51 | Unnamed.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 52 | Unnamed.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 53 | uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); |
David Blaikie | 6316ca4 | 2013-10-16 23:36:20 +0000 | [diff] [blame] | 54 | |
| 55 | // The exact same hash GCC produces for this DIE. |
| 56 | ASSERT_EQ(0x715305ce6cfd9ad1ULL, MD5Res); |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 57 | } |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 58 | |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 59 | // struct foo { }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 60 | TEST_F(DIEHashTest, NamedType) { |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 61 | DIE Foo(dwarf::DW_TAG_structure_type); |
| 62 | DIEInteger One(1); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 63 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 64 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
| 65 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 66 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 67 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 68 | |
| 69 | // The exact same hash GCC produces for this DIE. |
| 70 | ASSERT_EQ(0xd566dbd2ca5265ffULL, MD5Res); |
| 71 | } |
| 72 | |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 73 | // namespace space { struct foo { }; } |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 74 | TEST_F(DIEHashTest, NamespacedType) { |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 75 | DIE CU(dwarf::DW_TAG_compile_unit); |
| 76 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 77 | auto Space = make_unique<DIE>(dwarf::DW_TAG_namespace); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 78 | DIEInteger One(1); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 79 | DIEString SpaceStr = getString("space"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 80 | Space->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, SpaceStr); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 81 | // DW_AT_declaration is ignored. |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 82 | Space->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 83 | // sibling? |
| 84 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 85 | auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 86 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 87 | Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
| 88 | Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 89 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 90 | DIE &N = *Foo; |
| 91 | Space->addChild(std::move(Foo)); |
| 92 | CU.addChild(std::move(Space)); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 93 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 94 | uint64_t MD5Res = DIEHash().computeTypeSignature(N); |
David Blaikie | 8a142aa | 2013-10-17 00:10:34 +0000 | [diff] [blame] | 95 | |
| 96 | // The exact same hash GCC produces for this DIE. |
| 97 | ASSERT_EQ(0x7b80381fd17f1e33ULL, MD5Res); |
| 98 | } |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 99 | |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 100 | // struct { int member; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 101 | TEST_F(DIEHashTest, TypeWithMember) { |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 102 | DIE Unnamed(dwarf::DW_TAG_structure_type); |
| 103 | DIEInteger Four(4); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 104 | Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 105 | |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 106 | DIE Int(dwarf::DW_TAG_base_type); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 107 | DIEString IntStr = getString("int"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 108 | Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr); |
| 109 | Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 110 | DIEInteger Five(5); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 111 | Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 112 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 113 | DIEEntry IntRef(Int); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 114 | |
| 115 | auto Member = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 116 | DIEString MemberStr = getString("member"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 117 | Member->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemberStr); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 118 | DIEInteger Zero(0); |
| 119 | Member->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 120 | Zero); |
| 121 | Member->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 122 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 123 | Unnamed.addChild(std::move(Member)); |
| 124 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 125 | uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); |
David Blaikie | ca353be | 2013-10-17 22:07:09 +0000 | [diff] [blame] | 126 | |
| 127 | ASSERT_EQ(0x5646aa436b7e07c6ULL, MD5Res); |
| 128 | } |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 129 | |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 130 | // struct foo { int mem1, mem2; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 131 | TEST_F(DIEHashTest, ReusedType) { |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 132 | DIE Unnamed(dwarf::DW_TAG_structure_type); |
| 133 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 134 | Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 135 | |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 136 | DIEInteger Four(4); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 137 | DIE Int(dwarf::DW_TAG_base_type); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 138 | DIEString IntStr = getString("int"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 139 | Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr); |
| 140 | Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 141 | DIEInteger Five(5); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 142 | Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 143 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 144 | DIEEntry IntRef(Int); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 145 | |
| 146 | auto Mem1 = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 147 | DIEString Mem1Str = getString("mem1"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 148 | Mem1->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem1Str); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 149 | DIEInteger Zero(0); |
| 150 | Mem1->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 151 | Zero); |
| 152 | Mem1->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 153 | |
| 154 | Unnamed.addChild(std::move(Mem1)); |
| 155 | |
| 156 | auto Mem2 = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 157 | DIEString Mem2Str = getString("mem2"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 158 | Mem2->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem2Str); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 159 | Mem2->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 160 | Four); |
| 161 | Mem2->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 162 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 163 | Unnamed.addChild(std::move(Mem2)); |
| 164 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 165 | uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 166 | |
| 167 | ASSERT_EQ(0x3a7dc3ed7b76b2f8ULL, MD5Res); |
| 168 | } |
| 169 | |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 170 | // struct foo { static foo f; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 171 | TEST_F(DIEHashTest, RecursiveType) { |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 172 | DIE Foo(dwarf::DW_TAG_structure_type); |
| 173 | DIEInteger One(1); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 174 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 175 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 176 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 177 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 178 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 179 | DIEString MemStr = getString("mem"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 180 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 181 | DIEEntry FooRef(Foo); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 182 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 183 | // DW_AT_external and DW_AT_declaration are ignored anyway, so skip them. |
| 184 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 185 | Foo.addChild(std::move(Mem)); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 186 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 187 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | 980d499 | 2013-10-21 18:59:40 +0000 | [diff] [blame] | 188 | |
| 189 | ASSERT_EQ(0x73d8b25aef227b06ULL, MD5Res); |
| 190 | } |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 191 | |
| 192 | // struct foo { foo *mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 193 | TEST_F(DIEHashTest, Pointer) { |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 194 | DIE Foo(dwarf::DW_TAG_structure_type); |
| 195 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 196 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 197 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 198 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 199 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 200 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 201 | DIEString MemStr = getString("mem"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 202 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 203 | DIEInteger Zero(0); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 204 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 205 | |
| 206 | DIE FooPtr(dwarf::DW_TAG_pointer_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 207 | FooPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 208 | DIEEntry FooRef(Foo); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 209 | FooPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 210 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 211 | DIEEntry FooPtrRef(FooPtr); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 212 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooPtrRef); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 213 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 214 | Foo.addChild(std::move(Mem)); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 215 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 216 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | 6cf58c8 | 2013-10-21 22:36:50 +0000 | [diff] [blame] | 217 | |
| 218 | ASSERT_EQ(0x74ea73862e8708d2ULL, MD5Res); |
| 219 | } |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 220 | |
| 221 | // struct foo { foo &mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 222 | TEST_F(DIEHashTest, Reference) { |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 223 | DIE Foo(dwarf::DW_TAG_structure_type); |
| 224 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 225 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 226 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 227 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 228 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 229 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 230 | DIEString MemStr = getString("mem"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 231 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 232 | DIEInteger Zero(0); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 233 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 234 | |
| 235 | DIE FooRef(dwarf::DW_TAG_reference_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 236 | FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 237 | DIEEntry FooEntry(Foo); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 238 | FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 239 | |
| 240 | DIE FooRefConst(dwarf::DW_TAG_const_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 241 | DIEEntry FooRefRef(FooRef); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 242 | FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefRef); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 243 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 244 | DIEEntry FooRefConstRef(FooRefConst); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 245 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 246 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 247 | Foo.addChild(std::move(Mem)); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 248 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 249 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 250 | |
| 251 | ASSERT_EQ(0xa0b15f467ad4525bULL, MD5Res); |
| 252 | } |
| 253 | |
| 254 | // struct foo { foo &&mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 255 | TEST_F(DIEHashTest, RValueReference) { |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 256 | DIE Foo(dwarf::DW_TAG_structure_type); |
| 257 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 258 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 259 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 260 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 261 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 262 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 263 | DIEString MemStr = getString("mem"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 264 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 265 | DIEInteger Zero(0); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 266 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 267 | |
| 268 | DIE FooRef(dwarf::DW_TAG_rvalue_reference_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 269 | FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 270 | DIEEntry FooEntry(Foo); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 271 | FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 272 | |
| 273 | DIE FooRefConst(dwarf::DW_TAG_const_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 274 | DIEEntry FooRefRef(FooRef); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 275 | FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefRef); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 276 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 277 | DIEEntry FooRefConstRef(FooRefConst); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 278 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 279 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 280 | Foo.addChild(std::move(Mem)); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 281 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 282 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | fe3233a | 2013-10-21 23:06:19 +0000 | [diff] [blame] | 283 | |
| 284 | ASSERT_EQ(0xad211c8c3b31e57ULL, MD5Res); |
| 285 | } |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 286 | |
| 287 | // struct foo { foo foo::*mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 288 | TEST_F(DIEHashTest, PtrToMember) { |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 289 | DIE Foo(dwarf::DW_TAG_structure_type); |
| 290 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 291 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 292 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 293 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 294 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 295 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 296 | DIEString MemStr = getString("mem"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 297 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 298 | DIEInteger Zero(0); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 299 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 300 | |
| 301 | DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 302 | DIEEntry FooEntry(Foo); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 303 | PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry); |
Eric Christopher | da1d7d9 | 2014-02-20 00:54:38 +0000 | [diff] [blame] | 304 | PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 305 | FooEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 306 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 307 | DIEEntry PtrToFooMemRef(PtrToFooMem); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 308 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 309 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 310 | Foo.addChild(std::move(Mem)); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 311 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 312 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 313 | |
| 314 | ASSERT_EQ(0x852e0c9ff7c04ebULL, MD5Res); |
| 315 | } |
| 316 | |
| 317 | // Check that the hash for a pointer-to-member matches regardless of whether the |
| 318 | // pointed-to type is a declaration or a definition. |
| 319 | // |
| 320 | // struct bar; // { }; |
| 321 | // struct foo { bar foo::*mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 322 | TEST_F(DIEHashTest, PtrToMemberDeclDefMatch) { |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 323 | DIEInteger Zero(0); |
| 324 | DIEInteger One(1); |
| 325 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 326 | DIEString FooStr = getString("foo"); |
| 327 | DIEString BarStr = getString("bar"); |
| 328 | DIEString MemStr = getString("mem"); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 329 | uint64_t MD5ResDecl; |
| 330 | { |
| 331 | DIE Bar(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 332 | Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); |
| 333 | Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 334 | |
| 335 | DIE Foo(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 336 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
| 337 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 338 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 339 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 340 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 341 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 342 | Zero); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 343 | |
| 344 | DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 345 | DIEEntry BarEntry(Bar); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 346 | PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 347 | DIEEntry FooEntry(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 348 | PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 349 | FooEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 350 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 351 | DIEEntry PtrToFooMemRef(PtrToFooMem); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 352 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 353 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 354 | Foo.addChild(std::move(Mem)); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 355 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 356 | MD5ResDecl = DIEHash().computeTypeSignature(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 357 | } |
| 358 | uint64_t MD5ResDef; |
| 359 | { |
| 360 | DIE Bar(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 361 | Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); |
| 362 | Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 363 | |
| 364 | DIE Foo(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 365 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
| 366 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 367 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 368 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 369 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 370 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 371 | Zero); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 372 | |
| 373 | DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 374 | DIEEntry BarEntry(Bar); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 375 | PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 376 | DIEEntry FooEntry(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 377 | PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 378 | FooEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 379 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 380 | DIEEntry PtrToFooMemRef(PtrToFooMem); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 381 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 382 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 383 | Foo.addChild(std::move(Mem)); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 384 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 385 | MD5ResDef = DIEHash().computeTypeSignature(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 386 | } |
| 387 | ASSERT_EQ(MD5ResDef, MD5ResDecl); |
| 388 | } |
| 389 | |
| 390 | // Check that the hash for a pointer-to-member matches regardless of whether the |
| 391 | // pointed-to type is a declaration or a definition. |
| 392 | // |
| 393 | // struct bar; // { }; |
| 394 | // struct foo { bar bar::*mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 395 | TEST_F(DIEHashTest, PtrToMemberDeclDefMisMatch) { |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 396 | DIEInteger Zero(0); |
| 397 | DIEInteger One(1); |
| 398 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 399 | DIEString FooStr = getString("foo"); |
| 400 | DIEString BarStr = getString("bar"); |
| 401 | DIEString MemStr = getString("mem"); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 402 | uint64_t MD5ResDecl; |
| 403 | { |
| 404 | DIE Bar(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 405 | Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); |
| 406 | Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 407 | |
| 408 | DIE Foo(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 409 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
| 410 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 411 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 412 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 413 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 414 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 415 | Zero); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 416 | |
| 417 | DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 418 | DIEEntry BarEntry(Bar); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 419 | PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 420 | PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 421 | BarEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 422 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 423 | DIEEntry PtrToFooMemRef(PtrToFooMem); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 424 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 425 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 426 | Foo.addChild(std::move(Mem)); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 427 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 428 | MD5ResDecl = DIEHash().computeTypeSignature(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 429 | } |
| 430 | uint64_t MD5ResDef; |
| 431 | { |
| 432 | DIE Bar(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 433 | Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr); |
| 434 | Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 435 | |
| 436 | DIE Foo(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 437 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
| 438 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 439 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 440 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 441 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 442 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 443 | Zero); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 444 | |
| 445 | DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 446 | DIEEntry BarEntry(Bar); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 447 | PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, BarEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 448 | PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 449 | BarEntry); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 450 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 451 | DIEEntry PtrToFooMemRef(PtrToFooMem); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 452 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 453 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 454 | Foo.addChild(std::move(Mem)); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 455 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 456 | MD5ResDef = DIEHash().computeTypeSignature(Foo); |
David Blaikie | d70a055 | 2013-10-22 18:14:41 +0000 | [diff] [blame] | 457 | } |
| 458 | // FIXME: This seems to be a bug in the DWARF type hashing specification that |
| 459 | // only uses the brief name hashing for types referenced via DW_AT_type. In |
| 460 | // this case the type is referenced via DW_AT_containing_type and full hashing |
| 461 | // causes a hash to differ when the containing type is a declaration in one TU |
| 462 | // and a definition in another. |
| 463 | ASSERT_NE(MD5ResDef, MD5ResDecl); |
| 464 | } |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 465 | |
| 466 | // struct { } a; |
| 467 | // struct foo { decltype(a) mem; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 468 | TEST_F(DIEHashTest, RefUnnamedType) { |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 469 | DIEInteger Zero(0); |
| 470 | DIEInteger One(1); |
| 471 | DIEInteger Eight(8); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 472 | DIEString FooStr = getString("foo"); |
| 473 | DIEString MemStr = getString("mem"); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 474 | |
| 475 | DIE Unnamed(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 476 | Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 477 | |
| 478 | DIE Foo(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 479 | Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
| 480 | Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 481 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 482 | auto Mem = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 483 | Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr); |
| 484 | Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1, Zero); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 485 | |
| 486 | DIE UnnamedPtr(dwarf::DW_TAG_pointer_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 487 | UnnamedPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight); |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 488 | DIEEntry UnnamedRef(Unnamed); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 489 | UnnamedPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedRef); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 490 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 491 | DIEEntry UnnamedPtrRef(UnnamedPtr); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 492 | Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedPtrRef); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 493 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 494 | Foo.addChild(std::move(Mem)); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 495 | |
David Blaikie | 2aee7be | 2013-10-24 18:29:03 +0000 | [diff] [blame] | 496 | uint64_t MD5Res = DIEHash().computeTypeSignature(Foo); |
David Blaikie | 3274441 | 2013-10-24 17:53:58 +0000 | [diff] [blame] | 497 | |
| 498 | ASSERT_EQ(0x954e026f01c02529ULL, MD5Res); |
| 499 | } |
David Blaikie | 65cc969 | 2013-10-25 18:38:43 +0000 | [diff] [blame] | 500 | |
Eric Christopher | 5ad8d90 | 2014-01-31 20:02:55 +0000 | [diff] [blame] | 501 | // struct { struct foo { }; }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 502 | TEST_F(DIEHashTest, NestedType) { |
David Blaikie | 65cc969 | 2013-10-25 18:38:43 +0000 | [diff] [blame] | 503 | DIE Unnamed(dwarf::DW_TAG_structure_type); |
| 504 | DIEInteger One(1); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 505 | Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 65cc969 | 2013-10-25 18:38:43 +0000 | [diff] [blame] | 506 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 507 | auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 508 | DIEString FooStr = getString("foo"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 509 | Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr); |
| 510 | Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 65cc969 | 2013-10-25 18:38:43 +0000 | [diff] [blame] | 511 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 512 | Unnamed.addChild(std::move(Foo)); |
David Blaikie | 65cc969 | 2013-10-25 18:38:43 +0000 | [diff] [blame] | 513 | |
| 514 | uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); |
| 515 | |
| 516 | // The exact same hash GCC produces for this DIE. |
| 517 | ASSERT_EQ(0xde8a3b7b43807f4aULL, MD5Res); |
| 518 | } |
David Blaikie | 8bc7db7 | 2013-10-25 20:04:25 +0000 | [diff] [blame] | 519 | |
| 520 | // struct { static void func(); }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 521 | TEST_F(DIEHashTest, MemberFunc) { |
David Blaikie | 8bc7db7 | 2013-10-25 20:04:25 +0000 | [diff] [blame] | 522 | DIE Unnamed(dwarf::DW_TAG_structure_type); |
| 523 | DIEInteger One(1); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 524 | Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
David Blaikie | 8bc7db7 | 2013-10-25 20:04:25 +0000 | [diff] [blame] | 525 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 526 | auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 527 | DIEString FuncStr = getString("func"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 528 | Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr); |
David Blaikie | 8bc7db7 | 2013-10-25 20:04:25 +0000 | [diff] [blame] | 529 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 530 | Unnamed.addChild(std::move(Func)); |
David Blaikie | 8bc7db7 | 2013-10-25 20:04:25 +0000 | [diff] [blame] | 531 | |
| 532 | uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed); |
| 533 | |
| 534 | // The exact same hash GCC produces for this DIE. |
| 535 | ASSERT_EQ(0xd36a1b6dfb604ba0ULL, MD5Res); |
| 536 | } |
Eric Christopher | 4b1cf58 | 2014-01-31 20:02:58 +0000 | [diff] [blame] | 537 | |
| 538 | // struct A { |
| 539 | // static void func(); |
| 540 | // }; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 541 | TEST_F(DIEHashTest, MemberFuncFlag) { |
Eric Christopher | 4b1cf58 | 2014-01-31 20:02:58 +0000 | [diff] [blame] | 542 | DIE A(dwarf::DW_TAG_structure_type); |
| 543 | DIEInteger One(1); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 544 | DIEString AStr = getString("A"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 545 | A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); |
| 546 | A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
| 547 | A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 548 | A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); |
Eric Christopher | 4b1cf58 | 2014-01-31 20:02:58 +0000 | [diff] [blame] | 549 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 550 | auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 551 | DIEString FuncStr = getString("func"); |
| 552 | DIEString FuncLinkage = getString("_ZN1A4funcEv"); |
Eric Christopher | 4b1cf58 | 2014-01-31 20:02:58 +0000 | [diff] [blame] | 553 | DIEInteger Two(2); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 554 | Func->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); |
| 555 | Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr); |
| 556 | Func->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 557 | Func->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); |
| 558 | Func->addValue(dwarf::DW_AT_linkage_name, dwarf::DW_FORM_strp, FuncLinkage); |
| 559 | Func->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); |
Eric Christopher | 4b1cf58 | 2014-01-31 20:02:58 +0000 | [diff] [blame] | 560 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 561 | A.addChild(std::move(Func)); |
Eric Christopher | 4b1cf58 | 2014-01-31 20:02:58 +0000 | [diff] [blame] | 562 | |
| 563 | uint64_t MD5Res = DIEHash().computeTypeSignature(A); |
| 564 | |
| 565 | // The exact same hash GCC produces for this DIE. |
| 566 | ASSERT_EQ(0x8f78211ddce3df10ULL, MD5Res); |
| 567 | } |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 568 | |
| 569 | // Derived from: |
| 570 | // struct A { |
Eric Christopher | f5ec3a0 | 2014-02-20 00:59:17 +0000 | [diff] [blame] | 571 | // const static int PI = -3; |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 572 | // }; |
| 573 | // A a; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 574 | TEST_F(DIEHashTest, MemberSdata) { |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 575 | DIE A(dwarf::DW_TAG_structure_type); |
| 576 | DIEInteger One(1); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 577 | DIEString AStr = getString("A"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 578 | A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); |
| 579 | A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
| 580 | A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 581 | A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 582 | |
| 583 | DIEInteger Four(4); |
| 584 | DIEInteger Five(5); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 585 | DIEString FStr = getString("int"); |
David Blaikie | de519a2 | 2014-04-25 17:07:55 +0000 | [diff] [blame] | 586 | DIE IntTyDIE(dwarf::DW_TAG_base_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 587 | IntTyDIE.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); |
| 588 | IntTyDIE.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five); |
| 589 | IntTyDIE.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr); |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 590 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 591 | DIEEntry IntTy(IntTyDIE); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 592 | auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 593 | PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntTy); |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 594 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 595 | DIEEntry PITy(*PITyDIE); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 596 | auto PI = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 597 | DIEString PIStr = getString("PI"); |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 598 | DIEInteger Two(2); |
| 599 | DIEInteger NegThree(-3); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 600 | PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr); |
| 601 | PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 602 | PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); |
| 603 | PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy); |
| 604 | PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); |
| 605 | PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); |
| 606 | PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, NegThree); |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 607 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 608 | A.addChild(std::move(PI)); |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 609 | |
Eric Christopher | 8192ba2 | 2014-02-20 00:54:40 +0000 | [diff] [blame] | 610 | uint64_t MD5Res = DIEHash().computeTypeSignature(A); |
| 611 | ASSERT_EQ(0x9a216000dd3788a7ULL, MD5Res); |
| 612 | } |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 613 | |
| 614 | // Derived from: |
| 615 | // struct A { |
| 616 | // const static float PI = 3.14; |
| 617 | // }; |
| 618 | // A a; |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 619 | TEST_F(DIEHashTest, MemberBlock) { |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 620 | DIE A(dwarf::DW_TAG_structure_type); |
| 621 | DIEInteger One(1); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 622 | DIEString AStr = getString("A"); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 623 | A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr); |
| 624 | A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One); |
| 625 | A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 626 | A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 627 | |
| 628 | DIEInteger Four(4); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 629 | DIEString FStr = getString("float"); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 630 | auto FloatTyDIE = make_unique<DIE>(dwarf::DW_TAG_base_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 631 | FloatTyDIE->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four); |
| 632 | FloatTyDIE->addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Four); |
| 633 | FloatTyDIE->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 634 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 635 | DIEEntry FloatTy(*FloatTyDIE); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 636 | auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 637 | PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FloatTy); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 638 | |
David Blaikie | 8dbcc3f | 2014-04-25 19:33:43 +0000 | [diff] [blame] | 639 | DIEEntry PITy(*PITyDIE); |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 640 | auto PI = make_unique<DIE>(dwarf::DW_TAG_member); |
Duncan P. N. Exon Smith | f73bcf4 | 2015-05-24 16:40:47 +0000 | [diff] [blame] | 641 | DIEString PIStr = getString("PI"); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 642 | DIEInteger Two(2); |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 643 | PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr); |
| 644 | PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One); |
| 645 | PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two); |
| 646 | PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy); |
| 647 | PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One); |
| 648 | PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, One); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 649 | |
David Blaikie | de519a2 | 2014-04-25 17:07:55 +0000 | [diff] [blame] | 650 | DIEBlock PIBlock; |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 651 | DIEInteger Blk1(0xc3); |
| 652 | DIEInteger Blk2(0xf5); |
| 653 | DIEInteger Blk3(0x48); |
| 654 | DIEInteger Blk4(0x40); |
| 655 | |
Duncan P. N. Exon Smith | e7e1d0c | 2015-05-27 22:14:58 +0000 | [diff] [blame^] | 656 | PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk1); |
| 657 | PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk2); |
| 658 | PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk3); |
| 659 | PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk4); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 660 | |
David Blaikie | de519a2 | 2014-04-25 17:07:55 +0000 | [diff] [blame] | 661 | PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_block1, &PIBlock); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 662 | |
David Blaikie | 914046e | 2014-04-25 20:00:34 +0000 | [diff] [blame] | 663 | A.addChild(std::move(PI)); |
Eric Christopher | 420569b | 2014-02-20 02:50:45 +0000 | [diff] [blame] | 664 | |
| 665 | uint64_t MD5Res = DIEHash().computeTypeSignature(A); |
| 666 | ASSERT_EQ(0x493af53ad3d3f651ULL, MD5Res); |
| 667 | } |
Eric Christopher | 25b7adc | 2013-09-03 21:57:57 +0000 | [diff] [blame] | 668 | } |