//===- 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 #include 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 &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::getInlineStack(uint64_t Addr) const { InlineArray Result; if (getInlineStackHelper(*this, Addr, Result)) return Result; return llvm::None; }