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 "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
10 #include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
11 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
12 #include "TestingSupport/SubsystemRAII.h"
13 #include "TestingSupport/TestUtilities.h"
15 #include "lldb/Core/DataFileCache.h"
16 #include "lldb/Core/Module.h"
17 #include "lldb/Host/FileSystem.h"
18 #include "lldb/Host/HostInfo.h"
19 #include "lldb/Symbol/Symbol.h"
20 #include "lldb/Symbol/Symtab.h"
21 #include "lldb/Utility/DataEncoder.h"
22 #include "lldb/Utility/DataExtractor.h"
26 #include "gtest/gtest.h"
29 using namespace lldb_private
;
31 class SymtabTest
: public testing::Test
{
32 SubsystemRAII
<FileSystem
, HostInfo
, ObjectFileMachO
, SymbolFileDWARF
,
37 static void EncodeDecode(const Symtab
&object
, ByteOrder byte_order
) {
38 const uint8_t addr_size
= 8;
39 DataEncoder
file(byte_order
, addr_size
);
42 llvm::ArrayRef
<uint8_t> bytes
= file
.GetData();
43 DataExtractor
data(bytes
.data(), bytes
.size(), byte_order
, addr_size
);
44 Symtab
decoded_object(object
.GetObjectFile());
45 offset_t data_offset
= 0;
46 bool uuid_mismatch
= false;
47 decoded_object
.Decode(data
, &data_offset
, uuid_mismatch
);
48 ASSERT_EQ(object
.GetNumSymbols(), decoded_object
.GetNumSymbols());
49 for (size_t i
= 0; i
< object
.GetNumSymbols(); ++i
)
50 EXPECT_EQ(*object
.SymbolAtIndex(i
), *decoded_object
.SymbolAtIndex(i
));
53 static void EncodeDecode(const Symtab
&object
) {
54 EncodeDecode(object
, eByteOrderLittle
);
55 EncodeDecode(object
, eByteOrderBig
);
58 TEST_F(SymtabTest
, EncodeDecodeSymtab
) {
60 auto ExpectedFile
= TestFile::fromYaml(R
"(
107 content: FF8300D1E80300AA00008052FF1F00B9E81B00B9E10B00F9E20700F9FF830091C0035FD6
108 - sectname: __unwind_info
120 content: 010000001C000000000000001C000000000000001C00000002000000943F00003400000034000000B93F00000000000034000000030000000C000100100001000000000000200002
132 - cmd: LC_DYLD_CHAINED_FIXUPS
136 - cmd: LC_DYLD_EXPORTS_TRIE
166 - cmd: LC_LOAD_DYLINKER
169 Content: '/usr/lib/dyld'
173 uuid: 1EECD2B8-16EA-3FEC-AB3C-F46139DBD0E2
174 - cmd: LC_BUILD_VERSION
183 - cmd: LC_SOURCE_VERSION
195 current_version: 78643968
196 compatibility_version: 65536
197 Content: '/usr/lib/libc++.1.dylib'
204 current_version: 85917696
205 compatibility_version: 65536
206 Content: '/usr/lib/libSystem.B.dylib'
208 - cmd: LC_FUNCTION_STARTS
212 - cmd: LC_DATA_IN_CODE
216 - cmd: LC_CODE_SIGNATURE
274 - __mh_execute_header
276 - '/Users/gclayton/Documents/src/args/'
278 - '/Users/gclayton/Documents/src/args/main.o'
290 ASSERT_THAT_EXPECTED(ExpectedFile
, llvm::Succeeded());
291 auto module_sp
= std::make_shared
<Module
>(ExpectedFile
->moduleSpec());
292 ObjectFile
*objfile
= module_sp
->GetObjectFile();
293 ASSERT_NE(objfile
, nullptr);
295 // Test encoding and decoding an empty symbol table.
296 Symtab
symtab(objfile
);
297 symtab
.PreloadSymbols();
298 EncodeDecode(symtab
);
300 // Now encode and decode an actual symbol table from our yaml.
301 Symtab
*module_symtab
= module_sp
->GetSymtab();
302 ASSERT_NE(module_symtab
, nullptr);
303 module_symtab
->PreloadSymbols();
304 EncodeDecode(*module_symtab
);