1 | //===- LookupResult.cpp -------------------------------------------------*-===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "llvm/DebugInfo/GSYM/LookupResult.h" |
10 | #include "llvm/ADT/SmallString.h" |
11 | #include "llvm/DebugInfo/GSYM/ExtractRanges.h" |
12 | #include "llvm/Support/Format.h" |
13 | #include "llvm/Support/Path.h" |
14 | #include "llvm/Support/raw_ostream.h" |
15 | #include <ciso646> |
16 | |
17 | using namespace llvm; |
18 | using namespace gsym; |
19 | |
20 | std::string LookupResult::getSourceFile(uint32_t Index) const { |
21 | std::string Fullpath; |
22 | if (Index < Locations.size()) { |
23 | if (!Locations[Index].Dir.empty()) { |
24 | if (Locations[Index].Base.empty()) { |
25 | Fullpath = std::string(Locations[Index].Dir); |
26 | } else { |
27 | llvm::SmallString<64> Storage; |
28 | llvm::sys::path::append(path&: Storage, a: Locations[Index].Dir, |
29 | b: Locations[Index].Base); |
30 | Fullpath.assign(first: Storage.begin(), last: Storage.end()); |
31 | } |
32 | } else if (!Locations[Index].Base.empty()) |
33 | Fullpath = std::string(Locations[Index].Base); |
34 | } |
35 | return Fullpath; |
36 | } |
37 | |
38 | raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const SourceLocation &SL) { |
39 | OS << SL.Name; |
40 | if (SL.Offset > 0) |
41 | OS << " + "<< SL.Offset; |
42 | if (SL.Dir.size() || SL.Base.size()) { |
43 | OS << " @ "; |
44 | if (!SL.Dir.empty()) { |
45 | OS << SL.Dir; |
46 | if (SL.Dir.contains(C: '\\') && !SL.Dir.contains(C: '/')) |
47 | OS << '\\'; |
48 | else |
49 | OS << '/'; |
50 | } |
51 | if (SL.Base.empty()) |
52 | OS << "<invalid-file>"; |
53 | else |
54 | OS << SL.Base; |
55 | OS << ':' << SL.Line; |
56 | } |
57 | return OS; |
58 | } |
59 | |
60 | raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const LookupResult &LR) { |
61 | OS << HEX64(LR.LookupAddr) << ": "; |
62 | auto NumLocations = LR.Locations.size(); |
63 | for (size_t I = 0; I < NumLocations; ++I) { |
64 | if (I > 0) { |
65 | OS << '\n'; |
66 | OS.indent(NumSpaces: 20); |
67 | } |
68 | const bool IsInlined = I + 1 != NumLocations; |
69 | OS << LR.Locations[I]; |
70 | if (IsInlined) |
71 | OS << " [inlined]"; |
72 | } |
73 | OS << '\n'; |
74 | return OS; |
75 | } |
76 |