diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2009-10-15 16:26:17 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2009-10-15 16:26:17 +0000 |
commit | 1adacceba9c9ee0f16e54388e56c9a249b296f75 (patch) | |
tree | fbc3e1401bc9623b861166be5940c750f5ca52da /lib/Debugger | |
parent | 5effb5c6a161c1bdbdd9585dfdc97a6105e3df66 (diff) | |
download | FreeBSD-src-1adacceba9c9ee0f16e54388e56c9a249b296f75.zip FreeBSD-src-1adacceba9c9ee0f16e54388e56c9a249b296f75.tar.gz |
Delete all stale files.
Diffstat (limited to 'lib/Debugger')
-rw-r--r-- | lib/Debugger/CMakeLists.txt | 10 | ||||
-rw-r--r-- | lib/Debugger/Debugger.cpp | 231 | ||||
-rw-r--r-- | lib/Debugger/Makefile | 16 | ||||
-rw-r--r-- | lib/Debugger/ProgramInfo.cpp | 375 | ||||
-rw-r--r-- | lib/Debugger/README.txt | 7 | ||||
-rw-r--r-- | lib/Debugger/RuntimeInfo.cpp | 69 | ||||
-rw-r--r-- | lib/Debugger/SourceFile.cpp | 82 | ||||
-rw-r--r-- | lib/Debugger/SourceLanguage-CFamily.cpp | 28 | ||||
-rw-r--r-- | lib/Debugger/SourceLanguage-CPlusPlus.cpp | 27 | ||||
-rw-r--r-- | lib/Debugger/SourceLanguage-Unknown.cpp | 138 | ||||
-rw-r--r-- | lib/Debugger/SourceLanguage.cpp | 54 |
11 files changed, 0 insertions, 1037 deletions
diff --git a/lib/Debugger/CMakeLists.txt b/lib/Debugger/CMakeLists.txt deleted file mode 100644 index d2508cf..0000000 --- a/lib/Debugger/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -add_llvm_library(LLVMDebugger - Debugger.cpp - ProgramInfo.cpp - RuntimeInfo.cpp - SourceFile.cpp - SourceLanguage-CFamily.cpp - SourceLanguage-CPlusPlus.cpp - SourceLanguage-Unknown.cpp - SourceLanguage.cpp - ) diff --git a/lib/Debugger/Debugger.cpp b/lib/Debugger/Debugger.cpp deleted file mode 100644 index 77fd2ac..0000000 --- a/lib/Debugger/Debugger.cpp +++ /dev/null @@ -1,231 +0,0 @@ -//===-- Debugger.cpp - LLVM debugger library implementation ---------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains the main implementation of the LLVM debugger library. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/Debugger.h" -#include "llvm/Module.h" -#include "llvm/ModuleProvider.h" -#include "llvm/Bitcode/ReaderWriter.h" -#include "llvm/Debugger/InferiorProcess.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/ADT/StringExtras.h" -#include <cstdlib> -#include <memory> -using namespace llvm; - -/// Debugger constructor - Initialize the debugger to its initial, empty, state. -/// -Debugger::Debugger() : Environment(0), Program(0), Process(0) { -} - -Debugger::~Debugger() { - // Killing the program could throw an exception. We don't want to progagate - // the exception out of our destructor though. - try { - killProgram(); - } catch (const char *) { - } catch (const std::string &) { - } - - unloadProgram(); -} - -/// getProgramPath - Get the path of the currently loaded program, or an -/// empty string if none is loaded. -std::string Debugger::getProgramPath() const { - return Program ? Program->getModuleIdentifier() : ""; -} - -static Module * -getMaterializedModuleProvider(const std::string &Filename, - LLVMContext& C) { - std::auto_ptr<MemoryBuffer> Buffer; - Buffer.reset(MemoryBuffer::getFileOrSTDIN(Filename.c_str())); - if (Buffer.get()) - return ParseBitcodeFile(Buffer.get(), C); - return 0; -} - -/// loadProgram - If a program is currently loaded, unload it. Then search -/// the PATH for the specified program, loading it when found. If the -/// specified program cannot be found, an exception is thrown to indicate the -/// error. -void Debugger::loadProgram(const std::string &Filename, LLVMContext& C) { - if ((Program = getMaterializedModuleProvider(Filename, C)) || - (Program = getMaterializedModuleProvider(Filename+".bc", C))) - return; // Successfully loaded the program. - - // Search the program path for the file... - if (const char *PathS = getenv("PATH")) { - std::string Path = PathS; - - std::string Directory = getToken(Path, ":"); - while (!Directory.empty()) { - if ((Program = getMaterializedModuleProvider(Directory +"/"+ Filename, C)) - || (Program = getMaterializedModuleProvider(Directory +"/"+ Filename - + ".bc", C))) - return; // Successfully loaded the program. - - Directory = getToken(Path, ":"); - } - } - - throw "Could not find program '" + Filename + "'!"; -} - -/// unloadProgram - If a program is running, kill it, then unload all traces -/// of the current program. If no program is loaded, this method silently -/// succeeds. -void Debugger::unloadProgram() { - if (!isProgramLoaded()) return; - killProgram(); - delete Program; - Program = 0; -} - - -/// createProgram - Create an instance of the currently loaded program, -/// killing off any existing one. This creates the program and stops it at -/// the first possible moment. If there is no program loaded or if there is a -/// problem starting the program, this method throws an exception. -void Debugger::createProgram() { - if (!isProgramLoaded()) - throw "Cannot start program: none is loaded."; - - // Kill any existing program. - killProgram(); - - // Add argv[0] to the arguments vector.. - std::vector<std::string> Args(ProgramArguments); - Args.insert(Args.begin(), getProgramPath()); - - // Start the new program... this could throw if the program cannot be started. - Process = InferiorProcess::create(Program, Args, Environment); -} - -InferiorProcess * -InferiorProcess::create(Module *M, const std::vector<std::string> &Arguments, - const char * const *envp) { - throw"No supported binding to inferior processes (debugger not implemented)."; -} - -/// killProgram - If the program is currently executing, kill off the -/// process and free up any state related to the currently running program. If -/// there is no program currently running, this just silently succeeds. -void Debugger::killProgram() { - // The destructor takes care of the dirty work. - try { - delete Process; - } catch (...) { - Process = 0; - throw; - } - Process = 0; -} - -/// stepProgram - Implement the 'step' command, continuing execution until -/// the next possible stop point. -void Debugger::stepProgram() { - assert(isProgramRunning() && "Cannot step if the program isn't running!"); - try { - Process->stepProgram(); - } catch (InferiorProcessDead &IPD) { - killProgram(); - throw NonErrorException("The program stopped with exit code " + - itostr(IPD.getExitCode())); - } catch (...) { - killProgram(); - throw; - } -} - -/// nextProgram - Implement the 'next' command, continuing execution until -/// the next possible stop point that is in the current function. -void Debugger::nextProgram() { - assert(isProgramRunning() && "Cannot next if the program isn't running!"); - try { - // This should step the process. If the process enters a function, then it - // should 'finish' it. However, figuring this out is tricky. In - // particular, the program can do any of: - // 0. Not change current frame. - // 1. Entering or exiting a region within the current function - // (which changes the frame ID, but which we shouldn't 'finish') - // 2. Exiting the current function (which changes the frame ID) - // 3. Entering a function (which should be 'finish'ed) - // For this reason, we have to be very careful about when we decide to do - // the 'finish'. - - // Get the current frame, but don't trust it. It could change... - void *CurrentFrame = Process->getPreviousFrame(0); - - // Don't trust the current frame: get the caller frame. - void *ParentFrame = Process->getPreviousFrame(CurrentFrame); - - // Ok, we have some information, run the program one step. - Process->stepProgram(); - - // Where is the new frame? The most common case, by far is that it has not - // been modified (Case #0), in which case we don't need to do anything more. - void *NewFrame = Process->getPreviousFrame(0); - if (NewFrame != CurrentFrame) { - // Ok, the frame changed. If we are case #1, then the parent frame will - // be identical. - void *NewParentFrame = Process->getPreviousFrame(NewFrame); - if (ParentFrame != NewParentFrame) { - // Ok, now we know we aren't case #0 or #1. Check to see if we entered - // a new function. If so, the parent frame will be "CurrentFrame". - if (CurrentFrame == NewParentFrame) - Process->finishProgram(NewFrame); - } - } - - } catch (InferiorProcessDead &IPD) { - killProgram(); - throw NonErrorException("The program stopped with exit code " + - itostr(IPD.getExitCode())); - } catch (...) { - killProgram(); - throw; - } -} - -/// finishProgram - Implement the 'finish' command, continuing execution -/// until the specified frame ID returns. -void Debugger::finishProgram(void *Frame) { - assert(isProgramRunning() && "Cannot cont if the program isn't running!"); - try { - Process->finishProgram(Frame); - } catch (InferiorProcessDead &IPD) { - killProgram(); - throw NonErrorException("The program stopped with exit code " + - itostr(IPD.getExitCode())); - } catch (...) { - killProgram(); - throw; - } -} - -/// contProgram - Implement the 'cont' command, continuing execution until -/// the next breakpoint is encountered. -void Debugger::contProgram() { - assert(isProgramRunning() && "Cannot cont if the program isn't running!"); - try { - Process->contProgram(); - } catch (InferiorProcessDead &IPD) { - killProgram(); - throw NonErrorException("The program stopped with exit code " + - itostr(IPD.getExitCode())); - } catch (...) { - killProgram(); - throw; - } -} diff --git a/lib/Debugger/Makefile b/lib/Debugger/Makefile deleted file mode 100644 index 8290e30..0000000 --- a/lib/Debugger/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -##===- lib/Debugger/Makefile -------------------------------*- Makefile -*-===## -# -# The LLVM Compiler Infrastructure -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -##===----------------------------------------------------------------------===## - -LEVEL = ../.. -LIBRARYNAME = LLVMDebugger -EXTRA_DIST = README.txt -REQUIRES_EH := 1 -BUILD_ARCHIVE = 1 - -include $(LEVEL)/Makefile.common diff --git a/lib/Debugger/ProgramInfo.cpp b/lib/Debugger/ProgramInfo.cpp deleted file mode 100644 index e58b3d5..0000000 --- a/lib/Debugger/ProgramInfo.cpp +++ /dev/null @@ -1,375 +0,0 @@ -//===-- ProgramInfo.cpp - Compute and cache info about a program ----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the ProgramInfo and related classes, by sorting through -// the loaded Module. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/ProgramInfo.h" -#include "llvm/Constants.h" -#include "llvm/Analysis/ValueTracking.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Intrinsics.h" -#include "llvm/IntrinsicInst.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" -#include "llvm/Debugger/SourceFile.h" -#include "llvm/Debugger/SourceLanguage.h" -#include "llvm/Support/SlowOperationInformer.h" -#include "llvm/Support/Streams.h" -#include "llvm/ADT/STLExtras.h" -using namespace llvm; - -/// getGlobalVariablesUsing - Return all of the global variables which have the -/// specified value in their initializer somewhere. -static void getGlobalVariablesUsing(Value *V, - std::vector<GlobalVariable*> &Found) { - for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { - if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I)) - Found.push_back(GV); - else if (Constant *C = dyn_cast<Constant>(*I)) - getGlobalVariablesUsing(C, Found); - } -} - -/// getNextStopPoint - Follow the def-use chains of the specified LLVM value, -/// traversing the use chains until we get to a stoppoint. When we do, return -/// the source location of the stoppoint. If we don't find a stoppoint, return -/// null. -static const GlobalVariable *getNextStopPoint(const Value *V, unsigned &LineNo, - unsigned &ColNo) { - // The use-def chains can fork. As such, we pick the lowest numbered one we - // find. - const GlobalVariable *LastDesc = 0; - unsigned LastLineNo = ~0; - unsigned LastColNo = ~0; - - for (Value::use_const_iterator UI = V->use_begin(), E = V->use_end(); - UI != E; ++UI) { - bool ShouldRecurse = true; - if (cast<Instruction>(*UI)->getOpcode() == Instruction::PHI) { - // Infinite loops == bad, ignore PHI nodes. - ShouldRecurse = false; - } else if (const CallInst *CI = dyn_cast<CallInst>(*UI)) { - - // If we found a stop point, check to see if it is earlier than what we - // already have. If so, remember it. - if (CI->getCalledFunction()) - if (const DbgStopPointInst *SPI = dyn_cast<DbgStopPointInst>(CI)) { - unsigned CurLineNo = SPI->getLine(); - unsigned CurColNo = SPI->getColumn(); - const GlobalVariable *CurDesc = 0; - const Value *Op = SPI->getContext(); - - if ((CurDesc = dyn_cast<GlobalVariable>(Op)) && - (LineNo < LastLineNo || - (LineNo == LastLineNo && ColNo < LastColNo))) { - LastDesc = CurDesc; - LastLineNo = CurLineNo; - LastColNo = CurColNo; - } - ShouldRecurse = false; - } - } - - // If this is not a phi node or a stopping point, recursively scan the users - // of this instruction to skip over region.begin's and the like. - if (ShouldRecurse) { - unsigned CurLineNo, CurColNo; - if (const GlobalVariable *GV = getNextStopPoint(*UI, CurLineNo,CurColNo)){ - if (LineNo < LastLineNo || (LineNo == LastLineNo && ColNo < LastColNo)){ - LastDesc = GV; - LastLineNo = CurLineNo; - LastColNo = CurColNo; - } - } - } - } - - if (LastDesc) { - LineNo = LastLineNo != ~0U ? LastLineNo : 0; - ColNo = LastColNo != ~0U ? LastColNo : 0; - } - return LastDesc; -} - - -//===----------------------------------------------------------------------===// -// SourceFileInfo implementation -// - -SourceFileInfo::SourceFileInfo(const GlobalVariable *Desc, - const SourceLanguage &Lang) - : Language(&Lang), Descriptor(Desc) { - Version = 0; - SourceText = 0; - - if (Desc && Desc->hasInitializer()) - if (ConstantStruct *CS = dyn_cast<ConstantStruct>(Desc->getInitializer())) - if (CS->getNumOperands() > 4) { - if (ConstantInt *CUI = dyn_cast<ConstantInt>(CS->getOperand(1))) - Version = CUI->getZExtValue(); - - if (!GetConstantStringInfo(CS->getOperand(3), BaseName)) - BaseName = ""; - if (!GetConstantStringInfo(CS->getOperand(4), Directory)) - Directory = ""; - } -} - -SourceFileInfo::~SourceFileInfo() { - delete SourceText; -} - -SourceFile &SourceFileInfo::getSourceText() const { - // FIXME: this should take into account the source search directories! - if (SourceText == 0) { // Read the file in if we haven't already. - sys::Path tmpPath; - if (!Directory.empty()) - tmpPath.set(Directory); - tmpPath.appendComponent(BaseName); - if (tmpPath.canRead()) - SourceText = new SourceFile(tmpPath.toString(), Descriptor); - else - SourceText = new SourceFile(BaseName, Descriptor); - } - return *SourceText; -} - - -//===----------------------------------------------------------------------===// -// SourceFunctionInfo implementation -// -SourceFunctionInfo::SourceFunctionInfo(ProgramInfo &PI, - const GlobalVariable *Desc) - : Descriptor(Desc) { - LineNo = ColNo = 0; - if (Desc && Desc->hasInitializer()) - if (ConstantStruct *CS = dyn_cast<ConstantStruct>(Desc->getInitializer())) - if (CS->getNumOperands() > 2) { - // Entry #1 is the file descriptor. - if (const GlobalVariable *GV = - dyn_cast<GlobalVariable>(CS->getOperand(1))) - SourceFile = &PI.getSourceFile(GV); - - // Entry #2 is the function name. - if (!GetConstantStringInfo(CS->getOperand(2), Name)) - Name = ""; - } -} - -/// getSourceLocation - This method returns the location of the first stopping -/// point in the function. -void SourceFunctionInfo::getSourceLocation(unsigned &RetLineNo, - unsigned &RetColNo) const { - // If we haven't computed this yet... - if (!LineNo) { - // Look at all of the users of the function descriptor, looking for calls to - // %llvm.dbg.func.start. - for (Value::use_const_iterator UI = Descriptor->use_begin(), - E = Descriptor->use_end(); UI != E; ++UI) - if (const CallInst *CI = dyn_cast<CallInst>(*UI)) - if (const Function *F = CI->getCalledFunction()) - if (F->getIntrinsicID() == Intrinsic::dbg_func_start) { - // We found the start of the function. Check to see if there are - // any stop points on the use-list of the function start. - const GlobalVariable *SD = getNextStopPoint(CI, LineNo, ColNo); - if (SD) { // We found the first stop point! - // This is just a sanity check. - if (getSourceFile().getDescriptor() != SD) - cout << "WARNING: first line of function is not in the" - << " file that the function descriptor claims it is in.\n"; - break; - } - } - } - RetLineNo = LineNo; RetColNo = ColNo; -} - -//===----------------------------------------------------------------------===// -// ProgramInfo implementation -// - -ProgramInfo::ProgramInfo(Module *m) : M(m), ProgramTimeStamp(0,0) { - assert(M && "Cannot create program information with a null module!"); - sys::PathWithStatus ModPath(M->getModuleIdentifier()); - const sys::FileStatus *Stat = ModPath.getFileStatus(); - if (Stat) - ProgramTimeStamp = Stat->getTimestamp(); - - SourceFilesIsComplete = false; - SourceFunctionsIsComplete = false; -} - -ProgramInfo::~ProgramInfo() { - // Delete cached information about source program objects... - for (std::map<const GlobalVariable*, SourceFileInfo*>::iterator - I = SourceFiles.begin(), E = SourceFiles.end(); I != E; ++I) - delete I->second; - for (std::map<const GlobalVariable*, SourceFunctionInfo*>::iterator - I = SourceFunctions.begin(), E = SourceFunctions.end(); I != E; ++I) - delete I->second; - - // Delete the source language caches. - for (unsigned i = 0, e = LanguageCaches.size(); i != e; ++i) - delete LanguageCaches[i].second; -} - - -//===----------------------------------------------------------------------===// -// SourceFileInfo tracking... -// - -/// getSourceFile - Return source file information for the specified source file -/// descriptor object, adding it to the collection as needed. This method -/// always succeeds (is unambiguous), and is always efficient. -/// -const SourceFileInfo & -ProgramInfo::getSourceFile(const GlobalVariable *Desc) { - SourceFileInfo *&Result = SourceFiles[Desc]; - if (Result) return *Result; - - // Figure out what language this source file comes from... - unsigned LangID = 0; // Zero is unknown language - if (Desc && Desc->hasInitializer()) - if (ConstantStruct *CS = dyn_cast<ConstantStruct>(Desc->getInitializer())) - if (CS->getNumOperands() > 2) - if (ConstantInt *CUI = dyn_cast<ConstantInt>(CS->getOperand(2))) - LangID = CUI->getZExtValue(); - - const SourceLanguage &Lang = SourceLanguage::get(LangID); - SourceFileInfo *New = Lang.createSourceFileInfo(Desc, *this); - - // FIXME: this should check to see if there is already a Filename/WorkingDir - // pair that matches this one. If so, we shouldn't create the duplicate! - // - SourceFileIndex.insert(std::make_pair(New->getBaseName(), New)); - return *(Result = New); -} - - -/// getSourceFiles - Index all of the source files in the program and return -/// a mapping of it. This information is lazily computed the first time -/// that it is requested. Since this information can take a long time to -/// compute, the user is given a chance to cancel it. If this occurs, an -/// exception is thrown. -const std::map<const GlobalVariable*, SourceFileInfo*> & -ProgramInfo::getSourceFiles(bool RequiresCompleteMap) { - // If we have a fully populated map, or if the client doesn't need one, just - // return what we have. - if (SourceFilesIsComplete || !RequiresCompleteMap) - return SourceFiles; - - // Ok, all of the source file descriptors (compile_unit in dwarf terms), - // should be on the use list of the llvm.dbg.translation_units global. - // - GlobalVariable *Units = - M->getGlobalVariable("llvm.dbg.translation_units", StructType::get()); - if (Units == 0) - throw "Program contains no debugging information!"; - - std::vector<GlobalVariable*> TranslationUnits; - getGlobalVariablesUsing(Units, TranslationUnits); - - SlowOperationInformer SOI("building source files index"); - - // Loop over all of the translation units found, building the SourceFiles - // mapping. - for (unsigned i = 0, e = TranslationUnits.size(); i != e; ++i) { - getSourceFile(TranslationUnits[i]); - if (SOI.progress(i+1, e)) - throw "While building source files index, operation cancelled."; - } - - // Ok, if we got this far, then we indexed the whole program. - SourceFilesIsComplete = true; - return SourceFiles; -} - -/// getSourceFile - Look up the file with the specified name. If there is -/// more than one match for the specified filename, prompt the user to pick -/// one. If there is no source file that matches the specified name, throw -/// an exception indicating that we can't find the file. Otherwise, return -/// the file information for that file. -const SourceFileInfo &ProgramInfo::getSourceFile(const std::string &Filename) { - std::multimap<std::string, SourceFileInfo*>::const_iterator Start, End; - getSourceFiles(); - tie(Start, End) = SourceFileIndex.equal_range(Filename); - - if (Start == End) throw "Could not find source file '" + Filename + "'!"; - const SourceFileInfo &SFI = *Start->second; - ++Start; - if (Start == End) return SFI; - - throw "FIXME: Multiple source files with the same name not implemented!"; -} - - -//===----------------------------------------------------------------------===// -// SourceFunctionInfo tracking... -// - - -/// getFunction - Return function information for the specified function -/// descriptor object, adding it to the collection as needed. This method -/// always succeeds (is unambiguous), and is always efficient. -/// -const SourceFunctionInfo & -ProgramInfo::getFunction(const GlobalVariable *Desc) { - SourceFunctionInfo *&Result = SourceFunctions[Desc]; - if (Result) return *Result; - - // Figure out what language this function comes from... - const GlobalVariable *SourceFileDesc = 0; - if (Desc && Desc->hasInitializer()) - if (ConstantStruct *CS = dyn_cast<ConstantStruct>(Desc->getInitializer())) - if (CS->getNumOperands() > 0) - if (const GlobalVariable *GV = - dyn_cast<GlobalVariable>(CS->getOperand(1))) - SourceFileDesc = GV; - - const SourceLanguage &Lang = getSourceFile(SourceFileDesc).getLanguage(); - return *(Result = Lang.createSourceFunctionInfo(Desc, *this)); -} - - -// getSourceFunctions - Index all of the functions in the program and return -// them. This information is lazily computed the first time that it is -// requested. Since this information can take a long time to compute, the user -// is given a chance to cancel it. If this occurs, an exception is thrown. -const std::map<const GlobalVariable*, SourceFunctionInfo*> & -ProgramInfo::getSourceFunctions(bool RequiresCompleteMap) { - if (SourceFunctionsIsComplete || !RequiresCompleteMap) - return SourceFunctions; - - // Ok, all of the source function descriptors (subprogram in dwarf terms), - // should be on the use list of the llvm.dbg.translation_units global. - // - GlobalVariable *Units = - M->getGlobalVariable("llvm.dbg.globals", StructType::get()); - if (Units == 0) - throw "Program contains no debugging information!"; - - std::vector<GlobalVariable*> Functions; - getGlobalVariablesUsing(Units, Functions); - - SlowOperationInformer SOI("building functions index"); - - // Loop over all of the functions found, building the SourceFunctions mapping. - for (unsigned i = 0, e = Functions.size(); i != e; ++i) { - getFunction(Functions[i]); - if (SOI.progress(i+1, e)) - throw "While functions index, operation cancelled."; - } - - // Ok, if we got this far, then we indexed the whole program. - SourceFunctionsIsComplete = true; - return SourceFunctions; -} diff --git a/lib/Debugger/README.txt b/lib/Debugger/README.txt deleted file mode 100644 index 89935c5..0000000 --- a/lib/Debugger/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -//===-- llvm/lib/Debugger/ - LLVM Debugger interfaces ---------------------===// - -This directory contains the implementation of the LLVM debugger backend. This -directory builds into a library which can be used by various debugger -front-ends to debug LLVM programs. The current command line LLVM debugger, -llvm-db is currently the only client of this library, but others could be -built, to provide a GUI front-end for example. diff --git a/lib/Debugger/RuntimeInfo.cpp b/lib/Debugger/RuntimeInfo.cpp deleted file mode 100644 index 2f0ff72..0000000 --- a/lib/Debugger/RuntimeInfo.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//===-- RuntimeInfo.cpp - Compute and cache info about running program ----===// -// -// The LLVM Compiler Infrastructure -// -// This file 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(); - } -} diff --git a/lib/Debugger/SourceFile.cpp b/lib/Debugger/SourceFile.cpp deleted file mode 100644 index 03c60f8..0000000 --- a/lib/Debugger/SourceFile.cpp +++ /dev/null @@ -1,82 +0,0 @@ -//===-- SourceFile.cpp - SourceFile implementation for the debugger -------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the SourceFile class for the LLVM debugger. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/SourceFile.h" -#include "llvm/Support/MemoryBuffer.h" -#include <cassert> -using namespace llvm; - -static const char EmptyFile = 0; - -SourceFile::SourceFile(const std::string &fn, const GlobalVariable *Desc) - : Filename(fn), Descriptor(Desc) { - File.reset(MemoryBuffer::getFileOrSTDIN(fn)); - - // On error, return an empty buffer. - if (File == 0) - File.reset(MemoryBuffer::getMemBuffer(&EmptyFile, &EmptyFile)); -} - -SourceFile::~SourceFile() { -} - - -/// calculateLineOffsets - Compute the LineOffset vector for the current file. -/// -void SourceFile::calculateLineOffsets() const { - assert(LineOffset.empty() && "Line offsets already computed!"); - const char *BufPtr = File->getBufferStart(); - const char *FileStart = BufPtr; - const char *FileEnd = File->getBufferEnd(); - do { - LineOffset.push_back(BufPtr-FileStart); - - // Scan until we get to a newline. - while (BufPtr != FileEnd && *BufPtr != '\n' && *BufPtr != '\r') - ++BufPtr; - - if (BufPtr != FileEnd) { - ++BufPtr; // Skip over the \n or \r - if (BufPtr[-1] == '\r' && BufPtr != FileEnd && BufPtr[0] == '\n') - ++BufPtr; // Skip over dos/windows style \r\n's - } - } while (BufPtr != FileEnd); -} - - -/// getSourceLine - Given a line number, return the start and end of the line -/// in the file. If the line number is invalid, or if the file could not be -/// loaded, null pointers are returned for the start and end of the file. Note -/// that line numbers start with 0, not 1. -void SourceFile::getSourceLine(unsigned LineNo, const char *&LineStart, - const char *&LineEnd) const { - LineStart = LineEnd = 0; - if (LineOffset.empty()) calculateLineOffsets(); - - // Asking for an out-of-range line number? - if (LineNo >= LineOffset.size()) return; - - // Otherwise, they are asking for a valid line, which we can fulfill. - LineStart = File->getBufferStart()+LineOffset[LineNo]; - - if (LineNo+1 < LineOffset.size()) - LineEnd = File->getBufferStart()+LineOffset[LineNo+1]; - else - LineEnd = File->getBufferEnd(); - - // If the line ended with a newline, strip it off. - while (LineEnd != LineStart && (LineEnd[-1] == '\n' || LineEnd[-1] == '\r')) - --LineEnd; - - assert(LineEnd >= LineStart && "We somehow got our pointers swizzled!"); -} diff --git a/lib/Debugger/SourceLanguage-CFamily.cpp b/lib/Debugger/SourceLanguage-CFamily.cpp deleted file mode 100644 index f329db4..0000000 --- a/lib/Debugger/SourceLanguage-CFamily.cpp +++ /dev/null @@ -1,28 +0,0 @@ -//===-- SourceLanguage-CFamily.cpp - C family SourceLanguage impl ---------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the SourceLanguage class for the C family of languages -// (K&R C, C89, C99, etc). -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/SourceLanguage.h" -using namespace llvm; - -#if 0 -namespace { - struct CSL : public SourceLanguage { - } TheCSourceLanguageInstance; -} -#endif - -const SourceLanguage &SourceLanguage::getCFamilyInstance() { - return get(0); // We don't have an implementation for C yet fall back on - // generic -} diff --git a/lib/Debugger/SourceLanguage-CPlusPlus.cpp b/lib/Debugger/SourceLanguage-CPlusPlus.cpp deleted file mode 100644 index ce94ff4..0000000 --- a/lib/Debugger/SourceLanguage-CPlusPlus.cpp +++ /dev/null @@ -1,27 +0,0 @@ -//===-- SourceLanguage-CPlusPlus.cpp - C++ SourceLanguage impl ------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the SourceLanguage class for the C++ language. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/SourceLanguage.h" -using namespace llvm; - -#if 0 -namespace { - struct CPPSL : public SourceLanguage { - } TheCPlusPlusLanguageInstance; -} -#endif - -const SourceLanguage &SourceLanguage::getCPlusPlusInstance() { - return get(0); // We don't have an implementation for C yet fall back on - // generic -} diff --git a/lib/Debugger/SourceLanguage-Unknown.cpp b/lib/Debugger/SourceLanguage-Unknown.cpp deleted file mode 100644 index b806fc7..0000000 --- a/lib/Debugger/SourceLanguage-Unknown.cpp +++ /dev/null @@ -1,138 +0,0 @@ -//===-- SourceLanguage-Unknown.cpp - Implement itf for unknown languages --===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// If the LLVM debugger does not have a module for a particular language, it -// falls back on using this one to perform the source-language interface. This -// interface is not wonderful, but it gets the job done. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/SourceLanguage.h" -#include "llvm/Debugger/ProgramInfo.h" -#include "llvm/Support/Streams.h" -#include <cassert> -#include <ostream> -using namespace llvm; - -//===----------------------------------------------------------------------===// -// Implement the SourceLanguage cache for the Unknown language. -// - -namespace { - /// SLUCache - This cache allows for efficient lookup of source functions by - /// name. - /// - struct SLUCache : public SourceLanguageCache { - ProgramInfo &PI; - std::multimap<std::string, SourceFunctionInfo*> FunctionMap; - public: - SLUCache(ProgramInfo &pi); - - typedef std::multimap<std::string, SourceFunctionInfo*>::const_iterator - fm_iterator; - - std::pair<fm_iterator, fm_iterator> - getFunction(const std::string &Name) const { - return FunctionMap.equal_range(Name); - } - - SourceFunctionInfo *addSourceFunction(SourceFunctionInfo *SF) { - FunctionMap.insert(std::make_pair(SF->getSymbolicName(), SF)); - return SF; - } - }; -} - -SLUCache::SLUCache(ProgramInfo &pi) : PI(pi) { -} - - -//===----------------------------------------------------------------------===// -// Implement SourceLanguageUnknown class, which is used to handle unrecognized -// languages. -// - -namespace { - static struct SLU : public SourceLanguage { - //===------------------------------------------------------------------===// - // Implement the miscellaneous methods... - // - virtual const char *getSourceLanguageName() const { - return "unknown"; - } - - /// lookupFunction - Given a textual function name, return the - /// SourceFunctionInfo descriptor for that function, or null if it cannot be - /// found. If the program is currently running, the RuntimeInfo object - /// provides information about the current evaluation context, otherwise it - /// will be null. - /// - virtual SourceFunctionInfo *lookupFunction(const std::string &FunctionName, - ProgramInfo &PI, - RuntimeInfo *RI = 0) const; - - //===------------------------------------------------------------------===// - // We do use a cache for information... - // - typedef SLUCache CacheType; - SLUCache *createSourceLanguageCache(ProgramInfo &PI) const { - return new SLUCache(PI); - } - - /// createSourceFunctionInfo - Create the new object and inform the cache of - /// the new function. - virtual SourceFunctionInfo * - createSourceFunctionInfo(const GlobalVariable *Desc, ProgramInfo &PI) const; - - } TheUnknownSourceLanguageInstance; -} - -const SourceLanguage &SourceLanguage::getUnknownLanguageInstance() { - return TheUnknownSourceLanguageInstance; -} - - -SourceFunctionInfo * -SLU::createSourceFunctionInfo(const GlobalVariable *Desc, - ProgramInfo &PI) const { - SourceFunctionInfo *Result = new SourceFunctionInfo(PI, Desc); - return PI.getLanguageCache(this).addSourceFunction(Result); -} - - -/// lookupFunction - Given a textual function name, return the -/// SourceFunctionInfo descriptor for that function, or null if it cannot be -/// found. If the program is currently running, the RuntimeInfo object -/// provides information about the current evaluation context, otherwise it will -/// be null. -/// -SourceFunctionInfo *SLU::lookupFunction(const std::string &FunctionName, - ProgramInfo &PI, RuntimeInfo *RI) const{ - SLUCache &Cache = PI.getLanguageCache(this); - std::pair<SLUCache::fm_iterator, SLUCache::fm_iterator> IP - = Cache.getFunction(FunctionName); - - if (IP.first == IP.second) { - if (PI.allSourceFunctionsRead()) - return 0; // Nothing found - - // Otherwise, we might be able to find the function if we read all of them - // in. Do so now. - PI.getSourceFunctions(); - assert(PI.allSourceFunctionsRead() && "Didn't read in all functions?"); - return lookupFunction(FunctionName, PI, RI); - } - - SourceFunctionInfo *Found = IP.first->second; - ++IP.first; - if (IP.first != IP.second) - cout << "Whoa, found multiple functions with the same name. I should" - << " ask the user which one to use: FIXME!\n"; - return Found; -} diff --git a/lib/Debugger/SourceLanguage.cpp b/lib/Debugger/SourceLanguage.cpp deleted file mode 100644 index 4fcc38b..0000000 --- a/lib/Debugger/SourceLanguage.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//===-- SourceLanguage.cpp - Implement the SourceLanguage class -----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the SourceLanguage class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Debugger/SourceLanguage.h" -#include "llvm/Debugger/ProgramInfo.h" -using namespace llvm; - -const SourceLanguage &SourceLanguage::get(unsigned ID) { - switch (ID) { - case 1: // DW_LANG_C89 - case 2: // DW_LANG_C - case 12: // DW_LANG_C99 - return getCFamilyInstance(); - - case 4: // DW_LANG_C_plus_plus - return getCPlusPlusInstance(); - - case 3: // DW_LANG_Ada83 - case 5: // DW_LANG_Cobol74 - case 6: // DW_LANG_Cobol85 - case 7: // DW_LANG_Fortran77 - case 8: // DW_LANG_Fortran90 - case 9: // DW_LANG_Pascal83 - case 10: // DW_LANG_Modula2 - case 11: // DW_LANG_Java - case 13: // DW_LANG_Ada95 - case 14: // DW_LANG_Fortran95 - default: - return getUnknownLanguageInstance(); - } -} - - -SourceFileInfo * -SourceLanguage::createSourceFileInfo(const GlobalVariable *Desc, - ProgramInfo &PI) const { - return new SourceFileInfo(Desc, *this); -} - -SourceFunctionInfo * -SourceLanguage::createSourceFunctionInfo(const GlobalVariable *Desc, - ProgramInfo &PI) const { - return new SourceFunctionInfo(PI, Desc); -} |