rpms/gdb/F-8 gdb-6.6-buildid-locate.patch, 1.7, 1.8 gdb.spec, 1.260, 1.261

Jan Kratochvil (jkratoch) fedora-extras-commits at redhat.com
Mon Mar 10 10:06:08 UTC 2008


Author: jkratoch

Update of /cvs/pkgs/rpms/gdb/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv2574

Modified Files:
	gdb-6.6-buildid-locate.patch gdb.spec 
Log Message:
* Mon Mar 10 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.6-44
- build-id warnings integrated more with rpm and the lists of the warnings got
  replaced usually by a single-line `debuginfo-install' advice.
  - FIXME: Testsuite needs an update for the new pre-prompt messages.


gdb-6.6-buildid-locate.patch:

Index: gdb-6.6-buildid-locate.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/F-8/gdb-6.6-buildid-locate.patch,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- gdb-6.6-buildid-locate.patch	21 Feb 2008 21:41:37 -0000	1.7
+++ gdb-6.6-buildid-locate.patch	10 Mar 2008 10:05:57 -0000	1.8
@@ -1,12 +1,16 @@
 [base]
 
+2007-10-16  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Port to GDB-6.7.
+
 2008-01-22  Jan Kratochvil  <jan.kratochvil at redhat.com>
 	option "build-id-core-loads": Fix it to be an "on"/"off" type.
 	More intuitive build-id missing files messages.
 	Lookup also the main executable from the rpm database.
 	Suppress duplicite buil-id missing files warnings.
 
-2008-01-24  Jan Kratochvil  <jan.kratochvil at redhat.com>
+2008-01-26  Jan Kratochvil  <jan.kratochvil at redhat.com>
 	Print the shared libraries names unconditionally.
 
 2008-02-21  Jan Kratochvil  <jan.kratochvil at redhat.com>
@@ -15,9 +19,23 @@
 	New description of `build-id-verbose' in the documentation.
 	Resolve the RH Bug 432164.
 
-diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-unpatched/gdb/Makefile.in gdb-6.6-patched/gdb/Makefile.in
---- gdb-6.6-unpatched/gdb/Makefile.in	2008-02-21 04:44:49.000000000 +0100
-+++ gdb-6.6-patched/gdb/Makefile.in	2008-02-21 04:10:55.000000000 +0100
+2008-02-24  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Port to GDB-6.8pre.
+
+2008-03-09  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Implement the `debuginfo-install' rpm/yum integration.
+	Resolve the RH Bug 435581.
+
+2008-03-09  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Backport to GDB-6.6.
+
+Index: gdb-6.6/gdb/Makefile.in
+===================================================================
+--- gdb-6.6.orig/gdb/Makefile.in	2008-03-10 00:42:35.000000000 +0100
++++ gdb-6.6/gdb/Makefile.in	2008-03-10 00:42:35.000000000 +0100
 @@ -383,7 +383,7 @@ INSTALLED_LIBS=-lbfd -lreadline -lopcode
  CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(INTL) $(LIBIBERTY) \
  	$(XM_CLIBS) $(TM_CLIBS) $(NAT_CLIBS) $(GDBTKLIBS) @LIBS@ \
@@ -37,7 +55,17 @@
  core-regset.o: core-regset.c $(defs_h) $(command_h) $(gdbcore_h) \
  	$(inferior_h) $(target_h) $(gdb_string_h) $(gregset_h)
  cp-abi.o: cp-abi.c $(defs_h) $(value_h) $(cp_abi_h) $(command_h) $(gdbcmd_h) \
-@@ -2785,7 +2786,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
+@@ -2009,7 +2010,8 @@ event-loop.o: event-loop.c $(defs_h) $(e
+ 	$(gdb_string_h) $(exceptions_h) $(gdb_assert_h) $(gdb_select_h)
+ event-top.o: event-top.c $(defs_h) $(top_h) $(inferior_h) $(target_h) \
+ 	$(terminal_h) $(event_loop_h) $(event_top_h) $(interps_h) \
+-	$(exceptions_h) $(gdbcmd_h) $(readline_h) $(readline_history_h)
++	$(exceptions_h) $(gdbcmd_h) $(readline_h) $(readline_history_h) \
++	$(symfile_h)
+ exceptions.o: exceptions.c $(defs_h) $(exceptions_h) $(breakpoint_h) \
+ 	$(target_h) $(inferior_h) $(annotate_h) $(ui_out_h) $(gdb_assert_h) \
+ 	$(gdb_string_h) $(serial_h)
+@@ -2785,7 +2787,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
  	$(gdb_stabs_h) $(gdb_obstack_h) $(completer_h) $(bcache_h) \
  	$(hashtab_h) $(readline_h) $(gdb_assert_h) $(block_h) \
  	$(gdb_string_h) $(gdb_stat_h) $(observer_h) $(exec_h) \
@@ -47,9 +75,19 @@
  symfile-mem.o: symfile-mem.c $(defs_h) $(symtab_h) $(gdbcore_h) \
  	$(objfiles_h) $(exceptions_h) $(gdbcmd_h) $(target_h) $(value_h) \
  	$(symfile_h) $(observer_h) $(auxv_h) $(elf_common_h)
-diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-unpatched/gdb/corelow.c gdb-6.6-patched/gdb/corelow.c
---- gdb-6.6-unpatched/gdb/corelow.c	2008-02-21 04:44:49.000000000 +0100
-+++ gdb-6.6-patched/gdb/corelow.c	2008-02-21 04:10:55.000000000 +0100
+@@ -3216,7 +3219,7 @@ tui-hooks.o: $(srcdir)/tui/tui-hooks.c $
+ tui-interp.o: $(srcdir)/tui/tui-interp.c $(defs_h) $(interps_h) $(top_h) \
+ 	$(event_top_h) $(event_loop_h) $(ui_out_h) $(cli_out_h) \
+ 	$(tui_data_h) $(readline_h) $(tui_win_h) $(tui_h) $(tui_io_h) \
+-	$(exceptions_h)
++	$(exceptions_h) $(symtab_h) $(symfile_h)
+ 	$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-interp.c
+ tui-io.o: $(srcdir)/tui/tui-io.c $(defs_h) $(target_h) \
+ 	$(event_loop_h) $(event_top_h) $(command_h) $(top_h) $(tui_h) \
+Index: gdb-6.6/gdb/corelow.c
+===================================================================
+--- gdb-6.6.orig/gdb/corelow.c	2006-04-18 21:20:06.000000000 +0200
++++ gdb-6.6/gdb/corelow.c	2008-03-10 00:42:58.000000000 +0100
 @@ -46,6 +46,10 @@
  #include "gdb_assert.h"
  #include "exceptions.h"
@@ -61,13 +99,13 @@
  
  
  #ifndef O_LARGEFILE
-@@ -253,6 +257,57 @@ add_to_thread_list (bfd *abfd, asection 
+@@ -253,6 +257,56 @@ add_to_thread_list (bfd *abfd, asection 
      inferior_ptid = pid_to_ptid (thread_id);	/* Yes, make it current */
  }
  
 +static int build_id_core_loads = 1;
 +
-+static void 
++static void
 +build_id_locate_exec (int from_tty)
 +{
 +  CORE_ADDR at_entry;
@@ -89,8 +127,7 @@
 +  if (exec_filename != NULL)
 +    exec_file_attach (exec_filename, from_tty);
 +  else
-+    build_id_print_missing (_("the main executable file"), build_id_filename,
-+			    1);
++    debug_print_missing (_("the main executable file"), build_id_filename);
 +  xfree (build_id_filename);
 +
 +  /* `.note.gnu.build-id' section exists even for files without a separate
