137 lines · cpp
1//===-- SymbolTest.cpp ----------------------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8 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"14 15#include "gtest/gtest.h"16 17using namespace lldb;18using namespace lldb_private;19 20static 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);29 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);37 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);42}43 44static void EncodeDecode(const Symbol &object, const SectionList *sect_list) {45 EncodeDecode(object, sect_list, eByteOrderLittle);46 EncodeDecode(object, sect_list, eByteOrderBig);47}48 49TEST(SymbolTest, EncodeDecodeSymbol) {50 51 SectionSP sect_sp(new Section(52 /*module_sp=*/ModuleSP(),53 /*obj_file=*/nullptr,54 /*sect_id=*/1,55 /*name=*/ConstString(".text"),56 /*sect_type=*/eSectionTypeCode,57 /*file_vm_addr=*/0x1000,58 /*vm_size=*/0x1000,59 /*file_offset=*/0,60 /*file_size=*/0,61 /*log2align=*/5,62 /*flags=*/0x10203040));63 64 SectionList sect_list;65 sect_list.AddSection(sect_sp);66 67 Symbol symbol(68 /*symID=*/0x10203040,69 /*name=*/"main",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,76 /*offset=*/0x0,77 /*size=*/0x100,78 /*size_is_valid=*/true,79 /*contains_linker_annotations=*/false,80 /*flags=*/0x11223344);81 82 // Test encoding a symbol with an address.83 EncodeDecode(symbol, §_list);84 85 // Test that encoding the bits in the bitfield works for all endianness86 // combos.87 88 // Test Symbol.m_is_synthetic89 symbol.SetIsSynthetic(true);90 EncodeDecode(symbol, §_list);91 symbol.SetIsSynthetic(false);92 93 // Test Symbol.m_is_debug94 symbol.SetDebug(true);95 EncodeDecode(symbol, §_list);96 symbol.SetDebug(false);97 98 // Test Symbol.m_is_external99 symbol.SetExternal(true);100 EncodeDecode(symbol, §_list);101 symbol.SetExternal(false);102 103 // Test Symbol.m_size_is_sibling104 symbol.SetSizeIsSibling(true);105 EncodeDecode(symbol, §_list);106 symbol.SetSizeIsSibling(false);107 108 // Test Symbol.m_size_is_synthesized109 symbol.SetSizeIsSynthesized(true);110 EncodeDecode(symbol, §_list);111 symbol.SetSizeIsSynthesized(false);112 113 // Test Symbol.m_size_is_synthesized114 symbol.SetByteSize(0);115 EncodeDecode(symbol, §_list);116 symbol.SetByteSize(0x100);117 118 // Test Symbol.m_demangled_is_synthesized119 symbol.SetDemangledNameIsSynthesized(true);120 EncodeDecode(symbol, §_list);121 symbol.SetDemangledNameIsSynthesized(false);122 123 // Test Symbol.m_contains_linker_annotations124 symbol.SetContainsLinkerAnnotations(true);125 EncodeDecode(symbol, §_list);126 symbol.SetContainsLinkerAnnotations(false);127 128 // Test Symbol.m_is_weak129 symbol.SetIsWeak(true);130 EncodeDecode(symbol, §_list);131 symbol.SetIsWeak(false);132 133 // Test encoding a symbol with no address.134 symbol.GetAddressRef().SetSection(SectionSP());135 EncodeDecode(symbol, §_list);136}137