#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<uint8_t> bytes = file.GetData();
DataExtractor data(bytes.data(), bytes.size(), byte_order, addr_size);
const_strtab.Encode(strtab_encoder);
llvm::ArrayRef<uint8_t> 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(
ModuleSP(),
nullptr,
1,
ConstString(".text"),
eSectionTypeCode,
0x1000,
0x1000,
0,
0,
5,
0x10203040));
SectionList sect_list;
sect_list.AddSection(sect_sp);
Symbol symbol(
0x10203040,
"main",
eSymbolTypeCode,
false,
false,
false,
false,
sect_sp,
0x0,
0x100,
true,
false,
0x11223344);
EncodeDecode(symbol, §_list);
symbol.SetIsSynthetic(true);
EncodeDecode(symbol, §_list);
symbol.SetIsSynthetic(false);
symbol.SetDebug(true);
EncodeDecode(symbol, §_list);
symbol.SetDebug(false);
symbol.SetExternal(true);
EncodeDecode(symbol, §_list);
symbol.SetExternal(false);
symbol.SetSizeIsSibling(true);
EncodeDecode(symbol, §_list);
symbol.SetSizeIsSibling(false);
symbol.SetSizeIsSynthesized(true);
EncodeDecode(symbol, §_list);
symbol.SetSizeIsSynthesized(false);
symbol.SetByteSize(0);
EncodeDecode(symbol, §_list);
symbol.SetByteSize(0x100);
symbol.SetDemangledNameIsSynthesized(true);
EncodeDecode(symbol, §_list);
symbol.SetDemangledNameIsSynthesized(false);
symbol.SetContainsLinkerAnnotations(true);
EncodeDecode(symbol, §_list);
symbol.SetContainsLinkerAnnotations(false);
symbol.SetIsWeak(true);
EncodeDecode(symbol, §_list);
symbol.SetIsWeak(false);
symbol.GetAddressRef().SetSection(SectionSP());
EncodeDecode(symbol, §_list);
}