//===- llvm-db.cpp - LLVM Debugger ----------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This utility implements a simple text-mode front-end to the LLVM debugger // library. // //===----------------------------------------------------------------------===// #include "CLIDebugger.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/System/Signals.h" #include using namespace llvm; namespace { // Command line options for specifying the program to debug and options to use cl::opt InputFile(cl::desc(""), cl::Positional, cl::init("")); cl::list InputArgs("args", cl::Positional, cl::desc(""), cl::ZeroOrMore); // Command line options to control various directory related stuff cl::list SourceDirectories("directory", cl::value_desc("directory"), cl::desc("Add directory to the search for source files")); cl::alias SDA("d", cl::desc("Alias for --directory"), cl::aliasopt(SourceDirectories)); cl::opt WorkingDirectory("cd", cl::desc("Use directory as current working directory"), cl::value_desc("directory")); // Command line options specific to the llvm-db debugger driver cl::opt Quiet("quiet", cl::desc("Do not print introductory messages")); cl::alias QA1("silent", cl::desc("Alias for -quiet"), cl::aliasopt(Quiet)); cl::alias QA2("q", cl::desc("Alias for -quiet"), cl::aliasopt(Quiet)); } //===----------------------------------------------------------------------===// // main Driver function // int main(int argc, char **argv, char * const *envp) { llvm_shutdown_obj X; // Call llvm_shutdown() on exit. std::cout << "NOTE: llvm-db is known useless right now.\n"; try { cl::ParseCommandLineOptions(argc, argv, "llvm source-level debugger\n"); sys::PrintStackTraceOnErrorSignal(); if (!Quiet) std::cout << "llvm-db: The LLVM source-level debugger\n"; // Merge Inputfile and InputArgs into the InputArgs list... if (!InputFile.empty() && InputArgs.empty()) InputArgs.push_back(InputFile); // Create the CLI debugger... CLIDebugger D; // Initialize the debugger with the command line options we read... Debugger &Dbg = D.getDebugger(); // Initialize the debugger environment. Dbg.initializeEnvironment(envp); Dbg.setWorkingDirectory(WorkingDirectory); for (unsigned i = 0, e = SourceDirectories.size(); i != e; ++i) D.addSourceDirectory(SourceDirectories[i]); if (!InputArgs.empty()) { try { D.fileCommand(InputArgs[0]); } catch (const std::string &Error) { std::cout << "Error: " << Error << "\n"; } Dbg.setProgramArguments(InputArgs.begin()+1, InputArgs.end()); } // Now that we have initialized the debugger, run it. return D.run(); } catch (const std::string& msg) { std::cerr << argv[0] << ": " << msg << "\n"; } catch (...) { std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n"; } return 1; }