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]

[RFA] Move buildid stuff from symfile.c to elfread.c


Hi,

the build-id feature is only available on ELF platforms and only used by
elfread.c.  As previously discussed, this patch moves the associated functions
from symfile.c to elfread.c

I have also added a new function, protocol_bfd_open to make common an idiom
used 3 times.  I haven't found a better name but suggrestions are very
welcome.

No sepdebug.exp regressions on i386/linux.

Tristan.

2009-12-11  Tristan Gingold  <gingold@adacore.com>

	* symfile.h (find_separate_debug_file_by_buildid): Remove prototype.
	(protocol_bfd_open): New prototype.
	* symfile.c (protocol_bfd_open): New function.
	(separate_debug_file_exists, reread_symbols): Use it.
	(struct build_id, build_id_bfd_get, build_id_verify)
	(build_id_to_debug_filename)
	(find_separate_debug_file_by_buildid): Move these ...
	* elfread.c (struct build_id)
	(build_id_bfd_get, build_id_verify, build_id_to_debug_filename)
	(find_separate_debug_file_by_buildid): ... here.
---
 gdb/elfread.c |  151 ++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/symfile.c |  177 +++++----------------------------------------------------
 gdb/symfile.h |    4 +-
 3 files changed, 168 insertions(+), 164 deletions(-)

diff --git a/gdb/elfread.c b/gdb/elfread.c
index a47e687..a00ac6e 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -568,6 +568,157 @@ elf_symtab_read (struct objfile *objfile, int type,
     }
 }
 
