1 //===-- SymbolTest.cpp ----------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "lldb/Symbol/Symbol.h"
10 #include "lldb/Core/DataFileCache.h"
11 #include "lldb/Core/Section.h"
12 #include "lldb/Utility/DataEncoder.h"
13 #include "lldb/Utility/DataExtractor.h"
15 #include "gtest/gtest.h"
18 using namespace lldb_private
;
20 static void EncodeDecode(const Symbol
&object
, const SectionList
*sect_list
,
21 ByteOrder byte_order
) {
22 const uint8_t addr_size
= 8;
23 DataEncoder
file(byte_order
, addr_size
);
24 DataEncoder
strtab_encoder(byte_order
, addr_size
);
25 ConstStringTable const_strtab
;
26 object
.Encode(file
, const_strtab
);
27 llvm::ArrayRef
<uint8_t> bytes
= file
.GetData();
28 DataExtractor
data(bytes
.data(), bytes
.size(), byte_order
, addr_size
);
30 const_strtab
.Encode(strtab_encoder
);
31 llvm::ArrayRef
<uint8_t> strtab_bytes
= strtab_encoder
.GetData();
32 DataExtractor
strtab_data(strtab_bytes
.data(), strtab_bytes
.size(),
33 byte_order
, addr_size
);
34 StringTableReader strtab_reader
;
35 offset_t strtab_data_offset
= 0;
36 ASSERT_EQ(strtab_reader
.Decode(strtab_data
, &strtab_data_offset
), true);
38 Symbol decoded_object
;
39 offset_t data_offset
= 0;
40 decoded_object
.Decode(data
, &data_offset
, sect_list
, strtab_reader
);
41 EXPECT_EQ(object
, decoded_object
);
44 static void EncodeDecode(const Symbol
&object
, const SectionList
*sect_list
) {
45 EncodeDecode(object
, sect_list
, eByteOrderLittle
);
46 EncodeDecode(object
, sect_list
, eByteOrderBig
);
49 TEST(SymbolTest
, EncodeDecodeSymbol
) {
51 SectionSP
sect_sp(new Section(
52 /*module_sp=*/ModuleSP(),
55 /*name=*/ConstString(".text"),
56 /*sect_type=*/eSectionTypeCode
,
57 /*file_vm_addr=*/0x1000,
62 /*flags=*/0x10203040));
64 SectionList sect_list
;
65 sect_list
.AddSection(sect_sp
);
70 /*type=*/eSymbolTypeCode
,
71 /*bool external=*/false,
72 /*bool is_debug=*/false,
73 /*bool is_trampoline=*/false,
74 /*bool is_artificial=*/false,
75 /*section_sp=*/sect_sp
,
78 /*size_is_valid=*/true,
79 /*contains_linker_annotations=*/false,
80 /*flags=*/0x11223344);
82 // Test encoding a symbol with an address.
83 EncodeDecode(symbol
, §_list
);
85 // Test that encoding the bits in the bitfield works for all endianness
88 // Test Symbol.m_is_synthetic
89 symbol
.SetIsSynthetic(true);
90 EncodeDecode(symbol
, §_list
);
91 symbol
.SetIsSynthetic(false);
93 // Test Symbol.m_is_debug
94 symbol
.SetDebug(true);
95 EncodeDecode(symbol
, §_list
);
96 symbol
.SetDebug(false);
98 // Test Symbol.m_is_external
99 symbol
.SetExternal(true);
100 EncodeDecode(symbol
, §_list
);
101 symbol
.SetExternal(false);
103 // Test Symbol.m_size_is_sibling
104 symbol
.SetSizeIsSibling(true);
105 EncodeDecode(symbol
, §_list
);
106 symbol
.SetSizeIsSibling(false);
108 // Test Symbol.m_size_is_synthesized
109 symbol
.SetSizeIsSynthesized(true);
110 EncodeDecode(symbol
, §_list
);
111 symbol
.SetSizeIsSynthesized(false);
113 // Test Symbol.m_size_is_synthesized
114 symbol
.SetByteSize(0);
115 EncodeDecode(symbol
, §_list
);
116 symbol
.SetByteSize(0x100);
118 // Test Symbol.m_demangled_is_synthesized
119 symbol
.SetDemangledNameIsSynthesized(true);
120 EncodeDecode(symbol
, §_list
);
121 symbol
.SetDemangledNameIsSynthesized(false);
123 // Test Symbol.m_contains_linker_annotations
124 symbol
.SetContainsLinkerAnnotations(true);
125 EncodeDecode(symbol
, §_list
);
126 symbol
.SetContainsLinkerAnnotations(false);
128 // Test Symbol.m_is_weak
129 symbol
.SetIsWeak(true);
130 EncodeDecode(symbol
, §_list
);
131 symbol
.SetIsWeak(false);
133 // Test encoding a symbol with no address.
134 symbol
.GetAddressRef().SetSection(SectionSP());
135 EncodeDecode(symbol
, §_list
);