[Lldb-commits] [lldb] r183949 - Added a new makefile setting that can be set in LLDB makefiles: USE_LIBCPP. This will enable libc++ support.

Greg Clayton gclayton at apple.com
Thu Jun 13 14:27:15 PDT 2013


Author: gclayton
Date: Thu Jun 13 16:27:14 2013
New Revision: 183949

URL: http://llvm.org/viewvc/llvm-project?rev=183949&view=rev
Log:
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.


Modified:
    lldb/trunk/examples/functions/Makefile
    lldb/trunk/examples/functions/main.cpp
    lldb/trunk/examples/lookup/Makefile
    lldb/trunk/examples/lookup/main.cpp
    lldb/trunk/test/make/Makefile.rules

Modified: lldb/trunk/examples/functions/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/functions/Makefile?rev=183949&r1=183948&r2=183949&view=diff
==============================================================================
--- lldb/trunk/examples/functions/Makefile (original)
+++ lldb/trunk/examples/functions/Makefile Thu Jun 13 16:27:14 2013
@@ -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

Modified: lldb/trunk/examples/functions/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/functions/main.cpp?rev=183949&r1=183948&r2=183949&view=diff
==============================================================================
--- lldb/trunk/examples/functions/main.cpp (original)
+++ lldb/trunk/examples/functions/main.cpp Thu Jun 13 16:27:14 2013
@@ -10,7 +10,20 @@
 #include <stdint.h>
 #include <stdlib.h>
 
+#if defined(__APPLE__)
 #include <LLDB/LLDB.h>
+#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;
 

Modified: lldb/trunk/examples/lookup/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/lookup/Makefile?rev=183949&r1=183948&r2=183949&view=diff
==============================================================================
--- lldb/trunk/examples/lookup/Makefile (original)
+++ lldb/trunk/examples/lookup/Makefile Thu Jun 13 16:27:14 2013
@@ -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

Modified: lldb/trunk/examples/lookup/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/lookup/main.cpp?rev=183949&r1=183948&r2=183949&view=diff
==============================================================================
--- lldb/trunk/examples/lookup/main.cpp (original)
+++ lldb/trunk/examples/lookup/main.cpp Thu Jun 13 16:27:14 2013
@@ -7,18 +7,27 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <getopt.h>
 #include <stdint.h>
 #include <stdlib.h>
 
+#if defined(__APPLE__)
+#include <LLDB/LLDB.h>
+#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 <string>
+#include <vector>
 
 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=<ARCH>] [--platform=<PLATFORM>] [--verbose] [--help] --] <PATH> <ADDRESS> [<ADDRESS>....]\n"
+    "\n"
+    "DESCRIPTION\n"
+    "    Loads the executable pointed to by <PATH> and looks up and <ADDRESS>\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);
+    SBDebugger debugger (SBDebugger::Create());
     
     // Create a debugger instance so we can create a target
-    SBDebugger debugger (SBDebugger::Create());
+    if (!debugger.IsValid())
+        fprintf (stderr, "error: failed to create a debugger object\n");
     
-    if (debugger.IsValid())
+    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);
             }
         }
     }

Modified: lldb/trunk/test/make/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/make/Makefile.rules?rev=183949&r1=183948&r2=183949&view=diff
==============================================================================
--- lldb/trunk/test/make/Makefile.rules (original)
+++ lldb/trunk/test/make/Makefile.rules Thu Jun 13 16:27:14 2013
@@ -117,12 +117,19 @@ cxx_linker = $(if $(findstring clang,$(1
 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
 
 #----------------------------------------------------------------------





More information about the lldb-commits mailing list