blob: de0536c3acce047c96ed916ee0cad25e201db7e9 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/symbols/test_symbol_module.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/ELFObjectFile.h"
#include "src/developer/debug/zxdb/common/host_util.h"
#include "src/developer/debug/zxdb/symbols/dwarf_binary_impl.h"
namespace zxdb {
const char TestSymbolModule::kMyNamespaceName[] = "my_ns";
const char TestSymbolModule::kMyFunctionName[] = "MyFunction";
const int TestSymbolModule::kMyFunctionLine = 109;
const uint64_t TestSymbolModule::kMyFunctionAddress = 0x1420u;
const size_t TestSymbolModule::kMyFunctionPrologueSize = 10;
const char TestSymbolModule::kNamespaceFunctionName[] = "my_ns::NamespaceFunction";
const char TestSymbolModule::kMyClassName[] = "my_ns::MyClass";
const char TestSymbolModule::kMyInnerClassName[] = "my_ns::MyClass::Inner";
const char TestSymbolModule::kMyMemberOneName[] = "my_ns::MyClass::MyMemberOne";
const char TestSymbolModule::kFunctionInTest2Name[] = "ClassInTest2::FunctionInTest2";
const char TestSymbolModule::kMyMemberTwoName[] = "my_ns::MyClass::Inner::MyMemberTwo";
const char TestSymbolModule::kAnonNSFunctionName[] = "AnonNSFunction";
const char TestSymbolModule::kGlobalName[] = "my_ns::kGlobal";
const char TestSymbolModule::kClassStaticName[] = "my_ns::MyClass::kClassStatic";
const char TestSymbolModule::kPltFunctionName[] = "__stack_chk_fail";
const uint64_t TestSymbolModule::kPltFunctionOffset = 0x1520;
// Build ID of the checked-in symbol file. When the checked-in test file is updated, use:
// readelf -n test_data/libsymbol_test_so.targetso
// to get the new one.
//
// NOTE WHEN UPDATING: the build also needs to be updated to put the file into this directory. See
// the "dot_buildid" rule in BUILD.gn
const char TestSymbolModule::kCheckedInBuildId[] = "9eb335ffa35de20c";
namespace {
inline std::string GetTestFilePath(const std::string& rel_path) {
std::string path = GetSelfPath();
size_t last_slash = path.rfind('/');
if (last_slash == std::string::npos) {
path = "./"; // Just hope the current directory works.
} else {
path.resize(last_slash + 1);
}
return path + rel_path;
}
// The test files will be copied over to this specific location at build time.
const char kRelativeTestDataPath[] = "test_data/zxdb/";
} // namespace
// static
std::string TestSymbolModule::GetTestDataDir() { return GetTestFilePath(kRelativeTestDataPath); }
// static
std::string TestSymbolModule::GetTestFileName() {
return GetTestDataDir() + "libzxdb_symbol_test.targetso";
}
// static
std::string TestSymbolModule::GetCheckedInTestFileName() {
return GetTestDataDir() + "libsymbol_test_so.targetso";
}
// static
std::string TestSymbolModule::GetStrippedCheckedInTestFileName() {
return GetTestDataDir() + "libsymbol_test_so_stripped.targetso";
}
// static
Identifier TestSymbolModule::SplitName(std::string_view input) {
const std::string separator("::");
Identifier result;
size_t input_index = 0;
while (input_index < input.size()) {
size_t next = input.find(separator, input_index);
std::string cur_name;
if (next == std::string::npos) {
cur_name = input.substr(input_index);
input_index = input.size();
} else {
cur_name = input.substr(input_index, next - input_index);
input_index = next + separator.size(); // Skip over "::".
}
result.AppendComponent(IdentifierComponent(std::move(cur_name)));
}
return result;
}
TestSymbolModule::TestSymbolModule(Kind kind) {
// This leaves the binary name empty since these files have both symbols and code together.
switch (kind) {
case kCheckedIn:
sym_name_ = GetCheckedInTestFileName();
break;
case kBuilt:
sym_name_ = GetTestFileName();
break;
}
}
TestSymbolModule::TestSymbolModule(const std::string& sym_name, const std::string& binary_name)
: sym_name_(sym_name), binary_name_(binary_name) {}
TestSymbolModule::~TestSymbolModule() = default;
Err TestSymbolModule::Init(const std::string& build_dir, bool should_index) {
auto binary = std::make_unique<DwarfBinaryImpl>(sym_name_, binary_name_, std::string());
if (Err err = binary->Load(); err.has_error())
return err;
symbols_ = fxl::MakeRefCounted<ModuleSymbolsImpl>(std::move(binary), build_dir, should_index);
return Err();
}
} // namespace zxdb