summaryrefslogtreecommitdiff
path: root/tools/lldb-test/lldb-test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-test/lldb-test.cpp')
-rw-r--r--tools/lldb-test/lldb-test.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/tools/lldb-test/lldb-test.cpp b/tools/lldb-test/lldb-test.cpp
new file mode 100644
index 0000000000000..1fe2f5b638594
--- /dev/null
+++ b/tools/lldb-test/lldb-test.cpp
@@ -0,0 +1,126 @@
+//===- lldb-test.cpp ------------------------------------------ *- C++ --*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "FormatUtil.h"
+#include "SystemInitializerTest.h"
+
+#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
+#include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/Section.h"
+#include "lldb/Initialization/SystemLifetimeManager.h"
+#include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/ClangASTImporter.h"
+#include "lldb/Utility/DataExtractor.h"
+#include "lldb/Utility/StreamString.h"
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/PrettyStackTrace.h"
+#include "llvm/Support/Signals.h"
+#include <thread>
+
+using namespace lldb;
+using namespace lldb_private;
+using namespace llvm;
+
+namespace opts {
+cl::SubCommand ModuleSubcommand("module-sections",
+ "Display LLDB Module Information");
+cl::SubCommand SymbolsSubcommand("symbols", "Dump symbols for an object file");
+
+namespace module {
+cl::opt<bool> SectionContents("contents",
+ cl::desc("Dump each section's contents"),
+ cl::sub(ModuleSubcommand));
+cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input files>"),
+ cl::OneOrMore, cl::sub(ModuleSubcommand));
+} // namespace module
+
+namespace symbols {
+cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input files>"),
+ cl::OneOrMore, cl::sub(SymbolsSubcommand));
+}
+} // namespace opts
+
+static llvm::ManagedStatic<SystemLifetimeManager> DebuggerLifetime;
+
+static void dumpSymbols(Debugger &Dbg) {
+ for (const auto &File : opts::symbols::InputFilenames) {
+ ModuleSpec Spec{FileSpec(File, false)};
+ Spec.GetSymbolFileSpec().SetFile(File, false);
+
+ auto ModulePtr = std::make_shared<lldb_private::Module>(Spec);
+
+ StreamString Stream;
+ ModulePtr->ParseAllDebugSymbols();
+ ModulePtr->Dump(&Stream);
+ llvm::outs() << Stream.GetData() << "\n";
+ llvm::outs().flush();
+ }
+}
+
+static void dumpModules(Debugger &Dbg) {
+ LinePrinter Printer(4, llvm::outs());
+
+ for (const auto &File : opts::module::InputFilenames) {
+ ModuleSpec Spec{FileSpec(File, false)};
+ Spec.GetSymbolFileSpec().SetFile(File, false);
+
+ auto ModulePtr = std::make_shared<lldb_private::Module>(Spec);
+ SectionList *Sections = ModulePtr->GetSectionList();
+ if (!Sections) {
+ llvm::errs() << "Could not load sections for module " << File << "\n";
+ continue;
+ }
+
+ size_t Count = Sections->GetNumSections(0);
+ Printer.formatLine("Showing {0} sections", Count);
+ for (size_t I = 0; I < Count; ++I) {
+ AutoIndent Indent(Printer, 2);
+ auto S = Sections->GetSectionAtIndex(I);
+ assert(S);
+ Printer.formatLine("Index: {0}", I);
+ Printer.formatLine("Name: {0}", S->GetName().GetStringRef());
+ Printer.formatLine("VM size: {0}", S->GetByteSize());
+ Printer.formatLine("File size: {0}", S->GetFileSize());
+
+ if (opts::module::SectionContents) {
+ DataExtractor Data;
+ S->GetSectionData(Data);
+ ArrayRef<uint8_t> Bytes = {Data.GetDataStart(), Data.GetDataEnd()};
+ Printer.formatBinary("Data: ", Bytes, 0);
+ }
+ Printer.NewLine();
+ }
+ }
+}
+
+int main(int argc, const char *argv[]) {
+ StringRef ToolName = argv[0];
+ sys::PrintStackTraceOnErrorSignal(ToolName);
+ PrettyStackTraceProgram X(argc, argv);
+ llvm_shutdown_obj Y;
+
+ cl::ParseCommandLineOptions(argc, argv, "LLDB Testing Utility\n");
+
+ DebuggerLifetime->Initialize(llvm::make_unique<SystemInitializerTest>(),
+ nullptr);
+
+ auto Dbg = lldb_private::Debugger::CreateInstance();
+
+ if (opts::ModuleSubcommand)
+ dumpModules(*Dbg);
+ else if (opts::SymbolsSubcommand)
+ dumpSymbols(*Dbg);
+
+ DebuggerLifetime->Terminate();
+ return 0;
+}