//===-- SymbolTest.cpp ----------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "lldb/Symbol/Symbol.h" #include "lldb/Core/DataFileCache.h" #include "lldb/Core/Section.h" #include "lldb/Utility/DataEncoder.h" #include "lldb/Utility/DataExtractor.h" #include "gtest/gtest.h" using namespace lldb; using namespace lldb_private; static void EncodeDecode(const Symbol &object, const SectionList *sect_list, ByteOrder byte_order) { const uint8_t addr_size = 8; DataEncoder file(byte_order, addr_size); DataEncoder strtab_encoder(byte_order, addr_size); ConstStringTable const_strtab; object.Encode(file, const_strtab); llvm::ArrayRef bytes = file.GetData(); DataExtractor data(bytes.data(), bytes.size(), byte_order, addr_size); const_strtab.Encode(strtab_encoder); llvm::ArrayRef strtab_bytes = strtab_encoder.GetData(); DataExtractor strtab_data(strtab_bytes.data(), strtab_bytes.size(), byte_order, addr_size); StringTableReader strtab_reader; offset_t strtab_data_offset = 0; ASSERT_EQ(strtab_reader.Decode(strtab_data, &strtab_data_offset), true); Symbol decoded_object; offset_t data_offset = 0; decoded_object.Decode(data, &data_offset, sect_list, strtab_reader); EXPECT_EQ(object, decoded_object); } static void EncodeDecode(const Symbol &object, const SectionList *sect_list) { EncodeDecode(object, sect_list, eByteOrderLittle); EncodeDecode(object, sect_list, eByteOrderBig); } TEST(SymbolTest, EncodeDecodeSymbol) { SectionSP sect_sp(new Section( /*module_sp=*/ModuleSP(), /*obj_file=*/nullptr, /*sect_id=*/1, /*name=*/ConstString(".text"), /*sect_type=*/eSectionTypeCode, /*file_vm_addr=*/0x1000, /*vm_size=*/0x1000, /*file_offset=*/0, /*file_size=*/0, /*log2align=*/5, /*flags=*/0x10203040)); SectionList sect_list; sect_list.AddSection(sect_sp); Symbol symbol( /*symID=*/0x10203040, /*name=*/"main", /*type=*/eSymbolTypeCode, /*bool external=*/false, /*bool is_debug=*/false, /*bool is_trampoline=*/false, /*bool is_artificial=*/false, /*section_sp=*/sect_sp, /*offset=*/0x0, /*size=*/0x100, /*size_is_valid=*/true, /*contains_linker_annotations=*/false, /*flags=*/0x11223344); // Test encoding a symbol with an address. EncodeDecode(symbol, §_list); // Test that encoding the bits in the bitfield works for all endianness // combos. // Test Symbol.m_is_synthetic symbol.SetIsSynthetic(true); EncodeDecode(symbol, §_list); symbol.SetIsSynthetic(false); // Test Symbol.m_is_debug symbol.SetDebug(true); EncodeDecode(symbol, §_list); symbol.SetDebug(false); // Test Symbol.m_is_external symbol.SetExternal(true); EncodeDecode(symbol, §_list); symbol.SetExternal(false); // Test Symbol.m_size_is_sibling symbol.SetSizeIsSibling(true); EncodeDecode(symbol, §_list); symbol.SetSizeIsSibling(false); // Test Symbol.m_size_is_synthesized symbol.SetSizeIsSynthesized(true); EncodeDecode(symbol, §_list); symbol.SetSizeIsSynthesized(false); // Test Symbol.m_size_is_synthesized symbol.SetByteSize(0); EncodeDecode(symbol, §_list); symbol.SetByteSize(0x100); // Test Symbol.m_demangled_is_synthesized symbol.SetDemangledNameIsSynthesized(true); EncodeDecode(symbol, §_list); symbol.SetDemangledNameIsSynthesized(false); // Test Symbol.m_contains_linker_annotations symbol.SetContainsLinkerAnnotations(true); EncodeDecode(symbol, §_list); symbol.SetContainsLinkerAnnotations(false); // Test Symbol.m_is_weak symbol.SetIsWeak(true); EncodeDecode(symbol, §_list); symbol.SetIsWeak(false); // Test encoding a symbol with no address. symbol.GetAddressRef().SetSection(SectionSP()); EncodeDecode(symbol, §_list); }