Blame gdb-7.6.patch

Packit bf408e
Packit bf408e
# When this file is updated in an existing source tree, it gets re-applied
Packit bf408e
# during the next build using "patch -N --fuzz=0", which ignores patches
Packit bf408e
# that have already been applied.  However, if a gdb file has been modified
Packit bf408e
# multiple times, the subsequent patching may fail to recognize that a 
Packit bf408e
# given patch has been previously applied, and will attempt to re-apply it.
Packit bf408e
# To prevent any uninintended consequences, this file also acts as a 
Packit bf408e
# shell script that can restore any gdb file to its original state prior 
Packit bf408e
# to all subsequent patch applications.  
Packit bf408e
Packit bf408e
# The gdb-7.6-ppc64le-support.patch will have modified both files below
Packit bf408e
# during the initial build, so continue previous behavior.
Packit bf408e
Packit bf408e
if [ "$1" = "PPC64" ]
Packit bf408e
then
Packit bf408e
  exit 0
Packit bf408e
fi
Packit bf408e
 
Packit bf408e
tar xvzmf gdb-7.6.tar.gz \
Packit bf408e
	gdb-7.6/gdb/symtab.c \
Packit bf408e
	gdb-7.6/gdb/printcmd.c
Packit bf408e
Packit bf408e
exit 0
Packit bf408e
Packit bf408e
--- gdb-7.6/libiberty/Makefile.in.orig
Packit bf408e
+++ gdb-7.6/libiberty/Makefile.in
Packit bf408e
@@ -175,6 +175,7 @@ REQUIRED_OFILES =							\
Packit bf408e
 	./getruntime.$(objext) ./hashtab.$(objext) ./hex.$(objext)	\
Packit bf408e
 	./lbasename.$(objext) ./lrealpath.$(objext)			\
Packit bf408e
 	./make-relative-prefix.$(objext) ./make-temp-file.$(objext)	\
Packit bf408e
+	./mkstemps.$(objext)						\
Packit bf408e
 	./objalloc.$(objext)						\
Packit bf408e
 	./obstack.$(objext)						\
Packit bf408e
 	./partition.$(objext) ./pexecute.$(objext) ./physmem.$(objext)	\
Packit bf408e
@@ -206,7 +207,7 @@ CONFIGURED_OFILES = ./asprintf.$(objext)
Packit bf408e
 	./index.$(objext) ./insque.$(objext)				\
Packit bf408e
 	./memchr.$(objext) ./memcmp.$(objext) ./memcpy.$(objext) 	\
Packit bf408e
 	./memmem.$(objext) ./memmove.$(objext)				\
Packit bf408e
-	 ./mempcpy.$(objext) ./memset.$(objext) ./mkstemps.$(objext)	\
Packit bf408e
+	 ./mempcpy.$(objext) ./memset.$(objext) 			\
Packit bf408e
 	./pex-djgpp.$(objext) ./pex-msdos.$(objext)			\
Packit bf408e
 	 ./pex-unix.$(objext) ./pex-win32.$(objext)			\
Packit bf408e
 	 ./putenv.$(objext)						\
Packit bf408e
--- gdb-7.6/opcodes/i386-dis.c.orig
Packit bf408e
+++ gdb-7.6/opcodes/i386-dis.c
Packit bf408e
@@ -11510,6 +11510,10 @@ print_insn (bfd_vma pc, disassemble_info
Packit bf408e
       threebyte = *++codep;
Packit bf408e
       dp = &dis386_twobyte[threebyte];
Packit bf408e
       need_modrm = twobyte_has_modrm[*codep];
Packit bf408e
+      if (dp->name && ((strcmp(dp->name, "ud2a") == 0) || (strcmp(dp->name, "ud2") == 0))) {
Packit bf408e
+        extern int kernel_BUG_encoding_bytes(void);
Packit bf408e
+        codep += kernel_BUG_encoding_bytes();
Packit bf408e
+      }
Packit bf408e
       codep++;
Packit bf408e
     }
Packit bf408e
   else