+struct build_id
+  {
+    size_t size;
+    gdb_byte data[1];
+  };
+
+/* Locate NT_GNU_BUILD_ID from ABFD and return its content.  */
+
+static struct build_id *
+build_id_bfd_get (bfd *abfd)
+{
+  struct build_id *retval;
+
+  if (!bfd_check_format (abfd, bfd_object)
+      || bfd_get_flavour (abfd) != bfd_target_elf_flavour
+      || elf_tdata (abfd)->build_id == NULL)
+    return NULL;
+
+  retval = xmalloc (sizeof *retval - 1 + elf_tdata (abfd)->build_id_size);
+  retval->size = elf_tdata (abfd)->build_id_size;
+  memcpy (retval->data, elf_tdata (abfd)->build_id, retval->size);
+
+  return retval;
+}
+
+/* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value.  */
+
+static int
+build_id_verify (const char *filename, struct build_id *check)
+{
+  bfd *abfd;
+  struct build_id *found = NULL;
+  int retval = 0;
+
+  /* We expect to be silent on the non-existing files.  */
+  abfd = protocol_bfd_open (filename);
+  if (abfd == NULL)
+    return 0;
+
+  found = build_id_bfd_get (abfd);
+
+  if (found == NULL)
+    warning (_("File \"%s\" has no build-id, file skipped"), filename);
+  else if (found->size != check->size
+           || memcmp (found->data, check->data, found->size) != 0)
+    warning (_("File \"%s\" has a different build-id, file skipped"), filename);
+  else
+    retval = 1;
+
+  if (!bfd_close (abfd))
+    warning (_("cannot close \"%s\": %s"), filename,
+	     bfd_errmsg (bfd_get_error ()));
+
+  xfree (found);
+
+  return retval;
+}
+
+static char *
+build_id_to_debug_filename (struct build_id *build_id)
+{
+  char *link, *debugdir, *retval = NULL;
+
+  /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
+  link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
+		 + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
+
+  /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
+     cause "/.build-id/..." lookups.  */
+
+  debugdir = debug_file_directory;
+  do
+    {
+      char *s, *debugdir_end;
+      gdb_byte *data = build_id->data;
+      size_t size = build_id->size;
+
+      while (*debugdir == DIRNAME_SEPARATOR)
+	debugdir++;
+
+      debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
+      if (debugdir_end == NULL)
+	debugdir_end = &debugdir[strlen (debugdir)];
+
+      memcpy (link, debugdir, debugdir_end - debugdir);
+      s = &link[debugdir_end - debugdir];
+      s += sprintf (s, "/.build-id/");
+      if (size > 0)
+	{
+	  size--;
+	  s += sprintf (s, "%02x", (unsigned) *data++);
+	}
+      if (size > 0)
+	*s++ = '/';
+      while (size-- > 0)
+	s += sprintf (s, "%02x", (unsigned) *data++);
+      strcpy (s, ".debug");
+
+      /* lrealpath() is expensive even for the usually non-existent files.  */
+      if (access (link, F_OK) == 0)
+	retval = lrealpath (link);
+
+      if (retval != NULL && !build_id_verify (retval, build_id))
+	{
+	  xfree (retval);
+	  retval = NULL;
+	}
+
+      if (retval != NULL)
+	break;
+
+      debugdir = debugdir_end;
+    }
+  while (*debugdir != 0);
+
+  return retval;
+}
+
+static char *
+find_separate_debug_file_by_buildid (struct objfile *objfile)
+{
+  asection *sect;
+  char *basename, *name_copy, *debugdir;
+  char *dir = NULL;
+  char *debugfile = NULL;
+  char *canon_name = NULL;
+  bfd_size_type debuglink_size;
+  unsigned long crc32;
+  int i;
+  struct build_id *build_id;
+
+  build_id = build_id_bfd_get (objfile->obfd);
+  if (build_id != NULL)
+    {
+      char *build_id_name;
+
+      build_id_name = build_id_to_debug_filename (build_id);
+      xfree (build_id);
+      /* Prevent looping on a stripped .debug file.  */
+      if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
+        {
+	  warning (_("\"%s\": separate debug info file has no debug info"),
+		   build_id_name);
+	  xfree (build_id_name);
+	}
+      else if (build_id_name != NULL)
+        return build_id_name;
+    }
+  return NULL;
+}
+
 /* Scan and build partial symbols for a symbol file.
    We have been initialized by a call to elf_symfile_init, which 
    currently does nothing.
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 10733d7..e81802a 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1137,127 +1137,6 @@ symbol_file_clear (int from_tty)
     printf_unfiltered (_("No symbol file now.\n"));
 }
 
-struct build_id
-  {
-    size_t size;
-    gdb_byte data[1];
-  };
-
-/* Locate NT_GNU_BUILD_ID from ABFD and return its content.  */
-
-static struct build_id *
-build_id_bfd_get (bfd *abfd)
-{
-  struct build_id *retval;
-
-  if (!bfd_check_format (abfd, bfd_object)
-      || bfd_get_flavour (abfd) != bfd_target_elf_flavour
-      || elf_tdata (abfd)->build_id == NULL)
-    return NULL;
-
-  retval = xmalloc (sizeof *retval - 1 + elf_tdata (abfd)->build_id_size);
-  retval->size = elf_tdata (abfd)->build_id_size;
-  memcpy (retval->data, elf_tdata (abfd)->build_id, retval->size);
-
-  return retval;
-}
-
-/* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value.  */
-
-static int
-build_id_verify (const char *filename, struct build_id *check)
-{
-  bfd *abfd;
-  struct build_id *found = NULL;
-  int retval = 0;
-
-  /* We expect to be silent on the non-existing files.  */
-  if (remote_filename_p (filename))
-    abfd = remote_bfd_open (filename, gnutarget);
-  else
-    abfd = bfd_openr (filename, gnutarget);
-  if (abfd == NULL)
-    return 0;
-
-  found = build_id_bfd_get (abfd);
-
-  if (found == NULL)
-    warning (_("File \"%s\" has no build-id, file skipped"), filename);
-  else if (found->size != check->size
-           || memcmp (found->data, check->data, found->size) != 0)
-    warning (_("File \"%s\" has a different build-id, file skipped"), filename);
-  else
-    retval = 1;
-
-  if (!bfd_close (abfd))
-    warning (_("cannot close \"%s\": %s"), filename,
-	     bfd_errmsg (bfd_get_error ()));
-
-  xfree (found);
-
-  return retval;
-}
-
-static char *
-build_id_to_debug_filename (struct build_id *build_id)
-{
-  char *link, *debugdir, *retval = NULL;
-
-  /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
-  link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
-		 + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
-
-  /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
-     cause "/.build-id/..." lookups.  */
-
-  debugdir = debug_file_directory;
-  do
-    {
-      char *s, *debugdir_end;
-      gdb_byte *data = build_id->data;
-      size_t size = build_id->size;
-
-      while (*debugdir == DIRNAME_SEPARATOR)
-	debugdir++;
-
-      debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
-      if (debugdir_end == NULL)
-	debugdir_end = &debugdir[strlen (debugdir)];
-
-      memcpy (link, debugdir, debugdir_end - debugdir);
-      s = &link[debugdir_end - debugdir];
-      s += sprintf (s, "/.build-id/");
-      if (size > 0)
-	{
-	  size--;
-	  s += sprintf (s, "%02x", (unsigned) *data++);
-	}
-      if (size > 0)
-	*s++ = '/';
-      while (size-- > 0)
-	s += sprintf (s, "%02x", (unsigned) *data++);
-      strcpy (s, ".debug");
-
-      /* lrealpath() is expensive even for the usually non-existent files.  */
-      if (access (link, F_OK) == 0)
-	retval = lrealpath (link);
-
-      if (retval != NULL && !build_id_verify (retval, build_id))
-	{
-	  xfree (retval);
-	  retval = NULL;
-	}
-
-      if (retval != NULL)
-	break;
-
-      debugdir = debugdir_end;
-    }
-  while (*debugdir != 0);
-
-  return retval;
-}
-
 static char *
 get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
 {
@@ -1308,10 +1187,7 @@ separate_debug_file_exists (const char *name, unsigned long crc,
   if (strcmp (name, parent_objfile->name) == 0)
     return 0;
 
-  if (remote_filename_p (name))
-    abfd = remote_bfd_open (name, gnutarget);
-  else
-    abfd = bfd_openr (name, gnutarget);
+  abfd = protocol_bfd_open (name);
 
   if (!abfd)
     return 0;
@@ -1367,39 +1243,6 @@ The directory where separate debug symbols are searched for is \"%s\".\n"),
 #endif
 
 char *
-find_separate_debug_file_by_buildid (struct objfile *objfile)
-{
-  asection *sect;
-  char *basename, *name_copy, *debugdir;
-  char *dir = NULL;
-  char *debugfile = NULL;
-  char *canon_name = NULL;
-  bfd_size_type debuglink_size;
-  unsigned long crc32;
-  int i;
-  struct build_id *build_id;
-
-  build_id = build_id_bfd_get (objfile->obfd);
-  if (build_id != NULL)
-    {
-      char *build_id_name;
-
-      build_id_name = build_id_to_debug_filename (build_id);
-      xfree (build_id);
-      /* Prevent looping on a stripped .debug file.  */
-      if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
-        {
-	  warning (_("\"%s\": separate debug info file has no debug info"),
-		   build_id_name);
-	  xfree (build_id_name);
-	}
-      else if (build_id_name != NULL)
-        return build_id_name;
-    }
-  return NULL;
-}
-
-char *
 find_separate_debug_file_by_debuglink (struct objfile *objfile)
 {
   asection *sect;
@@ -1605,6 +1448,19 @@ set_initial_language (void)
     }
 }
 
