//===-- 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(); } }