mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 07:06:07 +00:00
58 lines
1.8 KiB
C++
58 lines
1.8 KiB
C++
//===-- lib/DebugInfo/Symbolize/DIFetcher.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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file defines the implementation of the local debug info fetcher, which
|
|
/// searches cache directories.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/Symbolize/DIFetcher.h"
|
|
|
|
#include "llvm/Support/FileSystem.h"
|
|
#include "llvm/Support/Path.h"
|
|
|
|
namespace llvm {
|
|
namespace symbolize {
|
|
|
|
Optional<std::string>
|
|
LocalDIFetcher::fetchBuildID(ArrayRef<uint8_t> BuildID) const {
|
|
auto GetDebugPath = [&](StringRef Directory) {
|
|
SmallString<128> Path{Directory};
|
|
sys::path::append(Path, ".build-id",
|
|
llvm::toHex(BuildID[0], /*LowerCase=*/true),
|
|
llvm::toHex(BuildID.slice(1), /*LowerCase=*/true));
|
|
Path += ".debug";
|
|
return Path;
|
|
};
|
|
if (DebugFileDirectory.empty()) {
|
|
SmallString<128> Path = GetDebugPath(
|
|
#if defined(__NetBSD__)
|
|
// Try /usr/libdata/debug/.build-id/../...
|
|
"/usr/libdata/debug"
|
|
#else
|
|
// Try /usr/lib/debug/.build-id/../...
|
|
"/usr/lib/debug"
|
|
#endif
|
|
);
|
|
if (llvm::sys::fs::exists(Path))
|
|
return std::string(Path);
|
|
} else {
|
|
for (const auto &Directory : DebugFileDirectory) {
|
|
// Try <debug-file-directory>/.build-id/../...
|
|
SmallString<128> Path = GetDebugPath(Directory);
|
|
if (llvm::sys::fs::exists(Path))
|
|
return std::string(Path);
|
|
}
|
|
}
|
|
return None;
|
|
}
|
|
|
|
} // namespace symbolize
|
|
} // namespace llvm
|