This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 4/7] New commands for loading and unloading a reader.


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     |   90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 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  <sdas@igalia.com>
 
+	* 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  <sdas@igalia.com>
+
 	* 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..a180621 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,84 @@ 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."));
+
+  if (loaded_jit_reader != NULL)
+    error (_("JIT reader already loaded.  Run jit-reader-unload first."));
+
+  snprintf (so_name, PATH_MAX, "%s/%s", jit_reader_dir, args);
+  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."));
+
+  loaded_jit_reader->functions->destroy (loaded_jit_reader->functions);
+  xfree (loaded_jit_reader);
+  loaded_jit_reader = NULL;
+}
+
 /* Open a BFD from the target's memory.  */
 
 static struct bfd *
@@ -566,4 +645,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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]