Packit bf408e
--- gdb-7.6/gdb/dwarf2read.c.orig
Packit bf408e
+++ gdb-7.6/gdb/dwarf2read.c
Packit bf408e
@@ -2670,7 +2670,11 @@ read_index_from_section (struct objfile
Packit bf408e
      indices.  */
Packit bf408e
   if (version < 4)
Packit bf408e
     {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+      static int warning_printed = 1;
Packit bf408e
+#else
Packit bf408e
       static int warning_printed = 0;
Packit bf408e
+#endif
Packit bf408e
       if (!warning_printed)
Packit bf408e
 	{
Packit bf408e
 	  warning (_("Skipping obsolete .gdb_index section in %s."),
Packit bf408e
@@ -2689,7 +2693,11 @@ read_index_from_section (struct objfile
Packit bf408e
      "set use-deprecated-index-sections on".  */
Packit bf408e
   if (version < 6 && !deprecated_ok)
Packit bf408e
     {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+      static int warning_printed = 1;
Packit bf408e
+#else
Packit bf408e
       static int warning_printed = 0;
Packit bf408e
+#endif
Packit bf408e
       if (!warning_printed)
Packit bf408e
 	{
Packit bf408e
 	  warning (_("\
Packit bf408e
--- gdb-7.6/gdb/amd64-linux-nat.c.orig
Packit bf408e
+++ gdb-7.6/gdb/amd64-linux-nat.c
Packit bf408e
@@ -45,6 +45,17 @@
Packit bf408e
 /* ezannoni-2003-07-09: I think this is fixed.  The extraneous defs have
Packit bf408e
    been removed from ptrace.h in the kernel.  However, better safe than
Packit bf408e
    sorry.  */
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+/*
Packit bf408e
+ * When compiling within a 2.6.25-based Fedora build environment with
Packit bf408e
+ * gcc 4.3, four new "typedef unsigned int u32;" declarations were
Packit bf408e
+ * required due to a new ptrace_bts_config structure declaration in
Packit bf408e
+ * "asm-x86/ptrace-abi.h" that used u32 members, but u32 is defined in
Packit bf408e
+ * "asm-x86/types.h" within a __KERNEL__ section.  They've been changed
Packit bf408e
+ * to __u32, but this patch remains for building in that environment.
Packit bf408e
+ */
Packit bf408e
+typedef unsigned int u32;
Packit bf408e
+#endif
Packit bf408e
 #include <asm/ptrace.h>
Packit bf408e
 #include <sys/reg.h>
Packit bf408e
 #include "gdb_proc_service.h"
Packit bf408e
--- gdb-7.6/gdb/symfile.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symfile.c
Packit bf408e
@@ -693,7 +693,26 @@ default_symfile_offsets (struct objfile
Packit bf408e
       for (cur_sec = abfd->sections; cur_sec != NULL; cur_sec = cur_sec->next)
Packit bf408e
 	/* We do not expect this to happen; just skip this step if the
Packit bf408e
 	   relocatable file has a section with an assigned VMA.  */
Packit bf408e
-	if (bfd_section_vma (abfd, cur_sec) != 0)
Packit bf408e
+	if (bfd_section_vma (abfd, cur_sec) != 0
Packit bf408e
+           /*
Packit bf408e
+            *  Kernel modules may have some non-zero VMAs, i.e., like the
Packit bf408e
+            *  __ksymtab and __ksymtab_gpl sections in this example:
Packit bf408e
+            *     
Packit bf408e
+            *    Section Headers:
Packit bf408e
+            *      [Nr] Name              Type             Address           Offset
Packit bf408e
+            *           Size              EntSize          Flags  Link  Info  Align
Packit bf408e
+            *      ...
Packit bf408e
+            *      [ 8] __ksymtab         PROGBITS         0000000000000060  0000ad90
Packit bf408e
+            *           0000000000000010  0000000000000000   A       0     0     16
Packit bf408e
+            *      [ 9] .rela__ksymtab    RELA             0000000000000000  0000ada0
Packit bf408e
+            *           0000000000000030  0000000000000018          43     8     8
Packit bf408e
+            *      [10] __ksymtab_gpl     PROGBITS         0000000000000070  0000add0
Packit bf408e
+            *           00000000000001a0  0000000000000000   A       0     0     16
Packit bf408e
+            *      ...
Packit bf408e
+            *
Packit bf408e
+            *  but they should be treated as if they are NULL.
Packit bf408e
+            */
Packit bf408e
+	    && strncmp (bfd_get_section_name (abfd, cur_sec), "__k", 3) != 0)
Packit bf408e
 	  break;
Packit bf408e
 
Packit bf408e
       if (cur_sec == NULL)
Packit bf408e
@@ -1122,6 +1141,12 @@ symbol_file_add_with_addrs_or_offsets (b
Packit bf408e
     error (_("Not confirmed."));
Packit bf408e
 
Packit bf408e
   objfile = allocate_objfile (abfd, flags | (mainline ? OBJF_MAINLINE : 0));
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  if (add_flags & SYMFILE_MAINLINE) {
Packit bf408e
+    extern struct objfile *gdb_kernel_objfile;
Packit bf408e
+    gdb_kernel_objfile = objfile;
Packit bf408e
+  }
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   if (parent)
Packit bf408e
     add_separate_debug_objfile (objfile, parent);
Packit bf408e
@@ -1484,6 +1509,9 @@ find_separate_debug_file (const char *di
Packit bf408e
   VEC (char_ptr) *debugdir_vec;
Packit bf408e
   struct cleanup *back_to;
Packit bf408e
   int ix;
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  extern int check_specified_module_tree(char *, char *);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Set I to max (strlen (canon_dir), strlen (dir)).  */
Packit bf408e
   i = strlen (dir);
Packit bf408e
@@ -1513,6 +1541,15 @@ find_separate_debug_file (const char *di
Packit bf408e
   if (separate_debug_file_exists (debugfile, crc32, objfile))
Packit bf408e
     return debugfile;
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+{
Packit bf408e
+  if (check_specified_module_tree(objfile->name, debugfile) &&
Packit bf408e
+      separate_debug_file_exists(debugfile, crc32, objfile)) {
Packit bf408e
+        return debugfile;
Packit bf408e
+  }
Packit bf408e
+}
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
   /* Then try in the global debugfile directories.
Packit bf408e
 
Packit bf408e
      Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
Packit bf408e
@@ -1583,6 +1620,10 @@ find_separate_debug_file_by_debuglink (s
Packit bf408e
   char *debugfile;
Packit bf408e
   unsigned long crc32;
Packit bf408e
   struct cleanup *cleanups;
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  char *name_copy;
Packit bf408e
+  extern char *check_specified_kernel_debug_file();
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   debuglink = get_debug_link_info (objfile, &crc32);
Packit bf408e
 
Packit bf408e
@@ -1635,6 +1676,12 @@ find_separate_debug_file_by_debuglink (s
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
   do_cleanups (cleanups);
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  if (debugfile == NULL) {
Packit bf408e
+       name_copy = check_specified_kernel_debug_file();
Packit bf408e
+       return (name_copy ? xstrdup(name_copy) : NULL);
Packit bf408e
+  }
Packit bf408e
+#endif
Packit bf408e
   return debugfile;
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
@@ -2409,8 +2456,10 @@ add_symbol_file_command (char *args, int
Packit bf408e
 	 so we can't determine what section names are valid.  */
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
+#ifndef CRASH_MERGE
Packit bf408e
   if (from_tty && (!query ("%s", "")))
Packit bf408e
     error (_("Not confirmed."));
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   symbol_file_add (filename, from_tty ? SYMFILE_VERBOSE : 0,
Packit bf408e
                    section_addrs, flags);
Packit bf408e
@@ -3690,6 +3739,15 @@ bfd_byte *
Packit bf408e
 symfile_relocate_debug_section (struct objfile *objfile,
Packit bf408e
                                 asection *sectp, bfd_byte *buf)
Packit bf408e
 {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  /* Executable files have all the relocations already resolved.
Packit bf408e
+   * Handle files linked with --emit-relocs.
Packit bf408e
+   * http://sources.redhat.com/ml/gdb/2006-08/msg00137.html
Packit bf408e
+   */
Packit bf408e
+  bfd *abfd = objfile->obfd;
Packit bf408e
+  if ((abfd->flags & EXEC_P) != 0)
Packit bf408e
+    return NULL;
Packit bf408e
+#endif
Packit bf408e
   gdb_assert (objfile->sf->sym_relocate);
Packit bf408e
 
Packit bf408e
   return (*objfile->sf->sym_relocate) (objfile, sectp, buf);
Packit bf408e
--- gdb-7.6/gdb/cli/cli-cmds.c.orig
Packit bf408e
+++ gdb-7.6/gdb/cli/cli-cmds.c
Packit bf408e
@@ -466,6 +466,10 @@ show_script_ext_mode (struct ui_file *fi
Packit bf408e
    If SEARCH_PATH is non-zero, and the file isn't found in cwd,
Packit bf408e
    search for it in the source search path.  */
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+static int crash_from_tty = 0;
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
 int
Packit bf408e
 find_and_open_script (const char *script_file, int search_path,
Packit bf408e
 		      FILE **streamp, char **full_pathp)
Packit bf408e
@@ -508,6 +512,32 @@ find_and_open_script (const char *script
Packit bf408e
       return 0;
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  /*
Packit bf408e
+   * Only allow trusted versions of .gdbinit files to be
Packit bf408e
+   * sourced during session initialization.
Packit bf408e
+   */
Packit bf408e
+  if (crash_from_tty == -1)
Packit bf408e
+    {
Packit bf408e
+      struct stat statbuf;
Packit bf408e
+      FILE *stream = *streamp;
Packit bf408e
+      int fd = fileno (stream);
Packit bf408e
+      if (fstat (fd, &statbuf) < 0)
Packit bf408e
+        {
Packit bf408e
+          perror_with_name (*full_pathp);
Packit bf408e
+          fclose (stream);
Packit bf408e
+          return 0;
Packit bf408e
+        }
Packit bf408e
+      if (statbuf.st_uid != getuid () || (statbuf.st_mode & S_IWOTH))
Packit bf408e
+        {
Packit bf408e
+          extern void untrusted_file(FILE *, char *);
Packit bf408e
+          untrusted_file(NULL, *full_pathp);
Packit bf408e
+          fclose (stream);
Packit bf408e
+          return 0;
Packit bf408e
+        }
Packit bf408e
+    }
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
   return 1;
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
@@ -566,7 +596,11 @@ source_script_with_search (const char *f
Packit bf408e
          If the source command was invoked interactively, throw an
Packit bf408e
 	 error.  Otherwise (e.g. if it was invoked by a script),
Packit bf408e
 	 silently ignore the error.  */
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+      if (from_tty > 0)
Packit bf408e
+#else
Packit bf408e
       if (from_tty)
Packit bf408e
+#endif
Packit bf408e
 	perror_with_name (file);
Packit bf408e
       else
Packit bf408e
 	return;
Packit bf408e
@@ -589,7 +623,14 @@ source_script_with_search (const char *f
Packit bf408e
 void
Packit bf408e
 source_script (char *file, int from_tty)
Packit bf408e
 {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  crash_from_tty = from_tty;
Packit bf408e
+#endif
Packit bf408e
   source_script_with_search (file, from_tty, 0);
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  crash_from_tty = 0;
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
 /* Return the source_verbose global variable to its previous state
Packit bf408e
--- gdb-7.6/gdb/psymtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/psymtab.c
Packit bf408e
@@ -305,10 +305,14 @@ find_pc_sect_psymtab (struct objfile *ob
Packit bf408e
 		      struct minimal_symbol *msymbol)
Packit bf408e
 {
Packit bf408e
   struct partial_symtab *pst;
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  extern int gdb_line_number_callback(unsigned long, unsigned long, unsigned long);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
Packit bf408e
      than the later used TEXTLOW/TEXTHIGH one.  */
Packit bf408e
 
Packit bf408e
+#ifndef __i386__
Packit bf408e
   if (objfile->psymtabs_addrmap != NULL)
Packit bf408e
     {
Packit bf408e
       pst = addrmap_find (objfile->psymtabs_addrmap, pc);
Packit bf408e
@@ -343,6 +347,7 @@ find_pc_sect_psymtab (struct objfile *ob
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
  next:
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
Packit bf408e
      which still have no corresponding full SYMTABs read.  But it is not
Packit bf408e
@@ -361,7 +366,12 @@ find_pc_sect_psymtab (struct objfile *ob
Packit bf408e
 
Packit bf408e
 	best_pst = find_pc_sect_psymtab_closer (objfile, pc, section, pst,
Packit bf408e
 						msymbol);
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+        if ((best_pst != NULL) &&
Packit bf408e
+          gdb_line_number_callback(pc, pst->textlow, pst->texthigh))
Packit bf408e
+#else
Packit bf408e
 	if (best_pst != NULL)
Packit bf408e
+#endif
Packit bf408e
 	  return best_pst;
Packit bf408e
       }
Packit bf408e
 
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -1198,7 +1198,9 @@ demangle_for_lookup (const char *name, e
Packit bf408e
    doesn't affect these calls since they are looking for a known
Packit bf408e
    variable and thus can probably assume it will never hit the C++
Packit bf408e
    code).  */
Packit bf408e
-
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+static void gdb_bait_and_switch(char *, struct symbol *);
Packit bf408e
+#endif
Packit bf408e
 struct symbol *
Packit bf408e
 lookup_symbol_in_language (const char *name, const struct block *block,
Packit bf408e
 			   const domain_enum domain, enum language lang,
Packit bf408e
@@ -1212,17 +1214,30 @@ lookup_symbol_in_language (const char *n
Packit bf408e
 				 is_a_field_of_this);
Packit bf408e
   do_cleanups (cleanup);
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  if (returnval && (domain == VAR_DOMAIN))
Packit bf408e
+	gdb_bait_and_switch((char *)modified_name, returnval);
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
   return returnval;
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
 /* Behave like lookup_symbol_in_language, but performed with the
Packit bf408e
    current language.  */
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+static struct block *gdb_get_crash_block(void);
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
 struct symbol *
Packit bf408e
 lookup_symbol (const char *name, const struct block *block,
Packit bf408e
 	       domain_enum domain,
Packit bf408e
 	       struct field_of_this_result *is_a_field_of_this)
Packit bf408e
 {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  if (!block)
Packit bf408e
+    block = gdb_get_crash_block();
Packit bf408e
+#endif
Packit bf408e
   return lookup_symbol_in_language (name, block, domain,
Packit bf408e
 				    current_language->la_language,
Packit bf408e
 				    is_a_field_of_this);
Packit bf408e
@@ -5100,3 +5115,662 @@ When enabled, debugging messages are pri
Packit bf408e
 
Packit bf408e
   observer_attach_executable_changed (symtab_observer_executable_changed);
Packit bf408e
 }
Packit bf408e
+
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+#include "gdb-stabs.h"
Packit bf408e
+#include "version.h"
Packit bf408e
+#define GDB_COMMON
Packit bf408e
+#include "../../defs.h"
Packit bf408e
+
Packit bf408e
+static void get_member_data(struct gnu_request *, struct type *);
Packit bf408e
+static void dump_enum(struct type *, struct gnu_request *);
Packit bf408e
+static void eval_enum(struct type *, struct gnu_request *);
Packit bf408e
+static void gdb_get_line_number(struct gnu_request *);
Packit bf408e
+static void gdb_get_datatype(struct gnu_request *);
Packit bf408e
+static void gdb_get_symbol_type(struct gnu_request *);
Packit bf408e
+static void gdb_command_exists(struct gnu_request *);
Packit bf408e
+static void gdb_debug_command(struct gnu_request *);
Packit bf408e
+static void gdb_function_numargs(struct gnu_request *);
Packit bf408e
+static void gdb_add_symbol_file(struct gnu_request *);
Packit bf408e
+static void gdb_delete_symbol_file(struct gnu_request *);
Packit bf408e
+static void gdb_patch_symbol_values(struct gnu_request *);
Packit bf408e
+extern void replace_ui_file_FILE(struct ui_file *, FILE *);
Packit bf408e
+static void get_user_print_option_address(struct gnu_request *);
Packit bf408e
+extern int get_frame_offset(CORE_ADDR);
Packit bf408e
+static void gdb_set_crash_block(struct gnu_request *);
Packit bf408e
+void gdb_command_funnel(struct gnu_request *);
Packit bf408e
+
Packit bf408e
+struct objfile *gdb_kernel_objfile = { 0 };
Packit bf408e
+
Packit bf408e
+static ulong gdb_merge_flags = 0;
Packit bf408e
+#define KERNEL_SYMBOLS_PATCHED (0x1)
Packit bf408e
+
Packit bf408e
+#undef STREQ
Packit bf408e
+#define STREQ(A, B)      (A && B && (strcmp(A, B) == 0))
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  All commands from above come through here.
Packit bf408e
+ */
Packit bf408e
+void
Packit bf408e
+gdb_command_funnel(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        struct symbol *sym;
Packit bf408e
+
Packit bf408e
+	if (req->command != GNU_VERSION) {
Packit bf408e
+        	replace_ui_file_FILE(gdb_stdout, req->fp);
Packit bf408e
+        	replace_ui_file_FILE(gdb_stderr, req->fp);
Packit bf408e
+		do_cleanups(all_cleanups());
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+	switch (req->command)
Packit bf408e
+	{
Packit bf408e
+	case GNU_VERSION:
Packit bf408e
+		req->buf = (char *)version;
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+        case GNU_PASS_THROUGH:
Packit bf408e
+                execute_command(req->buf, 
Packit bf408e
+			req->flags & GNU_FROM_TTY_OFF ? FALSE : TRUE); 
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_USER_PRINT_OPTION:
Packit bf408e
+		get_user_print_option_address(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_RESOLVE_TEXT_ADDR:
Packit bf408e
+                sym = find_pc_function(req->addr);
Packit bf408e
+                if (!sym || TYPE_CODE(sym->type) != TYPE_CODE_FUNC) 
Packit bf408e
+                        req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+        case GNU_DISASSEMBLE:
Packit bf408e
+		if (req->addr2)
Packit bf408e
+                	sprintf(req->buf, "disassemble 0x%lx 0x%lx", 
Packit bf408e
+				req->addr, req->addr2); 
Packit bf408e
+		else
Packit bf408e
+                	sprintf(req->buf, "disassemble 0x%lx", req->addr); 
Packit bf408e
+                execute_command(req->buf, TRUE);
Packit bf408e
+                break;
Packit bf408e
+
Packit bf408e
+	case GNU_ADD_SYMBOL_FILE:
Packit bf408e
+		gdb_add_symbol_file(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_DELETE_SYMBOL_FILE:
Packit bf408e
+		gdb_delete_symbol_file(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_GET_LINE_NUMBER:
Packit bf408e
+		gdb_get_line_number(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_GET_DATATYPE:
Packit bf408e
+		gdb_get_datatype(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_GET_SYMBOL_TYPE:
Packit bf408e
+		gdb_get_symbol_type(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_COMMAND_EXISTS:
Packit bf408e
+		gdb_command_exists(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_ALPHA_FRAME_OFFSET:
Packit bf408e
+		req->value = 0;
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_FUNCTION_NUMARGS:
Packit bf408e
+		gdb_function_numargs(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_DEBUG_COMMAND:
Packit bf408e
+		gdb_debug_command(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_PATCH_SYMBOL_VALUES:
Packit bf408e
+		gdb_patch_symbol_values(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_SET_CRASH_BLOCK:
Packit bf408e
+		gdb_set_crash_block(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	default:
Packit bf408e
+		req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+		break;
Packit bf408e
+	}
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  Given a PC value, return the file and line number.
Packit bf408e
+ */
Packit bf408e
+static void
Packit bf408e
+gdb_get_line_number(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        struct symtab_and_line sal;
Packit bf408e
+	struct symbol *sym;
Packit bf408e
+        CORE_ADDR pc;
Packit bf408e
+
Packit bf408e
+#define LASTCHAR(s)      (s[strlen(s)-1])
Packit bf408e
+
Packit bf408e
+	/*
Packit bf408e
+	 * Prime the addrmap pump.
Packit bf408e
+	 */
Packit bf408e
+	if (req->name)
Packit bf408e
+		sym = lookup_symbol(req->name, 0, VAR_DOMAIN, 0);
Packit bf408e
+
Packit bf408e
+        pc = req->addr;
Packit bf408e
+
Packit bf408e
+        sal = find_pc_line(pc, 0);
Packit bf408e
+
Packit bf408e
+	if (!sal.symtab) {
Packit bf408e
+		req->buf[0] = '\0';
Packit bf408e
+		return;
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+        if (sal.symtab->filename && sal.symtab->dirname) {
Packit bf408e
+                if (sal.symtab->filename[0] == '/')
Packit bf408e
+                        sprintf(req->buf, "%s: %d",
Packit bf408e
+                                sal.symtab->filename, sal.line);
Packit bf408e
+                else
Packit bf408e
+                        sprintf(req->buf, "%s%s%s: %d",
Packit bf408e
+                                sal.symtab->dirname,
Packit bf408e
+                                LASTCHAR(sal.symtab->dirname) == '/' ? "" : "/",
Packit bf408e
+                                sal.symtab->filename, sal.line);
Packit bf408e
+        }
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  General purpose routine for determining datatypes.
Packit bf408e
+ */
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
+gdb_get_datatype(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+ 	register struct cleanup *old_chain = NULL;
Packit bf408e
+  	register struct type *type;
Packit bf408e
+	register struct type *typedef_type;
Packit bf408e
+  	struct expression *expr;
Packit bf408e
+	struct symbol *sym;
Packit bf408e
+        register int i;
Packit bf408e
+        struct field *nextfield;
Packit bf408e
+	struct value *val;
Packit bf408e
+
Packit bf408e
+	if (gdb_CRASHDEBUG(2))
Packit bf408e
+		console("gdb_get_datatype [%s] (a)\n", req->name);
Packit bf408e
+
Packit bf408e
+	req->typecode = TYPE_CODE_UNDEF;
Packit bf408e
+
Packit bf408e
+	/*
Packit bf408e
+	 *  lookup_symbol() will pick up struct and union names.
Packit bf408e
+	 */
Packit bf408e
+	sym = lookup_symbol(req->name, 0, STRUCT_DOMAIN, 0);
Packit bf408e
+	if (sym) {
Packit bf408e
+                req->typecode = TYPE_CODE(sym->type);
Packit bf408e
+                req->length = TYPE_LENGTH(sym->type);
Packit bf408e
+		if (req->member)
Packit bf408e
+			get_member_data(req, sym->type);
Packit bf408e
+			
Packit bf408e
+		if (TYPE_CODE(sym->type) == TYPE_CODE_ENUM) {
Packit bf408e
+			if (req->flags & GNU_PRINT_ENUMERATORS) 
Packit bf408e
+				dump_enum(sym->type, req);
Packit bf408e
+		}
Packit bf408e
+
Packit bf408e
+		return;
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+	/*
Packit bf408e
+	 *  Otherwise parse the expression.
Packit bf408e
+	 */
Packit bf408e
+	if (gdb_CRASHDEBUG(2))
Packit bf408e
+		console("gdb_get_datatype [%s] (b)\n", req->name);
Packit bf408e
+
Packit bf408e
+        expr = parse_expression(req->name);
Packit bf408e
+
Packit bf408e
+        old_chain = make_cleanup(free_current_contents, &expr;;
Packit bf408e
+
Packit bf408e
+
Packit bf408e
+	switch (expr->elts[0].opcode)
Packit bf408e
+	{
Packit bf408e
+	case OP_VAR_VALUE:
Packit bf408e
+		if (gdb_CRASHDEBUG(2))
Packit bf408e
+        		console("expr->elts[0].opcode: OP_VAR_VALUE\n");
Packit bf408e
+		type = expr->elts[2].symbol->type;
Packit bf408e
+		if (req->flags & GNU_VAR_LENGTH_TYPECODE) {
Packit bf408e
+			req->typecode = TYPE_CODE(type);
Packit bf408e
+			req->length = TYPE_LENGTH(type);
Packit bf408e
+		}
Packit bf408e
+		if (TYPE_CODE(type) == TYPE_CODE_ENUM) {
Packit bf408e
+			req->typecode = TYPE_CODE(type);
Packit bf408e
+			req->value = SYMBOL_VALUE(expr->elts[2].symbol);
Packit bf408e
+			req->tagname = (char *)TYPE_TAG_NAME(type);
Packit bf408e
+			if (!req->tagname) {
Packit bf408e
+				val = evaluate_type(expr);
Packit bf408e
+				eval_enum(value_type(val), req);
Packit bf408e
+			}
Packit bf408e
+		}
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+  	case OP_TYPE:
Packit bf408e
+		if (gdb_CRASHDEBUG(2))
Packit bf408e
+        		console("expr->elts[0].opcode: OP_TYPE\n");
Packit bf408e
+    		type = expr->elts[1].type;
Packit bf408e
+
Packit bf408e
+		req->typecode = TYPE_CODE(type);
Packit bf408e
+		req->length = TYPE_LENGTH(type);
Packit bf408e
+
Packit bf408e
+        	if (TYPE_CODE(type) == TYPE_CODE_TYPEDEF) {
Packit bf408e
+			req->is_typedef = TYPE_CODE_TYPEDEF;
Packit bf408e
+                	if ((typedef_type = check_typedef(type))) {
Packit bf408e
+                        	req->typecode = TYPE_CODE(typedef_type);
Packit bf408e
+                        	req->length = TYPE_LENGTH(typedef_type);
Packit bf408e
+				type = typedef_type;
Packit bf408e
+			}
Packit bf408e
+		} 
Packit bf408e
+
Packit bf408e
+                if (TYPE_CODE(type) == TYPE_CODE_ENUM) {
Packit bf408e
+			if (req->is_typedef)
Packit bf408e
+                        if (req->flags & GNU_PRINT_ENUMERATORS) {
Packit bf408e
+				if (req->is_typedef)
Packit bf408e
+					fprintf_filtered(gdb_stdout,
Packit bf408e
+						"typedef ");
Packit bf408e
+                                dump_enum(type, req);
Packit bf408e
+			}
Packit bf408e
+		}
Packit bf408e
+
Packit bf408e
+                if (req->member) 
Packit bf408e
+                	get_member_data(req, type); 
Packit bf408e
+		
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	default:
Packit bf408e
+		if (gdb_CRASHDEBUG(2))
Packit bf408e
+			console("expr->elts[0].opcode: %d (?)\n",
Packit bf408e
+				expr->elts[0].opcode);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	} 
Packit bf408e
+
Packit bf408e
+        do_cleanups(old_chain);
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  More robust enum list dump that gdb's, showing the value of each
Packit bf408e
+ *  identifier, each on its own line.
Packit bf408e
+ */
Packit bf408e
+static void
Packit bf408e
+dump_enum(struct type *type, struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+	register int i;
Packit bf408e
+	int len;
Packit bf408e
+	int lastval;
Packit bf408e
+
Packit bf408e
+        len = TYPE_NFIELDS (type);
Packit bf408e
+        lastval = 0;
Packit bf408e
+	if (TYPE_TAG_NAME(type))
Packit bf408e
+        	fprintf_filtered(gdb_stdout, 
Packit bf408e
+			"enum %s {\n", TYPE_TAG_NAME (type));
Packit bf408e
+	else
Packit bf408e
+		fprintf_filtered(gdb_stdout, "enum {\n");
Packit bf408e
+
Packit bf408e
+        for (i = 0; i < len; i++) {
Packit bf408e
+        	fprintf_filtered(gdb_stdout, "  %s", 
Packit bf408e
+			TYPE_FIELD_NAME (type, i));
Packit bf408e
+                if (lastval != TYPE_FIELD_BITPOS (type, i)) {
Packit bf408e
+                	fprintf_filtered (gdb_stdout, " = %d",
Packit bf408e
+                        	TYPE_FIELD_BITPOS (type, i));
Packit bf408e
+                        lastval = TYPE_FIELD_BITPOS (type, i);
Packit bf408e
+                } else
Packit bf408e
+                        fprintf_filtered(gdb_stdout, " = %d", lastval);
Packit bf408e
+                fprintf_filtered(gdb_stdout, "\n");
Packit bf408e
+                lastval++;
Packit bf408e
+        }
Packit bf408e
+	if (TYPE_TAG_NAME(type))
Packit bf408e
+		fprintf_filtered(gdb_stdout, "};\n");
Packit bf408e
+	else
Packit bf408e
+		fprintf_filtered(gdb_stdout, "} %s;\n", req->name);
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  Given an enum type with no tagname, determine its value.
Packit bf408e
+ */
Packit bf408e
+static void
Packit bf408e
+eval_enum(struct type *type, struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        register int i;
Packit bf408e
+        int len;
Packit bf408e
+        int lastval;
Packit bf408e
+
Packit bf408e
+        len = TYPE_NFIELDS (type);
Packit bf408e
+        lastval = 0;
Packit bf408e
+
Packit bf408e
+        for (i = 0; i < len; i++) {
Packit bf408e
+                if (lastval != TYPE_FIELD_BITPOS (type, i)) {
Packit bf408e
+                        lastval = TYPE_FIELD_BITPOS (type, i);
Packit bf408e
+                } 
Packit bf408e
+		if (STREQ(TYPE_FIELD_NAME(type, i), req->name)) {
Packit bf408e
+			req->tagname = "(unknown)";
Packit bf408e
+			req->value = lastval;
Packit bf408e
+			return;
Packit bf408e
+		}
Packit bf408e
+                lastval++;
Packit bf408e
+        }
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  Walk through a struct type's list of fields looking for the desired
Packit bf408e
+ *  member field, and when found, return its relevant data.
Packit bf408e
+ */
Packit bf408e
+static void
Packit bf408e
+get_member_data(struct gnu_request *req, struct type *type)
Packit bf408e
+{
Packit bf408e
+	register short i;
Packit bf408e
+	struct field *nextfield;
Packit bf408e
+	short nfields;
Packit bf408e
+	struct type *typedef_type;
Packit bf408e
+
Packit bf408e
+	req->member_offset = -1;
Packit bf408e
+
Packit bf408e
+	nfields = TYPE_MAIN_TYPE(type)->nfields;
Packit bf408e
+	nextfield = TYPE_MAIN_TYPE(type)->flds_bnds.fields;
Packit bf408e
+
Packit bf408e
+        if (nfields == 0) {
Packit bf408e
+		struct type *newtype;
Packit bf408e
+                newtype = lookup_transparent_type(req->name);
Packit bf408e
+                if (newtype) {
Packit bf408e
+                        console("get_member_data(%s.%s): switching type from %lx to %lx\n", 
Packit bf408e
+				req->name, req->member, type, newtype);
Packit bf408e
+                	nfields = TYPE_MAIN_TYPE(newtype)->nfields;
Packit bf408e
+                	nextfield = TYPE_MAIN_TYPE(newtype)->flds_bnds.fields;
Packit bf408e
+		}
Packit bf408e
+        }
Packit bf408e
+
Packit bf408e
+	for (i = 0; i < nfields; i++) {
Packit bf408e
+		if (STREQ(req->member, nextfield->name)) {
Packit bf408e
+			req->member_offset = nextfield->loc.bitpos;
Packit bf408e
+			req->member_length = TYPE_LENGTH(nextfield->type);
Packit bf408e
+			req->member_typecode = TYPE_CODE(nextfield->type);
Packit bf408e
+			if ((req->member_typecode == TYPE_CODE_TYPEDEF) &&
Packit bf408e
+			    (typedef_type = check_typedef(nextfield->type))) 
Packit bf408e
+        			req->member_length = TYPE_LENGTH(typedef_type);
Packit bf408e
+			return;
Packit bf408e
+		}
Packit bf408e
+		nextfield++;
Packit bf408e
+	}
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  Check whether a command exists.  If it doesn't, the command will be 
Packit bf408e
+ *  returned indirectly via the error_hook.
Packit bf408e
+ */
Packit bf408e
+static void
Packit bf408e
+gdb_command_exists(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        extern struct cmd_list_element *cmdlist;
Packit bf408e
+        register struct cmd_list_element *c;
Packit bf408e
+
Packit bf408e
+        req->value = FALSE;
Packit bf408e
+        c = lookup_cmd(&req->name, cmdlist, "", 0, 1);
Packit bf408e
+        req->value = TRUE;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
+gdb_function_numargs(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        struct symbol *sym;
Packit bf408e
+
Packit bf408e
+        sym = find_pc_function(req->pc);
Packit bf408e
+
Packit bf408e
+        if (!sym || TYPE_CODE(sym->type) != TYPE_CODE_FUNC) {
Packit bf408e
+                req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+                return;
Packit bf408e
+        }
Packit bf408e
+
Packit bf408e
+	req->value = (ulong)TYPE_NFIELDS(sym->type);
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+struct load_module *gdb_current_load_module = NULL;
Packit bf408e
+
Packit bf408e
+static void 
Packit bf408e
+gdb_add_symbol_file(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+	register struct objfile *loaded_objfile = NULL;
Packit bf408e
+	register struct objfile *objfile;
Packit bf408e
+	register struct minimal_symbol *m;
Packit bf408e
+	struct load_module *lm;
Packit bf408e
+	int external, subsequent, found;
Packit bf408e
+	off_t offset;
Packit bf408e
+	ulong value, adjusted;
Packit bf408e
+	struct symbol *sym;
Packit bf408e
+	struct expression *expr;
Packit bf408e
+	struct cleanup *old_chain;
Packit bf408e
+	int i;
Packit bf408e
+        int allsect = 0;
Packit bf408e
+        char *secname;
Packit bf408e
+        char buf[80];
Packit bf408e
+    
Packit bf408e
+	gdb_current_load_module = lm = (struct load_module *)req->addr;
Packit bf408e
+
Packit bf408e
+	req->name = lm->mod_namelist;
Packit bf408e
+	gdb_delete_symbol_file(req);
Packit bf408e
+
Packit bf408e
+	if ((lm->mod_flags & MOD_NOPATCH) == 0) {
Packit bf408e
+	        for (i = 0 ; i < lm->mod_sections; i++) {
Packit bf408e
+	            if (STREQ(lm->mod_section_data[i].name, ".text") &&
Packit bf408e
+	                (lm->mod_section_data[i].flags & SEC_FOUND))
Packit bf408e
+	                    allsect = 1;
Packit bf408e
+	        }
Packit bf408e
+	
Packit bf408e
+	        if (!allsect) {
Packit bf408e
+	            sprintf(req->buf, "add-symbol-file %s 0x%lx %s", lm->mod_namelist,
Packit bf408e
+	                    lm->mod_text_start ? lm->mod_text_start : lm->mod_base,
Packit bf408e
+			    lm->mod_flags & MOD_DO_READNOW ? "-readnow" : "");
Packit bf408e
+		    if (lm->mod_data_start) {
Packit bf408e
+	                    sprintf(buf, " -s .data 0x%lx", lm->mod_data_start);
Packit bf408e
+	                    strcat(req->buf, buf);
Packit bf408e
+		    }
Packit bf408e
+		    if (lm->mod_bss_start) {
Packit bf408e
+	                    sprintf(buf, " -s .bss 0x%lx", lm->mod_bss_start);
Packit bf408e
+	                    strcat(req->buf, buf);
Packit bf408e
+		    }
Packit bf408e
+		    if (lm->mod_rodata_start) {
Packit bf408e
+	                    sprintf(buf, " -s .rodata 0x%lx", lm->mod_rodata_start);
Packit bf408e
+	                    strcat(req->buf, buf);
Packit bf408e
+		    }
Packit bf408e
+	        } else {
Packit bf408e
+	            sprintf(req->buf, "add-symbol-file %s 0x%lx %s", lm->mod_namelist,
Packit bf408e
+	                    lm->mod_text_start, lm->mod_flags & MOD_DO_READNOW ?
Packit bf408e
+			    "-readnow" : "");
Packit bf408e
+	            for (i = 0; i < lm->mod_sections; i++) {
Packit bf408e
+	                    secname = lm->mod_section_data[i].name;
Packit bf408e
+	                    if ((lm->mod_section_data[i].flags & SEC_FOUND) &&
Packit bf408e
+	                        !STREQ(secname, ".text")) {
Packit bf408e
+	                            sprintf(buf, " -s %s 0x%lx", secname,
Packit bf408e
+	                                lm->mod_section_data[i].offset + lm->mod_base);
Packit bf408e
+	                            strcat(req->buf, buf);
Packit bf408e
+	                    }
Packit bf408e
+	            }
Packit bf408e
+	        }
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+	if (gdb_CRASHDEBUG(1))
Packit bf408e
+            fprintf_filtered(gdb_stdout, "%s\n", req->buf);
Packit bf408e
+
Packit bf408e
+       	execute_command(req->buf, FALSE);
Packit bf408e
+
Packit bf408e
+        ALL_OBJFILES(objfile) {
Packit bf408e
+		if (same_file(objfile->name, lm->mod_namelist)) {
Packit bf408e
+                        loaded_objfile = objfile;
Packit bf408e
+			break;
Packit bf408e
+		}
Packit bf408e
+        }
Packit bf408e
+
Packit bf408e
+	if (!loaded_objfile)
Packit bf408e
+                req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
+gdb_delete_symbol_file(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        register struct objfile *objfile;
Packit bf408e
+
Packit bf408e
+        ALL_OBJFILES(objfile) {
Packit bf408e
+                if (STREQ(objfile->name, req->name) || 
Packit bf408e
+		    same_file(objfile->name, req->name)) {
Packit bf408e
+                	free_objfile(objfile);
Packit bf408e
+			break;
Packit bf408e
+                }
Packit bf408e
+        }
Packit bf408e
+
Packit bf408e
+	if (gdb_CRASHDEBUG(2)) {
Packit bf408e
+		fprintf_filtered(gdb_stdout, "current object files:\n");
Packit bf408e
+		ALL_OBJFILES(objfile) 
Packit bf408e
+			fprintf_filtered(gdb_stdout, "  %s\n", objfile->name); 
Packit bf408e
+	}
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  Walk through all minimal_symbols, patching their values with the
Packit bf408e
+ *  correct addresses.
Packit bf408e
+ */
Packit bf408e
+static void 
Packit bf408e
+gdb_patch_symbol_values(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+	struct minimal_symbol *msymbol;
Packit bf408e
+	struct objfile *objfile;
Packit bf408e
+
Packit bf408e
+	req->name = PATCH_KERNEL_SYMBOLS_START;
Packit bf408e
+	patch_kernel_symbol(req);
Packit bf408e
+
Packit bf408e
+	ALL_MSYMBOLS (objfile, msymbol)
Packit bf408e
+	{
Packit bf408e
+		req->name = (char *)msymbol->ginfo.name;
Packit bf408e
+		req->addr = (ulong)(&SYMBOL_VALUE_ADDRESS(msymbol));
Packit bf408e
+		if (!patch_kernel_symbol(req)) {
Packit bf408e
+			req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+			break;
Packit bf408e
+		}
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+	req->name = PATCH_KERNEL_SYMBOLS_STOP;
Packit bf408e
+	patch_kernel_symbol(req);
Packit bf408e
+
Packit bf408e
+	clear_symtab_users(0);
Packit bf408e
+	gdb_merge_flags |= KERNEL_SYMBOLS_PATCHED;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
+gdb_get_symbol_type(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+        struct expression *expr;
Packit bf408e
+        struct value *val;
Packit bf408e
+        struct cleanup *old_chain = NULL;
Packit bf408e
+        struct type *type;
Packit bf408e
+	struct type *target_type;
Packit bf408e
+
Packit bf408e
+	req->typecode = TYPE_CODE_UNDEF;
Packit bf408e
+
Packit bf408e
+        expr = parse_expression (req->name);
Packit bf408e
+        old_chain = make_cleanup (free_current_contents, &expr;;
Packit bf408e
+        val = evaluate_type (expr);
Packit bf408e
+
Packit bf408e
+        type = value_type(val);
Packit bf408e
+
Packit bf408e
+	req->type_name = (char *)TYPE_MAIN_TYPE(type)->name;
Packit bf408e
+	req->typecode = TYPE_MAIN_TYPE(type)->code;
Packit bf408e
+	req->length = type->length;
Packit bf408e
+	target_type = TYPE_MAIN_TYPE(type)->target_type;
Packit bf408e
+
Packit bf408e
+	if (target_type) {
Packit bf408e
+		req->target_typename = (char *)TYPE_MAIN_TYPE(target_type)->name;
Packit bf408e
+		req->target_typecode = TYPE_MAIN_TYPE(target_type)->code;
Packit bf408e
+		req->target_length = target_type->length;
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+	if (req->member) 
Packit bf408e
+		get_member_data(req, type);
Packit bf408e
+
Packit bf408e
+        do_cleanups (old_chain);
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
+gdb_debug_command(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+/*
Packit bf408e
+ *  Only necessary on "patched" kernel symbol sessions, and called only by
Packit bf408e
+ *  lookup_symbol(), pull a symbol value bait-and-switch operation by altering
Packit bf408e
+ *  either a data symbol's address value or a text symbol's block start address.
Packit bf408e
+ */
Packit bf408e
+static void
Packit bf408e
+gdb_bait_and_switch(char *name, struct symbol *sym)
Packit bf408e
+{
Packit bf408e
+	struct minimal_symbol *msym;
Packit bf408e
+	struct block *block;
Packit bf408e
+
Packit bf408e
+	if ((gdb_merge_flags & KERNEL_SYMBOLS_PATCHED) && 
Packit bf408e
+	    (msym = lookup_minimal_symbol(name, NULL, gdb_kernel_objfile))) {
Packit bf408e
+                if (sym->aclass == LOC_BLOCK) {
Packit bf408e
+                        block = (struct block *)SYMBOL_BLOCK_VALUE(sym);
Packit bf408e
+                        BLOCK_START(block) = SYMBOL_VALUE_ADDRESS(msym);
Packit bf408e
+                } else 
Packit bf408e
+                        SYMBOL_VALUE_ADDRESS(sym) = SYMBOL_VALUE_ADDRESS(msym);
Packit bf408e
+	} 
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+#include "valprint.h"
Packit bf408e
+
Packit bf408e
+void
Packit bf408e
+get_user_print_option_address(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+	extern struct value_print_options user_print_options;
Packit bf408e
+
Packit bf408e
+	req->addr = 0;
Packit bf408e
+
Packit bf408e
+        if (strcmp(req->name, "output_format") == 0)
Packit bf408e
+                req->addr = (ulong)&user_print_options.output_format;
Packit bf408e
+        if (strcmp(req->name, "print_max") == 0)
Packit bf408e
+                req->addr = (ulong)&user_print_options.print_max;
Packit bf408e
+        if (strcmp(req->name, "prettyprint_structs") == 0)
Packit bf408e
+                req->addr = (ulong)&user_print_options.prettyprint_structs;
Packit bf408e
+        if (strcmp(req->name, "prettyprint_arrays") == 0)
Packit bf408e
+                req->addr = (ulong)&user_print_options.prettyprint_arrays;
Packit bf408e
+        if (strcmp(req->name, "repeat_count_threshold") == 0)
Packit bf408e
+                req->addr = (ulong)&user_print_options.repeat_count_threshold;
Packit bf408e
+        if (strcmp(req->name, "stop_print_at_null") == 0)
Packit bf408e
+                req->addr = (ulong)&user_print_options.stop_print_at_null;
Packit bf408e
+        if (strcmp(req->name, "output_radix") == 0)
Packit bf408e
+                req->addr = (ulong)&output_radix;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+CORE_ADDR crash_text_scope;
Packit bf408e
+
Packit bf408e
+static void 
Packit bf408e
+gdb_set_crash_block(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+	if (!req->addr) {  /* debug */
Packit bf408e
+		crash_text_scope = 0;
Packit bf408e
+		return;
Packit bf408e
+	}
Packit bf408e
+
Packit bf408e
+	if ((req->addr2 = (ulong)block_for_pc(req->addr)))
Packit bf408e
+		crash_text_scope = req->addr;
Packit bf408e
+	else {
Packit bf408e
+		crash_text_scope = 0;
Packit bf408e
+		req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+	}
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static struct block *
Packit bf408e
+gdb_get_crash_block(void)
Packit bf408e
+{
Packit bf408e
+	if (crash_text_scope)
Packit bf408e
+		return block_for_pc(crash_text_scope);
Packit bf408e
+	else
Packit bf408e
+		return NULL;
Packit bf408e
+}
Packit bf408e
+#endif
Packit bf408e
--- gdb-7.6/gdb/c-typeprint.c.orig
Packit bf408e
+++ gdb-7.6/gdb/c-typeprint.c
Packit bf408e
@@ -1097,7 +1097,8 @@ c_type_print_base (struct type *type, st
Packit bf408e
 		  fprintf_filtered (stream, "static ");
Packit bf408e
 		c_print_type (TYPE_FIELD_TYPE (type, i),
Packit bf408e
 			      TYPE_FIELD_NAME (type, i),
Packit bf408e
-			      stream, show - 1, level + 4,
Packit bf408e
+			      stream, strlen(TYPE_FIELD_NAME (type, i)) ?
Packit bf408e
+			      show - 1 : show, level + 4,
Packit bf408e
 			      &local_flags);
Packit bf408e
 		if (!field_is_static (&TYPE_FIELD (type, i))
Packit bf408e
 		    && TYPE_FIELD_PACKED (type, i))
Packit bf408e
--- gdb-7.6/gdb/xml-syscall.c.orig
Packit bf408e
+++ gdb-7.6/gdb/xml-syscall.c
Packit bf408e
@@ -38,7 +38,11 @@
Packit bf408e
 static void
Packit bf408e
 syscall_warn_user (void)
Packit bf408e
 {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  static int have_warned = 1;
Packit bf408e
+#else
Packit bf408e
   static int have_warned = 0;
Packit bf408e
+#endif
Packit bf408e
   if (!have_warned)
Packit bf408e
     {
Packit bf408e
       have_warned = 1;
Packit bf408e
--- gdb-7.6/gdb/exceptions.c.orig
Packit bf408e
+++ gdb-7.6/gdb/exceptions.c
Packit bf408e
@@ -218,6 +218,10 @@ exceptions_state_mc_action_iter_1 (void)
Packit bf408e
 
Packit bf408e
 /* Return EXCEPTION to the nearest containing catch_errors().  */
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+void (*error_hook) (void) ATTRIBUTE_NORETURN;
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
 void
Packit bf408e
 throw_exception (struct gdb_exception exception)
Packit bf408e
 {
Packit bf408e
@@ -225,6 +229,13 @@ throw_exception (struct gdb_exception ex
Packit bf408e
   immediate_quit = 0;
Packit bf408e
 
Packit bf408e
   do_cleanups (all_cleanups ());
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  if (error_hook) {
Packit bf408e
+	fprintf_filtered(gdb_stderr, "%s\n", exception.message);
Packit bf408e
+	(*error_hook)();
Packit bf408e
+  } else
Packit bf408e
+	fprintf_filtered(gdb_stderr, "gdb called without error_hook: %s\n", exception.message);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Jump to the containing catch_errors() call, communicating REASON
Packit bf408e
      to that call via setjmp's return value.  Note that REASON can't
Packit bf408e
--- gdb-7.6/gdb/valprint.h.orig
Packit bf408e
+++ gdb-7.6/gdb/valprint.h
Packit bf408e
@@ -152,11 +152,17 @@ extern void print_function_pointer_addre
Packit bf408e
 					    struct gdbarch *gdbarch,
Packit bf408e
 					    CORE_ADDR address,
Packit bf408e
 					    struct ui_file *stream);
Packit bf408e
-
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+extern int valprint_read_string (CORE_ADDR addr, int len, int width,
Packit bf408e
+			unsigned int fetchlimit,
Packit bf408e
+			enum bfd_endian byte_order, gdb_byte **buffer,
Packit bf408e
+			int *bytes_read);
Packit bf408e
+#else
Packit bf408e
 extern int read_string (CORE_ADDR addr, int len, int width,
Packit bf408e
 			unsigned int fetchlimit,
Packit bf408e
 			enum bfd_endian byte_order, gdb_byte **buffer,
Packit bf408e
 			int *bytes_read);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
 extern void val_print_optimized_out (struct ui_file *stream);
Packit bf408e
 
Packit bf408e
--- gdb-7.6/gdb/target.c.orig
Packit bf408e
+++ gdb-7.6/gdb/target.c
Packit bf408e
@@ -1779,6 +1779,13 @@ target_xfer_partial (struct target_ops *
Packit bf408e
 int
Packit bf408e
 target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Packit bf408e
 {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  extern int gdb_readmem_callback(unsigned long, void *, int, int);
Packit bf408e
+  if (gdb_readmem_callback(memaddr, (void *)myaddr, len, 0))
Packit bf408e
+        return 0;
Packit bf408e
+  else
Packit bf408e
+	return EIO;
Packit bf408e
+#endif
Packit bf408e
   /* Dispatch to the topmost target, not the flattened current_target.
Packit bf408e
      Memory accesses check target->to_has_(all_)memory, and the
Packit bf408e
      flattened target doesn't inherit those.  */
Packit bf408e
@@ -1814,6 +1821,13 @@ target_read_stack (CORE_ADDR memaddr, gd
Packit bf408e
 int
Packit bf408e
 target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
Packit bf408e
 {
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  extern int gdb_readmem_callback(unsigned long, void *, int, int);
Packit bf408e
+  if (gdb_readmem_callback(memaddr, (void *)myaddr, len, 1))
Packit bf408e
+        return 0;
Packit bf408e
+  else
Packit bf408e
+        return EIO;
Packit bf408e
+#endif
Packit bf408e
   /* Dispatch to the topmost target, not the flattened current_target.
Packit bf408e
      Memory accesses check target->to_has_(all_)memory, and the
Packit bf408e
      flattened target doesn't inherit those.  */
Packit bf408e
--- gdb-7.6/gdb/printcmd.c.orig
Packit bf408e
+++ gdb-7.6/gdb/printcmd.c
Packit bf408e
@@ -1001,11 +1001,62 @@ print_command_1 (char *exp, int voidprin
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
 static void
Packit bf408e
+print_command_2 (char *exp, int inspect, int voidprint)
Packit bf408e
+{
Packit bf408e
+  struct expression *expr;
Packit bf408e
+  struct cleanup *old_chain = 0;
Packit bf408e
+  char format = 0;
Packit bf408e
+  struct value *val;
Packit bf408e
+  struct format_data fmt;
Packit bf408e
+  int cleanup = 0;
Packit bf408e
+
Packit bf408e
+  if (exp && *exp == '/')
Packit bf408e
+    {
Packit bf408e
+      exp++;
Packit bf408e
+      fmt = decode_format (&exp, last_format, 0);
Packit bf408e
+      validate_format (fmt, "print");
Packit bf408e
+      last_format = format = fmt.format;
Packit bf408e
+    }
Packit bf408e
+  else
Packit bf408e
+    {
Packit bf408e
+      fmt.count = 1;
Packit bf408e
+      fmt.format = 0;
Packit bf408e
+      fmt.size = 0;
Packit bf408e
+      fmt.raw = 0;
Packit bf408e
+    }
Packit bf408e
+
Packit bf408e
+  if (exp && *exp)
Packit bf408e
+    {
Packit bf408e
+      expr = parse_expression (exp);
Packit bf408e
+      old_chain = make_cleanup (free_current_contents, &expr;;
Packit bf408e
+      cleanup = 1;
Packit bf408e
+      val = evaluate_expression (expr);
Packit bf408e
+    }
Packit bf408e
+  else
Packit bf408e
+    val = access_value_history (0);
Packit bf408e
+
Packit bf408e
+    printf_filtered ("%d %d %d %d %d %d\n",
Packit bf408e
+      TYPE_CODE (check_typedef(value_type (val))),
Packit bf408e
+      TYPE_UNSIGNED (check_typedef(value_type (val))),
Packit bf408e
+      TYPE_LENGTH (check_typedef(value_type(val))),
Packit bf408e
+      value_offset (val), value_bitpos (val), value_bitsize(val));
Packit bf408e
+
Packit bf408e
+  if (cleanup)
Packit bf408e
+    do_cleanups (old_chain);
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
 print_command (char *exp, int from_tty)
Packit bf408e
 {
Packit bf408e
   print_command_1 (exp, 1);
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
+static void
Packit bf408e
+printm_command (char *exp, int from_tty)
Packit bf408e
+{
Packit bf408e
+  print_command_2 (exp, 0, 1);
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
 /* Same as print, except it doesn't print void results.  */
Packit bf408e
 static void
Packit bf408e
 call_command (char *exp, int from_tty)
Packit bf408e
@@ -2593,6 +2644,12 @@ EXP may be preceded with /FMT, where FMT
Packit bf408e
 but no count or size letter (see \"x\" command)."));
Packit bf408e
   set_cmd_completer (c, expression_completer);
Packit bf408e
   add_com_alias ("p", "print", class_vars, 1);
Packit bf408e
+
Packit bf408e
+  c = add_com ("printm", class_vars, printm_command, _("\
Packit bf408e
+Similar to \"print\" command, but it used to print the type, size, offset,\n\
Packit bf408e
+bitpos and bitsize of the expression EXP."));
Packit bf408e
+  set_cmd_completer (c, expression_completer);
Packit bf408e
+
Packit bf408e
   add_com_alias ("inspect", "print", class_vars, 1);
Packit bf408e
 
Packit bf408e
   add_setshow_uinteger_cmd ("max-symbolic-offset", no_class,
Packit bf408e
--- gdb-7.6/gdb/ui-file.c.orig
Packit bf408e
+++ gdb-7.6/gdb/ui-file.c
Packit bf408e
@@ -671,6 +671,17 @@ gdb_fopen (char *name, char *mode)
Packit bf408e
   return stdio_file_new (f, 1);
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+void
Packit bf408e
+replace_ui_file_FILE(struct ui_file *file, FILE *fp)
Packit bf408e
+{
Packit bf408e
+	struct stdio_file *stdio_file;
Packit bf408e
+
Packit bf408e
+	stdio_file = (struct stdio_file *)ui_file_data(file);
Packit bf408e
+	stdio_file->file = fp;
Packit bf408e
+}
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
 /* ``struct ui_file'' implementation that maps onto two ui-file objects.  */
Packit bf408e
 
Packit bf408e
 static ui_file_write_ftype tee_file_write;
Packit bf408e
--- gdb-7.6/gdb/main.c.orig
Packit bf408e
+++ gdb-7.6/gdb/main.c
Packit bf408e
@@ -806,7 +806,7 @@ captured_main (void *data)
Packit bf408e
     {
Packit bf408e
       print_gdb_version (gdb_stdout);
Packit bf408e
       wrap_here ("");
Packit bf408e
-      printf_filtered ("\n");
Packit bf408e
+      printf_filtered ("\n\n");
Packit bf408e
       exit (0);
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
@@ -853,6 +853,13 @@ captured_main (void *data)
Packit bf408e
       }
Packit bf408e
   }
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+{
Packit bf408e
+	extern void update_gdb_hooks(void);
Packit bf408e
+	update_gdb_hooks();
Packit bf408e
+}
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
   /* FIXME: cagney/2003-02-03: The big hack (part 2 of 2) that lets
Packit bf408e
      GDB retain the old MI1 interpreter startup behavior.  Output the
Packit bf408e
      copyright message after the interpreter is installed when it is
Packit bf408e
@@ -880,7 +887,11 @@ captured_main (void *data)
Packit bf408e
      processed; it sets global parameters, which are independent of
Packit bf408e
      what file you are debugging or what directory you are in.  */
Packit bf408e
   if (system_gdbinit && !inhibit_gdbinit)
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+    catch_command_errors (source_script, system_gdbinit, -1, RETURN_MASK_ALL);
Packit bf408e
+#else
Packit bf408e
     catch_command_errors (source_script, system_gdbinit, 0, RETURN_MASK_ALL);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Read and execute $HOME/.gdbinit file, if it exists.  This is done
Packit bf408e
      *before* all the command line arguments are processed; it sets
Packit bf408e
@@ -888,7 +899,11 @@ captured_main (void *data)
Packit bf408e
      debugging or what directory you are in.  */
Packit bf408e
 
Packit bf408e
   if (home_gdbinit && !inhibit_gdbinit && !inhibit_home_gdbinit)
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+    catch_command_errors (source_script, home_gdbinit, -1, RETURN_MASK_ALL);
Packit bf408e
+#else
Packit bf408e
     catch_command_errors (source_script, home_gdbinit, 0, RETURN_MASK_ALL);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Process '-ix' and '-iex' options early.  */
Packit bf408e
   for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++)
Packit bf408e
@@ -929,8 +944,12 @@ captured_main (void *data)
Packit bf408e
          catch_command_errors returns non-zero on success!  */
Packit bf408e
       if (catch_command_errors (exec_file_attach, execarg,
Packit bf408e
 				!batch_flag, RETURN_MASK_ALL))
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+        catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
Packit bf408e
+#else
Packit bf408e
 	catch_command_errors (symbol_file_add_main, symarg,
Packit bf408e
 			      !batch_flag, RETURN_MASK_ALL);
Packit bf408e
+#endif
Packit bf408e
     }
Packit bf408e
   else
Packit bf408e
     {
Packit bf408e
@@ -992,8 +1011,12 @@ captured_main (void *data)
Packit bf408e
 	{
Packit bf408e
 	  auto_load_local_gdbinit_loaded = 1;
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+          catch_command_errors (source_script, local_gdbinit, -1, RETURN_MASK_ALL);
Packit bf408e
+#else
Packit bf408e
 	  catch_command_errors (source_script, local_gdbinit, 0,
Packit bf408e
 				RETURN_MASK_ALL);
Packit bf408e
+#endif
Packit bf408e
 	}
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
@@ -1039,6 +1062,12 @@ captured_main (void *data)
Packit bf408e
   while (1)
Packit bf408e
     {
Packit bf408e
       catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL);
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+      {
Packit bf408e
+        int console(char *, ...);
Packit bf408e
+        console("<CAPTURED_MAIN WHILE LOOP>\n");
Packit bf408e
+      }
Packit bf408e
+#endif
Packit bf408e
     }
Packit bf408e
   /* No exit -- exit is through quit_command.  */
Packit bf408e
 }
Packit bf408e
@@ -1053,6 +1082,23 @@ gdb_main (struct captured_main_args *arg
Packit bf408e
   return 1;
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+/*
Packit bf408e
+ *  NOTE: adapted from gdb.c, which is no longer built in; changed name of
Packit bf408e
+ *        original main() to gdb_main_entry() for use as crash entry point
Packit bf408e
+ */
Packit bf408e
+int
Packit bf408e
+gdb_main_entry (int argc, char **argv)
Packit bf408e
+{
Packit bf408e
+  struct captured_main_args args;
Packit bf408e
+  memset (&args, 0, sizeof args);
Packit bf408e
+  args.argc = argc;
Packit bf408e
+  args.argv = argv;
Packit bf408e
+  args.use_windows = 0;
Packit bf408e
+  args.interpreter_p = INTERP_CONSOLE;
Packit bf408e
+  return gdb_main (&args);
Packit bf408e
+}
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
 /* Don't use *_filtered for printing help.  We don't want to prompt
Packit bf408e
    for continue no matter how small the screen or how much we're going
Packit bf408e
--- gdb-7.6/gdb/valprint.c.orig
Packit bf408e
+++ gdb-7.6/gdb/valprint.c
Packit bf408e
@@ -1768,8 +1768,13 @@ partial_memory_read (CORE_ADDR memaddr,
Packit bf408e
    this function instead?  */
Packit bf408e
 
Packit bf408e
 int
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+valprint_read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
Packit bf408e
+	     enum bfd_endian byte_order, gdb_byte **buffer, int *bytes_read)
Packit bf408e
+#else
Packit bf408e
 read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
Packit bf408e
 	     enum bfd_endian byte_order, gdb_byte **buffer, int *bytes_read)
Packit bf408e
+#endif
Packit bf408e
 {
Packit bf408e
   int found_nul;		/* Non-zero if we found the nul char.  */
Packit bf408e
   int errcode;			/* Errno returned from bad reads.  */
Packit bf408e
@@ -2472,8 +2477,13 @@ val_print_string (struct type *elttype,
Packit bf408e
   fetchlimit = (len == -1 ? options->print_max : min (len,
Packit bf408e
 						      options->print_max));
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  errcode = valprint_read_string (addr, len, width, fetchlimit, byte_order,
Packit bf408e
+			 &buffer, &bytes_read);
Packit bf408e
+#else
Packit bf408e
   errcode = read_string (addr, len, width, fetchlimit, byte_order,
Packit bf408e
 			 &buffer, &bytes_read);
Packit bf408e
+#endif
Packit bf408e
   old_chain = make_cleanup (xfree, buffer);
Packit bf408e
 
Packit bf408e
   addr += bytes_read;
Packit bf408e
--- gdb-7.6/gdb/Makefile.in.orig
Packit bf408e
+++ gdb-7.6/gdb/Makefile.in
Packit bf408e
@@ -422,7 +422,7 @@ CONFIG_UNINSTALL = @CONFIG_UNINSTALL@
Packit bf408e
 # It is also possible that you will need to add -I/usr/include/sys if
Packit bf408e
 # your system doesn't have fcntl.h in /usr/include (which is where it
Packit bf408e
 # should be according to Posix).
Packit bf408e
-DEFS = @DEFS@
Packit bf408e
+DEFS = -DCRASH_MERGE @DEFS@
Packit bf408e
 GDB_CFLAGS = -I. -I$(srcdir) -I$(srcdir)/common -I$(srcdir)/config \
Packit bf408e
 	-DLOCALEDIR="\"$(localedir)\"" $(DEFS)
Packit bf408e
 
Packit bf408e
@@ -934,7 +934,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $
Packit bf408e
 
Packit bf408e
 TSOBS = inflow.o
Packit bf408e
 
Packit bf408e
-SUBDIRS = doc @subdirs@ data-directory $(GNULIB_BUILDDIR)
Packit bf408e
+SUBDIRS = build_no_subdirs
Packit bf408e
 CLEANDIRS = $(SUBDIRS)
Packit bf408e
 
Packit bf408e
 # List of subdirectories in the build tree that must exist.
Packit bf408e
@@ -969,8 +969,8 @@ generated_files = config.h observer.h ob
Packit bf408e
 	$(COMPILE) $<
Packit bf408e
 	$(POSTCOMPILE)
Packit bf408e
 
Packit bf408e
-all: gdb$(EXEEXT) $(CONFIG_ALL)
Packit bf408e
-	@$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do
Packit bf408e
+all: gdb$(EXEEXT)
Packit bf408e
+	@$(MAKE) -s $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do
Packit bf408e
 
Packit bf408e
 installcheck:
Packit bf408e
 
Packit bf408e
@@ -1172,15 +1172,16 @@ libgdb.a: $(LIBGDB_OBS)
Packit bf408e
 
Packit bf408e
 # Removing the old gdb first works better if it is running, at least on SunOS.
Packit bf408e
 gdb$(EXEEXT): gdb.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS)
Packit bf408e
-	rm -f gdb$(EXEEXT)
Packit bf408e
+	@rm -f gdb$(EXEEXT)
Packit bf408e
+	@(cd ../..; make --no-print-directory GDB_FLAGS=-DGDB_7_6 library)
Packit bf408e
 	$(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) \
Packit bf408e
-		-o gdb$(EXEEXT) gdb.o $(LIBGDB_OBS) \
Packit bf408e
-		$(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES)
Packit bf408e
+		-o $(shell /bin/cat mergeobj) $(LIBGDB_OBS) \
Packit bf408e
+		$(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES) $(shell /bin/cat mergelibs)
Packit bf408e
 
Packit bf408e
 # Convenience rule to handle recursion.
Packit bf408e
 $(LIBGNU) $(GNULIB_H): all-lib
Packit bf408e
 all-lib: $(GNULIB_BUILDDIR)/Makefile
Packit bf408e
-	@$(MAKE) $(FLAGS_TO_PASS) DO=all DODIRS=$(GNULIB_BUILDDIR) subdir_do
Packit bf408e
+	@$(MAKE) $(FLAGS_TO_PASS) DO=all DODIRS=$(GNULIB_BUILDDIR) subdir_do -s
Packit bf408e
 .PHONY: all-lib
Packit bf408e
 
Packit bf408e
 # Convenience rule to handle recursion.
Packit bf408e
@@ -1389,12 +1390,12 @@ $(srcdir)/copying.c: @MAINTAINER_MODE_TR
Packit bf408e
 	mv $(srcdir)/copying.tmp $(srcdir)/copying.c
Packit bf408e
 
Packit bf408e
 version.c: Makefile version.in
Packit bf408e
-	rm -f version.c-tmp version.c
Packit bf408e
-	echo '#include "version.h"' >> version.c-tmp
Packit bf408e
-	echo 'const char version[] = "'"`sed q ${srcdir}/version.in`"'";' >> version.c-tmp
Packit bf408e
-	echo 'const char host_name[] = "$(host_alias)";' >> version.c-tmp
Packit bf408e
-	echo 'const char target_name[] = "$(target_alias)";' >> version.c-tmp
Packit bf408e
-	mv version.c-tmp version.c
Packit bf408e
+	@rm -f version.c-tmp version.c
Packit bf408e
+	@echo '#include "version.h"' >> version.c-tmp
Packit bf408e
+	@echo 'const char version[] = "'"`sed q ${srcdir}/version.in`"'";' >> version.c-tmp
Packit bf408e
+	@echo 'const char host_name[] = "$(host_alias)";' >> version.c-tmp
Packit bf408e
+	@echo 'const char target_name[] = "$(target_alias)";' >> version.c-tmp
Packit bf408e
+	@mv version.c-tmp version.c
Packit bf408e
 
Packit bf408e
 observer.h: observer.sh doc/observer.texi
Packit bf408e
 	${srcdir}/observer.sh h ${srcdir}/doc/observer.texi observer.h
Packit bf408e
--- gdb-7.6/gdb/c-lang.c.orig
Packit bf408e
+++ gdb-7.6/gdb/c-lang.c
Packit bf408e
@@ -307,7 +307,11 @@ c_get_string (struct value *value, gdb_b
Packit bf408e
     {
Packit bf408e
       CORE_ADDR addr = value_as_address (value);
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+      err = valprint_read_string (addr, *length, width, fetchlimit,
Packit bf408e
+#else
Packit bf408e
       err = read_string (addr, *length, width, fetchlimit,
Packit bf408e
+#endif
Packit bf408e
 			 byte_order, buffer, length);
Packit bf408e
       if (err)
Packit bf408e
 	{
Packit bf408e
--- gdb-7.6/readline/rltypedefs.h.orig
Packit bf408e
+++ gdb-7.6/readline/rltypedefs.h
Packit bf408e
@@ -31,10 +31,10 @@ extern "C" {
Packit bf408e
 #if !defined (_FUNCTION_DEF)
Packit bf408e
 #  define _FUNCTION_DEF
Packit bf408e
 
Packit bf408e
-typedef int Function ();
Packit bf408e
-typedef void VFunction ();
Packit bf408e
-typedef char *CPFunction ();
Packit bf408e
-typedef char **CPPFunction ();
Packit bf408e
+typedef int Function (void);
Packit bf408e
+typedef void VFunction (void);
Packit bf408e
+typedef char *CPFunction (void);
Packit bf408e
+typedef char **CPPFunction (void);
Packit bf408e
 
Packit bf408e
 #endif /* _FUNCTION_DEF */
Packit bf408e
 
Packit bf408e
--- gdb-7.6/readline/readline.h.orig
Packit bf408e
+++ gdb-7.6/readline/readline.h
Packit bf408e
@@ -378,7 +378,7 @@ extern int rl_crlf PARAMS((void));
Packit bf408e
 #if defined (USE_VARARGS) && defined (PREFER_STDARG)
Packit bf408e
 extern int rl_message (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
Packit bf408e
 #else
Packit bf408e
-extern int rl_message ();
Packit bf408e
+extern int rl_message (void);
Packit bf408e
 #endif
Packit bf408e
 
Packit bf408e
 extern int rl_show_char PARAMS((int));
Packit bf408e
--- gdb-7.6/readline/misc.c.orig
Packit bf408e
+++ gdb-7.6/readline/misc.c
Packit bf408e
@@ -405,7 +405,7 @@ _rl_history_set_point ()
Packit bf408e
 
Packit bf408e
 #if defined (VI_MODE)
Packit bf408e
   if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap)
Packit bf408e
-    rl_point = 0;
Packit bf408e
+    rl_point = rl_end;
Packit bf408e
 #endif /* VI_MODE */
Packit bf408e
 
Packit bf408e
   if (rl_editing_mode == emacs_mode)
Packit bf408e
--- gdb-7.6/Makefile.in.orig
Packit bf408e
+++ gdb-7.6/Makefile.in
Packit bf408e
@@ -342,6 +342,9 @@ AR_FOR_BUILD = @AR_FOR_BUILD@
Packit bf408e
 AS_FOR_BUILD = @AS_FOR_BUILD@
Packit bf408e
 CC_FOR_BUILD = @CC_FOR_BUILD@
Packit bf408e
 CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
Packit bf408e
+ifeq (${CRASH_TARGET}, PPC64)
Packit bf408e
+CFLAGS_FOR_BUILD += -m64 -fPIC
Packit bf408e
+endif
Packit bf408e
 CXXFLAGS_FOR_BUILD = @CXXFLAGS_FOR_BUILD@
Packit bf408e
 CXX_FOR_BUILD = @CXX_FOR_BUILD@
Packit bf408e
 DLLTOOL_FOR_BUILD = @DLLTOOL_FOR_BUILD@
Packit bf408e
@@ -407,6 +410,9 @@ GNATBIND = @GNATBIND@
Packit bf408e
 GNATMAKE = @GNATMAKE@
Packit bf408e
 
Packit bf408e
 CFLAGS = @CFLAGS@
Packit bf408e
+ifeq (${CRASH_TARGET}, PPC64)
Packit bf408e
+CFLAGS += -m64 -fPIC
Packit bf408e
+endif
Packit bf408e
 LDFLAGS = @LDFLAGS@
Packit bf408e
 LIBCFLAGS = $(CFLAGS)
Packit bf408e
 CXXFLAGS = @CXXFLAGS@
Packit bf408e
--- gdb-7.6/gdb/defs.h.orig
Packit bf408e
+++ gdb-7.6/gdb/defs.h
Packit bf408e
@@ -802,4 +802,8 @@ enum block_enum
Packit bf408e
 
Packit bf408e
 #include "utils.h"
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+extern int gdb_main_entry(int, char **);
Packit bf408e
+extern void replace_ui_file_FILE(struct ui_file *, FILE *);
Packit bf408e
+#endif
Packit bf408e
 #endif /* #ifndef DEFS_H */
Packit bf408e
--- gdb-7.6/bfd/elflink.c.orig
Packit bf408e
+++ gdb-7.6/bfd/elflink.c
Packit bf408e
@@ -4730,7 +4730,7 @@ error_free_dyn:
Packit bf408e
 	  struct elf_link_hash_entry *hlook;
Packit bf408e
 	  asection *slook;
Packit bf408e
 	  bfd_vma vlook;
Packit bf408e
-	  size_t i, j, idx;
Packit bf408e
+	  size_t i, j, idx = 0;
Packit bf408e
 
Packit bf408e
 	  hlook = weaks;
Packit bf408e
 	  weaks = hlook->u.weakdef;
Packit bf408e
--- gdb-7.6/gdb/s390-nat.c.orig
Packit bf408e
+++ gdb-7.6/gdb/s390-nat.c
Packit bf408e
@@ -37,6 +37,8 @@
Packit bf408e
 #include <sys/ucontext.h>
Packit bf408e
 #include <elf.h>
Packit bf408e
 
Packit bf408e
+#include <sys/uio.h>
Packit bf408e
+
Packit bf408e
 #ifndef HWCAP_S390_HIGH_GPRS
Packit bf408e
 #define HWCAP_S390_HIGH_GPRS 512
Packit bf408e
 #endif
Packit bf408e
--- gdb-7.6/gdb/printcmd.c.orig
Packit bf408e
+++ gdb-7.6/gdb/printcmd.c
Packit bf408e
@@ -573,11 +573,21 @@ print_address_symbolic (struct gdbarch *
Packit bf408e
   int unmapped = 0;
Packit bf408e
   int offset = 0;
Packit bf408e
   int line = 0;
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  extern int gdb_print_callback(unsigned long);
Packit bf408e
+#endif
Packit bf408e
 
Packit bf408e
   /* Throw away both name and filename.  */
Packit bf408e
   struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &name);
Packit bf408e
   make_cleanup (free_current_contents, &filename);
Packit bf408e
 
Packit bf408e
+#ifdef CRASH_MERGE
Packit bf408e
+  if (!gdb_print_callback(addr)) {
Packit bf408e
+	do_cleanups (cleanup_chain);
Packit bf408e
+	return 0;
Packit bf408e
+  }
Packit bf408e
+#endif
Packit bf408e
+
Packit bf408e
   if (build_address_symbolic (gdbarch, addr, do_demangle, &name, &offset,
Packit bf408e
 			      &filename, &line, &unmapped))
Packit bf408e
     {
Packit bf408e
--- gdb-7.6/bfd/bfd-in.h.orig
Packit bf408e
+++ gdb-7.6/bfd/bfd-in.h
Packit bf408e
@@ -294,9 +294,6 @@ typedef struct bfd_section *sec_ptr;
Packit bf408e
 
Packit bf408e
 #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
Packit bf408e
 
Packit bf408e
-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)), ((ptr)->user_set_vma = TRUE), TRUE)
Packit bf408e
-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
Packit bf408e
-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
Packit bf408e
 /* Find the address one past the end of SEC.  */
Packit bf408e
 #define bfd_get_section_limit(bfd, sec) \
Packit bf408e
   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
Packit bf408e
@@ -519,7 +516,6 @@ extern void warn_deprecated (const char
Packit bf408e
 
Packit bf408e
 #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
Packit bf408e
 
Packit bf408e
-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
Packit bf408e
 
Packit bf408e
 extern bfd_boolean bfd_cache_close
Packit bf408e
   (bfd *abfd);
Packit bf408e
--- gdb-7.6/bfd/bfd-in2.h.orig
Packit bf408e
+++ gdb-7.6/bfd/bfd-in2.h
Packit bf408e
@@ -301,9 +301,6 @@ typedef struct bfd_section *sec_ptr;
Packit bf408e
 
Packit bf408e
 #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
Packit bf408e
 
Packit bf408e
-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)), ((ptr)->user_set_vma = TRUE), TRUE)
Packit bf408e
-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
Packit bf408e
-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
Packit bf408e
 /* Find the address one past the end of SEC.  */
Packit bf408e
 #define bfd_get_section_limit(bfd, sec) \
Packit bf408e
   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
Packit bf408e
@@ -526,7 +523,6 @@ extern void warn_deprecated (const char
Packit bf408e
 
Packit bf408e
 #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
Packit bf408e
 
Packit bf408e
-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
Packit bf408e
 
Packit bf408e
 extern bfd_boolean bfd_cache_close
Packit bf408e
   (bfd *abfd);
Packit bf408e
@@ -1572,6 +1568,32 @@ struct relax_table {
Packit bf408e
   int size;
Packit bf408e
 };
Packit bf408e
 
Packit bf408e
+/* Note: the following are provided as inline functions rather than macros
Packit bf408e
+   because not all callers use the return value.  A macro implementation
Packit bf408e
+   would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some
Packit bf408e
+   compilers will complain about comma expressions that have no effect.  */
Packit bf408e
+static inline bfd_boolean
Packit bf408e
+bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val)
Packit bf408e
+{
Packit bf408e
+  ptr->userdata = val;
Packit bf408e
+  return TRUE;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static inline bfd_boolean
Packit bf408e
+bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val)
Packit bf408e
+{
Packit bf408e
+  ptr->vma = ptr->lma = val;
Packit bf408e
+  ptr->user_set_vma = TRUE;
Packit bf408e
+  return TRUE;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static inline bfd_boolean
Packit bf408e
+bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val)
Packit bf408e
+{
Packit bf408e
+  ptr->alignment_power = val;
Packit bf408e
+  return TRUE;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
 /* These sections are global, and are managed by BFD.  The application
Packit bf408e
    and target back end are not permitted to change the values in
Packit bf408e
    these sections.  */
Packit bf408e
@@ -6095,6 +6117,14 @@ struct bfd
Packit bf408e
   unsigned int selective_search : 1;
Packit bf408e
 };
Packit bf408e
 
Packit bf408e
+/* See note beside bfd_set_section_userdata.  */
Packit bf408e
+static inline bfd_boolean
Packit bf408e
+bfd_set_cacheable (bfd * abfd, bfd_boolean val)
Packit bf408e
+{
Packit bf408e
+  abfd->cacheable = val;
Packit bf408e
+  return TRUE;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
 typedef enum bfd_error
Packit bf408e
 {
Packit bf408e
   bfd_error_no_error = 0,
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5405,7 +5405,7 @@ dump_enum(struct type *type, struct gnu_
Packit bf408e
 {
Packit bf408e
 	register int i;
Packit bf408e
 	int len;
Packit bf408e
-	int lastval;
Packit bf408e
+	long long lastval;
Packit bf408e
 
Packit bf408e
         len = TYPE_NFIELDS (type);
Packit bf408e
         lastval = 0;
Packit bf408e
@@ -5418,12 +5418,12 @@ dump_enum(struct type *type, struct gnu_
Packit bf408e
         for (i = 0; i < len; i++) {
Packit bf408e
         	fprintf_filtered(gdb_stdout, "  %s", 
Packit bf408e
 			TYPE_FIELD_NAME (type, i));
Packit bf408e
-                if (lastval != TYPE_FIELD_BITPOS (type, i)) {
Packit bf408e
-                	fprintf_filtered (gdb_stdout, " = %d",
Packit bf408e
-                        	TYPE_FIELD_BITPOS (type, i));
Packit bf408e
-                        lastval = TYPE_FIELD_BITPOS (type, i);
Packit bf408e
+                if (lastval != TYPE_FIELD_ENUMVAL (type, i)) {
Packit bf408e
+                	fprintf_filtered (gdb_stdout, " = %s",
Packit bf408e
+                        	plongest(TYPE_FIELD_ENUMVAL (type, i)));
Packit bf408e
+                        lastval = TYPE_FIELD_ENUMVAL (type, i);
Packit bf408e
                 } else
Packit bf408e
-                        fprintf_filtered(gdb_stdout, " = %d", lastval);
Packit bf408e
+                        fprintf_filtered(gdb_stdout, " = %s", plongest(lastval));
Packit bf408e
                 fprintf_filtered(gdb_stdout, "\n");
Packit bf408e
                 lastval++;
Packit bf408e
         }
Packit bf408e
--- gdb-7.6/gdb/aarch64-linux-nat.c.orig
Packit bf408e
+++ gdb-7.6/gdb/aarch64-linux-nat.c
Packit bf408e
@@ -32,6 +32,7 @@
Packit bf408e
 #include "elf/common.h"
Packit bf408e
 
Packit bf408e
 #include <sys/ptrace.h>
Packit bf408e
+#include <asm/ptrace.h>
Packit bf408e
 #include <sys/utsname.h>
Packit bf408e
 
Packit bf408e
 #include "gregset.h"
Packit bf408e
--- gdb-7.6/sim/igen/Makefile.in.orig
Packit bf408e
+++ gdb-7.6/sim/igen/Makefile.in
Packit bf408e
@@ -117,7 +117,7 @@ IGEN_OBJS=\
Packit bf408e
 	gen.o
Packit bf408e
 
Packit bf408e
 igen: igen.o $(IGEN_OBJS)
Packit bf408e
-	$(CC_FOR_BUILD) $(BUILD_LDFLAGS) -o igen igen.o $(IGEN_OBJS) $(LIBIBERTY_LIB)
Packit bf408e
+	$(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o igen igen.o $(IGEN_OBJS) $(LIBIBERTY_LIB)
Packit bf408e
 
Packit bf408e
 igen.o: igen.c misc.h filter_host.h lf.h table.h ld-decode.h ld-cache.h ld-insn.h filter.h gen-model.h gen-itable.h gen-icache.h gen-idecode.h gen-engine.h gen-semantics.h gen-support.h gen.h igen.h 
Packit bf408e
 	$(CC_FOR_BUILD) $(BUILD_CFLAGS) -c $(srcdir)/igen.c
Packit bf408e
--- gdb-7.6/sim/mips/cp1.c.orig
Packit bf408e
+++ gdb-7.6/sim/mips/cp1.c
Packit bf408e
@@ -1359,7 +1359,7 @@ fp_rsqrt2(sim_cpu *cpu,
Packit bf408e
 /* Conversion operations.  */
Packit bf408e
 
Packit bf408e
 uword64
Packit bf408e
-convert (sim_cpu *cpu,
Packit bf408e
+sim_mips_convert (sim_cpu *cpu,
Packit bf408e
 	 address_word cia,
Packit bf408e
 	 int rm,
Packit bf408e
 	 uword64 op,
Packit bf408e
--- gdb-7.6/sim/mips/sim-main.h.orig
Packit bf408e
+++ gdb-7.6/sim/mips/sim-main.h
Packit bf408e
@@ -770,8 +770,8 @@ unsigned64 fp_nmadd (SIM_STATE, unsigned64 op1, unsigned64 op2,
Packit bf408e
 unsigned64 fp_nmsub (SIM_STATE, unsigned64 op1, unsigned64 op2,
Packit bf408e
 		     unsigned64 op3, FP_formats fmt);
Packit bf408e
 #define NegMultiplySub(op1,op2,op3,fmt) fp_nmsub(SIM_ARGS, op1, op2, op3, fmt)
Packit bf408e
-unsigned64 convert (SIM_STATE, int rm, unsigned64 op, FP_formats from, FP_formats to);
Packit bf408e
-#define Convert(rm,op,from,to) convert (SIM_ARGS, rm, op, from, to)
Packit bf408e
+unsigned64 sim_mips_convert (SIM_STATE, int rm, unsigned64 op, FP_formats from, FP_formats to);
Packit bf408e
+#define Convert(rm,op,from,to) sim_mips_convert (SIM_ARGS, rm, op, from, to)
Packit bf408e
 unsigned64 convert_ps (SIM_STATE, int rm, unsigned64 op, FP_formats from,
Packit bf408e
 		       FP_formats to);
Packit bf408e
 #define ConvertPS(rm,op,from,to) convert_ps (SIM_ARGS, rm, op, from, to)
Packit bf408e
Packit bf408e
--- gdb-7.6/readline/util.c
Packit bf408e
+++ gdb-7.6/readline/util.c
Packit bf408e
@@ -493,10 +493,13 @@ _rl_trace (va_alist)
Packit bf408e
 
Packit bf408e
   if (_rl_tracefp == 0)
Packit bf408e
     _rl_tropen ();
Packit bf408e
+  if (!_rl_tracefp)
Packit bf408e
+    goto out;
Packit bf408e
   vfprintf (_rl_tracefp, format, args);
Packit bf408e
   fprintf (_rl_tracefp, "\n");
Packit bf408e
   fflush (_rl_tracefp);
Packit bf408e
 
Packit bf408e
+out:
Packit bf408e
   va_end (args);
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
@@ -509,16 +512,17 @@ _rl_tropen ()
Packit bf408e
     fclose (_rl_tracefp);
Packit bf408e
   sprintf (fnbuf, "/var/tmp/rltrace.%ld", getpid());
Packit bf408e
   unlink(fnbuf);
Packit bf408e
-  _rl_tracefp = fopen (fnbuf, "w+");
Packit bf408e
+  _rl_tracefp = fopen (fnbuf, "w+xe");
Packit bf408e
   return _rl_tracefp != 0;
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
 int
Packit bf408e
 _rl_trclose ()
Packit bf408e
 {
Packit bf408e
-  int r;
Packit bf408e
+  int r = 0;
Packit bf408e
 
Packit bf408e
-  r = fclose (_rl_tracefp);
Packit bf408e
+  if (_rl_tracefp)
Packit bf408e
+    r = fclose (_rl_tracefp);
Packit bf408e
   _rl_tracefp = 0;
Packit bf408e
   return r;
Packit bf408e
 }
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5447,9 +5447,9 @@ eval_enum(struct type *type, struct gnu_
Packit bf408e
         lastval = 0;
Packit bf408e
 
Packit bf408e
         for (i = 0; i < len; i++) {
Packit bf408e
-                if (lastval != TYPE_FIELD_BITPOS (type, i)) {
Packit bf408e
-                        lastval = TYPE_FIELD_BITPOS (type, i);
Packit bf408e
-                } 
Packit bf408e
+		if (lastval != TYPE_FIELD_ENUMVAL (type, i))
Packit bf408e
+			lastval = TYPE_FIELD_ENUMVAL (type, i);
Packit bf408e
+
Packit bf408e
 		if (STREQ(TYPE_FIELD_NAME(type, i), req->name)) {
Packit bf408e
 			req->tagname = "(unknown)";
Packit bf408e
 			req->value = lastval;
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5236,6 +5236,12 @@ gdb_command_funnel(struct gnu_request *r
Packit bf408e
 		gdb_set_crash_block(req);
Packit bf408e
 		break;
Packit bf408e
 
Packit bf408e
+	case GNU_GET_FUNCTION_RANGE:
Packit bf408e
+		sym = lookup_symbol(req->name, 0, VAR_DOMAIN, 0);
Packit bf408e
+		if (!find_pc_partial_function(req->pc, NULL, &req->addr, &req->addr2))
Packit bf408e
+			req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
 	default:
Packit bf408e
 		req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
 		break;
Packit bf408e
--- gdb-7.6/opcodes/i386-dis.c.orig
Packit bf408e
+++ gdb-7.6/opcodes/i386-dis.c
Packit bf408e
@@ -11300,6 +11300,29 @@ get_sib (disassemble_info *info)
Packit bf408e
     }
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
+static char *
Packit bf408e
+check_for_extensions(struct dis_private *priv)
Packit bf408e
+{
Packit bf408e
+	unsigned char ModRM;
Packit bf408e
+
Packit bf408e
+	if ((priv->the_buffer[0] == 0x66) &&
Packit bf408e
+	    (priv->the_buffer[1] == 0x0f) && 
Packit bf408e
+	    (priv->the_buffer[2] == 0xae)) {
Packit bf408e
+		ModRM = priv->the_buffer[3];
Packit bf408e
+		if (ModRM == 0xf8)
Packit bf408e
+			return "pcommit";
Packit bf408e
+
Packit bf408e
+		switch ((ModRM >> 3)) 
Packit bf408e
+		{
Packit bf408e
+		case 0x6:
Packit bf408e
+			return "clwb";
Packit bf408e
+		case 0x7: 
Packit bf408e
+			return "clflushopt";
Packit bf408e
+		}
Packit bf408e
+	}
Packit bf408e
+	return NULL;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
 static int
Packit bf408e
 print_insn (bfd_vma pc, disassemble_info *info)
Packit bf408e
 {
Packit bf408e
@@ -11312,6 +11335,7 @@ print_insn (bfd_vma pc, disassemble_info
Packit bf408e
   struct dis_private priv;
Packit bf408e
   int prefix_length;
Packit bf408e
   int default_prefixes;
Packit bf408e
+  char *extension;
Packit bf408e
 
Packit bf408e
   priv.orig_sizeflag = AFLAG | DFLAG;
Packit bf408e
   if ((info->mach & bfd_mach_i386_i386) != 0)
Packit bf408e
@@ -11575,6 +11599,7 @@ print_insn (bfd_vma pc, disassemble_info
Packit bf408e
   need_vex = 0;
Packit bf408e
   need_vex_reg = 0;
Packit bf408e
   vex_w_done = 0;
Packit bf408e
+  extension = NULL;
Packit bf408e
 
Packit bf408e
   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
Packit bf408e
     {
Packit bf408e
@@ -11610,9 +11635,14 @@ print_insn (bfd_vma pc, disassemble_info
Packit bf408e
 	    name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
Packit bf408e
 	    if (name == NULL)
Packit bf408e
 	      name = INTERNAL_DISASSEMBLER_ERROR;
Packit bf408e
-	    (*info->fprintf_func) (info->stream, "%s", name);
Packit bf408e
-	    return 1;
Packit bf408e
-	  }
Packit bf408e
+	    if ((extension = check_for_extensions(&priv))) {
Packit bf408e
+    	      strcpy(obuf, extension);
Packit bf408e
+	      obufp = &obuf[strlen(obuf)];
Packit bf408e
+	    } else {
Packit bf408e
+	      (*info->fprintf_func) (info->stream, "%s", name);
Packit bf408e
+	      return 1;
Packit bf408e
+	    }
Packit bf408e
+	 }
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
   /* Check if the REX prefix is used.  */
Packit bf408e
@@ -11637,7 +11667,7 @@ print_insn (bfd_vma pc, disassemble_info
Packit bf408e
     all_prefixes[last_data_prefix] = 0;
Packit bf408e
 
Packit bf408e
   prefix_length = 0;
Packit bf408e
-  for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
Packit bf408e
+  for (i = 0; !extension && i < (int) ARRAY_SIZE (all_prefixes); i++)
Packit bf408e
     if (all_prefixes[i])
Packit bf408e
       {
Packit bf408e
 	const char *name;
Packit bf408e
@@ -11655,7 +11685,8 @@ print_insn (bfd_vma pc, disassemble_info
Packit bf408e
       return MAX_CODE_LENGTH;
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
-  obufp = mnemonicendp;
Packit bf408e
+  if (!extension)
Packit bf408e
+    obufp = mnemonicendp;
Packit bf408e
   for (i = strlen (obuf) + prefix_length; i < 6; i++)
Packit bf408e
     oappend (" ");
Packit bf408e
   oappend (" ");
Packit bf408e
--- gdb-7.6/bfd/coff-i386.c.orig
Packit bf408e
+++ gdb-7.6/bfd/coff-i386.c
Packit bf408e
@@ -141,7 +141,7 @@ coff_i386_reloc (bfd *abfd,
Packit bf408e
 #define DOIT(x) \
Packit bf408e
   x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
Packit bf408e
 
Packit bf408e
-    if (diff != 0)
Packit bf408e
+  if (diff != 0)
Packit bf408e
       {
Packit bf408e
 	reloc_howto_type *howto = reloc_entry->howto;
Packit bf408e
 	unsigned char *addr = (unsigned char *) data + reloc_entry->address;
Packit bf408e
--- gdb-7.6/bfd/coff-x86_64.c.orig
Packit bf408e
+++ gdb-7.6/bfd/coff-x86_64.c
Packit bf408e
@@ -139,7 +139,7 @@ coff_amd64_reloc (bfd *abfd,
Packit bf408e
 #define DOIT(x) \
Packit bf408e
   x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
Packit bf408e
 
Packit bf408e
-    if (diff != 0)
Packit bf408e
+  if (diff != 0)
Packit bf408e
       {
Packit bf408e
 	reloc_howto_type *howto = reloc_entry->howto;
Packit bf408e
 	unsigned char *addr = (unsigned char *) data + reloc_entry->address;
Packit bf408e
--- gdb-7.6/opcodes/arm-dis.c.orig
Packit bf408e
+++ gdb-7.6/opcodes/arm-dis.c
Packit bf408e
@@ -2103,7 +2103,7 @@ print_insn_coprocessor (bfd_vma pc,
Packit bf408e
 
Packit bf408e
 		    /* Is ``imm'' a negative number?  */
Packit bf408e
 		    if (imm & 0x40)
Packit bf408e
-		      imm |= (-1 << 7);
Packit bf408e
+		      imm -= 0x80;
Packit bf408e
 
Packit bf408e
 		    func (stream, "%d", imm);
Packit bf408e
 		  }
Packit bf408e
diff -up gdb-7.6/bfd/elf64-ppc.c.orig gdb-7.6/bfd/elf64-ppc.c
Packit bf408e
--- gdb-7.6/bfd/elf64-ppc.c.orig	2016-02-02 11:04:25.436527347 -0500
Packit bf408e
+++ gdb-7.6/bfd/elf64-ppc.c	2016-02-02 11:11:51.926468454 -0500
Packit bf408e
@@ -11743,7 +11743,7 @@ ppc64_elf_size_stubs (struct bfd_link_in
Packit bf408e
 	     stub_sec = stub_sec->next)
Packit bf408e
 	  if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
Packit bf408e
 	    stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
Packit bf408e
-			      & (-1 << htab->plt_stub_align));
Packit bf408e
+			      & -(1 << htab->plt_stub_align));
Packit bf408e
 
Packit bf408e
       for (stub_sec = htab->stub_bfd->sections;
Packit bf408e
 	   stub_sec != NULL;
Packit bf408e
@@ -12093,7 +12093,7 @@ ppc64_elf_build_stubs (bfd_boolean emit_
Packit bf408e
 	 stub_sec = stub_sec->next)
Packit bf408e
       if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
Packit bf408e
 	stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
Packit bf408e
-			  & (-1 << htab->plt_stub_align));
Packit bf408e
+			  & -(1 << htab->plt_stub_align));
Packit bf408e
 
Packit bf408e
   for (stub_sec = htab->stub_bfd->sections;
Packit bf408e
        stub_sec != NULL;
Packit bf408e
--- gdb-7.6/include/opcode/ppc.h.orig
Packit bf408e
+++ gdb-7.6/include/opcode/ppc.h
Packit bf408e
@@ -278,7 +278,7 @@ extern const unsigned int num_powerpc_op
Packit bf408e
 /* Use with the shift field of a struct powerpc_operand to indicate
Packit bf408e
      that BITM and SHIFT cannot be used to determine where the operand
Packit bf408e
      goes in the insn.  */
Packit bf408e
-#define PPC_OPSHIFT_INV (-1 << 31)
Packit bf408e
+#define PPC_OPSHIFT_INV (-1U << 31)
Packit bf408e
 
Packit bf408e
 /* Values defined for the flags field of a struct powerpc_operand.  */
Packit bf408e
 
Packit bf408e
--- gdb-7.6/opcodes/mips-dis.c.orig
Packit bf408e
+++ gdb-7.6/opcodes/mips-dis.c
Packit bf408e
@@ -245,18 +245,6 @@ static const char * const mips_cp0_names
Packit bf408e
   "c0_taglo",     "c0_taghi",     "c0_errorepc",  "$31"
Packit bf408e
 };
Packit bf408e
 
Packit bf408e
-static const struct mips_cp0sel_name mips_cp0sel_names_mipsr5900[] =
Packit bf408e
-{
Packit bf408e
-  { 24, 2, "c0_iab"			},
Packit bf408e
-  { 24, 3, "c0_iabm"		},
Packit bf408e
-  { 24, 4, "c0_dab"			},
Packit bf408e
-  { 24, 5, "c0_dabm"		},
Packit bf408e
-  { 24, 6, "c0_dvb"			},
Packit bf408e
-  { 24, 7, "c0_dvbm"		},
Packit bf408e
-  { 25, 1, "c0_perfcnt,1"	},
Packit bf408e
-  { 25, 2, "c0_perfcnt,2"	}
Packit bf408e
-};
Packit bf408e
-
Packit bf408e
 static const char * const mips_cp0_names_mips3264[32] =
Packit bf408e
 {
Packit bf408e
   "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
Packit bf408e
--- gdb-7.6/gdb/ada-lang.c.orig
Packit bf408e
+++ gdb-7.6/gdb/ada-lang.c
Packit bf408e
@@ -10503,7 +10503,7 @@ ada_evaluate_subexp (struct type *expect
Packit bf408e
         }
Packit bf408e
       else
Packit bf408e
         arg1 = ada_value_struct_elt (arg1, &exp->elts[pc + 2].string, 0);
Packit bf408e
-        arg1 = unwrap_value (arg1);
Packit bf408e
+      arg1 = unwrap_value (arg1);
Packit bf408e
         return ada_to_fixed_value (arg1);
Packit bf408e
 
Packit bf408e
     case OP_TYPE:
Packit bf408e
--- gdb-7.6/gdb/linux-record.c.orig
Packit bf408e
+++ gdb-7.6/gdb/linux-record.c
Packit bf408e
@@ -112,7 +112,7 @@ record_linux_sockaddr (struct regcache *
Packit bf408e
                             "memory at addr = 0x%s len = %d.\n",
Packit bf408e
                             phex_nz (len, tdep->size_pointer),
Packit bf408e
                             tdep->size_int);
Packit bf408e
-        return -1;
Packit bf408e
+      return -1;
Packit bf408e
     }
Packit bf408e
   addrlen = (int) extract_unsigned_integer (a, tdep->size_int, byte_order);
Packit bf408e
   if (addrlen <= 0 || addrlen > tdep->size_sockaddr)
Packit bf408e
@@ -150,7 +150,7 @@ record_linux_msghdr (struct regcache *re
Packit bf408e
                             "len = %d.\n",
Packit bf408e
                             phex_nz (addr, tdep->size_pointer),
Packit bf408e
                             tdep->size_msghdr);
Packit bf408e
-        return -1;
Packit bf408e
+      return -1;
Packit bf408e
     }
Packit bf408e
 
Packit bf408e
   /* msg_name msg_namelen */
Packit bf408e
@@ -186,7 +186,7 @@ record_linux_msghdr (struct regcache *re
Packit bf408e
                                     "len = %d.\n",
Packit bf408e
                                     phex_nz (addr,tdep->size_pointer),
Packit bf408e
                                     tdep->size_iovec);
Packit bf408e
-                return -1;
Packit bf408e
+              return -1;
Packit bf408e
             }
Packit bf408e
           tmpaddr = (CORE_ADDR) extract_unsigned_integer (iov,
Packit bf408e
                                                           tdep->size_pointer,
Packit bf408e
@@ -948,7 +948,7 @@ Do you want to stop the program?"),
Packit bf408e
                                         "memory at addr = 0x%s len = %d.\n",
Packit bf408e
                                         OUTPUT_REG (tmpulongest, tdep->arg2),
Packit bf408e
                                         tdep->size_ulong);
Packit bf408e
-                    return -1;
Packit bf408e
+                  return -1;
Packit bf408e
                 }
Packit bf408e
               tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
Packit bf408e
                                                       byte_order);
Packit bf408e
--- gdb-7.6/gdb/inflow.c.orig
Packit bf408e
+++ gdb-7.6/gdb/inflow.c
Packit bf408e
@@ -391,7 +391,7 @@ terminal_ours_1 (int output_only)
Packit bf408e
   if (tinfo->run_terminal != NULL || gdb_has_a_terminal () == 0)
Packit bf408e
     return;
Packit bf408e
 
Packit bf408e
-    {
Packit bf408e
+  {
Packit bf408e
 #ifdef SIGTTOU
Packit bf408e
       /* Ignore this signal since it will happen when we try to set the
Packit bf408e
          pgrp.  */
Packit bf408e
--- gdb-7.6/gdb/printcmd.c.orig
Packit bf408e
+++ gdb-7.6/gdb/printcmd.c
Packit bf408e
@@ -1045,7 +1045,7 @@ print_command_2 (char *exp, int inspect,
Packit bf408e
   else
Packit bf408e
     val = access_value_history (0);
Packit bf408e
 
Packit bf408e
-    printf_filtered ("%d %d %d %d %d %d\n",
Packit bf408e
+  printf_filtered ("%d %d %d %d %d %d\n",
Packit bf408e
       TYPE_CODE (check_typedef(value_type (val))),
Packit bf408e
       TYPE_UNSIGNED (check_typedef(value_type (val))),
Packit bf408e
       TYPE_LENGTH (check_typedef(value_type(val))),
Packit bf408e
--- gdb-7.6/gdb/c-typeprint.c.orig
Packit bf408e
+++ gdb-7.6/gdb/c-typeprint.c
Packit bf408e
@@ -1293,7 +1293,7 @@ c_type_print_base (struct type *type, st
Packit bf408e
 	      if (TYPE_NFIELDS (type) != 0 || TYPE_NFN_FIELDS (type) != 0)
Packit bf408e
 		fprintf_filtered (stream, "\n");
Packit bf408e
 
Packit bf408e
-		for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (type); i++)
Packit bf408e
+	      for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (type); i++)
Packit bf408e
 		  {
Packit bf408e
 		    struct type *target = TYPE_TYPEDEF_FIELD_TYPE (type, i);
Packit bf408e
 
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5139,6 +5139,8 @@ static void get_user_print_option_addres
Packit bf408e
 extern int get_frame_offset(CORE_ADDR);
Packit bf408e
 static void gdb_set_crash_block(struct gnu_request *);
Packit bf408e
 void gdb_command_funnel(struct gnu_request *);
Packit bf408e
+static long lookup_struct_contents(struct gnu_request *);
Packit bf408e
+static void iterate_datatypes(struct gnu_request *);
Packit bf408e
 
Packit bf408e
 struct objfile *gdb_kernel_objfile = { 0 };
Packit bf408e
 
Packit bf408e
@@ -5242,6 +5244,14 @@ gdb_command_funnel(struct gnu_request *r
Packit bf408e
 			req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
 		break;
Packit bf408e
 
Packit bf408e
+	case GNU_LOOKUP_STRUCT_CONTENTS:
Packit bf408e
+		req->value = lookup_struct_contents(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
+	case GNU_GET_NEXT_DATATYPE:
Packit bf408e
+		iterate_datatypes(req);
Packit bf408e
+		break;
Packit bf408e
+
Packit bf408e
 	default:
Packit bf408e
 		req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
 		break;
Packit bf408e
@@ -5779,4 +5789,135 @@ gdb_get_crash_block(void)
Packit bf408e
 	else
Packit bf408e
 		return NULL;
Packit bf408e
 }
Packit bf408e
+
Packit bf408e
+static long
Packit bf408e
+lookup_struct_contents(struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+  int i;
Packit bf408e
+  long r;
Packit bf408e
+  struct field *f;
Packit bf408e
+  struct main_type *m;
Packit bf408e
+  const char *n;
Packit bf408e
+  struct main_type *top_m = (struct main_type *)req->addr;
Packit bf408e
+  char *type_name = req->type_name;
Packit bf408e
+
Packit bf408e
+  if (!top_m || !type_name)
Packit bf408e
+    return 0;
Packit bf408e
+
Packit bf408e
+  for (i = 0; i < top_m->nfields; i++)
Packit bf408e
+    {
Packit bf408e
+      f = top_m->flds_bnds.fields + i;
Packit bf408e
+      if (!f->type)
Packit bf408e
+        continue;
Packit bf408e
+      m = f->type->main_type;
Packit bf408e
+
Packit bf408e
+      // If the field is an array, check the target type -
Packit bf408e
+      // it might be structure, or might not be.
Packit bf408e
+      // - struct request_sock *syn_table[0];
Packit bf408e
+      //   here m->target_type->main_type->code is expected
Packit bf408e
+      //   to be TYPE_CODE_PTR
Packit bf408e
+      // - struct list_head vec[TVN_SIZE];
Packit bf408e
+      //   here m->target_type->main_type->code should be
Packit bf408e
+      //   TYPE_CODE_STRUCT
Packit bf408e
+      if (m->code == TYPE_CODE_ARRAY && m->target_type)
Packit bf408e
+        m = m->target_type->main_type;
Packit bf408e
+
Packit bf408e
+      /* Here is a recursion.
Packit bf408e
+       * If we have struct variable (not pointer),
Packit bf408e
+       * scan this inner structure
Packit bf408e
+       */
Packit bf408e
+      if (m->code == TYPE_CODE_STRUCT) {
Packit bf408e
+        req->addr = (ulong)m;
Packit bf408e
+        r = lookup_struct_contents(req);
Packit bf408e
+        req->addr = (ulong)top_m;
Packit bf408e
+        if (r)
Packit bf408e
+          return 1;
Packit bf408e
+      }
Packit bf408e
+
Packit bf408e
+      if (m->code == TYPE_CODE_PTR && m->target_type)
Packit bf408e
+        m = m->target_type->main_type;
Packit bf408e
+      if (m->name)
Packit bf408e
+        n = m->name;
Packit bf408e
+      else if (m->tag_name)
Packit bf408e
+        n = m->tag_name;
Packit bf408e
+      else
Packit bf408e
+        continue;
Packit bf408e
+
Packit bf408e
+      if (strstr(n, type_name))
Packit bf408e
+        return 1;
Packit bf408e
+    }
Packit bf408e
+
Packit bf408e
+  return 0;
Packit bf408e
+}
Packit bf408e
+
Packit bf408e
+static void
Packit bf408e
+iterate_datatypes (struct gnu_request *req)
Packit bf408e
+{
Packit bf408e
+  static struct block_iterator bi; // Keeping this static will simplify code
Packit bf408e
+  struct block *b;
Packit bf408e
+  int do_return = 0;
Packit bf408e
+  struct global_iterator *gi = &req->global_iterator;
Packit bf408e
+
Packit bf408e
+  if (gi->finished)
Packit bf408e
+    return;
Packit bf408e
+
Packit bf408e
+  if (gi->obj == NULL)
Packit bf408e
+    {
Packit bf408e
+      gi->obj = current_program_space->objfiles;
Packit bf408e
+      gi->symtab = NULL;
Packit bf408e
+      do_return = 1;  // The initial case - we don't need to make next step.
Packit bf408e
+    }
Packit bf408e
+
Packit bf408e
+  for (; gi->obj; gi->obj = gi->obj->next, gi->symtab = NULL)
Packit bf408e
+    {
Packit bf408e
+      if (gi->symtab == NULL)
Packit bf408e
+        {
Packit bf408e
+          // Symtab `symtab` is nullified for every objfile
Packit bf408e
+          if (gi->obj->sf)
Packit bf408e
+            gi->obj->sf->qf->expand_all_symtabs(gi->obj);
Packit bf408e
+          gi->symtab = gi->obj->symtabs;
Packit bf408e
+          gi->sym = NULL;
Packit bf408e
+        }
Packit bf408e
+
Packit bf408e
+      for (; gi->symtab; gi->symtab = gi->symtab->next, gi->block_index = -1)
Packit bf408e
+        {
Packit bf408e
+          if (!gi->symtab->primary)
Packit bf408e
+            continue;
Packit bf408e
+
Packit bf408e
+          if (gi->block_index == -1)
Packit bf408e
+            {
Packit bf408e
+              gi->block_index = GLOBAL_BLOCK;
Packit bf408e
+              gi->sym = NULL;
Packit bf408e
+            }
Packit bf408e
+          for (; gi->block_index <= STATIC_BLOCK; gi->block_index++, gi->sym = NULL)
Packit bf408e
+            {
Packit bf408e
+              if (!gi->sym)
Packit bf408e
+                {
Packit bf408e
+                  b = BLOCKVECTOR_BLOCK(BLOCKVECTOR(gi->symtab), gi->block_index);
Packit bf408e
+                  gi->sym = block_iterator_first(b, &bi);
Packit bf408e
+                }
Packit bf408e
+              for (; gi->sym; gi->sym = block_iterator_next(&bi))
Packit bf408e
+                {
Packit bf408e
+                  QUIT;
Packit bf408e
+
Packit bf408e
+                  if (SYMBOL_CLASS (gi->sym) != LOC_TYPEDEF)
Packit bf408e
+                    continue;
Packit bf408e
+
Packit bf408e
+                  // Iteration 1 (do_return == 0): initialization
Packit bf408e
+                  // Iteration 2 (do_return == 1): iterate symbol
Packit bf408e
+                  if (do_return++ == 0)
Packit bf408e
+                    continue;
Packit bf408e
+
Packit bf408e
+                  // Yield the current symbol and its size
Packit bf408e
+                  req->addr = (ulong)(gi->sym->type->main_type);
Packit bf408e
+                  req->name = (char *)(gi->sym->ginfo.name);
Packit bf408e
+                  req->length = gi->sym->type->length;
Packit bf408e
+
Packit bf408e
+                  return;
Packit bf408e
+                }
Packit bf408e
+            }
Packit bf408e
+        }
Packit bf408e
+    }
Packit bf408e
+  gi->finished = 1; 
Packit bf408e
+}
Packit bf408e
 #endif
Packit bf408e
--- gdb-7.6/bfd/elf64-s390.c.orig
Packit bf408e
+++ gdb-7.6/bfd/elf64-s390.c
Packit bf408e
@@ -323,10 +323,10 @@ elf_s390_reloc_name_lookup (bfd *abfd AT
Packit bf408e
 	&& strcasecmp (elf_howto_table[i].name, r_name) == 0)
Packit bf408e
       return &elf_howto_table[i];
Packit bf408e
 
Packit bf408e
-    if (strcasecmp (elf64_s390_vtinherit_howto.name, r_name) == 0)
Packit bf408e
-      return &elf64_s390_vtinherit_howto;
Packit bf408e
-    if (strcasecmp (elf64_s390_vtentry_howto.name, r_name) == 0)
Packit bf408e
-      return &elf64_s390_vtentry_howto;
Packit bf408e
+  if (strcasecmp (elf64_s390_vtinherit_howto.name, r_name) == 0)
Packit bf408e
+    return &elf64_s390_vtinherit_howto;
Packit bf408e
+  if (strcasecmp (elf64_s390_vtentry_howto.name, r_name) == 0)
Packit bf408e
+    return &elf64_s390_vtentry_howto;
Packit bf408e
 
Packit bf408e
   return NULL;
Packit bf408e
 }
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5122,7 +5122,7 @@ When enabled, debugging messages are pri
Packit bf408e
 #define GDB_COMMON
Packit bf408e
 #include "../../defs.h"
Packit bf408e
 
Packit bf408e
-static void get_member_data(struct gnu_request *, struct type *);
Packit bf408e
+static void get_member_data(struct gnu_request *, struct type *, long, int);
Packit bf408e
 static void dump_enum(struct type *, struct gnu_request *);
Packit bf408e
 static void eval_enum(struct type *, struct gnu_request *);
Packit bf408e
 static void gdb_get_line_number(struct gnu_request *);
Packit bf408e
@@ -5327,7 +5327,7 @@ gdb_get_datatype(struct gnu_request *req
Packit bf408e
                 req->typecode = TYPE_CODE(sym->type);
Packit bf408e
                 req->length = TYPE_LENGTH(sym->type);
Packit bf408e
 		if (req->member)
Packit bf408e
-			get_member_data(req, sym->type);
Packit bf408e
+			get_member_data(req, sym->type, 0, 1);
Packit bf408e
 			
Packit bf408e
 		if (TYPE_CODE(sym->type) == TYPE_CODE_ENUM) {
Packit bf408e
 			if (req->flags & GNU_PRINT_ENUMERATORS) 
Packit bf408e
@@ -5397,7 +5397,7 @@ gdb_get_datatype(struct gnu_request *req
Packit bf408e
 		}
Packit bf408e
 
Packit bf408e
                 if (req->member) 
Packit bf408e
-                	get_member_data(req, type); 
Packit bf408e
+                	get_member_data(req, type, 0, 1); 
Packit bf408e
 		
Packit bf408e
 		break;
Packit bf408e
 
Packit bf408e
@@ -5480,7 +5480,7 @@ eval_enum(struct type *type, struct gnu_
Packit bf408e
  *  member field, and when found, return its relevant data.
Packit bf408e
  */
Packit bf408e
 static void
Packit bf408e
-get_member_data(struct gnu_request *req, struct type *type)
Packit bf408e
+get_member_data(struct gnu_request *req, struct type *type, long offset, int is_first)
Packit bf408e
 {
Packit bf408e
 	register short i;
Packit bf408e
 	struct field *nextfield;
Packit bf408e
@@ -5492,7 +5492,7 @@ get_member_data(struct gnu_request *req,
Packit bf408e
 	nfields = TYPE_MAIN_TYPE(type)->nfields;
Packit bf408e
 	nextfield = TYPE_MAIN_TYPE(type)->flds_bnds.fields;
Packit bf408e
 
Packit bf408e
-        if (nfields == 0) {
Packit bf408e
+	if (nfields == 0 && is_first /* The first call */) {
Packit bf408e
 		struct type *newtype;
Packit bf408e
                 newtype = lookup_transparent_type(req->name);
Packit bf408e
                 if (newtype) {
Packit bf408e
@@ -5505,13 +5505,18 @@ get_member_data(struct gnu_request *req,
Packit bf408e
 
Packit bf408e
 	for (i = 0; i < nfields; i++) {
Packit bf408e
 		if (STREQ(req->member, nextfield->name)) {
Packit bf408e
-			req->member_offset = nextfield->loc.bitpos;
Packit bf408e
+			req->member_offset = offset + nextfield->loc.bitpos;
Packit bf408e
 			req->member_length = TYPE_LENGTH(nextfield->type);
Packit bf408e
 			req->member_typecode = TYPE_CODE(nextfield->type);
Packit bf408e
 			if ((req->member_typecode == TYPE_CODE_TYPEDEF) &&
Packit bf408e
 			    (typedef_type = check_typedef(nextfield->type))) 
Packit bf408e
         			req->member_length = TYPE_LENGTH(typedef_type);
Packit bf408e
 			return;
Packit bf408e
+		} else if (*nextfield->name == 0) { /* Anonymous struct/union */
Packit bf408e
+			get_member_data(req, nextfield->type,
Packit bf408e
+			    offset + nextfield->loc.bitpos, 0);
Packit bf408e
+			if (req->member_offset != -1)
Packit bf408e
+				return;
Packit bf408e
 		}
Packit bf408e
 		nextfield++;
Packit bf408e
 	}
Packit bf408e
@@ -5706,7 +5711,7 @@ gdb_get_symbol_type(struct gnu_request *
Packit bf408e
 	}
Packit bf408e
 
Packit bf408e
 	if (req->member) 
Packit bf408e
-		get_member_data(req, type);
Packit bf408e
+		get_member_data(req, type, 0, 1);
Packit bf408e
 
Packit bf408e
         do_cleanups (old_chain);
Packit bf408e
 }
Packit bf408e
diff -up gdb-7.6/bfd/configure.orig gdb-7.6/bfd/configure
Packit bf408e
--- gdb-7.6/bfd/configure.orig	2017-02-17 17:19:51.654898822 -0500
Packit bf408e
+++ gdb-7.6/bfd/configure	2017-02-17 17:19:57.922038757 -0500
Packit bf408e
@@ -12193,7 +12193,7 @@ fi
Packit bf408e
 
Packit bf408e
 NO_WERROR=
Packit bf408e
 if test "${ERROR_ON_WARNING}" = yes ; then
Packit bf408e
-    GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror"
Packit bf408e
+    GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS"
Packit bf408e
     NO_WERROR="-Wno-error"
Packit bf408e
 fi
Packit bf408e
 
Packit bf408e
diff -up gdb-7.6/opcodes/configure.orig gdb-7.6/opcodes/configure
Packit bf408e
--- gdb-7.6/opcodes/configure.orig	2017-02-17 17:19:08.849943016 -0500
Packit bf408e
+++ gdb-7.6/opcodes/configure	2017-02-17 17:19:23.256264699 -0500
Packit bf408e
@@ -11539,7 +11539,7 @@ fi
Packit bf408e
 
Packit bf408e
 NO_WERROR=
Packit bf408e
 if test "${ERROR_ON_WARNING}" = yes ; then
Packit bf408e
-    GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror"
Packit bf408e
+    GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS"
Packit bf408e
     NO_WERROR="-Wno-error"
Packit bf408e
 fi
Packit bf408e
 
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5266,6 +5266,7 @@ gdb_get_line_number(struct gnu_request *
Packit bf408e
 {
Packit bf408e
         struct symtab_and_line sal;
Packit bf408e
 	struct symbol *sym;
Packit bf408e
+	struct objfile *objfile;
Packit bf408e
         CORE_ADDR pc;
Packit bf408e
 
Packit bf408e
 #define LASTCHAR(s)      (s[strlen(s)-1])
Packit bf408e
@@ -5281,8 +5282,22 @@ gdb_get_line_number(struct gnu_request *
Packit bf408e
         sal = find_pc_line(pc, 0);
Packit bf408e
 
Packit bf408e
 	if (!sal.symtab) {
Packit bf408e
-		req->buf[0] = '\0';
Packit bf408e
-		return;
Packit bf408e
+		/*
Packit bf408e
+		 *  If a module address line number can't be found, it's typically
Packit bf408e
+		 *  due to its addrmap still containing offset values because its 
Packit bf408e
+		 *  objfile doesn't have full symbols loaded.
Packit bf408e
+		 */
Packit bf408e
+		if (req->lm) {
Packit bf408e
+			objfile = req->lm->loaded_objfile;
Packit bf408e
+			if (!objfile_has_full_symbols(objfile) && objfile->sf) { 
Packit bf408e
+				objfile->sf->qf->expand_all_symtabs(objfile);
Packit bf408e
+				sal = find_pc_line(pc, 0);
Packit bf408e
+			}
Packit bf408e
+		}
Packit bf408e
+		if (!sal.symtab) {
Packit bf408e
+			req->buf[0] = '\0';
Packit bf408e
+			return;
Packit bf408e
+		}
Packit bf408e
 	}
Packit bf408e
 
Packit bf408e
         if (sal.symtab->filename && sal.symtab->dirname) {
Packit bf408e
@@ -5557,7 +5572,6 @@ struct load_module *gdb_current_load_mod
Packit bf408e
 static void 
Packit bf408e
 gdb_add_symbol_file(struct gnu_request *req)
Packit bf408e
 {
Packit bf408e
-	register struct objfile *loaded_objfile = NULL;
Packit bf408e
 	register struct objfile *objfile;
Packit bf408e
 	register struct minimal_symbol *m;
Packit bf408e
 	struct load_module *lm;
Packit bf408e
@@ -5576,6 +5590,7 @@ gdb_add_symbol_file(struct gnu_request *
Packit bf408e
 
Packit bf408e
 	req->name = lm->mod_namelist;
Packit bf408e
 	gdb_delete_symbol_file(req);
Packit bf408e
+	lm->loaded_objfile = NULL;
Packit bf408e
 
Packit bf408e
 	if ((lm->mod_flags & MOD_NOPATCH) == 0) {
Packit bf408e
 	        for (i = 0 ; i < lm->mod_sections; i++) {
Packit bf408e
@@ -5623,12 +5638,15 @@ gdb_add_symbol_file(struct gnu_request *
Packit bf408e
 
Packit bf408e
         ALL_OBJFILES(objfile) {
Packit bf408e
 		if (same_file(objfile->name, lm->mod_namelist)) {
Packit bf408e
-                        loaded_objfile = objfile;
Packit bf408e
+			if (objfile->separate_debug_objfile)
Packit bf408e
+				lm->loaded_objfile = objfile->separate_debug_objfile;
Packit bf408e
+			else
Packit bf408e
+				lm->loaded_objfile = objfile;
Packit bf408e
 			break;
Packit bf408e
 		}
Packit bf408e
         }
Packit bf408e
 
Packit bf408e
-	if (!loaded_objfile)
Packit bf408e
+	if (!lm->loaded_objfile)
Packit bf408e
                 req->flags |= GNU_COMMAND_FAILED;
Packit bf408e
 }
Packit bf408e
 
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5500,7 +5500,7 @@ get_member_data(struct gnu_request *req,
Packit bf408e
 	register short i;
Packit bf408e
 	struct field *nextfield;
Packit bf408e
 	short nfields;
Packit bf408e
-	struct type *typedef_type;
Packit bf408e
+	struct type *typedef_type, *target_type;
Packit bf408e
 
Packit bf408e
 	req->member_offset = -1;
Packit bf408e
 
Packit bf408e
@@ -5523,6 +5523,13 @@ get_member_data(struct gnu_request *req,
Packit bf408e
 			req->member_offset = offset + nextfield->loc.bitpos;
Packit bf408e
 			req->member_length = TYPE_LENGTH(nextfield->type);
Packit bf408e
 			req->member_typecode = TYPE_CODE(nextfield->type);
Packit bf408e
+			req->member_main_type_name = (char *)TYPE_NAME(nextfield->type);
Packit bf408e
+			req->member_main_type_tag_name = (char *)TYPE_TAG_NAME(nextfield->type);
Packit bf408e
+			target_type = TYPE_TARGET_TYPE(nextfield->type);
Packit bf408e
+			if (target_type) {
Packit bf408e
+				req->member_target_type_name = (char *)TYPE_NAME(target_type);
Packit bf408e
+				req->member_target_type_tag_name = (char *)TYPE_TAG_NAME(target_type);
Packit bf408e
+			}
Packit bf408e
 			if ((req->member_typecode == TYPE_CODE_TYPEDEF) &&
Packit bf408e
 			    (typedef_type = check_typedef(nextfield->type))) 
Packit bf408e
         			req->member_length = TYPE_LENGTH(typedef_type);
Packit bf408e
Packit bf408e
--- gdb-7.6/gdb/symtab.c.orig
Packit bf408e
+++ gdb-7.6/gdb/symtab.c
Packit bf408e
@@ -5727,6 +5727,7 @@ gdb_get_symbol_type(struct gnu_request *
Packit bf408e
 	req->type_name = (char *)TYPE_MAIN_TYPE(type)->name;
Packit bf408e
 	req->typecode = TYPE_MAIN_TYPE(type)->code;
Packit bf408e
 	req->length = type->length;
Packit bf408e
+	req->type_tag_name = (char *)TYPE_TAG_NAME(type);
Packit bf408e
 	target_type = TYPE_MAIN_TYPE(type)->target_type;
Packit bf408e
 
Packit bf408e
 	if (target_type) {
Packit bf408e
--- gdb-7.6/gdb/common/linux-ptrace.c.orig
Packit bf408e
+++ gdb-7.6/gdb/common/linux-ptrace.c
Packit bf408e
@@ -108,14 +108,14 @@ linux_ptrace_test_ret_to_nx (void)
Packit bf408e
 			".globl linux_ptrace_test_ret_to_nx_instr;"
Packit bf408e
 			"linux_ptrace_test_ret_to_nx_instr:"
Packit bf408e
 			"ret"
Packit bf408e
-			: : "r" (return_address) : "%esp", "memory");
Packit bf408e
+			: : "r" (return_address) : "memory");
Packit bf408e
 #elif defined __x86_64__
Packit bf408e
 	  asm volatile ("pushq %0;"
Packit bf408e
 			".globl linux_ptrace_test_ret_to_nx_instr;"
Packit bf408e
 			"linux_ptrace_test_ret_to_nx_instr:"
Packit bf408e
 			"ret"
Packit bf408e
 			: : "r" ((uint64_t) (uintptr_t) return_address)
Packit bf408e
-			: "%rsp", "memory");
Packit bf408e
+			: "memory");
Packit bf408e
 #else
Packit bf408e
 # error "!__i386__ && !__x86_64__"
Packit bf408e
 #endif
Packit Service 2d41f0
--- gdb-7.6/gdb/features/aarch64.c.orig
Packit Service 2d41f0
+++ gdb-7.6/gdb/features/aarch64.c
Packit Service 2d41f0
@@ -5,7 +5,6 @@
Packit Service 2d41f0
 #include "osabi.h"
Packit Service 2d41f0
 #include "target-descriptions.h"
Packit Service 2d41f0
 
Packit Service 2d41f0
-struct target_desc *tdesc_aarch64;
Packit Service 2d41f0
 static void
Packit Service 2d41f0
 initialize_tdesc_aarch64 (void)
Packit Service 2d41f0
 {
Packit Service 2d41f0
--- gdb-7.6/gdb/aarch64-linux-nat.c.orig
Packit Service 2d41f0
+++ gdb-7.6/gdb/aarch64-linux-nat.c
Packit Service 2d41f0
@@ -37,6 +37,7 @@
Packit Service 2d41f0
 
Packit Service 2d41f0
 #include "gregset.h"
Packit Service 2d41f0
 
Packit Service 2d41f0
+extern struct target_desc *tdesc_aarch64;
Packit Service 2d41f0
 #include "features/aarch64.c"
Packit Service 2d41f0
 
Packit Service 2d41f0
 /* Defines ps_err_e, struct ps_prochandle.  */
Packit Service 2d41f0
--- gdb-7.6/gdb/aarch64-tdep.c.orig
Packit Service 2d41f0
+++ gdb-7.6/gdb/aarch64-tdep.c
Packit Service 2d41f0
@@ -52,6 +52,7 @@
Packit Service 2d41f0
 #include "gdb_assert.h"
Packit Service 2d41f0
 #include "vec.h"
Packit Service 2d41f0
 
Packit Service 2d41f0
+struct target_desc *tdesc_aarch64;
Packit Service 2d41f0
 #include "features/aarch64.c"
Packit Service 2d41f0
 #include "features/aarch64-without-fpu.c"
Packit Service 2d41f0