| //===- InlineInfo.cpp -------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/DebugInfo/GSYM/FileEntry.h" |
| #include "llvm/DebugInfo/GSYM/InlineInfo.h" |
| #include <algorithm> |
| #include <inttypes.h> |
| |
| using namespace llvm; |
| using namespace gsym; |
| |
| |
| raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const InlineInfo &II) { |
| if (!II.isValid()) |
| return OS; |
| bool First = true; |
| for (auto Range : II.Ranges) { |
| if (First) |
| First = false; |
| else |
| OS << ' '; |
| OS << Range; |
| } |
| OS << " Name = " << HEX32(II.Name) << ", CallFile = " << II.CallFile |
| << ", CallLine = " << II.CallFile << '\n'; |
| for (const auto &Child : II.Children) |
| OS << Child; |
| return OS; |
| } |
| |
| static bool getInlineStackHelper(const InlineInfo &II, uint64_t Addr, |
| std::vector<const InlineInfo *> &InlineStack) { |
| if (II.Ranges.contains(Addr)) { |
| // If this is the top level that represents the concrete function, |
| // there will be no name and we shoud clear the inline stack. Otherwise |
| // we have found an inline call stack that we need to insert. |
| if (II.Name != 0) |
| InlineStack.insert(InlineStack.begin(), &II); |
| for (const auto &Child : II.Children) { |
| if (::getInlineStackHelper(Child, Addr, InlineStack)) |
| break; |
| } |
| return !InlineStack.empty(); |
| } |
| return false; |
| } |
| |
| llvm::Optional<InlineInfo::InlineArray> InlineInfo::getInlineStack(uint64_t Addr) const { |
| InlineArray Result; |
| if (getInlineStackHelper(*this, Addr, Result)) |
| return Result; |
| return llvm::None; |
| } |