blob: 851533e12e1a8b986819f5cd39bd64ec57a59ced [file] [log] [blame]
Chris Lattner7af5c122004-01-05 05:27:31 +00001//===- llvm-db.cpp - LLVM Debugger ----------------------------------------===//
Misha Brukman3da94ae2005-04-22 00:00:37 +00002//
Chris Lattner7af5c122004-01-05 05:27:31 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner21c62da2007-12-29 20:44:31 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman3da94ae2005-04-22 00:00:37 +00007//
Chris Lattner7af5c122004-01-05 05:27:31 +00008//===----------------------------------------------------------------------===//
9//
10// This utility implements a simple text-mode front-end to the LLVM debugger
11// library.
12//
13//===----------------------------------------------------------------------===//
14
15#include "CLIDebugger.h"
Owen Anderson8b477ed2009-07-01 16:58:40 +000016#include "llvm/LLVMContext.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000017#include "llvm/Support/CommandLine.h"
Chris Lattnerc30598b2006-12-06 01:18:01 +000018#include "llvm/Support/ManagedStatic.h"
Chris Lattnercc14d252009-03-06 05:34:10 +000019#include "llvm/Support/PrettyStackTrace.h"
Chris Lattnerbed85ff2004-05-27 05:41:36 +000020#include "llvm/System/Signals.h"
Chris Lattner7af5c122004-01-05 05:27:31 +000021#include <iostream>
Chris Lattner7af5c122004-01-05 05:27:31 +000022using namespace llvm;
23
24namespace {
25 // Command line options for specifying the program to debug and options to use
26 cl::opt<std::string>
27 InputFile(cl::desc("<program>"), cl::Positional, cl::init(""));
28
29 cl::list<std::string>
30 InputArgs("args", cl::Positional, cl::desc("<program and arguments>"),
31 cl::ZeroOrMore);
32
33 // Command line options to control various directory related stuff
34 cl::list<std::string>
35 SourceDirectories("directory", cl::value_desc("directory"),
36 cl::desc("Add directory to the search for source files"));
37 cl::alias SDA("d", cl::desc("Alias for --directory"),
38 cl::aliasopt(SourceDirectories));
Misha Brukman3da94ae2005-04-22 00:00:37 +000039
Chris Lattner7af5c122004-01-05 05:27:31 +000040 cl::opt<std::string>
41 WorkingDirectory("cd", cl::desc("Use directory as current working directory"),
42 cl::value_desc("directory"));
43
44 // Command line options specific to the llvm-db debugger driver
Chris Lattner7af5c122004-01-05 05:27:31 +000045 cl::opt<bool> Quiet("quiet", cl::desc("Do not print introductory messages"));
46 cl::alias QA1("silent", cl::desc("Alias for -quiet"), cl::aliasopt(Quiet));
47 cl::alias QA2("q", cl::desc("Alias for -quiet"), cl::aliasopt(Quiet));
48}
49
50//===----------------------------------------------------------------------===//
51// main Driver function
52//
53int main(int argc, char **argv, char * const *envp) {
Chris Lattnercc14d252009-03-06 05:34:10 +000054 // Print a stack trace if we signal out.
55 sys::PrintStackTraceOnErrorSignal();
56 PrettyStackTraceProgram X(argc, argv);
57
Owen Anderson8b477ed2009-07-01 16:58:40 +000058 LLVMContext Context;
Chris Lattnercc14d252009-03-06 05:34:10 +000059 llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
Chris Lattner6a58e0e2006-04-18 05:26:10 +000060 std::cout << "NOTE: llvm-db is known useless right now.\n";
Reid Spencer1ef8bda2004-12-30 05:36:08 +000061 try {
62 cl::ParseCommandLineOptions(argc, argv,
Dan Gohman82a13c92007-10-08 15:45:12 +000063 "llvm source-level debugger\n");
Chris Lattner7af5c122004-01-05 05:27:31 +000064
Reid Spencer1ef8bda2004-12-30 05:36:08 +000065 if (!Quiet)
66 std::cout << "llvm-db: The LLVM source-level debugger\n";
Chris Lattner7af5c122004-01-05 05:27:31 +000067
Reid Spencer1ef8bda2004-12-30 05:36:08 +000068 // Merge Inputfile and InputArgs into the InputArgs list...
69 if (!InputFile.empty() && InputArgs.empty())
70 InputArgs.push_back(InputFile);
Chris Lattner7af5c122004-01-05 05:27:31 +000071
Reid Spencer1ef8bda2004-12-30 05:36:08 +000072 // Create the CLI debugger...
Owen Anderson31895e72009-07-01 21:22:36 +000073 CLIDebugger D(Context);
Chris Lattner7af5c122004-01-05 05:27:31 +000074
Reid Spencer1ef8bda2004-12-30 05:36:08 +000075 // Initialize the debugger with the command line options we read...
76 Debugger &Dbg = D.getDebugger();
Chris Lattner7af5c122004-01-05 05:27:31 +000077
Reid Spencer1ef8bda2004-12-30 05:36:08 +000078 // Initialize the debugger environment.
79 Dbg.initializeEnvironment(envp);
80 Dbg.setWorkingDirectory(WorkingDirectory);
81 for (unsigned i = 0, e = SourceDirectories.size(); i != e; ++i)
82 D.addSourceDirectory(SourceDirectories[i]);
Misha Brukman3da94ae2005-04-22 00:00:37 +000083
Reid Spencer1ef8bda2004-12-30 05:36:08 +000084 if (!InputArgs.empty()) {
85 try {
86 D.fileCommand(InputArgs[0]);
87 } catch (const std::string &Error) {
88 std::cout << "Error: " << Error << "\n";
89 }
90
91 Dbg.setProgramArguments(InputArgs.begin()+1, InputArgs.end());
Chris Lattner7af5c122004-01-05 05:27:31 +000092 }
93
Reid Spencer1ef8bda2004-12-30 05:36:08 +000094 // Now that we have initialized the debugger, run it.
95 return D.run();
96 } catch (const std::string& msg) {
Dan Gohman65f57c22009-07-15 16:35:29 +000097 errs() << argv[0] << ": " << msg << "\n";
Reid Spencer1ef8bda2004-12-30 05:36:08 +000098 } catch (...) {
Dan Gohman65f57c22009-07-15 16:35:29 +000099 errs() << argv[0] << ": Unexpected unknown exception occurred.\n";
Chris Lattner7af5c122004-01-05 05:27:31 +0000100 }
Reid Spencer1ef8bda2004-12-30 05:36:08 +0000101 return 1;
Chris Lattner7af5c122004-01-05 05:27:31 +0000102}