forked from OSchip/llvm-project
60 lines
1.7 KiB
C++
60 lines
1.7 KiB
C++
//===- 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;
|
|
}
|