From 1767a73bc8882e8457ff985229c5aee669a5d7b4 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Thu, 13 Jun 2013 21:27:14 +0000 Subject: [PATCH] Added a new makefile setting that can be set in LLDB makefiles: USE_LIBCPP. This will enable libc++ support. Improved the makefile "clean" to include deleting all ".d.[0-9]+" files. Added options to the "lldb/examples/lookup" example and made it build using the LLDB_BUILD_DIR. If this is not set, it will default to "/Applications/Xcode.app/Contents/SharedFrameworks" on Darwin. Added options to the "lldb/examples/function" example and made it build using the LLDB_BUILD_DIR. llvm-svn: 183949 --- lldb/examples/functions/Makefile | 10 +- lldb/examples/functions/main.cpp | 13 +++ lldb/examples/lookup/Makefile | 8 +- lldb/examples/lookup/main.cpp | 186 +++++++++++++++++++++++++------ lldb/test/make/Makefile.rules | 13 ++- 5 files changed, 186 insertions(+), 44 deletions(-) diff --git a/lldb/examples/functions/Makefile b/lldb/examples/functions/Makefile index 13d83dfdc5cf..64ea6e75b332 100644 --- a/lldb/examples/functions/Makefile +++ b/lldb/examples/functions/Makefile @@ -2,11 +2,15 @@ LEVEL = ../../test/make CXX_SOURCES := main.cpp +EXE := lldb-functions +USE_LIBCPP := 1 + MY_OS = $(shell uname -s) -CXXFLAGS += -std=gnu++11 -stdlib=libc++ + ifeq "$(MY_OS)" "Darwin" - LD_EXTRAS ?= -framework LLDB -Wl,-rpath,/Applications/Xcode.app/Contents/SharedFrameworks - FRAMEWORK_INCLUDES=-F/Applications/Xcode.app/Contents/SharedFrameworks + LLDB_BUILD_DIR ?= /Applications/Xcode.app/Contents/SharedFrameworks + LD_EXTRAS ?= -framework LLDB -Wl,-rpath,"$(LLDB_BUILD_DIR)" + FRAMEWORK_INCLUDES=-F"$(LLDB_BUILD_DIR)" else LD_EXTRAS ?= $(LLDB_BUILD_DIR)/_lldb.so endif diff --git a/lldb/examples/functions/main.cpp b/lldb/examples/functions/main.cpp index fd599832c727..3f27b3993acb 100644 --- a/lldb/examples/functions/main.cpp +++ b/lldb/examples/functions/main.cpp @@ -10,7 +10,20 @@ #include #include +#if defined(__APPLE__) #include +#else +#include "LLDB/SBBlock.h" +#include "LLDB/SBCompileUnit.h" +#include "LLDB/SBDebugger.h" +#include "LLDB/SBFunction.h" +#include "LLDB/SBModule.h" +#include "LLDB/SBStream.h" +#include "LLDB/SBSymbol.h" +#include "LLDB/SBTarget.h" +#include "LLDB/SBThread.h" +#include "LLDB/SBProcess.h" +#endif using namespace lldb; diff --git a/lldb/examples/lookup/Makefile b/lldb/examples/lookup/Makefile index f23a84446c8d..f4429b6e4d92 100644 --- a/lldb/examples/lookup/Makefile +++ b/lldb/examples/lookup/Makefile @@ -1,11 +1,15 @@ LEVEL = ../../test/make CXX_SOURCES := main.cpp +EXE := lldb-lookup +USE_LIBCPP := 1 MY_OS = $(shell uname -s) + ifeq "$(MY_OS)" "Darwin" - LD_EXTRAS ?= -framework LLDB - FRAMEWORK_INCLUDES=-F/Volumes/data/lldb/svn/trunk/build/Debug + LLDB_BUILD_DIR ?= /Applications/Xcode.app/Contents/SharedFrameworks + LD_EXTRAS ?= -framework LLDB -Wl,-rpath,"$(LLDB_BUILD_DIR)" + FRAMEWORK_INCLUDES=-F"$(LLDB_BUILD_DIR)" else LD_EXTRAS ?= $(LLDB_BUILD_DIR)/_lldb.so endif diff --git a/lldb/examples/lookup/main.cpp b/lldb/examples/lookup/main.cpp index 10c16407bb40..fabb5cb2a71e 100644 --- a/lldb/examples/lookup/main.cpp +++ b/lldb/examples/lookup/main.cpp @@ -7,18 +7,27 @@ // //===----------------------------------------------------------------------===// +#include #include #include +#if defined(__APPLE__) +#include +#else #include "LLDB/SBBlock.h" #include "LLDB/SBCompileUnit.h" #include "LLDB/SBDebugger.h" #include "LLDB/SBFunction.h" #include "LLDB/SBModule.h" +#include "LLDB/SBStream.h" #include "LLDB/SBSymbol.h" #include "LLDB/SBTarget.h" #include "LLDB/SBThread.h" #include "LLDB/SBProcess.h" +#endif + +#include +#include using namespace lldb; @@ -50,38 +59,154 @@ public: SBDebugger::Terminate(); } }; + +static struct option g_long_options[] = +{ + { "help", no_argument, NULL, 'h' }, + { "verbose", no_argument, NULL, 'v' }, + { "arch", required_argument, NULL, 'a' }, + { "platform", required_argument, NULL, 'p' }, + { NULL, 0, NULL, 0 } +}; + +#define PROGRAM_NAME "lldb-lookup" +void +usage () +{ + puts ( + "NAME\n" + " " PROGRAM_NAME " -- symbolicate addresses using lldb.\n" + "\n" + "SYNOPSIS\n" + " " PROGRAM_NAME " [[--arch=] [--platform=] [--verbose] [--help] --]
[
....]\n" + "\n" + "DESCRIPTION\n" + " Loads the executable pointed to by and looks up and
\n" + " arguments\n" + "\n" + "EXAMPLE\n" + " " PROGRAM_NAME " --arch=x86_64 -- /usr/lib/dyld 0x100000000\n" + ); + exit(0); +} int main (int argc, char const *argv[]) { // Use a sentry object to properly initialize/terminate LLDB. LLDBSentry sentry; - - if (argc < 3) - exit (1); - // The first argument is the file path we want to look something up in - const char *exe_file_path = argv[1]; - // The second argument in the address that we want to lookup - lldb::addr_t file_addr = strtoull (argv[2], NULL, 0); - - // Create a debugger instance so we can create a target SBDebugger debugger (SBDebugger::Create()); - if (debugger.IsValid()) + // Create a debugger instance so we can create a target + if (!debugger.IsValid()) + fprintf (stderr, "error: failed to create a debugger object\n"); + + bool show_usage = false; + bool verbose = false; + const char *arch = NULL; + const char *platform = NULL; + std::string short_options("h?"); + for (const struct option *opt = g_long_options; opt->name; ++opt) { + if (isprint(opt->val)) + { + short_options.append(1, (char)opt->val); + switch (opt->has_arg) + { + case no_argument: + break; + case required_argument: + short_options.append(1, ':'); + break; + case optional_argument: + short_options.append(2, ':'); + break; + } + } + } +#ifdef __GLIBC__ + optind = 0; +#else + optreset = 1; + optind = 1; +#endif + char ch; + while ((ch = getopt_long_only(argc, (char * const *)argv, short_options.c_str(), g_long_options, 0)) != -1) + { + switch (ch) + { + case 0: + break; + + case 'a': + if (arch != NULL) + { + fprintf (stderr, "error: the --arch option can only be specified once\n"); + exit(1); + } + arch = optarg; + break; + + case 'p': + platform = optarg; + break; + + case 'v': + verbose = true; + break; + + case 'h': + case '?': + default: + show_usage = true; + break; + } + } + argc -= optind; + argv += optind; + + if (show_usage || argc < 2) + usage(); + + int arg_idx = 0; + // The first argument is the file path we want to look something up in + const char *exe_file_path = argv[arg_idx]; + const char *addr_cstr; + const bool add_dependent_libs = false; + SBError error; + SBStream strm; + strm.RedirectToFileHandle (stdout, false); + + while ((addr_cstr = argv[++arg_idx]) != NULL) + { + // The second argument in the address that we want to lookup + lldb::addr_t file_addr = strtoull (addr_cstr, NULL, 0); + // Create a target using the executable. - SBTarget target (debugger.CreateTargetWithFileAndArch (exe_file_path, "i386")); + SBTarget target = debugger.CreateTarget (exe_file_path, + arch, + platform, + add_dependent_libs, + error); + if (!error.Success()) + { + fprintf (stderr, "error: %s\n", error.GetCString()); + exit(1); + } + + printf ("%sLooking up 0x%llx in '%s':\n", (arg_idx > 1) ? "\n" : "", file_addr, exe_file_path); + if (target.IsValid()) { // Find the executable module so we can do a lookup inside it SBFileSpec exe_file_spec (exe_file_path, true); SBModule module (target.FindModule (exe_file_spec)); - + // Take a file virtual address and resolve it to a section offset // address that can be used to do a symbol lookup by address SBAddress addr = module.ResolveFileAddress (file_addr); - if (addr.IsValid()) - + bool success = addr.IsValid() && addr.GetSection().IsValid(); + if (success) { // We can resolve a section offset address in the module // and only ask for what we need. You can logical or together @@ -91,28 +216,17 @@ main (int argc, char const *argv[]) // // NOTE: the less you ask for, the less LLDB will parse as // LLDB does partial parsing on just about everything. - SBSymbolContext symbol_context (module.ResolveSymbolContextForAddress (addr, eSymbolContextEverything)); - - SBCompileUnit comp_unit (symbol_context.GetCompileUnit()); - if (comp_unit.IsValid()) - { - } - SBFunction function (symbol_context.GetFunction()); - if (function.IsValid()) - { - } - SBBlock block (symbol_context.GetBlock()); - if (block.IsValid()) - { - } - SBLineEntry line_entry (symbol_context.GetLineEntry()); - if (line_entry.IsValid()) - { - } - SBSymbol symbol (symbol_context.GetSymbol()); - if (symbol.IsValid()) - { - } + SBSymbolContext sc (module.ResolveSymbolContextForAddress (addr, eSymbolContextEverything)); + + strm.Printf (" Address: %s + 0x%llx\n Summary: ", addr.GetSection().GetName (), addr.GetOffset()); + addr.GetDescription (strm); + strm.Printf ("\n"); + if (verbose) + sc.GetDescription (strm); + } + else + { + printf ("error: 0x%llx does not resolve to a valid file address in '%s'\n", file_addr, exe_file_path); } } } diff --git a/lldb/test/make/Makefile.rules b/lldb/test/make/Makefile.rules index 7cd53f5f4cc3..db7c393887c0 100644 --- a/lldb/test/make/Makefile.rules +++ b/lldb/test/make/Makefile.rules @@ -117,12 +117,19 @@ cxx_linker = $(if $(findstring clang,$(1)), $(subst clang,clang++,$(1)), $(if $( ifeq (1,$(USE_LIBSTDCPP)) # Clang requires an extra flag: -stdlib=libstdc++ ifneq (,$(findstring clang,$(CC))) - CFLAGS += -stdlib=libstdc++ CXXFLAGS += -stdlib=libstdc++ LDFLAGS += -stdlib=libstdc++ endif endif +ifeq (1,$(USE_LIBCPP)) + # Clang requires an extra flag: -stdlib=libstdc++ + ifneq (,$(findstring clang,$(CC))) + CXXFLAGS += -stdlib=libc++ + LDFLAGS += -stdlib=libc++ + endif +endif + #---------------------------------------------------------------------- # dylib settings #---------------------------------------------------------------------- @@ -333,9 +340,9 @@ dsym: $(DSYM) all: $(EXE) $(DSYM) clean:: ifeq "$(DYLIB_NAME)" "" - rm -rf "$(EXE)" "$(DSYM)" $(OBJECTS) $(PREREQS) $(ARCHIVE_NAME) $(ARCHIVE_OBJECTS) + rm -rf "$(EXE)" "$(DSYM)" $(OBJECTS) $(PREREQS) $(ARCHIVE_NAME) $(ARCHIVE_OBJECTS) *.d.[0-9] *.d.[0-9][0-9] *.d.[0-9][0-9][0-9] *.d.[0-9][0-9][0-9][0-9] *.d.[0-9][0-9][0-9][0-9][0-9] else - rm -rf "$(EXE)" "$(DSYM)" $(OBJECTS) $(PREREQS) $(ARCHIVE_NAME) $(ARCHIVE_OBJECTS) $(DYLIB_OBJECTS) $(DYLIB_PREREQS) $(DYLIB_FILENAME) $(DYLIB_FILENAME).dSYM + rm -rf "$(EXE)" "$(DSYM)" $(OBJECTS) $(PREREQS) $(ARCHIVE_NAME) $(ARCHIVE_OBJECTS) $(DYLIB_OBJECTS) $(DYLIB_PREREQS) $(DYLIB_FILENAME) $(DYLIB_FILENAME).dSYM *.d.[0-9] *.d.[0-9][0-9] *.d.[0-9][0-9][0-9] *.d.[0-9][0-9][0-9][0-9] *.d.[0-9][0-9][0-9][0-9][0-9] endif #----------------------------------------------------------------------