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