@@ -107,7 +144,7 @@
 +	symbol_file_add_main (exec_filename, from_tty);
 +      /* For EXEC_FILENAME NULL we were already complaining above.  */
 +      if (symfile_objfile == NULL && exec_filename != NULL)
-+	build_id_print_missing (exec_filename, build_id_filename, 1);
++	debug_print_missing (exec_filename, build_id_filename);
 +    }
 +  xfree (build_id_filename);
 +
@@ -119,7 +156,7 @@
  /* This routine opens and sets up the core file bfd.  */
  
  static void
-@@ -349,6 +404,15 @@ core_open (char *filename, int from_tty)
+@@ -349,6 +403,15 @@ core_open (char *filename, int from_tty)
    ontop = !push_target (&core_ops);
    discard_cleanups (old_chain);
  
@@ -135,7 +172,7 @@
    /* This is done first, before anything has a chance to query the
       inferior for information such as symbols.  */
    post_create_inferior (&core_ops, from_tty);
-@@ -662,4 +726,11 @@ _initialize_corelow (void)
+@@ -662,4 +725,11 @@ _initialize_corelow (void)
  
    if (!coreops_suppress_target)
      add_target (&core_ops);
@@ -147,10 +184,11 @@
 +			   NULL, NULL, NULL,
 +			   &setlist, &showlist);
  }
-diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-unpatched/gdb/doc/gdb.texinfo gdb-6.6-patched/gdb/doc/gdb.texinfo
---- gdb-6.6-unpatched/gdb/doc/gdb.texinfo	2008-02-21 04:44:15.000000000 +0100
-+++ gdb-6.6-patched/gdb/doc/gdb.texinfo	2008-02-21 04:43:15.000000000 +0100
-@@ -11940,6 +11940,27 @@ information files.
+Index: gdb-6.6/gdb/doc/gdb.texinfo
+===================================================================
+--- gdb-6.6.orig/gdb/doc/gdb.texinfo	2008-03-10 00:42:35.000000000 +0100
++++ gdb-6.6/gdb/doc/gdb.texinfo	2008-03-10 00:43:33.000000000 +0100
+@@ -11939,6 +11939,27 @@ information files.
  
  @end table
  
@@ -158,7 +196,7 @@
 +
 + at table @code
 +
-+ at kindex set build-id-verbose 
++ at kindex set build-id-verbose
 + at item set build-id-verbose 0
 +No additional messages are printed.
 +
@@ -178,10 +216,41 @@
  @cindex @code{.gnu_debuglink} sections
  @cindex debug links
  A debug link is a special section of the executable file named
-diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-unpatched/gdb/solib-svr4.c gdb-6.6-patched/gdb/solib-svr4.c
---- gdb-6.6-unpatched/gdb/solib-svr4.c	2008-02-21 04:44:49.000000000 +0100
-+++ gdb-6.6-patched/gdb/solib-svr4.c	2008-02-21 04:10:55.000000000 +0100
-@@ -943,10 +943,35 @@ svr4_current_sos (void)
+Index: gdb-6.6/gdb/event-top.c
+===================================================================
+--- gdb-6.6.orig/gdb/event-top.c	2006-12-06 17:54:13.000000000 +0100
++++ gdb-6.6/gdb/event-top.c	2008-03-10 00:42:35.000000000 +0100
+@@ -33,6 +33,7 @@
+ #include <signal.h>
+ #include "exceptions.h"
+ #include "cli/cli-script.h"     /* for reset_command_nest_depth */
++#include "symfile.h"
+ 
+ /* For dont_repeat() */
+ #include "gdbcmd.h"
+@@ -194,6 +195,8 @@ cli_command_loop (void)
+      prompt, otherwise just print the prompt. */
+   if (async_command_editing_p)
+     {
++      debug_flush_missing ();
++
+       /* Tell readline what the prompt to display is and what function it
+          will need to call after a whole line is read. This also displays
+          the first prompt. */
+@@ -264,6 +267,8 @@ display_gdb_prompt (char *new_prompt)
+   /* Reset the nesting depth used when trace-commands is set.  */
+   reset_command_nest_depth ();
+ 
++  debug_flush_missing ();
++
+   /* Each interpreter has its own rules on displaying the command
+      prompt.  */
+   if (!current_interp_display_prompt_p ())
+Index: gdb-6.6/gdb/solib-svr4.c
+===================================================================
+--- gdb-6.6.orig/gdb/solib-svr4.c	2008-03-10 00:42:32.000000000 +0100
++++ gdb-6.6/gdb/solib-svr4.c	2008-03-10 00:42:35.000000000 +0100
+@@ -943,10 +943,36 @@ svr4_current_sos (void)
  		}
                else
                  {
@@ -191,8 +260,6 @@
 +
 +		  strncpy (new->so_original_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
 +		  new->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
- 		  xfree (buffer);
--		  strcpy (new->so_original_name, new->so_name);
 +		  /* May get overwritten below.  */
 +		  strcpy (new->so_name, new->so_original_name);
 +
@@ -211,18 +278,22 @@
 +			  xfree (name);
 +			}
 +		      else
-+			build_id_print_missing (new->so_name, build_id_filename,
-+						1);
++			debug_print_missing (new->so_name, build_id_filename);
++
 +		      xfree (build_id_filename);
 +		      xfree (build_id);
 +		    }
 +
