mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	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();
 | |
|   }
 | |
| }
 |