+/* If NAME is a remote name open the file using remote protocol, otherwise
+   open it normaly.  */
+
+bfd *
+protocol_bfd_open (const char *name)
+{
+  if (remote_filename_p (name))
+    return remote_bfd_open (name, gnutarget);
+  else
+    return bfd_openr (name, gnutarget);
+}
+
+
 /* Open the file specified by NAME and hand it off to BFD for
    preliminary analysis.  Return a newly initialized bfd *, which
    includes a newly malloc'd` copy of NAME (tilde-expanded and made
@@ -2381,10 +2237,7 @@ reread_symbols (void)
 	  if (!bfd_close (objfile->obfd))
 	    error (_("Can't close BFD for %s: %s"), objfile->name,
 		   bfd_errmsg (bfd_get_error ()));
-	  if (remote_filename_p (obfd_filename))
-	    objfile->obfd = remote_bfd_open (obfd_filename, gnutarget);
-	  else
-	    objfile->obfd = bfd_openr (obfd_filename, gnutarget);
+	  objfile->obfd = protocol_bfd_open (obfd_filename);
 	  if (objfile->obfd == NULL)
 	    error (_("Can't open %s to read symbols."), objfile->name);
 	  else
diff --git a/gdb/symfile.h b/gdb/symfile.h
index a9c5608..6445298 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -241,8 +241,6 @@ extern struct objfile *symbol_file_add_from_bfd (bfd *, int,
 extern void symbol_file_add_separate (bfd *bfd, int symfile_flags,
 				      struct objfile *objfile);
 
-extern char *find_separate_debug_file_by_buildid (struct objfile *objfile);
-
 extern char *find_separate_debug_file_by_debuglink (struct objfile *objfile);
 
 /* Create a new section_addr_info, with room for NUM_SECTIONS.  */
@@ -324,6 +322,8 @@ extern void find_lowest_section (bfd *, asection *, void *);
 
 extern bfd *symfile_bfd_open (char *);
 
+extern bfd *protocol_bfd_open (const char *);
+
 extern int get_section_index (struct objfile *, char *);
 
 /* Utility functions for overlay sections: */
-- 
1.6.4


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