+ 		  xfree (buffer);
+-		  strcpy (new->so_original_name, new->so_name);
++
  		  if (debug_solib)
  		    {
  		      fprintf_unfiltered (gdb_stdlog, 
-diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-unpatched/gdb/symfile.c gdb-6.6-patched/gdb/symfile.c
---- gdb-6.6-unpatched/gdb/symfile.c	2008-02-21 04:46:25.000000000 +0100
-+++ gdb-6.6-patched/gdb/symfile.c	2008-02-21 04:47:36.000000000 +0100
+Index: gdb-6.6/gdb/symfile.c
+===================================================================
+--- gdb-6.6.orig/gdb/symfile.c	2008-03-10 00:42:35.000000000 +0100
++++ gdb-6.6/gdb/symfile.c	2008-03-10 00:43:24.000000000 +0100
 @@ -54,6 +54,9 @@
  #include "exec.h"
  #include "parser-defs.h"
@@ -241,7 +312,7 @@
  
  
  int (*deprecated_ui_load_progress_hook) (const char *section, unsigned long num);
-@@ -1141,16 +1145,65 @@ symbol_file_clear (int from_tty)
+@@ -1120,16 +1124,65 @@ symbol_file_clear (int from_tty)
        printf_unfiltered (_("No symbol file now.\n"));
  }
  
@@ -309,7 +380,7 @@
  {
    struct build_id *retval;
  
-@@ -1166,6 +1219,348 @@ build_id_bfd_get (bfd *abfd)
+@@ -1145,6 +1198,348 @@ build_id_bfd_get (bfd *abfd)
    return retval;
  }
  
@@ -658,7 +729,7 @@
  /* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value.  */
  
  static int
-@@ -1180,7 +1575,7 @@ build_id_verify (const char *filename, s
+@@ -1159,7 +1554,7 @@ build_id_verify (const char *filename, s
    if (abfd == NULL)
      return 0;
  
@@ -667,7 +738,7 @@
  
    if (found == NULL)
      warning (_("File \"%s\" has no build-id, file skipped"), filename);
-@@ -1198,8 +1593,9 @@ build_id_verify (const char *filename, s
+@@ -1177,8 +1572,9 @@ build_id_verify (const char *filename, s
  
  static char *debug_file_directory = NULL;
  
@@ -679,7 +750,7 @@
  {
    char *link, *s, *retval = NULL;
    gdb_byte *data = build_id->data;
-@@ -1207,7 +1603,9 @@ build_id_to_debug_filename (struct build
+@@ -1186,7 +1582,9 @@ build_id_to_debug_filename (struct build
  
    /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
    link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
@@ -690,7 +761,7 @@
    s = link + sprintf (link, "%s/.build-id/", debug_file_directory);
    if (size > 0)
      {
-@@ -1218,12 +1616,14 @@ build_id_to_debug_filename (struct build
+@@ -1197,12 +1595,14 @@ build_id_to_debug_filename (struct build
      *s++ = '/';
    while (size-- > 0)
      s += sprintf (s, "%02x", (unsigned) *data++);
@@ -707,7 +778,7 @@
  
    if (retval != NULL && !build_id_verify (retval, build_id))
      {
-@@ -1231,9 +1631,206 @@ build_id_to_debug_filename (struct build
+@@ -1210,9 +1610,433 @@ build_id_to_debug_filename (struct build
        retval = NULL;
      }
  
@@ -725,152 +796,378 @@
 +#include <rpm/rpmdb.h>
 +#include <rpm/header.h>
 +
-+static void
-+rpm_print_debuginfo (const char *filename)
++/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files
++   and avoid their duplicities during a single inferior run.  */
++
++static struct htab *missing_rpm_hash;
++
++/* This MISSING_RPM_LIST tracker is used to collect and print as a single line
++   all the rpms right before the nearest GDB prompt.  It gets cleared after
++   each such print (it is questionable if we should clear it after the print).
++   */
++
++struct missing_rpm
++  {
++    struct missing_rpm *next;
++    char rpm[1];
++  };
++static struct missing_rpm *missing_rpm_list;
++static int missing_rpm_list_entries;
++
++/* Returns the count of newly added rpms.  */
++
++static int
++missing_rpm_enlist (const char *filename)
 +{
 +  static int rpm_init_done = 0;
 +  rpmts ts;
 +  rpmdbMatchIterator mi;
++  int count = 0;
++
++  if (filename == NULL)
++    return 0;
 +
 +  if (!rpm_init_done)
 +    {
 +      if (rpmReadConfigFiles(NULL, NULL) != 0)
 +	{
 +	  warning (_("Error reading the rpm configuration files"));
-+	  return;
++	  return 0;
 +	}
 +      rpm_init_done = 1;
 +    }
 +
 +  ts = rpmtsCreate ();
-+  
++
 +  mi = rpmtsInitIterator (ts, RPMTAG_BASENAMES, filename, 0);
 +  if (mi != NULL)
 +    {
-+      int printed = 0;
-+
 +      for (;;)
 +	{
 +	  Header h;
-+	  char *s;
-+	  const char *errmsg;
++	  char *s, *srcrpm, *verrel, *debuginfo;
++	  union
++	    {
++	      void *voidp;
++	      char *s;
++	    }
++	  sourcerpm, arch;
++	  char **slot;
++	  rpmdbMatchIterator mi_debuginfo;
 +
 +	  h = rpmdbNextIterator (mi);
 +	  if (h == NULL)
 +	    break;
 +
-+	  s = headerSprintf (h, " %{name}", rpmTagTable, rpmHeaderFormats,
-+			     &errmsg);
-+	  if (s == NULL)
-+	    warning (_("Error querying rpm file `%s': %s"), filename, errmsg);
-+	  else
++	  if (!headerGetEntry (h, RPMTAG_SOURCERPM, NULL, &sourcerpm.voidp,
++			       NULL))
 +	    {
-+	      if (!printed)
-+	        {
-+		  fprintf_unfiltered (gdb_stdout,
-+				      _("Getting all the debuginfos: %s"),
-+				      "debuginfo-install");
-+		  printed = 1;
++	      warning (_("Error querying the rpm file `%s' %s"), filename,
++		       "RPMTAG_SOURCERPM");
++	      continue;
++	    }
++	  srcrpm = sourcerpm.s + strlen (sourcerpm.s) - (sizeof ".src.rpm" - 1);
++	  if (srcrpm < sourcerpm.s || strcmp (srcrpm, ".src.rpm") != 0)
++	    {
++error_parsing_sourcerpm:
++	      warning (_("Error parsing %%{sourcerpm} of the rpm file `%s': %s"),
++		       filename, sourcerpm.s);
++	      continue;
++	    }
++	  s = srcrpm;
++
++	  /* Skip the release.  */
++
++	  while (s > sourcerpm.s && s[-1] != '-')
++	    s--;
++	  if (s == sourcerpm.s)
++	    goto error_parsing_sourcerpm;
++	  s--;
++
++	  /* Skip the version.  */
++
++	  while (s > sourcerpm.s && s[-1] != '-')
++	    s--;
++	  if (s == sourcerpm.s)
++	    goto error_parsing_sourcerpm;
++	  s--;
++	  verrel = s;
++
++	  if (!headerGetEntry (h, RPMTAG_ARCH, NULL, &arch.voidp, NULL))
++	    {
++	      warning (_("Error querying the rpm file `%s' %s"), filename,
++		       "RPMTAG_ARCH");
++	      continue;
++	    }
++
++	  /* The allocated memory gets utilized below for MISSING_RPM_HASH.  */
++
++	  debuginfo = xmalloc (strlen (sourcerpm.s) + strlen (arch.s) + 32);
++
++	  /* Verify the debuginfo file is not already installed.  */
++
++	  sprintf (debuginfo, "%.*s-debuginfo%.*s.%s",
++		   (int) (verrel - sourcerpm.s), sourcerpm.s,
++		   (int) (srcrpm - verrel), verrel, arch.s);
++	  mi_debuginfo = rpmtsInitIterator (ts, RPMDBI_LABEL, debuginfo, 0);
++	  if (mi_debuginfo != NULL)
++	    {
++	      Header h_debuginfo;
++
++	      h_debuginfo = rpmdbNextIterator (mi_debuginfo);
++	      rpmdbFreeIterator (mi_debuginfo);
++	      if (h_debuginfo != NULL)
++		{
++		  xfree (debuginfo);
++
++		  /* We ignore any != 0 for possibly already enlisted rpms as
++		     it should not hurt much.  */
++
++		  count = 0;
++		  break;
 +		}
-+	      /* Space (' ') delimited was insted by HEADERSPRINTF above.  */
-+	      fputs_unfiltered (s, gdb_stdout);
 +	    }
-+	}
 +
-+      if (printed)
-+	fputs_unfiltered ("\n", gdb_stdout);
++	  /* Base package name for `debuginfo-install'.  We do not use `yum'
++	     as its command
++		 yum --enablerepo='*-debuginfo' install BASE-debuginfo.ARCH
++	     would be more complicated than just:
++		 debuginfo-install BASE.ARCH
++	     We do not need to supply the version-release as
++	     `debuginfo-install' always installs only the debuginfo matching
++	     the currently installed rpm.  Still we must supply `.%{arch}' as
++	     we may have multilib (multiple arch-differing rpm packages)
++	     installed.
++	     FUTURE: After multiple debuginfo versions simultaneously installed
++	     get supported we may need to supply the version-release here.  */
++
++	  sprintf (debuginfo, "%.*s.%s", (int) (verrel - sourcerpm.s),
++		   sourcerpm.s, arch.s);
++
++	  if (missing_rpm_hash == NULL)
++	    {
++	      /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE
++		 should not deallocate the entries.  */
++
++	      missing_rpm_hash = htab_create_alloc (64, htab_hash_string,
++			       (int (*) (const void *, const void *)) streq,
++						    NULL, xcalloc, xfree);
++	    }
++	  slot = (char **) htab_find_slot (missing_rpm_hash, debuginfo, INSERT);
++	  /* XCALLOC never returns NULL.  */
++	  gdb_assert (slot != NULL);
++	  if (*slot == NULL)
++	    {
++	      struct missing_rpm *missing_rpm;
++
++	      *slot = debuginfo;
++
++	      missing_rpm = xmalloc (sizeof (*missing_rpm) + strlen (debuginfo));
++	      strcpy (missing_rpm->rpm, debuginfo);
++	      missing_rpm->next = missing_rpm_list;
++	      missing_rpm_list = missing_rpm;
++	      missing_rpm_list_entries++;
++	    }
++	  else
++	    xfree (debuginfo);
++	  count++;
++	}
 +
 +      rpmdbFreeIterator (mi);
 +    }
 +
 +  rpmtsFree (ts);
++
++  return count;
++}
++
++static int
++missing_rpm_list_compar (const char *const *ap, const char *const *bp)
++{
++  return strcoll (*ap, *bp);
 +}
 +
-+struct missing_debuginfos
++/* It returns a NULL-terminated array of strings needing to be FREEd.  It may
++   also return only NULL.  */
++
++static void
++missing_rpm_list_print (void)
++{
++  char **array, **array_iter;
++  struct missing_rpm *list_iter;
++
++  if (missing_rpm_list_entries == 0)
++    return;
++
++  array = xmalloc (sizeof (*array) * missing_rpm_list_entries);
++  array_iter = array;
++  for (list_iter = missing_rpm_list; list_iter != NULL;
++       list_iter = list_iter->next)
++    {
++      *array_iter++ = list_iter->rpm;
++    }
++  gdb_assert (array_iter == array + missing_rpm_list_entries);
++
++  qsort (array, missing_rpm_list_entries, sizeof (*array),
++	 (int (*) (const void *, const void *)) missing_rpm_list_compar);
++
++  printf (_("Missing separate debuginfos, use: %s"), "debuginfo-install");
++  for (array_iter = array; array_iter < array + missing_rpm_list_entries;
++       array_iter++)
++    {
++      putchar (' ');
++      fputs (*array_iter, stdout);
++    }
++  putchar ('\n');
++
++  xfree (array);
++  while (missing_rpm_list != NULL)
++    {
++      list_iter = missing_rpm_list;
++      missing_rpm_list = list_iter->next;
++      xfree (list_iter);
++    }
++  missing_rpm_list_entries = 0;
++}
++
++static void
++missing_rpm_change (void)
++{
++  debug_flush_missing ();
++
++  gdb_assert (missing_rpm_list == NULL);
++  if (missing_rpm_hash != NULL)
++    {
++      htab_delete (missing_rpm_hash);
++      missing_rpm_hash = NULL;
++    }
++}
++
++enum missing_exec
++  {
++    /* Init state.  EXEC_BFD also still could be NULL.  */
++    MISSING_EXEC_NOT_TRIED,
++    /* We saw a non-NULL EXEC_BFD but RPM has no info about it.  */
++    MISSING_EXEC_NOT_FOUND,
++    /* We found EXEC_BFD by RPM and we either have its symbols (either embedded
++       or separate) or the main executable's RPM is now contained in
++       MISSING_RPM_HASH.  */
++    MISSING_EXEC_ENLISTED
++  };
++static enum missing_exec missing_exec = MISSING_EXEC_NOT_TRIED;
++
++void
++debug_flush_missing (void)
++{
++  missing_rpm_list_print ();
++}
++
++/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
++     yum --enablerepo='*-debuginfo' install ...
++   avoidance.  */
++
++struct missing_filepair
 +  {
 +    char *binary;
 +    char *debug;
 +    char data[1];
 +  };
 +
-+static struct htab *missing_debuginfos_hash;
-+static struct obstack missing_debuginfos_obstack;
++static struct htab *missing_filepair_hash;
++static struct obstack missing_filepair_obstack;
 +
 +static void *
-+missing_debuginfos_xcalloc (size_t nmemb, size_t nmemb_size)
++missing_filepair_xcalloc (size_t nmemb, size_t nmemb_size)
 +{
 +  void *retval;
 +  size_t size = nmemb * nmemb_size;
-+  
-+  retval = obstack_alloc (&missing_debuginfos_obstack, size);
++
++  retval = obstack_alloc (&missing_filepair_obstack, size);
 +  memset (retval, 0, size);
 +  return retval;
 +}
 +
 +static hashval_t
-+missing_debuginfos_hash_func (const struct missing_debuginfos *elem)
++missing_filepair_hash_func (const struct missing_filepair *elem)
 +{
-+  return htab_hash_string (elem->binary) ^ htab_hash_string (elem->debug);
++  hashval_t retval = 0;
++
++  retval ^= htab_hash_string (elem->binary);
++  if (elem->debug != NULL)
++    retval ^= htab_hash_string (elem->debug);
++
++  return retval;
 +}
 +
 +static int
-+missing_debuginfos_eq (const struct missing_debuginfos *elem1,
-+		       const struct missing_debuginfos *elem2)
++missing_filepair_eq (const struct missing_filepair *elem1,
++		       const struct missing_filepair *elem2)
 +{
 +  return strcmp (elem1->binary, elem2->binary) == 0
-+         && strcmp (elem1->debug, elem2->debug) == 0;
++         && ((elem1->debug == NULL && elem2->debug == NULL)
++	     || strcmp (elem1->debug, elem2->debug) == 0);
 +}
 +
 +static void
-+missing_debuginfos_change (void)
++missing_filepair_change (void)
 +{
-+  if (missing_debuginfos_hash != NULL)
++  if (missing_filepair_hash != NULL)
 +    {
-+      obstack_free (&missing_debuginfos_obstack, NULL);
-+      /* All their memory came just from MISSING_DEBUGINFOS_OBSTACK.  */
-+      missing_debuginfos_hash = NULL;
++      obstack_free (&missing_filepair_obstack, NULL);
++      /* All their memory came just from missing_filepair_OBSTACK.  */
++      missing_filepair_hash = NULL;
 +    }
++  missing_exec = MISSING_EXEC_NOT_TRIED;
 +}
 +
 +static void
-+missing_debuginfos_change_inferior_created (struct target_ops *objfile,
-+					    int from_tty)
++debug_print_executable_changed (void *unused)
 +{
-+  missing_debuginfos_change ();
++  missing_rpm_change ();
++  missing_filepair_change ();
 +}
 +
++/* Notify user the file BINARY with (possibly NULL) associated separate debug
++   information file DEBUG is missing.  DEBUG may or may not be the build-id
++   file such as would be:
++     /usr/lib/debug/.build-id/dd/b1d2ce632721c47bb9e8679f369e2295ce71be.debug
++   */
++
 +void
-+build_id_print_missing (const char *binary, const char *debug,
-+			int print_filename)
++debug_print_missing (const char *binary, const char *debug)
 +{
-+  char *exec_filename = NULL;
 +  size_t binary_len0 = strlen (binary) + 1;
-+  size_t debug_len0 = strlen (debug) + 1;
-+  struct missing_debuginfos *missing_debuginfos;
-+  struct missing_debuginfos **slot;
++  size_t debug_len0 = debug ? strlen (debug) + 1 : 0;
++  struct missing_filepair *missing_filepair;
++  struct missing_filepair **slot;
 +
 +  if (build_id_verbose < BUILD_ID_VERBOSE_FILENAMES)
 +    return;
 +
-+  if (missing_debuginfos_hash == NULL)
++  if (missing_filepair_hash == NULL)
 +    {
-+      obstack_init (&missing_debuginfos_obstack);
-+      missing_debuginfos_hash = htab_create_alloc (64,
-+	(hashval_t (*) (const void *)) missing_debuginfos_hash_func,
-+	(int (*) (const void *, const void *)) missing_debuginfos_eq, NULL,
-+	missing_debuginfos_xcalloc, NULL);
++      obstack_init (&missing_filepair_obstack);
++      missing_filepair_hash = htab_create_alloc (64,
++	(hashval_t (*) (const void *)) missing_filepair_hash_func,
++	(int (*) (const void *, const void *)) missing_filepair_eq, NULL,
++	missing_filepair_xcalloc, NULL);
 +    }
 +
-+  missing_debuginfos = obstack_alloc (&missing_debuginfos_obstack,
-+				      sizeof (*missing_debuginfos) - 1
++  missing_filepair = obstack_alloc (&missing_filepair_obstack,
++				      sizeof (*missing_filepair) - 1
 +				      + binary_len0 + debug_len0);
-+  missing_debuginfos->binary = missing_debuginfos->data;
-+  memcpy (missing_debuginfos->binary, binary, binary_len0);
-+  missing_debuginfos->debug = missing_debuginfos->binary + binary_len0;
-+  memcpy (missing_debuginfos->debug, debug, debug_len0);
++  missing_filepair->binary = missing_filepair->data;
++  memcpy (missing_filepair->binary, binary, binary_len0);
++  if (debug != NULL)
++    {
++      missing_filepair->debug = missing_filepair->binary + binary_len0;
++      memcpy (missing_filepair->debug, debug, debug_len0);
++    }
++  else
++    missing_filepair->debug = NULL;
 +
-+  slot = (struct missing_debuginfos **) htab_find_slot (missing_debuginfos_hash,
-+							missing_debuginfos,
++  slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash,
++							missing_filepair,
 +							INSERT);
 +
 +  /* While it may be still printed duplicitely with the missing debuginfo file
@@ -880,41 +1177,53 @@
 +
 +  if (*slot != NULL)
 +    {
-+      obstack_free (&missing_debuginfos_obstack, missing_debuginfos);
++      obstack_free (&missing_filepair_obstack, missing_filepair);
 +      return;
 +    }
-+  *slot = missing_debuginfos;
++  *slot = missing_filepair;
 +
-+  if (print_filename)
-+    fprintf_unfiltered (gdb_stdlog, _("Missing separate debuginfo for %s\n"),
-+			binary);
-+  else
-+    fprintf_unfiltered (gdb_stdlog, _("(no separate debuginfo file found)\n"));
-+
-+  fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
-+		      "yum --enablerepo='*-debuginfo' install", debug);
-+
-+  if (exec_bfd != NULL)
-+    exec_filename = bfd_get_filename (exec_bfd);
-+  if (exec_filename != NULL)
++  if (missing_exec == MISSING_EXEC_NOT_TRIED)
 +    {
-+      static char *last_exec_filename;
++      char *exec_filename;
 +
-+      if (last_exec_filename == NULL
-+	  || strcmp (exec_filename, last_exec_filename) != 0)
++      exec_filename = get_exec_file (0);
++      if (exec_filename != NULL)
 +	{
-+	  xfree (last_exec_filename);
-+	  last_exec_filename = xstrdup (exec_filename);
-+
-+	  rpm_print_debuginfo (exec_filename);
++	  if (missing_rpm_enlist (exec_filename) == 0)
++	    missing_exec = MISSING_EXEC_NOT_FOUND;
++	  else
++	    missing_exec = MISSING_EXEC_ENLISTED;
 +	}
 +    }
++  if (missing_exec != MISSING_EXEC_ENLISTED)
++    if (missing_rpm_enlist (binary) == 0 && missing_rpm_enlist (debug) == 0)
++      {
++	/* We do not collect and flush these messages as each such message
++	   already requires its own separate lines.  */
++
++	fprintf_unfiltered (gdb_stdlog,
++			    _("Missing separate debuginfo for %s\n"), binary);
++        if (debug != NULL)
++	  fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
++			      "yum --enablerepo='*-debuginfo' install", debug);
++      }
 +}
 +
  static char *
  get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
  {
-@@ -1326,23 +1923,27 @@ find_separate_debug_file (struct objfile
+@@ -1297,31 +2121,35 @@ static char *
+ find_separate_debug_file (struct objfile *objfile)
+ {
+   asection *sect;
+-  char *basename;
+-  char *dir;
+-  char *debugfile;
++  char *basename = NULL;
++  char *dir = NULL;
++  char *debugfile = NULL;
+   char *name_copy;
+   bfd_size_type debuglink_size;
    unsigned long crc32;
    int i;
    struct build_id *build_id;
@@ -940,63 +1249,90 @@
  	}
        else if (build_id_name != NULL)
 -        return build_id_name;
-+        {
++	{
 +	  xfree (build_id_filename);
 +	  return build_id_name;
 +	}
      }
  
    basename = get_debug_link_info (objfile, &crc32);
-@@ -1350,7 +1951,10 @@ find_separate_debug_file (struct objfile
+@@ -1329,7 +2157,7 @@ find_separate_debug_file (struct objfile
    if (basename == NULL)
      /* There's no separate debug info, hence there's no way we could
         load it => no warning.  */
 -    return NULL;
-+    {
-+      xfree (build_id_filename);
-+      return NULL;
-+    }
++    goto cleanup_return_debugfile;
  
    dir = xstrdup (objfile->name);
  
-@@ -1379,6 +1983,7 @@ find_separate_debug_file (struct objfile
+@@ -1345,23 +2173,19 @@ find_separate_debug_file (struct objfile
+   gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i]));
+   dir[i+1] = '\0';
+ 
+-  debugfile = alloca (strlen (debug_file_directory) + 1
+-                      + strlen (dir)
+-                      + strlen (DEBUG_SUBDIRECTORY)
+-                      + strlen ("/")
+-                      + strlen (basename)
+-                      + 1);
++  debugfile = xmalloc (strlen (debug_file_directory) + 1
++		       + strlen (dir)
++		       + strlen (DEBUG_SUBDIRECTORY)
++		       + strlen ("/")
++		       + strlen (basename)
++		       + 1);
+ 
+   /* First try in the same directory as the original file.  */
+   strcpy (debugfile, dir);
+   strcat (debugfile, basename);
  
    if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-     {
-+      xfree (build_id_filename);
-       xfree (basename);
-       xfree (dir);
-       return xstrdup (debugfile);
-@@ -1392,6 +1997,7 @@ find_separate_debug_file (struct objfile
+-    {
+-      xfree (basename);
+-      xfree (dir);
+-      return xstrdup (debugfile);
+-    }
++    goto cleanup_return_debugfile;
+ 
+   /* Then try in the subdirectory named DEBUG_SUBDIRECTORY.  */
+   strcpy (debugfile, dir);
+@@ -1370,11 +2194,7 @@ find_separate_debug_file (struct objfile
+   strcat (debugfile, basename);
  
    if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-     {
-+      xfree (build_id_filename);
-       xfree (basename);
-       xfree (dir);
-       return xstrdup (debugfile);
-@@ -1405,11 +2011,20 @@ find_separate_debug_file (struct objfile
+-    {
+-      xfree (basename);
+-      xfree (dir);
+-      return xstrdup (debugfile);
+-    }
++    goto cleanup_return_debugfile;
+ 
+   /* Then try in the global debugfile directory.  */
+   strcpy (debugfile, debug_file_directory);
+@@ -1383,15 +2203,16 @@ find_separate_debug_file (struct objfile
+   strcat (debugfile, basename);
  
    if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-     {
-+      xfree (build_id_filename);
-       xfree (basename);
-       xfree (dir);
-       return xstrdup (debugfile);
-     }
+-    {
+-      xfree (basename);
+-      xfree (dir);
+-      return xstrdup (debugfile);
+-    }
++    goto cleanup_return_debugfile;
  
-+  if (build_id_filename != NULL)
-+    {
-+      /* The filename is already printed for shared libraries.  */
-+      build_id_print_missing (objfile->name, build_id_filename,
-+			      1);
-+      xfree (build_id_filename);
-+    }
++  debugfile = NULL;
++  debug_print_missing (objfile->name, build_id_filename);
 +
++cleanup_return_debugfile:
++  xfree (build_id_filename);
    xfree (basename);
    xfree (dir);
-   return NULL;
-@@ -4045,4 +4660,16 @@ the global debug-file directory prepende
+-  return NULL;
++  return debugfile;
+ }
+ 
+ 
+@@ -4024,4 +4845,16 @@ the global debug-file directory prepende
  				     NULL,
  				     show_debug_file_directory,
  				     &setlist, &showlist);
@@ -1011,11 +1347,12 @@
 +			    show_build_id_verbose,
 +			    &setlist, &showlist);
 +
-+  observer_attach_inferior_created (missing_debuginfos_change_inferior_created);
++  observer_attach_executable_changed (debug_print_executable_changed);
  }
-diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-unpatched/gdb/symfile.h gdb-6.6-patched/gdb/symfile.h
---- gdb-6.6-unpatched/gdb/symfile.h	2008-02-21 04:44:49.000000000 +0100
-+++ gdb-6.6-patched/gdb/symfile.h	2008-02-21 04:10:55.000000000 +0100
+Index: gdb-6.6/gdb/symfile.h
+===================================================================
+--- gdb-6.6.orig/gdb/symfile.h	2005-12-17 23:34:03.000000000 +0100
++++ gdb-6.6/gdb/symfile.h	2008-03-10 00:42:35.000000000 +0100
 @@ -322,6 +322,14 @@ extern bfd_byte *symfile_relocate_debug_
  extern void dwarf_build_psymtabs (struct objfile *, int, file_ptr,
  				  unsigned int, file_ptr, unsigned int);
@@ -1025,9 +1362,22 @@
 +extern struct build_id *build_id_addr_get (CORE_ADDR addr);
 +extern char *build_id_to_filename (struct build_id *build_id,
 +				   char **link_return, int add_debug_suffix);
-+extern void build_id_print_missing (const char *binary, const char *debug,
-+				    int print_filename);
++extern void debug_print_missing (const char *binary, const char *debug);
++extern void debug_flush_missing (void);
 +
  /* From dwarf2read.c */
  
  extern int dwarf2_has_info (struct objfile *);
+Index: gdb-6.6/gdb/tui/tui-interp.c
+===================================================================
+--- gdb-6.6.orig/gdb/tui/tui-interp.c	2005-12-23 20:10:02.000000000 +0100
++++ gdb-6.6/gdb/tui/tui-interp.c	2008-03-10 00:42:35.000000000 +0100
+@@ -32,6 +32,8 @@
+ #include "tui/tui.h"
+ #include "tui/tui-io.h"
+ #include "exceptions.h"
++#include "symtab.h"
++#include "symfile.h"
+ 
+ /* Set to 1 when the TUI mode must be activated when we first start gdb.  */
+ static int tui_start_enabled = 0;


Index: gdb.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/F-8/gdb.spec,v
retrieving revision 1.260
retrieving revision 1.261
diff -u -r1.260 -r1.261
--- gdb.spec	21 Feb 2008 21:41:37 -0000	1.260
+++ gdb.spec	10 Mar 2008 10:05:57 -0000	1.261
@@ -11,7 +11,7 @@
 Version: 6.6
 
 # The release always contains a leading reserved number, start it at 1.
-Release: 43%{?dist}
+Release: 44%{?dist}
 
 License: GPL
 Group: Development/Debuggers
@@ -721,6 +721,11 @@
 # don't include the files in include, they are part of binutils
 
 %changelog
+* Mon Mar 10 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.6-44
+- build-id warnings integrated more with rpm and the lists of the warnings got
+  replaced usually by a single-line `debuginfo-install' advice.
+  - FIXME: Testsuite needs an update for the new pre-prompt messages.
+
 * Thu Feb 21 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.6-43
 - Rename `set debug build-id' as `set build-id-verbose', former level 1 moved
   to level 2, default value is now 1, use `set build-id-verbose 0' now to




More information about the fedora-extras-commits mailing list