diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/DebugInfo/GSYM/LookupResult.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/DebugInfo/GSYM/LookupResult.cpp | 74 | 
1 files changed, 74 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/DebugInfo/GSYM/LookupResult.cpp b/contrib/llvm-project/llvm/lib/DebugInfo/GSYM/LookupResult.cpp new file mode 100644 index 000000000000..8a624226b1d3 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/DebugInfo/GSYM/LookupResult.cpp @@ -0,0 +1,74 @@ +//===- 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; +}  | 
