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