From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20085 invoked by alias); 27 Aug 2011 13:08:44 -0000 Received: (qmail 19997 invoked by uid 22791); 27 Aug 2011 13:08:43 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,SPF_SOFTFAIL,TW_BJ X-Spam-Check-By: sourceware.org Received: from mail-pz0-f44.google.com (HELO mail-pz0-f44.google.com) (209.85.210.44) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 27 Aug 2011 13:08:19 +0000 Received: by mail-pz0-f44.google.com with SMTP id 36so6427504pzk.3 for ; Sat, 27 Aug 2011 06:08:19 -0700 (PDT) Received: by 10.142.226.2 with SMTP id y2mr1216040wfg.449.1314450498102; Sat, 27 Aug 2011 06:08:18 -0700 (PDT) Received: from localhost.localdomain ([203.110.240.205]) by mx.google.com with ESMTPS id b20sm933541wfh.12.2011.08.27.06.08.14 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 27 Aug 2011 06:08:17 -0700 (PDT) From: Sanjoy Das To: gdb-patches@sourceware.org Cc: Sanjoy Das Subject: [PATCH 4/7] New commands for loading and unloading a reader. Date: Sat, 27 Aug 2011 13:08:00 -0000 Message-Id: <1314450736-19389-5-git-send-email-sanjoy@playingwithpointers.com> In-Reply-To: <1314450736-19389-1-git-send-email-sanjoy@playingwithpointers.com> References: <1314450736-19389-1-git-send-email-sanjoy@playingwithpointers.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-08/txt/msg00531.txt.bz2 Introduces two new GDB commands - `load-jit-reader' and `unload-jit-reader'. gdb/ChangeLog: * gdb/jit.c: Include gdb-dlfcn.h. (loaded_jit_reader, reader_init_fn_sym): New static variables. (jit_reader_load, jit_reader_load_command) (jit_reader_unload_command): New functions. (_initialize_jit): Add commands "jit-reader-load" and "jit-reader-unload". --- gdb/ChangeLog | 9 +++++ gdb/jit.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 0 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3536807..78076ef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2011-08-27 Sanjoy Das + * gdb/jit.c: Include gdb-dlfcn.h. + (loaded_jit_reader, reader_init_fn_sym): New static variables. + (jit_reader_load, jit_reader_load_command) + (jit_reader_unload_command): New functions. + (_initialize_jit): Add commands "jit-reader-load" and + "jit-reader-unload". + +2011-08-27 Sanjoy Das + * gdb/Makefile.in: Add gdb-dlfcn.c and gdb-dlfcn.h to build system. * gdb/config.in: Add new #define HAVE_LIBDL. diff --git a/gdb/jit.c b/gdb/jit.c index cab27a9..4fc5819 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -31,6 +31,7 @@ #include "symfile.h" #include "symtab.h" #include "target.h" +#include "gdb-dlfcn.h" #include "gdb_stat.h" static const char *jit_reader_dir = NULL; @@ -115,6 +116,97 @@ mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb) return 0; } +/* One reader that has been loaded successfully, and can potentially be used to + parse debug info. */ + +static struct jit_reader +{ + struct gdb_reader_funcs *functions; +} *loaded_jit_reader = NULL; + +typedef struct gdb_reader_funcs * (reader_init_fn_type) (void); +static const char *reader_init_fn_sym = "gdb_init_reader"; + +/* Try to load FILE_NAME as a JIT debug info reader. */ + +static struct jit_reader * +jit_reader_load (const char *file_name) +{ + void *so; + reader_init_fn_type *init_fn; + struct jit_reader *new_reader = NULL; + struct gdb_reader_funcs *funcs = NULL; + struct cleanup *old_cleanups; + + if (jit_debug) + fprintf_unfiltered (gdb_stdlog, _("Opening shared object %s.\n"), + file_name); + so = gdb_dlopen (file_name); + old_cleanups = make_cleanup_dlclose (so); + + init_fn = gdb_dlsym (so, reader_init_fn_sym); + if (!init_fn) + error(_("Could not locate initialization function: %s."), + reader_init_fn_sym); + + if (gdb_dlsym (so, "plugin_is_GPL_compatible") == NULL) + error(_("Reader not GPL compatible.")); + + funcs = init_fn (); + if (funcs->reader_version != GDB_READER_INTERFACE_VERSION) + error(_("Reader version does not match GDB version.")); + + new_reader = XZALLOC (struct jit_reader); + new_reader->functions = funcs; + + discard_cleanups (old_cleanups); + return new_reader; +} + +/* Provides the jit-reader-load command. */ + +static void +jit_reader_load_command (char *args, int from_tty) +{ + char so_name[PATH_MAX]; + int len; + + if (args == NULL) + { + error (_("No reader name provided.")); + return; + } + + if (loaded_jit_reader != NULL) + { + error (_("JIT reader already loaded. Run jit-reader-unload first.")); + return; + } + + len = strlen (jit_reader_dir); + strcpy(so_name, jit_reader_dir); + so_name[len] = '/'; + so_name[len + 1] = 0; + + strncat (so_name, args, PATH_MAX - (len + 1)); + loaded_jit_reader = jit_reader_load (so_name); +} + +/* Provides the jit-reader-unload command. */ + +static void +jit_reader_unload_command (char *args, int from_tty) +{ + if (!loaded_jit_reader) + { + error(_("No JIT reader loaded.")); + return; + } + loaded_jit_reader->functions->destroy (loaded_jit_reader->functions); + free (loaded_jit_reader); + loaded_jit_reader = NULL; +} + /* Open a BFD from the target's memory. */ static struct bfd * @@ -566,4 +658,15 @@ _initialize_jit (void) jit_objfile_data = register_objfile_data (); jit_inferior_data = register_inferior_data_with_cleanup (jit_inferior_data_cleanup); + add_com ("jit-reader-load", no_class, jit_reader_load_command, _("\ +Load FILE as debug info reader and unwinder for JIT compiled code.\n\ +Try to load file FILE as a debug info reader (and unwinder) for\n\ +JIT compiled code. The file is loaded from\n\ +" JIT_READER_DIR ", relocated \n\ +relative to the GDB executable if required.\n\ +Usage is `jit-reader-load FILE`.")); + add_com ("jit-reader-unload", no_class, jit_reader_unload_command, _("\ +Unload the currently loaded JIT debug info reader.\n\ +See jit-reader-load for how to load JIT debug readers.\n\ +")); } -- 1.7.5.4