| //===- LookupResult.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 "llvm/DebugInfo/GSYM/LookupResult.h" |
| #include "llvm/ADT/SmallString.h" |
| #include "llvm/Support/Format.h" |
| #include "llvm/Support/Path.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <ciso646> |
| |
| using namespace llvm; |
| using namespace gsym; |
| |
| std::string LookupResult::getSourceFile(uint32_t Index) const { |
| std::string Fullpath; |
| if (Index < Locations.size()) { |
| if (!Locations[Index].Dir.empty()) { |
| if (Locations[Index].Base.empty()) { |
| Fullpath = Locations[Index].Dir; |
| } else { |
| llvm::SmallString<64> Storage; |
| llvm::sys::path::append(Storage, Locations[Index].Dir, |
| Locations[Index].Base); |
| Fullpath.assign(Storage.begin(), Storage.end()); |
| } |
| } else if (!Locations[Index].Base.empty()) |
| Fullpath = Locations[Index].Base; |
| } |
| return Fullpath; |
| } |
| |
| raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const SourceLocation &SL) { |
| OS << SL.Name << " @ "; |
| if (!SL.Dir.empty()) { |
| OS << SL.Dir; |
| if (SL.Dir.contains('\\') and not SL.Dir.contains('/')) |
| OS << '\\'; |
| else |
| OS << '/'; |
| } |
| if (SL.Base.empty()) |
| OS << "<invalid-file>"; |
| else |
| OS << SL.Base; |
| OS << ':' << SL.Line; |
| return OS; |
| } |
| |
| raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const LookupResult &LR) { |
| OS << HEX64(LR.LookupAddr) << ": "; |
| auto NumLocations = LR.Locations.size(); |
| for (size_t I = 0; I < NumLocations; ++I) { |
| if (I > 0) { |
| OS << '\n'; |
| OS.indent(20); |
| } |
| const bool IsInlined = I + 1 != NumLocations; |
| OS << LR.Locations[I]; |
| if (IsInlined) |
| OS << " [inlined]"; |
| } |
| OS << '\n'; |
| return OS; |
| } |