|  | //===- 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 = std::string(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 = std::string(Locations[Index].Base); | 
|  | } | 
|  | return Fullpath; | 
|  | } | 
|  |  | 
|  | raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const SourceLocation &SL) { | 
|  | OS << SL.Name; | 
|  | if (SL.Offset > 0) | 
|  | OS << " + " << SL.Offset; | 
|  | if (SL.Dir.size() || SL.Base.size()) { | 
|  | OS << " @ "; | 
|  | 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; | 
|  | } |