mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 06:06:19 +00:00
2eacf26aa6
by any stretch of the imagination, but it is pretty cool and works :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10685 91177308-0d34-0410-b5e6-96231b3b80d8
70 lines
2.4 KiB
C++
70 lines
2.4 KiB
C++
//===-- RuntimeInfo.cpp - Compute and cache info about running program ----===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the RuntimeInfo and related classes, by querying and
|
|
// cachine information from the running inferior process.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Debugger/InferiorProcess.h"
|
|
#include "llvm/Debugger/ProgramInfo.h"
|
|
#include "llvm/Debugger/RuntimeInfo.h"
|
|
using namespace llvm;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// StackFrame class implementation
|
|
|
|
StackFrame::StackFrame(RuntimeInfo &ri, void *ParentFrameID)
|
|
: RI(ri), SourceInfo(0) {
|
|
FrameID = RI.getInferiorProcess().getPreviousFrame(ParentFrameID);
|
|
if (FrameID == 0) throw "Stack frame does not exist!";
|
|
|
|
// Compute lazily as needed.
|
|
FunctionDesc = 0;
|
|
}
|
|
|
|
const GlobalVariable *StackFrame::getFunctionDesc() {
|
|
if (FunctionDesc == 0)
|
|
FunctionDesc = RI.getInferiorProcess().getSubprogramDesc(FrameID);
|
|
return FunctionDesc;
|
|
}
|
|
|
|
/// getSourceLocation - Return the source location that this stack frame is
|
|
/// sitting at.
|
|
void StackFrame::getSourceLocation(unsigned &lineNo, unsigned &colNo,
|
|
const SourceFileInfo *&sourceInfo) {
|
|
if (SourceInfo == 0) {
|
|
const GlobalVariable *SourceDesc = 0;
|
|
RI.getInferiorProcess().getFrameLocation(FrameID, LineNo,ColNo, SourceDesc);
|
|
SourceInfo = &RI.getProgramInfo().getSourceFile(SourceDesc);
|
|
}
|
|
|
|
lineNo = LineNo;
|
|
colNo = ColNo;
|
|
sourceInfo = SourceInfo;
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// RuntimeInfo class implementation
|
|
|
|
/// materializeFrame - Create and process all frames up to and including the
|
|
/// specified frame number. This throws an exception if the specified frame
|
|
/// ID is nonexistant.
|
|
void RuntimeInfo::materializeFrame(unsigned ID) {
|
|
assert(ID >= CallStack.size() && "no need to materialize this frame!");
|
|
void *CurFrame = 0;
|
|
if (!CallStack.empty())
|
|
CurFrame = CallStack.back().getFrameID();
|
|
|
|
while (CallStack.size() <= ID) {
|
|
CallStack.push_back(StackFrame(*this, CurFrame));
|
|
CurFrame = CallStack.back().getFrameID();
|
|
}
|
|
}
|