diff --git a/.cvsignore b/.cvsignore index d1d65dc..5879a33 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1 @@ -gdb-6.8.50.20090302.tar.bz2 +gdb-6.8.50.20090803.tar.bz2 diff --git a/gdb-6.3-dtorfix-20050121.patch b/gdb-6.3-dtorfix-20050121.patch deleted file mode 100644 index 55cd23e..0000000 --- a/gdb-6.3-dtorfix-20050121.patch +++ /dev/null @@ -1,52 +0,0 @@ -2005-01-21 Jeff Johnston - - * linespec.c (collect_methods): Don't do special processing for - destructors as this will be handled in find_methods. - (find_methods): Fix ctor check to also check for dtor. - -2007-10-14 Jan Kratochvil - - Port to GDB-6.7. - -Index: gdb-6.7/gdb/linespec.c -=================================================================== ---- gdb-6.7.orig/gdb/linespec.c 2007-10-13 05:26:33.000000000 +0200 -+++ gdb-6.7/gdb/linespec.c 2007-10-14 23:31:03.000000000 +0200 -@@ -398,12 +398,14 @@ add_matching_methods (int method_counter - - /* Check for special case of looking for member that - doesn't have a mangled name provided. This will happen -- when we have in-charge and not-in-charge constructors. -+ when we have in-charge and not-in-charge ctors/dtors. - Since we don't have a mangled name to work with, if we -- look for the symbol, we can only find the class itself. -+ look for the symbol, we can at best find the class itself. - We can find the information we need in the minimal symbol - table which has the full member name information we need. */ -- if (strlen (phys_name) <= strlen (class_name)) -+ if (strlen (phys_name) <= strlen (class_name) -+ || (strlen (phys_name) == strlen (class_name) + 1 -+ && phys_name[0] == '~')) - return add_minsym_members (class_name, phys_name, msym_arr); - - /* Destructor is handled by caller, don't add it to -@@ -1731,6 +1733,11 @@ collect_methods (char *copy, struct type - { - int i1 = 0; /* Counter for the symbol array. */ - -+#if 0 -+ /* Ignore this special method for getting destructors because -+ find_methods is more robust and can handle multiple -+ destructors which is the case when gcc generates a not-in-charge -+ vs an in-charge destructor. */ - if (destructor_name_p (copy, t)) - { - /* Destructors are a special case. */ -@@ -1749,6 +1756,7 @@ collect_methods (char *copy, struct type - } - } - else -+#endif - i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr, msym_arr); - - return i1; diff --git a/gdb-6.3-gcore-thread-20050204.patch b/gdb-6.3-gcore-thread-20050204.patch index 7da5240..31ecbba 100644 --- a/gdb-6.3-gcore-thread-20050204.patch +++ b/gdb-6.3-gcore-thread-20050204.patch @@ -3,13 +3,13 @@ * linux-nat.c (linux_nat_xfer_memory): Don't use linux_proc_xfer_memory for ia64. -Index: gdb-6.8.50.20081209/gdb/linux-nat.c +Index: gdb-6.8.50.20090803/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/linux-nat.c 2008-12-10 01:22:23.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/linux-nat.c 2008-12-10 01:25:26.000000000 +0100 -@@ -4123,10 +4123,15 @@ linux_xfer_partial (struct target_ops *o - return linux_nat_xfer_osdata (ops, object, annex, readbuf, writebuf, - offset, len); +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.c 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.c 2009-08-04 06:29:55.000000000 +0200 +@@ -4495,10 +4495,15 @@ linux_xfer_partial (struct target_ops *o + offset &= ((ULONGEST) 1 << addr_bit) - 1; + } +#ifndef NATIVE_XFER_UNWIND_TABLE + /* FIXME: For ia64, we cannot currently use linux_proc_xfer_memory diff --git a/gdb-6.3-gstack-20050411.patch b/gdb-6.3-gstack-20050411.patch index f0f950e..55bfaab 100644 --- a/gdb-6.3-gstack-20050411.patch +++ b/gdb-6.3-gstack-20050411.patch @@ -4,20 +4,20 @@ to install and uninstall. * gstack.sh, gstack.1: New files. -Index: gdb-6.8.50.20090226/gdb/Makefile.in +Index: gdb-6.8.50.20090802/gdb/Makefile.in =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/Makefile.in 2009-02-26 22:09:59.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/Makefile.in 2009-02-26 22:10:22.000000000 +0100 -@@ -973,7 +973,7 @@ install: all install-only - - # The "install-only" target also installs the syscalls' XML files in - # the system. --install-only: $(CONFIG_INSTALL) xml-syscall-install -+install-only: install-gstack $(CONFIG_INSTALL) xml-syscall-install +--- gdb-6.8.50.20090802.orig/gdb/Makefile.in 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/Makefile.in 2009-08-03 11:09:49.000000000 +0200 +@@ -947,7 +947,7 @@ gdb.z:gdb.1 + # time it takes for make to check that all is up to date. + # install-only is intended to address that need. + install: all install-only +-install-only: $(CONFIG_INSTALL) ++install-only: install-gstack $(CONFIG_INSTALL) transformed_name=`t='$(program_transform_name)'; \ echo gdb | sed -e "$$t"` ; \ if test "x$$transformed_name" = x; then \ -@@ -1005,9 +1005,26 @@ install-tui: +@@ -979,9 +979,26 @@ install-tui: $(DESTDIR)$(man1dir) ; \ $(INSTALL_DATA) $(srcdir)/gdb.1 \ $(DESTDIR)$(man1dir)/$$transformed_name.1 @@ -45,7 +45,7 @@ Index: gdb-6.8.50.20090226/gdb/Makefile.in transformed_name=`t='$(program_transform_name)'; \ echo gdb | sed -e $$t` ; \ if test "x$$transformed_name" = x; then \ -@@ -1029,6 +1046,17 @@ uninstall-tui: +@@ -1003,6 +1020,17 @@ uninstall-tui: fi ; \ rm -f $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) \ $(DESTDIR)$(man1dir)/$$transformed_name.1 @@ -63,10 +63,10 @@ Index: gdb-6.8.50.20090226/gdb/Makefile.in # The C++ name parser can be built standalone for testing. test-cp-name-parser.o: cp-name-parser.c -Index: gdb-6.8.50.20090226/gdb/gstack.sh +Index: gdb-6.8.50.20090802/gdb/gstack.sh =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090226/gdb/gstack.sh 2009-02-26 22:10:05.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/gstack.sh 2009-08-03 11:08:52.000000000 +0200 @@ -0,0 +1,48 @@ +#!/bin/sh + diff --git a/gdb-6.3-ia64-gcore-page0-20050421.patch b/gdb-6.3-ia64-gcore-page0-20050421.patch index 093d641..0c4245c 100644 --- a/gdb-6.3-ia64-gcore-page0-20050421.patch +++ b/gdb-6.3-ia64-gcore-page0-20050421.patch @@ -1,8 +1,8 @@ -Index: gdb-6.8.50.20081128/gdb/gcore.c +Index: gdb-6.8.50.20090802/gdb/gcore.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/gcore.c 2008-09-11 16:27:34.000000000 +0200 -+++ gdb-6.8.50.20081128/gdb/gcore.c 2008-12-01 16:39:04.000000000 +0100 -@@ -475,8 +475,14 @@ gcore_copy_callback (bfd *obfd, asection +--- gdb-6.8.50.20090802.orig/gdb/gcore.c 2009-08-03 12:27:55.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/gcore.c 2009-08-03 12:28:56.000000000 +0200 +@@ -479,8 +479,14 @@ gcore_copy_callback (bfd *obfd, asection if (size > total_size) size = total_size; @@ -12,9 +12,9 @@ Index: gdb-6.8.50.20081128/gdb/gcore.c if (target_read_memory (bfd_section_vma (obfd, osec) + offset, - memhunk, size) != 0) + memhunk, size) != 0 -+ && (strcmp (gdbarch_bfd_arch_info (current_gdbarch)->arch_name, ++ && (strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, + "ia64") + || bfd_section_vma (obfd, osec) != 0)) { - warning (_("Memory read failed for corefile section, %s bytes at 0x%s."), - plongest (size), paddr (bfd_section_vma (obfd, osec))); + warning (_("Memory read failed for corefile section, %s bytes at %s."), + plongest (size), diff --git a/gdb-6.3-ia64-gcore-speedup-20050714.patch b/gdb-6.3-ia64-gcore-speedup-20050714.patch index a9d4377..f902e62 100644 --- a/gdb-6.3-ia64-gcore-speedup-20050714.patch +++ b/gdb-6.3-ia64-gcore-speedup-20050714.patch @@ -7,13 +7,13 @@ (ia64_rse_skip_regs): Ditto. (ia64_linux_check_stack_region): New function. -Index: gdb-6.8.50.20090226/gdb/linux-nat.c +Index: gdb-6.8.50.20090803/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/linux-nat.c 2009-02-27 07:51:44.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/linux-nat.c 2009-02-28 07:19:05.000000000 +0100 -@@ -4386,15 +4386,38 @@ linux_xfer_partial (struct target_ops *o - return linux_nat_xfer_osdata (ops, object, annex, readbuf, writebuf, - offset, len); +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.c 2009-08-04 06:29:55.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.c 2009-08-04 06:30:53.000000000 +0200 +@@ -4495,15 +4495,38 @@ linux_xfer_partial (struct target_ops *o + offset &= ((ULONGEST) 1 << addr_bit) - 1; + } -#ifndef NATIVE_XFER_UNWIND_TABLE - /* FIXME: For ia64, we cannot currently use linux_proc_xfer_memory @@ -55,10 +55,10 @@ Index: gdb-6.8.50.20090226/gdb/linux-nat.c return super_xfer_partial (ops, object, annex, readbuf, writebuf, offset, len); -Index: gdb-6.8.50.20090226/gdb/ia64-linux-nat.c +Index: gdb-6.8.50.20090803/gdb/ia64-linux-nat.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/ia64-linux-nat.c 2009-02-23 01:03:49.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/ia64-linux-nat.c 2009-02-28 07:18:10.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/ia64-linux-nat.c 2009-02-23 01:03:49.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/ia64-linux-nat.c 2009-08-04 06:30:53.000000000 +0200 @@ -809,6 +809,64 @@ ia64_linux_xfer_partial (struct target_o void _initialize_ia64_linux_nat (void); diff --git a/gdb-6.3-ia64-sigtramp-fp-20050926.patch b/gdb-6.3-ia64-sigtramp-fp-20050926.patch index 528afbf..9baf801 100644 --- a/gdb-6.3-ia64-sigtramp-fp-20050926.patch +++ b/gdb-6.3-ia64-sigtramp-fp-20050926.patch @@ -24,11 +24,11 @@ Fix a compilation error on a typo. -Index: gdb-6.8.50.20081128/gdb/libunwind-frame.c +Index: gdb-6.8.50.20090803/gdb/libunwind-frame.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/libunwind-frame.c 2008-05-06 20:37:46.000000000 +0200 -+++ gdb-6.8.50.20081128/gdb/libunwind-frame.c 2008-12-02 19:46:26.000000000 +0100 -@@ -61,6 +61,7 @@ static unw_word_t (*unw_find_dyn_list_p) +--- gdb-6.8.50.20090803.orig/gdb/libunwind-frame.c 2009-01-03 06:57:52.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/libunwind-frame.c 2009-08-04 06:31:34.000000000 +0200 +@@ -62,6 +62,7 @@ static unw_word_t (*unw_find_dyn_list_p) struct libunwind_frame_cache { CORE_ADDR base; @@ -36,7 +36,7 @@ Index: gdb-6.8.50.20081128/gdb/libunwind-frame.c CORE_ADDR func_addr; unw_cursor_t cursor; unw_addr_space_t as; -@@ -133,6 +134,7 @@ libunwind_frame_cache (struct frame_info +@@ -134,6 +135,7 @@ libunwind_frame_cache (struct frame_info unw_accessors_t *acc; unw_addr_space_t as; unw_word_t fp; @@ -44,7 +44,7 @@ Index: gdb-6.8.50.20081128/gdb/libunwind-frame.c unw_regnum_t uw_sp_regnum; struct libunwind_frame_cache *cache; struct libunwind_descr *descr; -@@ -174,14 +176,30 @@ libunwind_frame_cache (struct frame_info +@@ -175,14 +177,30 @@ libunwind_frame_cache (struct frame_info : __LITTLE_ENDIAN); unw_init_remote_p (&cache->cursor, as, this_frame); @@ -77,7 +77,7 @@ Index: gdb-6.8.50.20081128/gdb/libunwind-frame.c ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp); if (ret < 0) { -@@ -189,6 +207,7 @@ libunwind_frame_cache (struct frame_info +@@ -190,6 +208,7 @@ libunwind_frame_cache (struct frame_info error (_("Can't get libunwind sp register.")); } @@ -85,7 +85,7 @@ Index: gdb-6.8.50.20081128/gdb/libunwind-frame.c cache->base = (CORE_ADDR)fp; cache->as = as; -@@ -376,6 +395,31 @@ libunwind_search_unwind_table (void *as, +@@ -377,6 +396,31 @@ libunwind_search_unwind_table (void *as, di, pi, need_unwind_info, args); } @@ -117,10 +117,10 @@ Index: gdb-6.8.50.20081128/gdb/libunwind-frame.c /* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */ int libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self, -Index: gdb-6.8.50.20081128/gdb/libunwind-frame.h +Index: gdb-6.8.50.20090803/gdb/libunwind-frame.h =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/libunwind-frame.h 2008-05-06 20:37:46.000000000 +0200 -+++ gdb-6.8.50.20081128/gdb/libunwind-frame.h 2008-12-02 19:38:55.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/libunwind-frame.h 2009-01-03 06:57:52.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/libunwind-frame.h 2009-08-04 06:31:34.000000000 +0200 @@ -52,6 +52,9 @@ void libunwind_frame_set_descr (struct g void libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache, @@ -131,11 +131,11 @@ Index: gdb-6.8.50.20081128/gdb/libunwind-frame.h struct value *libunwind_frame_prev_register (struct frame_info *this_frame, void **this_cache, int regnum); void libunwind_frame_dealloc_cache (struct frame_info *self, void *cache); -Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c +Index: gdb-6.8.50.20090803/gdb/ia64-tdep.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/ia64-tdep.c 2008-12-02 19:04:32.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/ia64-tdep.c 2008-12-02 21:09:46.000000000 +0100 -@@ -2964,7 +2964,7 @@ ia64_libunwind_sigtramp_frame_this_id (s +--- gdb-6.8.50.20090803.orig/gdb/ia64-tdep.c 2009-08-04 06:30:45.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/ia64-tdep.c 2009-08-04 06:31:34.000000000 +0200 +@@ -3023,7 +3023,7 @@ ia64_libunwind_sigtramp_frame_this_id (s struct frame_id id; CORE_ADDR prev_ip; @@ -144,9 +144,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c if (frame_id_eq (id, null_frame_id)) { (*this_id) = null_frame_id; -@@ -2976,8 +2976,14 @@ ia64_libunwind_sigtramp_frame_this_id (s +@@ -3035,8 +3035,14 @@ ia64_libunwind_sigtramp_frame_this_id (s get_frame_register (this_frame, IA64_BSP_REGNUM, buf); - bsp = extract_unsigned_integer (buf, 8); + bsp = extract_unsigned_integer (buf, 8, byte_order); - /* For a sigtramp frame, we don't make the check for previous ip being 0. */ - (*this_id) = frame_id_build_special (id.stack_addr, id.code_addr, bsp); diff --git a/gdb-6.3-large-core-20051206.patch b/gdb-6.3-large-core-20051206.patch index 73e8139..9b44d5b 100644 --- a/gdb-6.3-large-core-20051206.patch +++ b/gdb-6.3-large-core-20051206.patch @@ -25,10 +25,10 @@ Port to GDB-6.7. -Index: gdb-6.8.50.20090226/gdb/symfile-mem.c +Index: gdb-6.8.50.20090803/gdb/symfile-mem.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/symfile-mem.c 2009-02-21 17:14:49.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/symfile-mem.c 2009-02-28 07:22:09.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/symfile-mem.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile-mem.c 2009-08-03 16:03:17.000000000 +0200 @@ -56,6 +56,14 @@ #include "elf/common.h" @@ -53,11 +53,11 @@ Index: gdb-6.8.50.20090226/gdb/symfile-mem.c if (nbfd == NULL) error (_("Failed to read a valid object file image from memory.")); -Index: gdb-6.8.50.20090226/gdb/target.c +Index: gdb-6.8.50.20090803/gdb/target.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/target.c 2009-02-27 00:04:32.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/target.c 2009-02-28 07:22:09.000000000 +0100 -@@ -57,7 +57,7 @@ static int nosymbol (char *, CORE_ADDR * +--- gdb-6.8.50.20090803.orig/gdb/target.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/target.c 2009-08-03 16:03:17.000000000 +0200 +@@ -59,7 +59,7 @@ static int nosymbol (char *, CORE_ADDR * static void tcomplain (void) ATTR_NORETURN; @@ -66,16 +66,16 @@ Index: gdb-6.8.50.20090226/gdb/target.c static int return_zero (void); -@@ -286,7 +286,7 @@ target_create_inferior (char *exec_file, +@@ -452,7 +452,7 @@ target_terminal_inferior (void) + (*current_target.to_terminal_inferior) (); } - -static int +static LONGEST nomemory (CORE_ADDR memaddr, char *myaddr, int len, int write, struct target_ops *t) { -@@ -507,7 +507,7 @@ update_current_target (void) +@@ -670,7 +670,7 @@ update_current_target (void) (void (*) (struct regcache *)) noprocess); de_fault (deprecated_xfer_memory, @@ -84,25 +84,25 @@ Index: gdb-6.8.50.20090226/gdb/target.c nomemory); de_fault (to_files_info, (void (*) (struct target_ops *)) -@@ -1237,7 +1237,7 @@ target_xfer_partial (struct target_ops * +@@ -1381,7 +1381,7 @@ target_xfer_partial (struct target_ops * it makes no progress, and then return how much was transferred). */ int -target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len) +target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, LONGEST len) { - if (target_read (¤t_target, TARGET_OBJECT_MEMORY, NULL, - myaddr, memaddr, len) == len) -@@ -1247,7 +1247,7 @@ target_read_memory (CORE_ADDR memaddr, g + /* Dispatch to the topmost target, not the flattened current_target. + Memory accesses check target->to_has_(all_)memory, and the +@@ -1394,7 +1394,7 @@ target_read_memory (CORE_ADDR memaddr, g } int -target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, int len) +target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, LONGEST len) { - if (target_write (¤t_target, TARGET_OBJECT_MEMORY, NULL, - myaddr, memaddr, len) == len) -@@ -2777,8 +2777,8 @@ debug_to_prepare_to_store (struct regcac + /* Dispatch to the topmost target, not the flattened current_target. + Memory accesses check target->to_has_(all_)memory, and the +@@ -2861,8 +2861,8 @@ debug_to_prepare_to_store (struct regcac fprintf_unfiltered (gdb_stdlog, "target_prepare_to_store ()\n"); } @@ -113,22 +113,22 @@ Index: gdb-6.8.50.20090226/gdb/target.c int write, struct mem_attrib *attrib, struct target_ops *target) { -@@ -2788,8 +2788,8 @@ deprecated_debug_xfer_memory (CORE_ADDR +@@ -2872,8 +2872,8 @@ deprecated_debug_xfer_memory (CORE_ADDR attrib, target); fprintf_unfiltered (gdb_stdlog, - "target_xfer_memory (%s, xxx, %d, %s, xxx) = %d", -- paddress (memaddr), len, write ? "write" : "read", +- paddress (target_gdbarch, memaddr), len, + "target_xfer_memory (%s, xxx, %ld, %s, xxx) = %d", -+ paddress (memaddr), (long) len, write ? "write" : "read", - retval); ++ paddress (target_gdbarch, memaddr), (long) len, + write ? "write" : "read", retval); if (retval > 0) -Index: gdb-6.8.50.20090226/gdb/target.h +Index: gdb-6.8.50.20090803/gdb/target.h =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/target.h 2009-02-27 00:04:32.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/target.h 2009-02-28 07:22:09.000000000 +0100 -@@ -376,10 +376,10 @@ struct target_ops +--- gdb-6.8.50.20090803.orig/gdb/target.h 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/target.h 2009-08-03 16:03:17.000000000 +0200 +@@ -363,10 +363,10 @@ struct target_ops NOTE: cagney/2004-10-01: This has been entirely superseeded by to_xfer_partial and inferior inheritance. */ @@ -142,30 +142,24 @@ Index: gdb-6.8.50.20090226/gdb/target.h + struct target_ops *target); void (*to_files_info) (struct target_ops *); - int (*to_insert_breakpoint) (struct bp_target_info *); -@@ -679,13 +679,14 @@ extern DCACHE *target_dcache; + int (*to_insert_breakpoint) (struct gdbarch *, struct bp_target_info *); +@@ -675,10 +675,10 @@ extern DCACHE *target_dcache; extern int target_read_string (CORE_ADDR, char **, int, int *); -extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len); -+extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, -+ LONGEST len); ++extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, LONGEST len); extern int target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, - int len); + LONGEST len); --extern int xfer_memory (CORE_ADDR, gdb_byte *, int, int, -- struct mem_attrib *, struct target_ops *); -+extern LONGEST xfer_memory (CORE_ADDR, gdb_byte *, LONGEST, int, -+ struct mem_attrib *, struct target_ops *); - /* Fetches the target's memory map. If one is found it is sorted and returned, after some consistency checking. Otherwise, NULL -Index: gdb-6.8.50.20090226/gdb/dcache.c +Index: gdb-6.8.50.20090803/gdb/dcache.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/dcache.c 2009-01-03 06:57:51.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/dcache.c 2009-02-28 07:22:09.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/dcache.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/dcache.c 2009-08-03 16:03:17.000000000 +0200 @@ -524,9 +524,9 @@ dcache_free (DCACHE *dcache) This routine is indended to be called by remote_xfer_ functions. */ @@ -178,10 +172,10 @@ Index: gdb-6.8.50.20090226/gdb/dcache.c { int i; int (*xfunc) (DCACHE *dcache, CORE_ADDR addr, gdb_byte *ptr); -Index: gdb-6.8.50.20090226/gdb/dcache.h +Index: gdb-6.8.50.20090803/gdb/dcache.h =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/dcache.h 2009-01-03 06:57:51.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/dcache.h 2009-02-28 07:22:09.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/dcache.h 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/dcache.h 2009-08-03 16:03:17.000000000 +0200 @@ -35,7 +35,7 @@ void dcache_free (DCACHE *); /* Simple to call from _xfer_memory */ @@ -192,26 +186,24 @@ Index: gdb-6.8.50.20090226/gdb/dcache.h + LONGEST len, int should_write); #endif /* DCACHE_H */ -Index: gdb-6.8.50.20090226/gdb/exec.c +Index: gdb-6.8.50.20090803/gdb/exec.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/exec.c 2009-02-22 20:35:47.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/exec.c 2009-02-28 07:22:09.000000000 +0100 -@@ -464,8 +464,8 @@ map_vmap (bfd *abfd, bfd *arch) - The same routine is used to handle both core and exec files; - we just tail-call it with more arguments to select between them. */ +--- gdb-6.8.50.20090803.orig/gdb/exec.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/exec.c 2009-08-03 16:03:17.000000000 +0200 +@@ -560,7 +560,7 @@ map_vmap (bfd *abfd, bfd *arch) + } + -int --xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, +LONGEST -+xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, LONGEST len, int write, - struct mem_attrib *attrib, struct target_ops *target) - { - int res; -Index: gdb-6.8.50.20090226/gdb/linux-nat.c + section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST offset, LONGEST len, + struct target_section *sections, +Index: gdb-6.8.50.20090803/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/linux-nat.c 2009-02-28 07:22:02.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/linux-nat.c 2009-02-28 07:22:32.000000000 +0100 -@@ -4407,7 +4407,7 @@ linux_xfer_partial (struct target_ops *o +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.c 2009-08-03 16:03:17.000000000 +0200 +@@ -4516,7 +4516,7 @@ linux_xfer_partial (struct target_ops *o #endif if (iterate_over_lwps (ia64_linux_check_stack_region, &range) != NULL) { /* This region contains ia64 rse registers, we have to re-read. */ @@ -220,10 +212,10 @@ Index: gdb-6.8.50.20090226/gdb/linux-nat.c /* Re-read register stack area. */ xxfer = super_xfer_partial (ops, object, annex, -Index: gdb-6.8.50.20090226/gdb/remote.c +Index: gdb-6.8.50.20090803/gdb/remote.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/remote.c 2009-02-25 03:14:22.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/remote.c 2009-02-28 07:22:09.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/remote.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/remote.c 2009-08-03 16:03:17.000000000 +0200 @@ -25,6 +25,7 @@ #include "gdb_string.h" #include @@ -232,7 +224,7 @@ Index: gdb-6.8.50.20090226/gdb/remote.c #include "inferior.h" #include "bfd.h" #include "symfile.h" -@@ -5683,12 +5684,19 @@ handle_notification (char *buf, size_t l +@@ -5785,12 +5786,19 @@ handle_notification (char *buf, size_t l if SHOULD_WRITE is nonzero. Returns length of data written or read; 0 for error. TARGET is unused. */ @@ -254,7 +246,7 @@ Index: gdb-6.8.50.20090226/gdb/remote.c set_general_thread (inferior_ptid); -@@ -5697,7 +5705,7 @@ remote_xfer_memory (CORE_ADDR mem_addr, +@@ -5799,7 +5807,7 @@ remote_xfer_memory (CORE_ADDR mem_addr, else res = remote_read_bytes (mem_addr, buffer, mem_len); @@ -263,11 +255,11 @@ Index: gdb-6.8.50.20090226/gdb/remote.c } /* Sends a packet with content determined by the printf format string -Index: gdb-6.8.50.20090226/gdb/remote-sim.c +Index: gdb-6.8.50.20090803/gdb/remote-sim.c =================================================================== ---- gdb-6.8.50.20090226.orig/gdb/remote-sim.c 2009-02-23 19:31:23.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/remote-sim.c 2009-02-28 07:22:09.000000000 +0100 -@@ -754,11 +754,14 @@ gdbsim_prepare_to_store (struct regcache +--- gdb-6.8.50.20090803.orig/gdb/remote-sim.c 2009-08-03 16:03:00.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/remote-sim.c 2009-08-03 16:03:17.000000000 +0200 +@@ -752,11 +752,14 @@ gdbsim_prepare_to_store (struct regcache Returns the number of bytes transferred. */ @@ -284,33 +276,16 @@ Index: gdb-6.8.50.20090226/gdb/remote-sim.c /* If no program is running yet, then ignore the simulator for memory. Pass the request down to the next target, hopefully an exec file. */ -@@ -774,22 +777,22 @@ gdbsim_xfer_inferior_memory (CORE_ADDR m - printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x"); - gdb_print_host_address (myaddr, gdb_stdout); - printf_filtered (", memaddr 0x%s, len %d, write %d\n", -- paddr_nz (memaddr), len, write); -+ paddr_nz (memaddr), xfer_len, write); - if (remote_debug && write) -- dump_mem (myaddr, len); -+ dump_mem (myaddr, xfer_len); - } +Index: gdb-6.8.50.20090803/gdb/exec.h +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/exec.h 2009-06-12 20:38:36.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/exec.h 2009-08-03 16:03:57.000000000 +0200 +@@ -56,7 +56,7 @@ extern int resize_section_table (struct - if (write) - { -- len = sim_write (gdbsim_desc, memaddr, myaddr, len); -+ xfer_len = sim_write (gdbsim_desc, memaddr, myaddr, xfer_len); - } - else - { -- len = sim_read (gdbsim_desc, memaddr, myaddr, len); -- if (remote_debug && len > 0) -- dump_mem (myaddr, len); -+ xfer_len = sim_read (gdbsim_desc, memaddr, myaddr, xfer_len); -+ if (remote_debug && xfer_len > 0) -+ dump_mem (myaddr, xfer_len); - } -- return len; -+ return (LONGEST)xfer_len; - } + One, and only one, of readbuf or writebuf must be non-NULL. */ - static void +-extern int section_table_xfer_memory_partial (gdb_byte *, const gdb_byte *, ++extern LONGEST section_table_xfer_memory_partial (gdb_byte *, const gdb_byte *, + ULONGEST, LONGEST, + struct target_section *, + struct target_section *, diff --git a/gdb-6.3-linespec-20041213.patch b/gdb-6.3-linespec-20041213.patch deleted file mode 100644 index eb373ef..0000000 --- a/gdb-6.3-linespec-20041213.patch +++ /dev/null @@ -1,464 +0,0 @@ -[base] - -2007-09-21 Jan Kratochvil - - * linespec.c (add_minsym_members): Support also the `$allocate' and - `$delete' variants. - -2007-10-05 Jan Kratochvil - - * linespec.c (add_minsym_members): Support also the `$allocate' and - `$delete' variants. - (decode_variable): Renamed to ... - (decode_variable_1) ... here, its parameter NOT_FOUND_PTR and its - exception throwing was moved to ... - (decode_variable_not_found): ... a new function here. - (decode_variable): New function. - -2007-10-31 Jan Kratochvil - - Port to GDB-6.7. - -[ Remove decode_variable* for GDB-6.8+ as no longer needed. ] - -Index: gdb-6.8.50.20081128/gdb/linespec.c -=================================================================== ---- gdb-6.8.50.20081128.orig/gdb/linespec.c 2008-09-05 13:37:17.000000000 +0200 -+++ gdb-6.8.50.20081128/gdb/linespec.c 2008-12-04 01:43:36.000000000 +0100 -@@ -39,6 +39,7 @@ - #include "interps.h" - #include "mi/mi-cmds.h" - #include "target.h" -+#include "gdb_assert.h" - - /* We share this one with symtab.c, but it is not exported widely. */ - -@@ -78,7 +79,8 @@ static struct symtabs_and_lines find_met - - static int collect_methods (char *copy, struct type *t, - struct symbol *sym_class, -- struct symbol **sym_arr); -+ struct symbol **sym_arr, -+ struct minimal_symbol **msym_arr); - - static NORETURN void cplusplus_error (const char *name, - const char *fmt, ...) -@@ -87,11 +89,13 @@ static NORETURN void cplusplus_error (co - static int total_number_of_methods (struct type *type); - - static int find_methods (struct type *, char *, -- enum language, struct symbol **); -+ enum language, struct symbol **, -+ struct minimal_symbol **); - - static int add_matching_methods (int method_counter, struct type *t, - enum language language, -- struct symbol **sym_arr); -+ struct symbol **sym_arr, -+ struct minimal_symbol **msym_arr); - - static int add_constructors (int method_counter, struct type *t, - enum language language, -@@ -107,6 +111,9 @@ static int is_objc_method_format (const - static struct symtabs_and_lines decode_line_2 (struct symbol *[], - int, int, char ***); - -+static struct symtabs_and_lines decode_line_3 (struct minimal_symbol *[], -+ int, int, char ***); -+ - static struct symtab *symtab_from_filename (char **argptr, - char *p, int is_quote_enclosed, - int *not_found_ptr); -@@ -196,13 +203,18 @@ total_number_of_methods (struct type *ty - /* Recursive helper function for decode_line_1. - Look for methods named NAME in type T. - Return number of matches. -- Put matches in SYM_ARR, which should have been allocated with -+ Put symbol matches in SYM_ARR, which should have been allocated with - a size of total_number_of_methods (T) * sizeof (struct symbol *). -+ In a special case where we are looking for constructors, we may -+ have to return minimal symbols in the array: MSYM_ARR. This occurs -+ when the compiler does not generate mangled names for the constructor's -+ debug info because there are multiple versions of the constructor -+ (in-charge vs not-in-charge). - Note that this function is g++ specific. */ - - static int - find_methods (struct type *t, char *name, enum language language, -- struct symbol **sym_arr) -+ struct symbol **sym_arr, struct minimal_symbol **msym_arr) - { - int i1 = 0; - int ibase; -@@ -244,7 +256,7 @@ find_methods (struct type *t, char *name - if (strcmp_iw (name, method_name) == 0) - /* Find all the overloaded methods with that name. */ - i1 += add_matching_methods (method_counter, t, language, -- sym_arr + i1); -+ sym_arr + i1, msym_arr); - else if (strncmp (class_name, name, name_len) == 0 - && (class_name[name_len] == '\0' - || class_name[name_len] == '<')) -@@ -267,21 +279,100 @@ find_methods (struct type *t, char *name - if (i1 == 0) - for (ibase = 0; ibase < TYPE_N_BASECLASSES (t); ibase++) - i1 += find_methods (TYPE_BASECLASS (t, ibase), name, -- language, sym_arr + i1); -+ language, sym_arr + i1, msym_arr); - - return i1; - } - -+static int -+add_minsym_members (const char *class_name, -+ const char *member_name, -+ struct minimal_symbol **msym_arr) -+{ -+ char *completion_name; -+ char **list; -+ int i; -+ int comp_len; -+ int counter = 0; -+ -+ /* To find the member, we first cheat and use symbol completion. -+ This will give us a list of all the member names including -+ the function signature. */ -+ completion_name = xmalloc (strlen (class_name) + -+ strlen (member_name) + 9); -+ completion_name[0] = '\''; -+ strcpy (completion_name+1, class_name); -+ /* FIXME: make this the language class separator. */ -+ strcat (completion_name, "::"); -+ strcat (completion_name, member_name); -+ strcat (completion_name, "("); -+ list = make_symbol_completion_list (completion_name, -+ completion_name+1); -+ -+ /* Now that we have the list, we generate an array of their -+ corresponding minimal symbols. */ -+ counter = 0; -+ while (list && list[counter] != NULL) -+ { -+ msym_arr[counter] = lookup_minimal_symbol (list[counter], NULL, NULL); -+ ++counter; -+ } -+ -+ xfree (list); -+ -+ /* In the case of constructors, there may be in-charge vs not-in-charge -+ constructors. Check for names with $base which indicates not-in-charge -+ constructors. */ -+ comp_len = strlen (completion_name); -+ strcpy (completion_name + comp_len - 1, "$base("); -+ list = make_symbol_completion_list (completion_name, -+ completion_name+1); -+ -+ /* Again we have a list. Add their minimal symbols to the array. */ -+ i = 0; -+ while (list && list[i] != NULL) -+ { -+ msym_arr[counter] = lookup_minimal_symbol (list[i++], NULL, NULL); -+ ++counter; -+ } -+ xfree (list); -+ -+ /* Target also the allocating/deleting variants. */ -+ if (member_name[0] == '~') -+ strcpy (completion_name + comp_len - 1, "$delete("); -+ else -+ strcpy (completion_name + comp_len - 1, "$allocate("); -+ list = make_symbol_completion_list (completion_name, -+ completion_name+1); -+ -+ /* Again we have a list. Add their minimal symbols to the array. */ -+ i = 0; -+ while (list && list[i] != NULL) -+ { -+ msym_arr[counter] = lookup_minimal_symbol (list[i++], NULL, NULL); -+ ++counter; -+ } -+ xfree (list); -+ -+ xfree (completion_name); -+ -+ return counter; -+} -+ - /* Add the symbols associated to methods of the class whose type is T - and whose name matches the method indexed by METHOD_COUNTER in the - array SYM_ARR. Return the number of methods added. */ - - static int - add_matching_methods (int method_counter, struct type *t, -- enum language language, struct symbol **sym_arr) -+ enum language language, struct symbol **sym_arr, -+ struct minimal_symbol **msym_arr) - { - int field_counter; - int i1 = 0; -+ int cons_index = 0; -+ char *class_name = type_name_no_tag (t); -+ char **list = NULL; - - for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1; - field_counter >= 0; -@@ -306,6 +397,16 @@ add_matching_methods (int method_counter - else - phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); - -+ /* Check for special case of looking for member that -+ doesn't have a mangled name provided. This will happen -+ when we have in-charge and not-in-charge constructors. -+ Since we don't have a mangled name to work with, if we -+ look for the symbol, we can only find the class itself. -+ We can find the information we need in the minimal symbol -+ table which has the full member name information we need. */ -+ if (strlen (phys_name) <= strlen (class_name)) -+ return add_minsym_members (class_name, phys_name, msym_arr); -+ - /* Destructor is handled by caller, don't add it to - the list. */ - if (is_destructor_name (phys_name) != 0) -@@ -330,6 +431,9 @@ add_matching_methods (int method_counter - } - } - -+ if (list) -+ xfree (list); -+ - return i1; - } - -@@ -630,6 +734,146 @@ See set/show multiple-symbol.")); - discard_cleanups (old_chain); - return return_values; - } -+ -+/* Given a list of NELTS minimal symbols in MSYM_ARR, return a list of lines to -+ operate on (ask user if necessary). -+ If CANONICAL is non-NULL return a corresponding array of mangled names -+ as canonical line specs there. */ -+ -+static struct symtabs_and_lines -+decode_line_3 (struct minimal_symbol *msym_arr[], -+ int nelts, int funfirstline, -+ char ***canonical) -+{ -+ struct symtabs_and_lines values, return_values; -+ char *args, *arg1; -+ int i; -+ char *prompt; -+ char *symname; -+ struct cleanup *old_chain; -+ char **canonical_arr = (char **) NULL; -+ -+ values.sals = (struct symtab_and_line *) -+ alloca (nelts * sizeof (struct symtab_and_line)); -+ return_values.sals = (struct symtab_and_line *) -+ xmalloc (nelts * sizeof (struct symtab_and_line)); -+ old_chain = make_cleanup (xfree, return_values.sals); -+ -+ if (canonical) -+ { -+ canonical_arr = (char **) xmalloc (nelts * sizeof (char *)); -+ make_cleanup (xfree, canonical_arr); -+ memset (canonical_arr, 0, nelts * sizeof (char *)); -+ *canonical = canonical_arr; -+ } -+ -+ i = 0; -+ printf_unfiltered ("[0] cancel\n[1] all\n"); -+ while (i < nelts) -+ { -+ init_sal (&return_values.sals[i]); /* Initialize to zeroes. */ -+ init_sal (&values.sals[i]); -+ if (msym_arr[i]) -+ { -+ struct symtabs_and_lines msal = minsym_found (funfirstline, -+ msym_arr[i]); -+ memcpy (&values.sals[i], &msal.sals[0], -+ sizeof (struct symtab_and_line)); -+ if (values.sals[i].symtab) -+ printf_unfiltered ("[%d] %s at %s:%d\n", -+ (i + 2), -+ SYMBOL_PRINT_NAME (msym_arr[i]), -+ values.sals[i].symtab->filename, -+ values.sals[i].line); -+ else -+ printf_unfiltered ("[%d] %s at ?FILE:%d [No symtab? Probably broken debug info...]\n", -+ (i + 2), -+ SYMBOL_PRINT_NAME (msym_arr[i]), -+ values.sals[i].line); -+ -+ } -+ else -+ printf_unfiltered ("?HERE\n"); -+ i++; -+ } -+ -+ prompt = getenv ("PS2"); -+ if (prompt == NULL) -+ { -+ prompt = "> "; -+ } -+ args = command_line_input (prompt, 0, "overload-choice"); -+ -+ if (args == 0 || *args == 0) -+ error_no_arg ("one or more choice numbers"); -+ -+ i = 0; -+ while (*args) -+ { -+ int num; -+ -+ arg1 = args; -+ while (*arg1 >= '0' && *arg1 <= '9') -+ arg1++; -+ if (*arg1 && *arg1 != ' ' && *arg1 != '\t') -+ error ("Arguments must be choice numbers."); -+ -+ num = atoi (args); -+ -+ if (num == 0) -+ error ("canceled"); -+ else if (num == 1) -+ { -+ if (canonical_arr) -+ { -+ for (i = 0; i < nelts; i++) -+ { -+ if (canonical_arr[i] == NULL) -+ { -+ symname = SYMBOL_LINKAGE_NAME (msym_arr[i]); -+ canonical_arr[i] = savestring (symname, strlen (symname)); -+ } -+ } -+ } -+ memcpy (return_values.sals, values.sals, -+ (nelts * sizeof (struct symtab_and_line))); -+ return_values.nelts = nelts; -+ discard_cleanups (old_chain); -+ return return_values; -+ } -+ -+ if (num >= nelts + 2) -+ { -+ printf_unfiltered ("No choice number %d.\n", num); -+ } -+ else -+ { -+ num -= 2; -+ if (values.sals[num].pc) -+ { -+ if (canonical_arr) -+ { -+ symname = SYMBOL_LINKAGE_NAME (msym_arr[num]); -+ make_cleanup (xfree, symname); -+ canonical_arr[i] = savestring (symname, strlen (symname)); -+ } -+ return_values.sals[i++] = values.sals[num]; -+ values.sals[num].pc = 0; -+ } -+ else -+ { -+ printf_unfiltered ("duplicate request for %d ignored.\n", num); -+ } -+ } -+ -+ args = arg1; -+ while (*args == ' ' || *args == '\t') -+ args++; -+ } -+ return_values.nelts = i; -+ discard_cleanups (old_chain); -+ return return_values; -+} - - /* The parser of linespec itself. */ - -@@ -1438,35 +1682,47 @@ find_method (int funfirstline, char ***c - struct symbol **sym_arr = alloca (total_number_of_methods (t) - * sizeof (struct symbol *)); - -+ struct minimal_symbol **msym_arr = alloca (total_number_of_methods (t) -+ * sizeof (struct minimal_symbol *)); -+ -+ msym_arr[0] = NULL; -+ - /* Find all methods with a matching name, and put them in - sym_arr. */ - -- i1 = collect_methods (copy, t, sym_class, sym_arr); -+ i1 = collect_methods (copy, t, sym_class, sym_arr, msym_arr); - - if (i1 == 1) - { - /* There is exactly one field with that name. */ -- sym = sym_arr[0]; -- -- if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) -- { -- values.sals = (struct symtab_and_line *) -- xmalloc (sizeof (struct symtab_and_line)); -- values.nelts = 1; -- values.sals[0] = find_function_start_sal (sym, -- funfirstline); -- } -+ if (msym_arr[0] != NULL) -+ return minsym_found (funfirstline, msym_arr[0]); - else - { -- values.sals = NULL; -- values.nelts = 0; -+ sym = sym_arr[0]; -+ -+ if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) -+ { -+ values.sals = (struct symtab_and_line *) -+ xmalloc (sizeof (struct symtab_and_line)); -+ values.nelts = 1; -+ values.sals[0] = find_function_start_sal (sym, -+ funfirstline); -+ } -+ else -+ { -+ values.sals = NULL; -+ values.nelts = 0; -+ } -+ return values; - } -- return values; - } - if (i1 > 0) - { - /* There is more than one field with that name - (overloaded). Ask the user which one to use. */ -+ if (msym_arr[0] != NULL) -+ return decode_line_3 (msym_arr, i1, funfirstline, canonical); - return decode_line_2 (sym_arr, i1, funfirstline, canonical); - } - else -@@ -1493,11 +1748,12 @@ find_method (int funfirstline, char ***c - } - - /* Find all methods named COPY in the class whose type is T, and put -- them in SYM_ARR. Return the number of methods found. */ -+ them in SYM_ARR or MSYM_ARR. Return the number of methods found. */ - - static int - collect_methods (char *copy, struct type *t, -- struct symbol *sym_class, struct symbol **sym_arr) -+ struct symbol *sym_class, struct symbol **sym_arr, -+ struct minimal_symbol **msym_arr) - { - int i1 = 0; /* Counter for the symbol array. */ - -@@ -1518,7 +1774,7 @@ collect_methods (char *copy, struct type - } - } - else -- i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr); -+ i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr, msym_arr); - - return i1; - } diff --git a/gdb-6.3-pie-20050110.patch b/gdb-6.3-pie-20050110.patch index 0bbc0ec..71aeaaa 100644 --- a/gdb-6.3-pie-20050110.patch +++ b/gdb-6.3-pie-20050110.patch @@ -26,10 +26,10 @@ Fix scan_dyntag() for binaries provided by valgrind (BZ 460319). -Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c +Index: gdb-6.8.50.20090803/gdb/amd64-tdep.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/amd64-tdep.c 2009-05-10 21:36:29.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/amd64-tdep.c 2009-05-10 21:41:23.000000000 +0200 +--- gdb-6.8.50.20090803.orig/gdb/amd64-tdep.c 2009-08-03 21:39:38.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/amd64-tdep.c 2009-08-03 21:39:39.000000000 +0200 @@ -36,6 +36,7 @@ #include "regcache.h" #include "regset.h" @@ -38,15 +38,17 @@ Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c #include "gdb_assert.h" -@@ -1586,16 +1587,28 @@ amd64_analyze_stack_align (CORE_ADDR pc, +@@ -1591,18 +1592,31 @@ amd64_analyze_stack_align (CORE_ADDR pc, Any function that doesn't start with this sequence will be assumed to have no prologue and thus no valid frame pointer in %rbp. */ -static CORE_ADDR --amd64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc, +-amd64_analyze_prologue (struct gdbarch *gdbarch, +- CORE_ADDR pc, CORE_ADDR current_pc, - struct amd64_frame_cache *cache) +struct amd64_analyze_prologue_data + { ++ struct gdbarch *gdbarch; + CORE_ADDR pc, current_pc; + struct amd64_frame_cache *cache; + CORE_ADDR retval; @@ -56,8 +58,10 @@ Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c +amd64_analyze_prologue_1 (void *data_pointer) { + struct amd64_analyze_prologue_data *data = data_pointer; ++ struct gdbarch *gdbarch = data->gdbarch; + CORE_ADDR pc = data->pc, current_pc = data->current_pc; + struct amd64_frame_cache *cache = data->cache; + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); static gdb_byte proto[3] = { 0x48, 0x89, 0xe5 }; /* movq %rsp, %rbp */ gdb_byte buf[3]; gdb_byte op; @@ -71,7 +75,7 @@ Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c pc = amd64_analyze_stack_align (pc, current_pc, cache); -@@ -1610,18 +1623,57 @@ amd64_analyze_prologue (CORE_ADDR pc, CO +@@ -1617,18 +1631,59 @@ amd64_analyze_prologue (struct gdbarch * /* If that's all, return now. */ if (current_pc <= pc + 1) @@ -107,7 +111,8 @@ Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c + ->find_function_start_sal */ + +static CORE_ADDR -+amd64_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc, ++amd64_analyze_prologue (struct gdbarch *gdbarch, ++ CORE_ADDR pc, CORE_ADDR current_pc, + struct amd64_frame_cache *cache) +{ + int status; @@ -118,6 +123,7 @@ Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c + saved_gdb_stderr = gdb_stderr; + gdb_stderr = ui_file_new (); + ++ data.gdbarch = gdbarch; + data.pc = pc; + data.current_pc = current_pc; + data.cache = cache; @@ -132,11 +138,11 @@ Index: gdb-6.8.50.20090302/gdb/amd64-tdep.c return pc; } -Index: gdb-6.8.50.20090302/gdb/auxv.c +Index: gdb-6.8.50.20090803/gdb/auxv.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/auxv.c 2009-05-10 21:36:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/auxv.c 2009-05-10 21:41:23.000000000 +0200 -@@ -81,7 +81,7 @@ procfs_xfer_auxv (struct target_ops *ops +--- gdb-6.8.50.20090803.orig/gdb/auxv.c 2009-08-03 21:39:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/auxv.c 2009-08-03 21:39:39.000000000 +0200 +@@ -78,7 +78,7 @@ procfs_xfer_auxv (struct target_ops *ops Return 1 if an entry was read into *TYPEP and *VALP. */ static int default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, @@ -145,7 +151,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c { const int sizeof_auxv_field = gdbarch_ptr_bit (target_gdbarch) / TARGET_CHAR_BIT; -@@ -108,7 +108,7 @@ default_auxv_parse (struct target_ops *o +@@ -106,7 +106,7 @@ default_auxv_parse (struct target_ops *o Return 1 if an entry was read into *TYPEP and *VALP. */ int target_auxv_parse (struct target_ops *ops, gdb_byte **readptr, @@ -154,7 +160,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c { struct target_ops *t; for (t = ops; t != NULL; t = t->beneath) -@@ -123,9 +123,10 @@ target_auxv_parse (struct target_ops *op +@@ -121,9 +121,10 @@ target_auxv_parse (struct target_ops *op an error getting the information. On success, return 1 after storing the entry's value field in *VALP. */ int @@ -167,7 +173,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c gdb_byte *data; LONGEST n = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL, &data); gdb_byte *ptr = data; -@@ -135,10 +136,10 @@ target_auxv_search (struct target_ops *o +@@ -133,10 +134,10 @@ target_auxv_search (struct target_ops *o return n; while (1) @@ -180,7 +186,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c { xfree (data); *valp = val; -@@ -161,7 +162,8 @@ target_auxv_search (struct target_ops *o +@@ -159,7 +160,8 @@ target_auxv_search (struct target_ops *o int fprint_target_auxv (struct ui_file *file, struct target_ops *ops) { @@ -190,7 +196,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c gdb_byte *data; LONGEST len = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL, &data); -@@ -171,13 +173,13 @@ fprint_target_auxv (struct ui_file *file +@@ -169,13 +171,13 @@ fprint_target_auxv (struct ui_file *file if (len <= 0) return len; @@ -206,7 +212,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c { #define TAG(tag, text, kind) \ case tag: name = #tag; description = text; flavor = kind; break -@@ -233,7 +235,7 @@ fprint_target_auxv (struct ui_file *file +@@ -231,7 +233,7 @@ fprint_target_auxv (struct ui_file *file } fprintf_filtered (file, "%-4s %-20s %-30s ", @@ -215,7 +221,7 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c switch (flavor) { case dec: -@@ -255,7 +257,7 @@ fprint_target_auxv (struct ui_file *file +@@ -253,7 +255,7 @@ fprint_target_auxv (struct ui_file *file break; } ++ents; @@ -224,11 +230,11 @@ Index: gdb-6.8.50.20090302/gdb/auxv.c break; } -Index: gdb-6.8.50.20090302/gdb/auxv.h +Index: gdb-6.8.50.20090803/gdb/auxv.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/auxv.h 2009-01-03 06:57:50.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/auxv.h 2009-05-10 21:41:23.000000000 +0200 -@@ -36,14 +36,14 @@ struct target_ops; /* Forward declarati +--- gdb-6.8.50.20090803.orig/gdb/auxv.h 2009-08-03 21:39:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/auxv.h 2009-08-03 21:39:39.000000000 +0200 +@@ -31,14 +31,14 @@ Return 1 if an entry was read into *TYPEP and *VALP. */ extern int target_auxv_parse (struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, @@ -245,123 +251,24 @@ Index: gdb-6.8.50.20090302/gdb/auxv.h /* Print the contents of the target's AUXV on the specified file. */ extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops); -Index: gdb-6.8.50.20090302/gdb/breakpoint.c +Index: gdb-6.8.50.20090803/gdb/dwarf2read.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/breakpoint.c 2009-05-10 21:36:30.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/breakpoint.c 2009-05-10 21:41:23.000000000 +0200 -@@ -3920,7 +3920,8 @@ describe_other_breakpoints (CORE_ADDR pc - printf_filtered (" (thread %d)", b->thread); - printf_filtered ("%s%s ", - ((b->enable_state == bp_disabled || -- b->enable_state == bp_call_disabled) -+ b->enable_state == bp_call_disabled || -+ b->enable_state == bp_startup_disabled) - ? " (disabled)" - : b->enable_state == bp_permanent - ? " (permanent)" -@@ -5009,6 +5010,61 @@ create_catchpoint (int tempflag, char *c - return b; - } - -+void -+disable_breakpoints_at_startup (int silent) -+{ -+ struct breakpoint *b; -+ int disabled_startup_breaks = 0; -+ -+ if (bfd_get_start_address (exec_bfd) != entry_point_address ()) -+ { -+ ALL_BREAKPOINTS (b) -+ { -+ if (((b->type == bp_breakpoint) || -+ (b->type == bp_hardware_breakpoint)) && -+ b->enable_state == bp_enabled && -+ b->loc != NULL && !b->loc->duplicate) -+ { -+ b->enable_state = bp_startup_disabled; -+ if (!silent) -+ { -+ if (!disabled_startup_breaks) -+ { -+ target_terminal_ours_for_output (); -+ warning ("Temporarily disabling breakpoints:"); -+ } -+ disabled_startup_breaks = 1; -+ warning ("breakpoint #%d addr 0x%s", b->number, paddr_nz(b->loc->address)); -+ } -+ } -+ } -+ } -+} -+ -+/* Try to reenable any breakpoints after startup. */ -+void -+re_enable_breakpoints_at_startup (void) -+{ -+ struct breakpoint *b; -+ -+ if (bfd_get_start_address (exec_bfd) != entry_point_address ()) -+ { -+ ALL_BREAKPOINTS (b) -+ if (b->enable_state == bp_startup_disabled) -+ { -+ char buf[1]; -+ -+ /* Do not reenable the breakpoint if the shared library -+ is still not mapped in. */ -+ if (target_read_memory (b->loc->address, buf, 1) == 0) -+ { -+ /*printf ("enabling breakpoint at 0x%s\n", paddr_nz(b->loc->address));*/ -+ b->enable_state = bp_enabled; -+ } -+ } -+ } -+} -+ - static void - create_fork_vfork_event_catchpoint (int tempflag, char *cond_string, - struct breakpoint_ops *ops) -Index: gdb-6.8.50.20090302/gdb/breakpoint.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/breakpoint.h 2009-05-10 21:36:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/breakpoint.h 2009-05-10 21:41:23.000000000 +0200 -@@ -127,6 +127,7 @@ enum enable_state - automatically enabled and reset when the call - "lands" (either completes, or stops at another - eventpoint). */ -+ bp_startup_disabled, - bp_permanent /* There is a breakpoint instruction hard-wired into - the target's code. Don't try to write another - breakpoint instruction on top of it, or restore -@@ -847,6 +848,10 @@ extern void remove_thread_event_breakpoi - - extern void disable_breakpoints_in_shlibs (void); - -+extern void disable_breakpoints_at_startup (int silent); -+ -+extern void re_enable_breakpoints_at_startup (void); -+ - /* This function returns TRUE if ep is a catchpoint. */ - extern int ep_is_catchpoint (struct breakpoint *); - -Index: gdb-6.8.50.20090302/gdb/dwarf2read.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/dwarf2read.c 2009-05-10 21:36:30.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/dwarf2read.c 2009-05-10 21:41:23.000000000 +0200 -@@ -1438,7 +1438,7 @@ dwarf2_build_psymtabs (struct objfile *o - else - dwarf2_per_objfile->loc_buffer = NULL; +--- gdb-6.8.50.20090803.orig/gdb/dwarf2read.c 2009-08-03 21:39:39.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/dwarf2read.c 2009-08-03 21:39:39.000000000 +0200 +@@ -1659,7 +1659,7 @@ dwarf2_build_psymtabs (struct objfile *o + dwarf2_read_section (objfile, &dwarf2_per_objfile->eh_frame); + dwarf2_read_section (objfile, &dwarf2_per_objfile->frame); - if (mainline + if ((mainline == 1) || (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0)) { -Index: gdb-6.8.50.20090302/gdb/elfread.c +Index: gdb-6.8.50.20090803/gdb/elfread.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/elfread.c 2009-05-10 21:36:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/elfread.c 2009-05-10 21:41:23.000000000 +0200 -@@ -680,7 +680,7 @@ elf_symfile_read (struct objfile *objfil +--- gdb-6.8.50.20090803.orig/gdb/elfread.c 2009-08-03 21:39:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/elfread.c 2009-08-03 21:39:39.000000000 +0200 +@@ -681,7 +681,7 @@ elf_symfile_read (struct objfile *objfil /* If we are reinitializing, or if we have never loaded syms yet, set table to empty. MAINLINE is cleared so that *_read_psymtab functions do not all also re-initialize the psymbol table. */ @@ -370,29 +277,28 @@ Index: gdb-6.8.50.20090302/gdb/elfread.c { init_psymbol_list (objfile, 0); mainline = 0; -Index: gdb-6.8.50.20090302/gdb/infrun.c +Index: gdb-6.8.50.20090803/gdb/infrun.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infrun.c 2009-05-10 21:36:30.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/infrun.c 2009-05-10 21:41:23.000000000 +0200 -@@ -3354,6 +3354,11 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( +--- gdb-6.8.50.20090803.orig/gdb/infrun.c 2009-08-03 21:39:38.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/infrun.c 2009-08-04 06:04:25.000000000 +0200 +@@ -3531,6 +3531,10 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( #endif target_terminal_inferior (); + /* For PIE executables, we dont really know where the -+ breakpoints are going to be until we start up the -+ inferior. */ -+ re_enable_breakpoints_at_startup (); ++ breakpoints are going to be until we start up the inferior. */ ++ enable_breakpoints_after_startup (); + /* If requested, stop when the dynamic linker notifies gdb of events. This allows the user to get control and place breakpoints in initializer routines for -Index: gdb-6.8.50.20090302/gdb/objfiles.c +Index: gdb-6.8.50.20090803/gdb/objfiles.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/objfiles.c 2009-05-10 21:36:42.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/objfiles.c 2009-05-10 21:41:36.000000000 +0200 +--- gdb-6.8.50.20090803.orig/gdb/objfiles.c 2009-08-03 21:39:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/objfiles.c 2009-08-03 21:39:39.000000000 +0200 @@ -52,6 +52,9 @@ #include "exec.h" - #include "varobj.h" + #include "observer.h" +#include "auxv.h" +#include "elf/common.h" @@ -400,30 +306,27 @@ Index: gdb-6.8.50.20090302/gdb/objfiles.c /* Prototypes for local functions */ static void objfile_alloc_data (struct objfile *objfile); -@@ -272,7 +275,19 @@ init_entry_point_info (struct objfile *o +@@ -279,9 +282,17 @@ init_entry_point_info (struct objfile *o CORE_ADDR entry_point_address (void) { -- return symfile_objfile ? symfile_objfile->ei.entry_point : 0; + int ret; -+ CORE_ADDR entry_addr; + + struct gdbarch *gdbarch; + CORE_ADDR entry_point; + + /* Find the address of the entry point of the program from the + auxv vector. */ -+ ret = target_auxv_search (¤t_target, AT_ENTRY, &entry_addr); ++ ret = target_auxv_search (¤t_target, AT_ENTRY, &entry_point); + if (ret == 1) -+ return entry_addr; -+ /*if (ret == 0 || ret == -1)*/ -+ else -+ { -+ return symfile_objfile ? symfile_objfile->ei.entry_point : 0; -+ } - } ++ return entry_point; ++ + if (symfile_objfile == NULL) + return 0; - /* Create the terminating entry of OBJFILE's minimal symbol table. -@@ -445,6 +460,9 @@ free_objfile (struct objfile *objfile) - if (objfile == rt_common_objfile) - rt_common_objfile = NULL; +@@ -475,6 +486,9 @@ free_objfile (struct objfile *objfile) + if (objfile == symfile_objfile) + symfile_objfile = NULL; + if (objfile == symfile_objfile) + symfile_objfile = NULL; @@ -431,11 +334,11 @@ Index: gdb-6.8.50.20090302/gdb/objfiles.c /* Before the symbol table code was redone to make it easier to selectively load and remove information particular to a specific linkage unit, gdb used to do these things whenever the monolithic -Index: gdb-6.8.50.20090302/gdb/solib-svr4.c +Index: gdb-6.8.50.20090803/gdb/solib-svr4.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/solib-svr4.c 2009-05-10 21:36:29.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/solib-svr4.c 2009-05-10 21:41:23.000000000 +0200 -@@ -45,6 +45,7 @@ +--- gdb-6.8.50.20090803.orig/gdb/solib-svr4.c 2009-08-03 21:39:38.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/solib-svr4.c 2009-08-03 21:41:49.000000000 +0200 +@@ -47,6 +47,7 @@ #include "exec.h" #include "auxv.h" #include "exceptions.h" @@ -443,7 +346,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c static struct link_map_offsets *svr4_fetch_link_map_offsets (void); static int svr4_have_link_map_offsets (void); -@@ -287,7 +288,9 @@ static CORE_ADDR main_lm_addr; +@@ -359,7 +360,9 @@ solib_svr4_inferior_exit (int pid) /* Local function prototypes */ @@ -453,7 +356,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c static CORE_ADDR bfd_lookup_symbol (bfd *, char *); -@@ -521,10 +524,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE +@@ -600,10 +603,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE int arch_size, step, sect_size; long dyn_tag; CORE_ADDR dyn_ptr, dyn_addr; @@ -466,9 +369,9 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c if (abfd == NULL) return 0; -@@ -532,19 +537,81 @@ scan_dyntag (int dyntag, bfd *abfd, CORE +@@ -615,19 +620,81 @@ scan_dyntag (int dyntag, bfd *abfd, CORE if (arch_size == -1) - return 0; + return 0; + /* The auxv vector based relocatable files reading is limited to the main + executable. */ @@ -489,21 +392,21 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: program entry address not found. Using bfd's 0x%s for %s\n", -+ paddr_nz (entry_addr), exec_bfd->filename); ++ "elf_locate_base: program entry address not found. Using bfd's %s for %s\n", ++ paddress (target_gdbarch, entry_addr), exec_bfd->filename); + } + else + { + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: found program entry address 0x%s for %s\n", -+ paddr_nz (entry_addr), exec_bfd->filename); ++ "elf_locate_base: found program entry address %s for %s\n", ++ paddress (target_gdbarch, entry_addr), exec_bfd->filename); + } + reloc_addr = entry_addr - bfd_get_start_address (exec_bfd); + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: expected relocation offset 0x%s for %s\n", -+ paddr_nz (reloc_addr), exec_bfd->filename); ++ "elf_locate_base: expected relocation offset %s for %s\n", ++ paddress (target_gdbarch, reloc_addr), exec_bfd->filename); + } + /* Find the start address of the .dynamic section. */ @@ -528,8 +431,8 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c dyn_addr = bfd_section_vma (abfd, sect); + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: .dynamic addr 0x%s\n", -+ paddr_nz (dyn_addr)); ++ "elf_locate_base: .dynamic addr %s\n", ++ paddress (target_gdbarch, dyn_addr)); /* Read in .dynamic from the BFD. We will get the actual value from memory later. */ @@ -550,7 +453,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */ step = (arch_size == 32) ? sizeof (Elf32_External_Dyn) -@@ -565,26 +632,105 @@ scan_dyntag (int dyntag, bfd *abfd, CORE +@@ -648,26 +715,105 @@ scan_dyntag (int dyntag, bfd *abfd, CORE dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag); dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr); } @@ -573,7 +476,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + fprintf_unfiltered (gdb_stdlog, + "elf_locate_base: tag at offset 0x%lx does not match," + " dropping relocation offset %s\n", -+ (unsigned long) (buf - bufstart), paddr_nz (reloc_addr)); ++ (unsigned long) (buf - bufstart), paddress (target_gdbarch, reloc_addr)); + reloc_addr = 0; + } + } @@ -583,7 +486,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + fprintf_unfiltered (gdb_stdlog, + "elf_locate_base: tag at offset 0x%lx is not readable," + " dropping relocation offset %s\n", -+ (unsigned long) (buf - bufstart), paddr_nz (reloc_addr)); ++ (unsigned long) (buf - bufstart), paddress (target_gdbarch, reloc_addr)); + reloc_addr = 0; + } + } @@ -623,14 +526,14 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + { + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: unrelocated ptr addr 0x%s\n", -+ paddr_nz (ptr_addr)); ++ "elf_locate_base: unrelocated ptr addr %s\n", ++ paddress (target_gdbarch, ptr_addr)); + ptr_addr += reloc_addr; + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: relocated ptr addr 0x%s" ++ "elf_locate_base: relocated ptr addr %s" + " (relocation offset %s) for %s\n", -+ paddr_nz (ptr_addr), paddr_nz (reloc_addr), ++ paddress (target_gdbarch, ptr_addr), paddress (target_gdbarch, reloc_addr), + exec_bfd->filename); + } + got = target_read_memory (ptr_addr, ptr_buf, arch_size / 8); @@ -639,9 +542,9 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + ptr_addr -= reloc_addr; + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: unrelocated back to ptr addr 0x%s" ++ "elf_locate_base: unrelocated back to ptr addr %s" + " as the memory was unreable for %s\n", -+ paddr_nz (ptr_addr), exec_bfd->filename); ++ paddress (target_gdbarch, ptr_addr), exec_bfd->filename); + got = target_read_memory (ptr_addr, ptr_buf, arch_size / 8); + } + @@ -655,8 +558,8 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + { + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "elf_locate_base: Tag entry has value 0x%s -- return now\n", -+ paddr_nz (dyn_ptr)); ++ "elf_locate_base: Tag entry has value %s -- return now\n", ++ paddress (target_gdbarch, dyn_ptr)); + } + } + else @@ -675,33 +578,22 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c } return 0; -@@ -774,6 +920,10 @@ solib_svr4_r_map (void) - struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; - -+ if (debug_solib) -+ fprintf_unfiltered (gdb_stdlog, -+ "solib_svr4_r_map: read at 0x%s\n", -+ paddr_nz (debug_base + lmo->r_map_offset)); - return read_memory_typed_address (debug_base + lmo->r_map_offset, ptr_type); - } - -@@ -945,6 +1095,11 @@ svr4_current_sos (void) - struct so_list *head = 0; - struct so_list **link_ptr = &head; +@@ -1040,6 +1186,11 @@ svr4_current_sos (void) CORE_ADDR ldsomap = 0; + struct inferior *inf; + struct svr4_info *info; + const char *filename = exec_bfd ? exec_bfd->filename : ""; + + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, + "svr4_current_sos: exec_bfd %s\n", filename); - /* Always locate the debug struct, in case it has moved. */ - debug_base = 0; -@@ -953,10 +1108,19 @@ svr4_current_sos (void) + if (ptid_equal (inferior_ptid, null_ptid)) + return NULL; +@@ -1054,7 +1205,13 @@ svr4_current_sos (void) /* If we can't find the dynamic linker's base structure, this must not be a dynamically linked executable. Hmm. */ - if (! debug_base) + if (! info->debug_base) - return svr4_default_sos (); + { + if (debug_solib) @@ -713,19 +605,13 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c /* Walk the inferior's link map list, and build our list of `struct so_list' nodes. */ -+ if (debug_solib) -+ fprintf_unfiltered (gdb_stdlog, -+ "svr4_current_sos: walk link map in %s\n", filename); - lm = solib_svr4_r_map (); - - while (lm) -@@ -973,26 +1137,104 @@ svr4_current_sos (void) +@@ -1074,26 +1231,104 @@ svr4_current_sos (void) new->lm_info->lm = xzalloc (lmo->link_map_size); make_cleanup (xfree, new->lm_info->lm); + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "svr4_current_sos: read lm at 0x%s\n", paddr_nz(lm)); ++ "svr4_current_sos: read lm at %s\n", paddress (target_gdbarch, lm)); read_memory (lm, new->lm_info->lm, lmo->link_map_size); lm = LM_NEXT (new); @@ -743,7 +629,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c - if (IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0) + if (exec_bfd != NULL && IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0) { -- main_lm_addr = new->lm_info->lm_addr; +- info->main_lm_addr = new->lm_info->lm_addr; - free_so (new); - } + /* It is the first link map entry, i.e. it is the main executable. */ @@ -751,7 +637,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + if (bfd_get_start_address (exec_bfd) == entry_point_address ()) + { + /* Non-pie case, main executable has not been relocated. */ -+ main_lm_addr = new->lm_info->lm_addr; ++ info->main_lm_addr = new->lm_info->lm_addr; + free_so (new); + } + else @@ -828,7 +714,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c target_read_string (LM_NAME (new), &buffer, SO_NAME_MAX_PATH_SIZE - 1, &errcode); if (errcode != 0) -@@ -1000,47 +1242,60 @@ svr4_current_sos (void) +@@ -1101,47 +1336,60 @@ svr4_current_sos (void) safe_strerror (errcode)); else { @@ -922,7 +808,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c } /* On Solaris, the dynamic linker is not in the normal list of -@@ -1056,6 +1311,9 @@ svr4_current_sos (void) +@@ -1157,6 +1405,9 @@ svr4_current_sos (void) if (head == NULL) return svr4_default_sos (); @@ -932,7 +818,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c return head; } -@@ -1087,7 +1345,7 @@ svr4_fetch_objfile_link_map (struct objf +@@ -1189,7 +1440,7 @@ svr4_fetch_objfile_link_map (struct objf /* On some systems, the only way to recognize the link map entry for the main executable file is by looking at its name. Return non-zero iff SONAME matches one of the known main executable names. */ @@ -941,7 +827,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c static int match_main (char *soname) { -@@ -1101,6 +1359,7 @@ match_main (char *soname) +@@ -1203,6 +1454,7 @@ match_main (char *soname) return (0); } @@ -949,7 +835,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c /* Return 1 if PC lies in the dynamic symbol resolution code of the SVR4 run time loader. */ -@@ -1251,15 +1510,29 @@ enable_break (void) +@@ -1354,15 +1606,29 @@ enable_break (struct svr4_info *info) /* Find the program interpreter; if not found, warn the user and drop into the old breakpoint at symbol code. */ interp_name = find_program_interpreter (); @@ -979,7 +865,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c sym_addr = 0; -@@ -1276,6 +1549,9 @@ enable_break (void) +@@ -1379,6 +1645,9 @@ enable_break (struct svr4_info *info) { tmp_bfd = solib_bfd_open (interp_name); } @@ -989,7 +875,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c if (tmp_bfd == NULL) goto bkpt_at_symbol; -@@ -1329,16 +1605,16 @@ enable_break (void) +@@ -1436,16 +1705,16 @@ enable_break (struct svr4_info *info) interp_sect = bfd_get_section_by_name (tmp_bfd, ".text"); if (interp_sect) { @@ -1010,29 +896,25 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c interp_plt_sect_high = interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect); } -@@ -1373,7 +1649,11 @@ enable_break (void) +@@ -1480,7 +1749,7 @@ enable_break (struct svr4_info *info) if (sym_addr != 0) { -- create_solib_event_breakpoint (load_addr + sym_addr); -+ create_solib_event_breakpoint ((load_addr + sym_addr) -+ & load_addr_mask); -+ if (debug_solib) -+ fprintf_unfiltered (gdb_stdlog, -+ "enable_break: solib bp set\n"); +- create_solib_event_breakpoint (target_gdbarch, load_addr + sym_addr); ++ create_solib_event_breakpoint (target_gdbarch, (load_addr + sym_addr) & load_addr_mask); xfree (interp_name); return 1; } -@@ -1639,6 +1919,8 @@ svr4_solib_create_inferior_hook (void) +@@ -1753,6 +2022,8 @@ svr4_solib_create_inferior_hook (void) while (tp->stop_signal != TARGET_SIGNAL_TRAP); inf->stop_soon = NO_STOP_QUIETLY; #endif /* defined(_SCO_DS) */ + -+ disable_breakpoints_at_startup (1); ++ disable_breakpoints_before_startup (); } static void -@@ -1820,6 +2102,75 @@ svr4_lp64_fetch_link_map_offsets (void) +@@ -1929,6 +2200,76 @@ svr4_lp64_fetch_link_map_offsets (void) return lmp; } @@ -1040,16 +922,17 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c +info_linkmap_command (char *cmd, int from_tty) +{ + CORE_ADDR lm; ++ struct svr4_info *info = get_svr4_info (PIDGET (inferior_ptid)); + + /* Make sure we've looked up the inferior's dynamic linker's base + structure. */ -+ if (! debug_base) ++ if (! info->debug_base) + { -+ debug_base = locate_base (); ++ info->debug_base = locate_base (info); + + /* If we can't find the dynamic linker's base structure, this + must not be a dynamically linked executable. Hmm. */ -+ if (! debug_base) ++ if (! info->debug_base) + { + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, @@ -1061,7 +944,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + + /* Walk the inferior's link map list, and print the info. */ + -+ lm = solib_svr4_r_map (); ++ lm = solib_svr4_r_map (info); + while (lm) + { + int errcode; @@ -1084,7 +967,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, -+ "svr4_print_linkmap: read lm at 0x%s\n", paddr_nz(lm)); ++ "svr4_print_linkmap: read lm at %s\n", paddress (target_gdbarch, lm)); + read_memory (lm, new->lm_info->lm, lmo->link_map_size); + + lm = LM_NEXT (new); @@ -1100,7 +983,7 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c + warning ("svr4_print_linkmap: Can't read pathname for load map: %s\n", + safe_strerror (errcode)); + } -+ fprintf_filtered (gdb_stdout, "%-8s %-30s\n", paddr(load_addr), buffer); ++ fprintf_filtered (gdb_stdout, "%-8s %-30s\n", paddress (target_gdbarch, load_addr), buffer); + do_cleanups (old_chain); + } +} @@ -1108,18 +991,18 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c struct target_so_ops svr4_so_ops; -@@ -1859,4 +2210,7 @@ _initialize_svr4_solib (void) - svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code; - svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol; +@@ -1969,4 +2310,7 @@ _initialize_svr4_solib (void) svr4_so_ops.same = svr4_same; + + observer_attach_inferior_exit (solib_svr4_inferior_exit); + + add_info ("linkmap", info_linkmap_command, + "Display the inferior's linkmap."); } -Index: gdb-6.8.50.20090302/gdb/solib.c +Index: gdb-6.8.50.20090803/gdb/solib.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/solib.c 2009-02-21 17:14:49.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/solib.c 2009-05-10 21:41:23.000000000 +0200 +--- gdb-6.8.50.20090803.orig/gdb/solib.c 2009-08-03 21:39:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/solib.c 2009-08-04 05:57:36.000000000 +0200 @@ -81,6 +81,8 @@ set_solib_ops (struct gdbarch *gdbarch, /* external data declarations */ @@ -1138,7 +1021,7 @@ Index: gdb-6.8.50.20090302/gdb/solib.c /* GLOBAL FUNCTION -@@ -426,10 +430,23 @@ free_so (struct so_list *so) +@@ -428,10 +432,23 @@ free_so (struct so_list *so) if (so->abfd) { @@ -1166,7 +1049,7 @@ Index: gdb-6.8.50.20090302/gdb/solib.c } if (bfd_filename) -@@ -460,15 +477,40 @@ symbol_add_stub (void *arg) +@@ -458,15 +475,40 @@ symbol_add_stub (struct so_list *so, int /* Have we already loaded this shared object? */ ALL_OBJFILES (so->objfile) { @@ -1174,7 +1057,7 @@ Index: gdb-6.8.50.20090302/gdb/solib.c + /* Found an already loaded shared library. */ + if (strcmp (so->objfile->name, so->so_name) == 0 + && !so->main) -+ return 1; ++ return; + /* Found an already loaded main executable. This could happen in + two circumstances. + First case: the main file has already been read in @@ -1186,31 +1069,31 @@ Index: gdb-6.8.50.20090302/gdb/solib.c + if (strcmp (so->objfile->name, so->so_name) == 0 + && so->main + && so->main_relocated) - return 1; + return; } sap = build_section_addr_info_from_section_table (so->sections, so->sections_end); -- so->objfile = symbol_file_add_from_bfd (so->abfd, so->from_tty, -- sap, 0, OBJF_SHARED | OBJF_KEEPBFD); +- so->objfile = symbol_file_add_from_bfd (so->abfd, flags, +- sap, OBJF_SHARED | OBJF_KEEPBFD); + if (so->main) + { + if (debug_solib) + fprintf_unfiltered (gdb_stdlog, + "symbol_add_stub: adding symbols for main\n"); -+ so->objfile = symbol_file_add_from_bfd (so->abfd, /*so->from_tty*/ 0, -+ sap, 1, OBJF_KEEPBFD); ++ so->objfile = symbol_file_add_from_bfd (so->abfd, (flags & ~SYMFILE_VERBOSE) | SYMFILE_MAINLINE, ++ sap, OBJF_KEEPBFD); + so->main_relocated = 1; + } + else -+ so->objfile = symbol_file_add_from_bfd (so->abfd, so->from_tty, -+ sap, 0, OBJF_SHARED | OBJF_KEEPBFD); ++ so->objfile = symbol_file_add_from_bfd (so->abfd, flags, ++ sap, OBJF_SHARED | OBJF_KEEPBFD); + free_section_addr_info (sap); - return (1); -@@ -600,6 +642,10 @@ update_solib_list (int from_tty, struct + return; +@@ -606,6 +648,10 @@ update_solib_list (int from_tty, struct } else { @@ -1221,7 +1104,7 @@ Index: gdb-6.8.50.20090302/gdb/solib.c if (! strcmp (gdb->so_original_name, i->so_original_name)) break; } -@@ -654,28 +700,7 @@ update_solib_list (int from_tty, struct +@@ -660,18 +706,7 @@ update_solib_list (int from_tty, struct /* Fill in the rest of each of the `struct so_list' nodes. */ for (i = inferior; i; i = i->next) { @@ -1232,26 +1115,16 @@ Index: gdb-6.8.50.20090302/gdb/solib.c - "Error while mapping shared library sections:\n", - RETURN_MASK_ALL); - -- /* If requested, add the shared object's sections to the TARGET's -- section table. Do this immediately after mapping the object so -- that later nodes in the list can query this object, as is needed -- in solib-osf.c. */ -- if (target) -- { -- int count = (i->sections_end - i->sections); -- if (count > 0) -- { -- int space = target_resize_to_sections (target, count); -- memcpy (target->to_sections + space, -- i->sections, -- count * sizeof (i->sections[0])); -- } -- } -+ add_to_target_sections (from_tty, target, i); +- /* Add the shared object's sections to the current set of +- file section tables. Do this immediately after mapping +- the object so that later nodes in the list can query this +- object, as is needed in solib-osf.c. */ +- add_target_sections (i->sections, i->sections_end); ++ add_to_target_sections (from_tty, target, i); /* Notify any observer that the shared object has been loaded now that we've added it to GDB's tables. */ -@@ -771,6 +796,41 @@ solib_add (char *pattern, int from_tty, +@@ -781,6 +816,32 @@ solib_add (char *pattern, int from_tty, } } @@ -1267,33 +1140,24 @@ Index: gdb-6.8.50.20090302/gdb/solib.c + + /* Fill in the rest of the `struct so_list' node. */ + catch_errors (solib_map_sections, solib, -+ "Error while mapping shared library sections:\n", -+ RETURN_MASK_ALL); ++ "Error while mapping shared library sections:\n", ++ RETURN_MASK_ALL); + -+ /* If requested, add the shared object's sections to the TARGET's -+ section table. Do this immediately after mapping the object so -+ that later nodes in the list can query this object, as is needed -+ in solib-osf.c. */ -+ if (target) -+ { -+ int count = (solib->sections_end - solib->sections); -+ if (count > 0) -+ { -+ int space = target_resize_to_sections (target, count); -+ if (debug_solib) -+ fprintf_unfiltered (gdb_stdlog, -+ "add_to_target_sections: add %s to to_sections\n", -+ solib->so_original_name); -+ memcpy (target->to_sections + space, -+ solib->sections, -+ count * sizeof (solib->sections[0])); -+ } -+ } ++ if (debug_solib) ++ fprintf_unfiltered (gdb_stdlog, ++ "add_to_target_sections: add %s to to_sections\n", ++ solib->so_original_name); ++ ++ /* Add the shared object's sections to the current set of ++ file section tables. Do this immediately after mapping ++ the object so that later nodes in the list can query this ++ object, as is needed in solib-osf.c. */ ++ add_target_sections (solib->sections, solib->sections_end); +} /* -@@ -1089,4 +1149,12 @@ This takes precedence over the environme +@@ -1134,4 +1195,12 @@ This takes precedence over the environme reload_shared_libraries, show_solib_search_path, &setlist, &showlist); @@ -1306,10 +1170,10 @@ Index: gdb-6.8.50.20090302/gdb/solib.c + NULL, NULL, + &setdebuglist, &showdebuglist); } -Index: gdb-6.8.50.20090302/gdb/solist.h +Index: gdb-6.8.50.20090803/gdb/solist.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/solist.h 2009-02-04 09:42:11.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/solist.h 2009-05-10 21:41:23.000000000 +0200 +--- gdb-6.8.50.20090803.orig/gdb/solist.h 2009-08-03 21:39:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/solist.h 2009-08-03 21:39:39.000000000 +0200 @@ -61,6 +61,8 @@ struct so_list bfd *abfd; char symbols_loaded; /* flag: symbols read in yet? */ @@ -1317,10 +1181,10 @@ Index: gdb-6.8.50.20090302/gdb/solist.h + char main; /* flag: is this the main executable? */ + char main_relocated; /* flag: has it been relocated yet? */ struct objfile *objfile; /* objfile for loaded lib */ - struct section_table *sections; - struct section_table *sections_end; -@@ -149,4 +151,10 @@ struct symbol *solib_global_lookup (cons - const char *linkage_name, + struct target_section *sections; + struct target_section *sections_end; +@@ -147,4 +149,10 @@ struct symbol *solib_global_lookup (cons + const char *name, const domain_enum domain); +/* Add the list of sections in so_list to the target to_sections. */ @@ -1330,24 +1194,24 @@ Index: gdb-6.8.50.20090302/gdb/solist.h +extern int debug_solib; + #endif -Index: gdb-6.8.50.20090302/gdb/symfile-mem.c +Index: gdb-6.8.50.20090803/gdb/symfile-mem.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile-mem.c 2009-05-10 21:36:28.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/symfile-mem.c 2009-05-10 21:41:23.000000000 +0200 -@@ -116,7 +116,7 @@ symbol_file_add_from_memory (struct bfd +--- gdb-6.8.50.20090803.orig/gdb/symfile-mem.c 2009-08-03 21:39:38.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile-mem.c 2009-08-03 21:39:39.000000000 +0200 +@@ -115,7 +115,7 @@ symbol_file_add_from_memory (struct bfd + ++i; } - objf = symbol_file_add_from_bfd (nbfd, from_tty, -- sai, 0, OBJF_SHARED); -+ sai, 2, OBJF_SHARED); +- objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0, ++ objf = symbol_file_add_from_bfd (nbfd, (from_tty ? SYMFILE_VERBOSE : 0) | SYMFILE_MAINLINE2_BOTH, + sai, OBJF_SHARED); /* This might change our ideas about frames already looked at. */ - reinit_frame_cache (); -Index: gdb-6.8.50.20090302/gdb/symfile.c +Index: gdb-6.8.50.20090803/gdb/symfile.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.c 2009-05-10 21:37:51.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/symfile.c 2009-05-10 21:41:23.000000000 +0200 -@@ -47,6 +47,7 @@ +--- gdb-6.8.50.20090803.orig/gdb/symfile.c 2009-08-03 21:39:38.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile.c 2009-08-04 06:02:45.000000000 +0200 +@@ -49,6 +49,7 @@ #include "readline/readline.h" #include "gdb_assert.h" #include "block.h" @@ -1355,16 +1219,16 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c #include "observer.h" #include "exec.h" #include "parser-defs.h" -@@ -787,7 +788,7 @@ syms_from_objfile (struct objfile *objfi +@@ -785,7 +786,7 @@ syms_from_objfile (struct objfile *objfi /* Now either addrs or offsets is non-zero. */ - if (mainline) -+ if (mainline == 1) ++ if ((add_flags & SYMFILE_MAINLINE) && !(add_flags & SYMFILE_MAINLINE2_ONLY)) { /* We will modify the main symbol table, make sure that all its users will be cleaned up if an error occurs during symbol reading. */ -@@ -815,7 +816,7 @@ syms_from_objfile (struct objfile *objfi +@@ -813,7 +814,7 @@ syms_from_objfile (struct objfile *objfi We no longer warn if the lowest section is not a text segment (as happens for the PA64 port. */ @@ -1373,20 +1237,30 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c { asection *lower_sect; asection *sect; -@@ -917,17 +918,21 @@ new_symfile_objfile (struct objfile *obj +@@ -896,7 +897,7 @@ syms_from_objfile (struct objfile *objfi + init_objfile_sect_indices (objfile); + } + +- (*objfile->sf->sym_read) (objfile, mainline); ++ (*objfile->sf->sym_read) (objfile, add_flags & SYMFILE_MAINLINE2_ONLY ? 2 : (add_flags & SYMFILE_MAINLINE ? 1 : 0)); + + /* Discard cleanups as symbol reading was successful. */ + +@@ -915,17 +916,22 @@ new_symfile_objfile (struct objfile *obj /* If this is the main symbol file we have to clean up all users of the old main symbol file. Otherwise it is sufficient to fixup all the breakpoints that may have been redefined by this symbol file. */ -- if (mainline) -+ if (mainline == 1) +- if (add_flags & SYMFILE_MAINLINE) ++ if (add_flags & SYMFILE_MAINLINE && !(add_flags & SYMFILE_MAINLINE2_ONLY)) { /* OK, make it the "real" symbol file. */ symfile_objfile = objfile; clear_symtab_users (); } -- else -+ else if (mainline == 0) +- else if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0) ++ else if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0 ++ && (add_flags & SYMFILE_MAINLINE2_BOTH) == 0) { breakpoint_re_set (); } @@ -1396,28 +1270,27 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c + } /* We're done reading the symbol file; finish off complaints. */ - clear_complaints (&symfile_complaints, 0, verbo); -@@ -982,7 +987,7 @@ symbol_file_add_with_addrs_or_offsets (b + clear_complaints (&symfile_complaints, 0, add_flags & SYMFILE_VERBOSE); +@@ -982,7 +988,7 @@ symbol_file_add_with_addrs_or_offsets (b /* Give user a chance to burp if we'd be interactively wiping out any existing symbols. */ -- if (mainline -+ if (mainline == 1 +- if ((add_flags & SYMFILE_MAINLINE) ++ if ((add_flags & SYMFILE_MAINLINE) && !(add_flags & SYMFILE_MAINLINE2_ONLY) + && (have_full_symbols () || have_partial_symbols ()) && from_tty && (have_full_symbols () || have_partial_symbols ()) - && !query (_("Load new symbol table from \"%s\"? "), name)) -@@ -1178,6 +1183,10 @@ symbol_file_clear (int from_tty) +@@ -1183,6 +1189,9 @@ symbol_file_clear (int from_tty) symfile_objfile->name) : !query (_("Discard symbol table? ")))) error (_("Not confirmed.")); +#ifdef CLEAR_SOLIB + CLEAR_SOLIB (); +#endif -+ - free_all_objfiles (); - /* solib descriptors may have handles to objfiles. Since their -@@ -3367,6 +3376,8 @@ reread_symbols (void) + free_all_objfiles (); + +@@ -3380,6 +3389,8 @@ reread_symbols (void) /* Discard cleanups as symbol reading was successful. */ discard_cleanups (old_cleanups); @@ -1426,11 +1299,11 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c /* If the mtime has changed between the time we set new_modtime and now, we *want* this to be out of date, so don't call stat again now. */ -Index: gdb-6.8.50.20090302/gdb/target.h +Index: gdb-6.8.50.20090803/gdb/target.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/target.h 2009-05-10 21:36:29.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/target.h 2009-05-10 21:41:23.000000000 +0200 -@@ -542,7 +542,7 @@ struct target_ops +--- gdb-6.8.50.20090803.orig/gdb/target.h 2009-08-03 21:39:39.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/target.h 2009-08-03 21:39:39.000000000 +0200 +@@ -524,7 +524,7 @@ struct target_ops Return -1 if there is insufficient buffer for a whole entry. Return 1 if an entry was read into *TYPEP and *VALP. */ int (*to_auxv_parse) (struct target_ops *ops, gdb_byte **readptr, @@ -1439,3 +1312,22 @@ Index: gdb-6.8.50.20090302/gdb/target.h /* Search SEARCH_SPACE_LEN bytes beginning at START_ADDR for the sequence of bytes in PATTERN with length PATTERN_LEN. +Index: gdb-6.8.50.20090803/gdb/symfile.h +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/symfile.h 2009-08-03 21:39:38.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile.h 2009-08-03 21:39:39.000000000 +0200 +@@ -229,7 +229,13 @@ enum symfile_add_flags + SYMFILE_MAINLINE = 1 << 2, + + /* Do not call breakpoint_re_set when adding this symbol file. */ +- SYMFILE_DEFER_BP_RESET = 1 << 3 ++ SYMFILE_DEFER_BP_RESET = 1 << 3, ++ ++ /* Red Hat PIE patch: Like SYMFILE_MAINLINE but for mainline == 2. ++ Former code was checking `if (mainline)' being satisfied both by ++ standard 1 and rare 2, simulate it here. */ ++ SYMFILE_MAINLINE2_ONLY = 1 << 4, ++ SYMFILE_MAINLINE2_BOTH = SYMFILE_MAINLINE2_ONLY | SYMFILE_MAINLINE + }; + + extern void syms_from_objfile (struct objfile *, diff --git a/gdb-6.3-ppc64syscall-20040622.patch b/gdb-6.3-ppc64syscall-20040622.patch index 99529db..8e6c391 100644 --- a/gdb-6.3-ppc64syscall-20040622.patch +++ b/gdb-6.3-ppc64syscall-20040622.patch @@ -6,11 +6,11 @@ use to skip over first half of a GNU/Linux syscall and update "func_start". -Index: gdb-6.8/gdb/rs6000-tdep.c +Index: gdb-6.8.50.20090802/gdb/rs6000-tdep.c =================================================================== ---- gdb-6.8.orig/gdb/rs6000-tdep.c 2008-02-20 15:34:43.000000000 +0100 -+++ gdb-6.8/gdb/rs6000-tdep.c 2008-07-14 10:25:29.000000000 +0200 -@@ -124,6 +124,7 @@ static const char *powerpc_vector_abi_st +--- gdb-6.8.50.20090802.orig/gdb/rs6000-tdep.c 2009-07-31 17:23:20.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/rs6000-tdep.c 2009-08-03 09:52:39.000000000 +0200 +@@ -126,6 +126,7 @@ static const char *powerpc_vector_abi_st struct rs6000_framedata { @@ -18,7 +18,7 @@ Index: gdb-6.8/gdb/rs6000-tdep.c int offset; /* total size of frame --- the distance by which we decrement sp to allocate the frame */ -@@ -1262,7 +1263,6 @@ static CORE_ADDR +@@ -1488,7 +1489,6 @@ static CORE_ADDR skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, struct rs6000_framedata *fdata) { @@ -26,7 +26,7 @@ Index: gdb-6.8/gdb/rs6000-tdep.c CORE_ADDR last_prologue_pc = pc; CORE_ADDR li_found_pc = 0; gdb_byte buf[4]; -@@ -1280,11 +1280,13 @@ skip_prologue (struct gdbarch *gdbarch, +@@ -1506,12 +1506,14 @@ skip_prologue (struct gdbarch *gdbarch, int minimal_toc_loaded = 0; int prev_insn_was_prologue_insn = 1; int num_skip_non_prologue_insns = 0; @@ -34,15 +34,16 @@ Index: gdb-6.8/gdb/rs6000-tdep.c int r0_contains_arg = 0; const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); memset (fdata, 0, sizeof (struct rs6000_framedata)); + fdata->func_start = pc; fdata->saved_gpr = -1; fdata->saved_fpr = -1; fdata->saved_vr = -1; -@@ -1313,6 +1315,55 @@ skip_prologue (struct gdbarch *gdbarch, +@@ -1545,6 +1547,55 @@ skip_prologue (struct gdbarch *gdbarch, break; - op = extract_unsigned_integer (buf, 4); + op = extract_unsigned_integer (buf, 4, byte_order); + /* A PPC64 GNU/Linux system call function is split into two + sub-functions: a non-threaded fast-path (__NAME_nocancel) @@ -96,7 +97,7 @@ Index: gdb-6.8/gdb/rs6000-tdep.c if ((op & 0xfc1fffff) == 0x7c0802a6) { /* mflr Rx */ /* Since shared library / PIC code, which needs to get its -@@ -1486,9 +1537,9 @@ skip_prologue (struct gdbarch *gdbarch, +@@ -1726,9 +1777,9 @@ skip_prologue (struct gdbarch *gdbarch, we have no line table information or the line info tells us that the subroutine call is not part of the line associated with the prologue. */ diff --git a/gdb-6.3-ppcdotsolib-20041022.patch b/gdb-6.3-ppcdotsolib-20041022.patch index 046633e..7226c0d 100644 --- a/gdb-6.3-ppcdotsolib-20041022.patch +++ b/gdb-6.3-ppcdotsolib-20041022.patch @@ -8,11 +8,11 @@ Port to GDB-6.7. -Index: gdb-6.7/gdb/solib-svr4.c +Index: gdb-6.8.50.20090802/gdb/solib-svr4.c =================================================================== ---- gdb-6.7.orig/gdb/solib-svr4.c 2007-10-09 20:03:30.000000000 +0200 -+++ gdb-6.7/gdb/solib-svr4.c 2007-10-12 22:34:03.000000000 +0200 -@@ -1089,7 +1089,15 @@ enable_break (void) +--- gdb-6.8.50.20090802.orig/gdb/solib-svr4.c 2009-08-03 10:03:36.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/solib-svr4.c 2009-08-03 10:51:15.000000000 +0200 +@@ -1431,7 +1431,15 @@ enable_break (struct svr4_info *info) { sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep); if (sym_addr != 0) @@ -20,7 +20,7 @@ Index: gdb-6.7/gdb/solib-svr4.c + { + /* The symbol might be a descriptor, convert to into the + corresponding code address. */ -+ sym_addr = gdbarch_convert_from_func_ptr_addr (current_gdbarch, ++ sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch, + sym_addr, + tmp_bfd_target); + if (sym_addr != 0) diff --git a/gdb-6.3-readnever-20050907.patch b/gdb-6.3-readnever-20050907.patch index aa1eb77..93a3fe7 100644 --- a/gdb-6.3-readnever-20050907.patch +++ b/gdb-6.3-readnever-20050907.patch @@ -11,11 +11,11 @@ * gdb.texinfo (File Options): Document --readnever. -Index: gdb-6.8.50.20090302/gdb/doc/gdb.texinfo +Index: gdb-6.8.50.20090802/gdb/doc/gdb.texinfo =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/doc/gdb.texinfo 2009-05-09 20:00:02.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/doc/gdb.texinfo 2009-05-09 20:00:06.000000000 +0200 -@@ -988,6 +988,12 @@ Read each symbol file's entire symbol ta +--- gdb-6.8.50.20090802.orig/gdb/doc/gdb.texinfo 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/doc/gdb.texinfo 2009-08-03 12:29:58.000000000 +0200 +@@ -991,6 +991,12 @@ Read each symbol file's entire symbol ta the default, which is to read it incrementally as it is needed. This makes startup slower, but makes future operations faster. @@ -28,11 +28,11 @@ Index: gdb-6.8.50.20090302/gdb/doc/gdb.texinfo @end table @node Mode Options -Index: gdb-6.8.50.20090302/gdb/main.c +Index: gdb-6.8.50.20090802/gdb/main.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/main.c 2009-05-09 20:00:03.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/main.c 2009-05-09 20:00:06.000000000 +0200 -@@ -427,6 +427,7 @@ captured_main (void *data) +--- gdb-6.8.50.20090802.orig/gdb/main.c 2009-08-03 12:29:03.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/main.c 2009-08-03 12:29:58.000000000 +0200 +@@ -382,6 +382,7 @@ captured_main (void *data) {"xdb", no_argument, &xdb_commands, 1}, {"dbx", no_argument, &dbx_commands, 1}, {"readnow", no_argument, &readnow_symbol_files, 1}, @@ -40,7 +40,7 @@ Index: gdb-6.8.50.20090302/gdb/main.c {"r", no_argument, &readnow_symbol_files, 1}, {"quiet", no_argument, &quiet, 1}, {"q", no_argument, &quiet, 1}, -@@ -1070,6 +1071,7 @@ Options:\n\n\ +@@ -1030,6 +1031,7 @@ Options:\n\n\ fputs_unfiltered (_("\ --quiet Do not print version number on startup.\n\ --readnow Fully read symbol files on first access.\n\ @@ -48,11 +48,11 @@ Index: gdb-6.8.50.20090302/gdb/main.c "), stream); fputs_unfiltered (_("\ --se=FILE Use FILE as symbol file and executable file.\n\ -Index: gdb-6.8.50.20090302/gdb/symfile.c +Index: gdb-6.8.50.20090802/gdb/symfile.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.c 2009-05-09 20:00:03.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/symfile.c 2009-05-09 20:00:06.000000000 +0200 -@@ -77,6 +77,7 @@ static void clear_symtab_users_cleanup ( +--- gdb-6.8.50.20090802.orig/gdb/symfile.c 2009-08-03 12:28:14.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/symfile.c 2009-08-03 12:29:58.000000000 +0200 +@@ -78,6 +78,7 @@ static void clear_symtab_users_cleanup ( /* Global variables owned by this file */ int readnow_symbol_files; /* Read full symbols immediately */ @@ -60,32 +60,32 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c /* External variables and functions referenced. */ -Index: gdb-6.8.50.20090302/gdb/dwarf2read.c +Index: gdb-6.8.50.20090802/gdb/dwarf2read.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/dwarf2read.c 2009-05-09 20:00:02.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/dwarf2read.c 2009-05-09 20:00:19.000000000 +0200 -@@ -50,6 +50,7 @@ - #include "c-lang.h" +--- gdb-6.8.50.20090802.orig/gdb/dwarf2read.c 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/dwarf2read.c 2009-08-03 12:31:01.000000000 +0200 +@@ -52,6 +52,7 @@ + #include "jv-lang.h" #include "typeprint.h" - #include "block.h" + #include "vec.h" +#include "top.h" #include #include "gdb_string.h" -@@ -1187,7 +1188,8 @@ dwarf2_has_info (struct objfile *objfile - dwarf_aranges_section = 0; - - bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, &update_sizes); -- return (dwarf_info_section != NULL && dwarf_abbrev_section != NULL); +@@ -1225,7 +1226,8 @@ dwarf2_has_info (struct objfile *objfile + + bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); + } +- return (dwarf2_per_objfile->info.asection != NULL + return !readnever_symbol_files -+ && dwarf_info_section != NULL && dwarf_abbrev_section != NULL; ++ && (dwarf2_per_objfile->info.asection != NULL + && dwarf2_per_objfile->abbrev.asection != NULL); } - /* When loading sections, we can either look for ".", or for -Index: gdb-6.8.50.20090302/gdb/top.h +Index: gdb-6.8.50.20090802/gdb/top.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/top.h 2009-01-03 06:57:53.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/top.h 2009-05-09 20:00:06.000000000 +0200 +--- gdb-6.8.50.20090802.orig/gdb/top.h 2009-01-03 06:57:53.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/top.h 2009-08-03 12:29:58.000000000 +0200 @@ -59,6 +59,7 @@ extern void set_prompt (char *); /* From random places. */ diff --git a/gdb-6.3-removebp-20041130.patch b/gdb-6.3-removebp-20041130.patch deleted file mode 100644 index 093b3c2..0000000 --- a/gdb-6.3-removebp-20041130.patch +++ /dev/null @@ -1,29 +0,0 @@ -2004-11-30 Jeff Johnston - - * breakpoint.c (remove_breakpoints): Continue removing breakpoints - even if an error occurs. Remove a failure code for the last failure - only. - ---- gdb+dejagnu-20040607/gdb/breakpoint.c.fix2 Tue Nov 30 18:01:33 2004 -+++ gdb+dejagnu-20040607/gdb/breakpoint.c Tue Nov 30 18:06:01 2004 -@@ -1297,6 +1297,7 @@ remove_breakpoints (void) - { - struct bp_location *b; - int val; -+ int return_val = 0; - - ALL_BP_LOCATIONS (b) - { -@@ -1304,10 +1305,10 @@ remove_breakpoints (void) - { - val = remove_breakpoint (b, mark_uninserted); - if (val != 0) -- return val; -+ return_val = val; - } - } -- return 0; -+ return return_val; - } - - int diff --git a/gdb-6.3-test-pie-20050107.patch b/gdb-6.3-test-pie-20050107.patch index c646efd..d9c5148 100644 --- a/gdb-6.3-test-pie-20050107.patch +++ b/gdb-6.3-test-pie-20050107.patch @@ -1,40 +1,40 @@ -Index: gdb-6.8.50.20081128/gdb/testsuite/configure.ac +Index: gdb-6.8.50.20090802/gdb/testsuite/configure.ac =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/testsuite/configure.ac 2008-12-09 17:02:39.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/testsuite/configure.ac 2008-12-09 17:02:55.000000000 +0100 -@@ -116,6 +116,6 @@ AC_OUTPUT([Makefile \ +--- gdb-6.8.50.20090802.orig/gdb/testsuite/configure.ac 2009-07-31 17:38:16.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/testsuite/configure.ac 2009-08-03 11:10:45.000000000 +0200 +@@ -144,6 +144,6 @@ AC_OUTPUT([Makefile \ gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile \ gdb.fortran/Makefile gdb.server/Makefile \ gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile \ - gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile \ + gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.pie/Makefile \ - gdb.python/Makefile \ + gdb.python/Makefile gdb.reverse/Makefile \ gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile]) -Index: gdb-6.8.50.20081128/gdb/testsuite/configure +Index: gdb-6.8.50.20090802/gdb/testsuite/configure =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/testsuite/configure 2008-12-09 17:02:39.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/testsuite/configure 2008-12-09 17:02:55.000000000 +0100 -@@ -3131,7 +3131,7 @@ done +--- gdb-6.8.50.20090802.orig/gdb/testsuite/configure 2009-07-31 17:38:16.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/testsuite/configure 2009-08-03 11:11:27.000000000 +0200 +@@ -3239,7 +3239,7 @@ done -- ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.python/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile" -+ ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.pie/Makefile gdb.python/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile" +- ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.python/Makefile gdb.reverse/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile" ++ ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.modula2/Makefile gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile gdb.pie/Makefile gdb.python/Makefile gdb.reverse/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure -@@ -3698,6 +3698,7 @@ do +@@ -3813,6 +3813,7 @@ do "gdb.objc/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.objc/Makefile" ;; "gdb.opt/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.opt/Makefile" ;; "gdb.pascal/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.pascal/Makefile" ;; + "gdb.pie/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.pie/Makefile" ;; "gdb.python/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.python/Makefile" ;; + "gdb.reverse/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.reverse/Makefile" ;; "gdb.threads/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.threads/Makefile" ;; - "gdb.trace/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.trace/Makefile" ;; -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/attach.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach.c 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/attach.c 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,20 @@ +/* This program is intended to be started outside of gdb, and then + attached to by gdb. Thus, it simply spins in a loop. The loop @@ -56,10 +56,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach.c + } + return 0; +} -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach2.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/attach2.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach2.c 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/attach2.c 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,24 @@ +/* This program is intended to be started outside of gdb, and then + attached to by gdb. Thus, it simply spins in a loop. The loop @@ -85,10 +85,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach2.c + } + return (0); +} -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/break.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break.c 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/break.c 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,146 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -236,10 +236,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break.c + } + return 0; +} -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break1.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/break1.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break1.c 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/break1.c 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,44 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -285,10 +285,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break1.c +void marker3 (a, b) char *a, *b; {} /* set breakpoint 18 here */ +void marker4 (d) long d; {} /* set breakpoint 13 here */ +#endif -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/coremaker.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/coremaker.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/coremaker.c 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/coremaker.c 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,142 @@ +/* Copyright 1992, 1993, 1994, 1995, 1996, 1999 + Free Software Foundation, Inc. @@ -432,10 +432,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/coremaker.c + return 0; +} + -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach.exp +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/attach.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach.exp 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/attach.exp 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,432 @@ +# Copyright 1997, 1999, 2002 Free Software Foundation, Inc. + @@ -869,10 +869,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/attach.exp +do_call_attach_tests + +return 0 -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break.exp +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/break.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break.exp 2008-12-09 17:24:34.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/break.exp 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,977 @@ +# Copyright 1988, 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2002, 2003, 2004 @@ -1851,10 +1851,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/break.exp + send_gdb "set args main\n" + gdb_expect -re ".*$gdb_prompt $" {} +} -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/corefile.exp +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/corefile.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/corefile.exp 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/corefile.exp 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,243 @@ +# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. @@ -2099,10 +2099,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/corefile.exp +gdb_test "up" "#\[0-9\]* *\[0-9xa-fH'\]* in .* \\(\\).*" "up in corefile.exp (reinit)" + +gdb_test "core" "No core file now." -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/Makefile.in +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/Makefile.in =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.pie/Makefile.in 2008-12-09 17:02:55.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.pie/Makefile.in 2009-08-03 11:10:12.000000000 +0200 @@ -0,0 +1,19 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ diff --git a/gdb-6.3-threaded-watchpoints2-20050225.patch b/gdb-6.3-threaded-watchpoints2-20050225.patch index 2d7965c..859638d 100644 --- a/gdb-6.3-threaded-watchpoints2-20050225.patch +++ b/gdb-6.3-threaded-watchpoints2-20050225.patch @@ -42,7 +42,7 @@ FIXME: The testcase does not expects multiple watchpoints hits per one stop. Index: gdb-6.5/gdb/testsuite/gdb.threads/watchthreads2.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.5/gdb/testsuite/gdb.threads/watchthreads2.c 2006-07-12 01:54:29.000000000 -0300 ++++ gdb-6.5/gdb/testsuite/gdb.threads/watchthreads-threaded.c 2006-07-12 01:54:29.000000000 -0300 @@ -0,0 +1,66 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -113,7 +113,7 @@ Index: gdb-6.5/gdb/testsuite/gdb.threads/watchthreads2.c Index: gdb-6.5/gdb/testsuite/gdb.threads/watchthreads2.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.5/gdb/testsuite/gdb.threads/watchthreads2.exp 2006-07-12 01:54:29.000000000 -0300 ++++ gdb-6.5/gdb/testsuite/gdb.threads/watchthreads-threaded.exp 2006-07-12 01:54:29.000000000 -0300 @@ -0,0 +1,133 @@ +# This testcase is part of GDB, the GNU debugger. + diff --git a/gdb-6.5-bz181390-memory-address-width.patch b/gdb-6.5-bz181390-memory-address-width.patch deleted file mode 100644 index 894ca0c..0000000 --- a/gdb-6.5-bz181390-memory-address-width.patch +++ /dev/null @@ -1,197 +0,0 @@ -https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=181390 - -2006-09-28 Jan Kratochvil - - * gdb/utils.c (paddress): Disable cutting of the printed addresses - to the target's address bit size; user wants to see everything. - * gdb/value.c (value_as_address1): Original `value_as_address'. - (value_as_address): New `value_as_address' wrapper - cut memory address - to the target's address bit size, bugreport by John Reiser. - -2008-03-02 Jan Kratochvil - - Port to GDB-6.8pre. - New testcase `gdb.arch/amd64-i386-address.exp'. - -Index: gdb-6.7.50.20080227/gdb/utils.c -=================================================================== ---- gdb-6.7.50.20080227.orig/gdb/utils.c 2008-03-02 14:28:44.000000000 +0100 -+++ gdb-6.7.50.20080227/gdb/utils.c 2008-03-02 14:35:09.000000000 +0100 -@@ -2540,6 +2540,14 @@ paddr_nz (CORE_ADDR addr) - const char * - paddress (CORE_ADDR addr) - { -+ /* Do not cut the address as the user should see all the information -+ available. Otherwise 64-bit gdb debugging 32-bit inferior would -+ report for `x/x 0xffffffffffffce70' error -+ `Cannot access memory at 0xffffce70' while the error occured just -+ because of the higher order bits 0xffffffff00000000 there. -+ This specific error no longer occurs as the address is now cut -+ during execution by `value_as_address'. */ -+#if 0 - /* Truncate address to the size of a target address, avoiding shifts - larger or equal than the width of a CORE_ADDR. The local - variable ADDR_BIT stops the compiler reporting a shift overflow -@@ -2553,6 +2561,8 @@ paddress (CORE_ADDR addr) - - if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT)) - addr &= ((CORE_ADDR) 1 << addr_bit) - 1; -+#endif -+ - return hex_string (addr); - } - -Index: gdb-6.7.50.20080227/gdb/value.c -=================================================================== ---- gdb-6.7.50.20080227.orig/gdb/value.c 2008-01-18 18:07:40.000000000 +0100 -+++ gdb-6.7.50.20080227/gdb/value.c 2008-03-02 14:36:38.000000000 +0100 -@@ -983,11 +983,9 @@ value_as_double (struct value *val) - return foo; - } - --/* Extract a value as a C pointer. Does not deallocate the value. -- Note that val's type may not actually be a pointer; value_as_long -- handles all the cases. */ --CORE_ADDR --value_as_address (struct value *val) -+/* See `value_as_address' below - core of value to C pointer extraction. */ -+static CORE_ADDR -+value_as_address1 (struct value *val) - { - /* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure - whether we want this to be true eventually. */ -@@ -1087,6 +1085,34 @@ value_as_address (struct value *val) - return unpack_long (value_type (val), value_contents (val)); - #endif - } -+ -+/* Extract a value as a C pointer. Does not deallocate the value. -+ Note that val's type may not actually be a pointer; value_as_long -+ handles all the cases. */ -+CORE_ADDR -+value_as_address (struct value *val) -+{ -+ CORE_ADDR addr; -+ int addr_bit; -+ -+ addr = value_as_address1 (val); -+ -+ /* Truncate address to the size of a target address, avoiding shifts -+ larger or equal than the width of a CORE_ADDR. The local -+ variable ADDR_BIT stops the compiler reporting a shift overflow -+ when it won't occur. */ -+ /* NOTE: This assumes that the significant address information is -+ kept in the least significant bits of ADDR - the upper bits were -+ either zero or sign extended. Should ADDRESS_TO_POINTER() or -+ some ADDRESS_TO_PRINTABLE() be used to do the conversion? */ -+ -+ addr_bit = gdbarch_addr_bit (current_gdbarch); -+ -+ if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT)) -+ addr &= ((CORE_ADDR) 1 << addr_bit) - 1; -+ -+ return addr; -+} - - /* Unpack raw data (copied from debugee, target byte order) at VALADDR - as a long, or as a double, assuming the raw data is described ---- /dev/null 2008-03-01 10:30:54.797374318 +0100 -+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.arch/amd64-i386-address.S 2008-03-02 12:47:06.000000000 +0100 -@@ -0,0 +1,32 @@ -+/* Copyright 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@gnu.org -+ -+ This file is part of the gdb testsuite. -+ -+ Test UNsigned extension of the 32-bit inferior address on a 64-bit host. -+ This file is based on the work by John Reiser. -+ This file was created by Jan Kratochvil . -+ https://bugzilla.redhat.com/show_bug.cgi?id=181390 */ -+ -+_start: .globl _start -+ nop -+ int3 -+ movl %esp,%ebx -+ int3 # examining memory from $ebx fails, from $esp succeeds -+ nop -+ nop ---- /dev/null 2008-03-01 10:30:54.797374318 +0100 -+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.arch/amd64-i386-address.exp 2008-03-02 12:57:11.000000000 +0100 -@@ -0,0 +1,62 @@ -+# Copyright 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Please email any bugs, comments, and/or additions to this file to: -+# bug-gdb@gnu.org -+ -+# This file is part of the gdb testsuite. -+ -+# Test UNsigned extension of the 32-bit inferior address on a 64-bit host. -+# This file is based on the work by John Reiser. -+# This file was created by Jan Kratochvil . -+# https://bugzilla.redhat.com/show_bug.cgi?id=181390 -+ -+if {![istarget "x86_64-*-*"]} then { -+ verbose "Skipping amd64->i386 adress test." -+ return -+} -+ -+set testfile "amd64-i386-address" -+set srcfile ${testfile}.S -+set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "additional_flags=-m32 -nostdlib"]] != "" } { -+ untested amd64-i386-address.exp -+ return -1 -+} -+ -+# Get things started. -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+gdb_run_cmd -+ -+set test "trap stop" -+gdb_test_multiple "" $test { -+ -re "Program received signal SIGTRAP,.*_start .*$gdb_prompt $" { -+ pass $test -+ } -+} -+ -+gdb_test "stepi" ".*_start .*int3.*" -+ -+gdb_test "x/x \$esp" "0x\[0-9a-f\]*:\t0x0*1" -+ -+# Failure case would be: -+# 0xff8d7f00: Cannot access memory at address 0xff8d7f00 -+gdb_test "x/x \$ebx" "0x\[0-9a-f\]*:\t0x0*1" diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch index f183f6d..9dd75d4 100644 --- a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +++ b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch @@ -30,75 +30,55 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug: <81a2> DW_AT_name : (indirect string, offset: 0x280e): __errno_location <81a8> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location -Index: gdb-6.8.50.20090228/gdb/gdbtypes.c +Index: gdb-6.8.50.20090802/gdb/gdbtypes.c =================================================================== ---- gdb-6.8.50.20090228.orig/gdb/gdbtypes.c 2009-03-02 01:01:15.000000000 +0100 -+++ gdb-6.8.50.20090228/gdb/gdbtypes.c 2009-03-02 01:01:53.000000000 +0100 -@@ -3633,6 +3633,8 @@ gdbtypes_post_init (struct gdbarch *gdba - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, - 0, "int", OBJFILE_INTERNAL); -+ builtin_type->builtin_int_ptr = -+ make_pointer_type (builtin_type->builtin_int, NULL); - builtin_type->builtin_unsigned_int = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, -@@ -3742,6 +3744,12 @@ gdbtypes_post_init (struct gdbarch *gdba - "", OBJFILE_INTERNAL); - TYPE_TARGET_TYPE (builtin_type->nodebug_text_symbol) = - builtin_type->builtin_int; -+ builtin_type->nodebug_text_symbol_errno_location = -+ init_type (TYPE_CODE_FUNC, 1, 0, -+ "", -+ OBJFILE_INTERNAL); -+ TYPE_TARGET_TYPE (builtin_type->nodebug_text_symbol_errno_location) = -+ builtin_type->builtin_int_ptr; - builtin_type->nodebug_data_symbol = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0, -Index: gdb-6.8.50.20090228/gdb/gdbtypes.h -=================================================================== ---- gdb-6.8.50.20090228.orig/gdb/gdbtypes.h 2009-03-02 01:01:15.000000000 +0100 -+++ gdb-6.8.50.20090228/gdb/gdbtypes.h 2009-03-02 01:01:53.000000000 +0100 -@@ -1053,6 +1053,7 @@ struct builtin_type +--- gdb-6.8.50.20090802.orig/gdb/gdbtypes.c 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/gdbtypes.c 2009-08-03 15:42:51.000000000 +0200 +@@ -3769,6 +3769,9 @@ gdbtypes_post_init (struct gdbarch *gdba + = arch_type (gdbarch, TYPE_CODE_INTERNAL_FUNCTION, 0, + ""); - /* Types used for symbols with no debug information. */ - struct type *nodebug_text_symbol; -+ struct type *nodebug_text_symbol_errno_location; - struct type *nodebug_data_symbol; - struct type *nodebug_unknown_symbol; - struct type *nodebug_tls_symbol; -@@ -1065,6 +1066,7 @@ struct builtin_type - struct type *builtin_char; - struct type *builtin_short; - struct type *builtin_int; -+ struct type *builtin_int_ptr; - struct type *builtin_long; - struct type *builtin_signed_char; - struct type *builtin_unsigned_char; -Index: gdb-6.8.50.20090228/gdb/parse.c ++ builtin_type->nodebug_text_symbol_errno_location ++ = lookup_function_type (lookup_pointer_type (builtin_type->builtin_int)); ++ + return builtin_type; + } + +Index: gdb-6.8.50.20090802/gdb/gdbtypes.h =================================================================== ---- gdb-6.8.50.20090228.orig/gdb/parse.c 2009-03-02 01:01:15.000000000 +0100 -+++ gdb-6.8.50.20090228/gdb/parse.c 2009-03-02 01:01:53.000000000 +0100 -@@ -508,7 +508,12 @@ write_exp_msymbol (struct minimal_symbol +--- gdb-6.8.50.20090802.orig/gdb/gdbtypes.h 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/gdbtypes.h 2009-08-03 15:40:02.000000000 +0200 +@@ -1128,6 +1128,8 @@ struct builtin_type + + /* This type is used to represent a GDB internal function. */ + struct type *internal_fn; ++ ++ struct type *nodebug_text_symbol_errno_location; + }; + + /* Return the type table for the specified architecture. */ +Index: gdb-6.8.50.20090802/gdb/parse.c +=================================================================== +--- gdb-6.8.50.20090802.orig/gdb/parse.c 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/parse.c 2009-08-03 15:41:54.000000000 +0200 +@@ -510,7 +510,11 @@ write_exp_msymbol (struct minimal_symbol case mst_text: case mst_file_text: case mst_solib_trampoline: -- write_exp_elt_type (builtin_type (gdbarch)->nodebug_text_symbol); +- write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol); + if (builtin_type (gdbarch)->nodebug_text_symbol_errno_location != NULL + && strcmp (SYMBOL_LINKAGE_NAME (msymbol), "__errno_location") == 0) -+ write_exp_elt_type (builtin_type (gdbarch) -+ ->nodebug_text_symbol_errno_location); ++ write_exp_elt_type (builtin_type (gdbarch)->nodebug_text_symbol_errno_location); + else -+ write_exp_elt_type (builtin_type (gdbarch)->nodebug_text_symbol); ++ write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol); break; case mst_data: -Index: gdb-6.8.50.20090228/gdb/target.c +Index: gdb-6.8.50.20090802/gdb/target.c =================================================================== ---- gdb-6.8.50.20090228.orig/gdb/target.c 2009-03-02 01:01:44.000000000 +0100 -+++ gdb-6.8.50.20090228/gdb/target.c 2009-03-02 01:01:53.000000000 +0100 -@@ -827,6 +827,25 @@ pop_all_targets (int quitting) +--- gdb-6.8.50.20090802.orig/gdb/target.c 2009-08-03 12:38:47.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/target.c 2009-08-03 12:49:33.000000000 +0200 +@@ -933,6 +933,25 @@ pop_all_targets (int quitting) pop_all_targets_above (dummy_stratum, quitting); } @@ -124,7 +104,7 @@ Index: gdb-6.8.50.20090228/gdb/target.c /* Using the objfile specified in OBJFILE, find the address for the current thread's thread-local storage with offset OFFSET. */ CORE_ADDR -@@ -917,7 +936,28 @@ target_translate_tls_address (struct obj +@@ -1023,7 +1042,28 @@ target_translate_tls_address (struct obj /* It wouldn't be wrong here to try a gdbarch method, too; finding TLS is an ABI-specific thing. But we don't do that yet. */ else @@ -154,10 +134,10 @@ Index: gdb-6.8.50.20090228/gdb/target.c return addr; } -Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.dwarf2/dw2-errno.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2009-03-02 01:01:53.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2009-08-03 12:49:33.000000000 +0200 @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -187,10 +167,10 @@ Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.c + + return 0; /* breakpoint */ +} -Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.exp +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.dwarf2/dw2-errno.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2009-03-02 01:01:53.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2009-08-03 12:49:33.000000000 +0200 @@ -0,0 +1,67 @@ +# Copyright 2007 Free Software Foundation, Inc. + diff --git a/gdb-6.5-bz203661-emit-relocs.patch b/gdb-6.5-bz203661-emit-relocs.patch index e09c888..f58cc9e 100644 --- a/gdb-6.5-bz203661-emit-relocs.patch +++ b/gdb-6.5-bz203661-emit-relocs.patch @@ -1,8 +1,8 @@ -Index: gdb-6.5/gdb/symfile.c +Index: gdb-6.8.50.20090802/gdb/symfile.c =================================================================== ---- gdb-6.5.orig/gdb/symfile.c 2006-08-24 02:56:02.000000000 -0300 -+++ gdb-6.5/gdb/symfile.c 2006-08-24 02:56:36.000000000 -0300 -@@ -3739,6 +3739,12 @@ symfile_dummy_outputs (bfd *abfd, asecti +--- gdb-6.8.50.20090802.orig/gdb/symfile.c 2009-08-03 12:29:58.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/symfile.c 2009-08-03 12:40:58.000000000 +0200 +@@ -4012,6 +4012,12 @@ symfile_dummy_outputs (bfd *abfd, asecti bfd_byte * symfile_relocate_debug_section (bfd *abfd, asection *sectp, bfd_byte *buf) { @@ -12,6 +12,6 @@ Index: gdb-6.5/gdb/symfile.c + if ((abfd->flags & EXEC_P) != 0) + return NULL; + - /* We're only interested in debugging sections with relocation + /* We're only interested in sections with relocation information. */ if ((sectp->flags & SEC_RELOC) == 0) diff --git a/gdb-6.5-bz216711-clone-is-outermost.patch b/gdb-6.5-bz216711-clone-is-outermost.patch index c8c25b5..89d1db6 100644 --- a/gdb-6.5-bz216711-clone-is-outermost.patch +++ b/gdb-6.5-bz216711-clone-is-outermost.patch @@ -23,11 +23,11 @@ instead. Port to GDB-6.7. -Index: gdb-6.8.50.20081128/gdb/amd64-linux-tdep.c +Index: gdb-6.8.50.20090802/gdb/amd64-linux-tdep.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/amd64-linux-tdep.c 2008-12-08 10:56:17.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/amd64-linux-tdep.c 2008-12-08 21:11:08.000000000 +0100 -@@ -234,6 +234,80 @@ amd64_linux_register_reggroup_p (struct +--- gdb-6.8.50.20090802.orig/gdb/amd64-linux-tdep.c 2009-07-02 19:25:52.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/amd64-linux-tdep.c 2009-08-03 15:50:08.000000000 +0200 +@@ -238,6 +238,80 @@ amd64_linux_register_reggroup_p (struct /* Set the program counter for process PTID to PC. */ @@ -108,7 +108,7 @@ Index: gdb-6.8.50.20081128/gdb/amd64-linux-tdep.c static void amd64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc) { -@@ -272,6 +346,8 @@ amd64_linux_init_abi (struct gdbarch_inf +@@ -276,6 +350,8 @@ amd64_linux_init_abi (struct gdbarch_inf tdep->sc_reg_offset = amd64_linux_sc_reg_offset; tdep->sc_num_regs = ARRAY_SIZE (amd64_linux_sc_reg_offset); @@ -117,11 +117,11 @@ Index: gdb-6.8.50.20081128/gdb/amd64-linux-tdep.c /* GNU/Linux uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); -Index: gdb-6.8.50.20081128/gdb/amd64-tdep.c +Index: gdb-6.8.50.20090802/gdb/amd64-tdep.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/amd64-tdep.c 2008-12-08 10:56:17.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/amd64-tdep.c 2008-12-08 21:05:12.000000000 +0100 -@@ -1044,11 +1044,16 @@ amd64_frame_this_id (struct frame_info * +--- gdb-6.8.50.20090802.orig/gdb/amd64-tdep.c 2009-07-02 19:25:52.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/amd64-tdep.c 2009-08-03 15:50:08.000000000 +0200 +@@ -1736,11 +1736,16 @@ amd64_frame_this_id (struct frame_info * { struct amd64_frame_cache *cache = amd64_frame_cache (this_frame, this_cache); @@ -138,11 +138,11 @@ Index: gdb-6.8.50.20081128/gdb/amd64-tdep.c (*this_id) = frame_id_build (cache->base + 16, cache->pc); } -Index: gdb-6.8.50.20081128/gdb/i386-tdep.c +Index: gdb-6.8.50.20090802/gdb/i386-tdep.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/i386-tdep.c 2008-12-08 10:56:17.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/i386-tdep.c 2008-12-08 11:00:43.000000000 +0100 -@@ -2698,6 +2698,9 @@ i386_gdbarch_init (struct gdbarch_info i +--- gdb-6.8.50.20090802.orig/gdb/i386-tdep.c 2009-07-12 19:46:21.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/i386-tdep.c 2009-08-03 15:50:08.000000000 +0200 +@@ -5307,6 +5307,9 @@ i386_gdbarch_init (struct gdbarch_info i tdep->sc_pc_offset = -1; tdep->sc_sp_offset = -1; @@ -152,24 +152,24 @@ Index: gdb-6.8.50.20081128/gdb/i386-tdep.c /* The format used for `long double' on almost all i386 targets is the i387 extended floating-point format. In fact, of all targets in the GCC 2.95 tree, only OSF/1 does it different, and insists -Index: gdb-6.8.50.20081128/gdb/i386-tdep.h +Index: gdb-6.8.50.20090802/gdb/i386-tdep.h =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/i386-tdep.h 2008-12-08 10:56:17.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/i386-tdep.h 2008-12-08 21:07:47.000000000 +0100 -@@ -106,6 +106,9 @@ struct gdbarch_tdep - /* ISA-specific data types. */ - struct type *i386_mmx_type; - struct type *i386_sse_type; +--- gdb-6.8.50.20090802.orig/gdb/i386-tdep.h 2009-07-02 19:25:54.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/i386-tdep.h 2009-08-03 15:50:29.000000000 +0200 +@@ -115,6 +115,9 @@ struct gdbarch_tdep + int (*i386_intx80_record) (struct regcache *regcache); + /* Parse sysenter args. */ + int (*i386_sysenter_record) (struct regcache *regcache); + + /* Detect OS dependent outermost frames; such as `clone'. */ + int (*outermost_frame_p) (struct frame_info *this_frame); }; /* Floating-point registers. */ -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/bt-clone-stop.c +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/bt-clone-stop.c 2008-12-08 11:00:43.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.c 2009-08-03 15:50:08.000000000 +0200 @@ -0,0 +1,39 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -210,10 +210,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/bt-clone-stop.c + for (;;) + pause(); +} -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/bt-clone-stop.exp +Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/bt-clone-stop.exp 2008-12-08 11:00:43.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.exp 2009-08-03 15:50:08.000000000 +0200 @@ -0,0 +1,61 @@ +# Copyright 2006 Free Software Foundation, Inc. + diff --git a/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch b/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch index 5fee1e6..b7bbe42 100644 --- a/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch +++ b/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch @@ -1,11 +1,11 @@ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=218379 -Index: gdb-6.8/gdb/symtab.c +Index: gdb-6.8.50.20090803/gdb/symtab.c =================================================================== ---- gdb-6.8.orig/gdb/symtab.c 2008-02-05 23:17:40.000000000 +0100 -+++ gdb-6.8/gdb/symtab.c 2008-07-14 10:27:32.000000000 +0200 -@@ -2132,6 +2132,13 @@ find_pc_sect_line (CORE_ADDR pc, struct +--- gdb-6.8.50.20090803.orig/gdb/symtab.c 2009-08-03 16:09:36.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symtab.c 2009-08-03 16:13:13.000000000 +0200 +@@ -2261,6 +2261,13 @@ find_pc_sect_line (CORE_ADDR pc, struct /* See above comment about why warning is commented out */ /* warning ("In stub for %s; unable to find real function/line info", SYMBOL_LINKAGE_NAME (msymbol)) */ ; /* fall through */ @@ -14,7 +14,7 @@ Index: gdb-6.8/gdb/symtab.c + Avoid `find_pc_sect_line'<->`find_pc_line' infinite loop. + Red Hat Bug 218379. */ + else if (SYMBOL_VALUE (mfunsym) == pc) -+ warning ("In stub for %s (0x%s); interlocked, please submit the binary to http://bugzilla.redhat.com", SYMBOL_LINKAGE_NAME (msymbol), paddr (pc)); ++ warning ("In stub for %s (0x%s); interlocked, please submit the binary to http://bugzilla.redhat.com", SYMBOL_LINKAGE_NAME (msymbol), paddress (target_gdbarch, pc)); + /* fall through */ else return find_pc_line (SYMBOL_VALUE_ADDRESS (mfunsym), 0); diff --git a/gdb-6.5-gcore-i386-on-amd64.patch b/gdb-6.5-gcore-i386-on-amd64.patch index b4fb9c5..7dae330 100644 --- a/gdb-6.5-gcore-i386-on-amd64.patch +++ b/gdb-6.5-gcore-i386-on-amd64.patch @@ -23,21 +23,21 @@ Port to GDB-6.8pre. -Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c +Index: gdb-6.8.50.20090802/gdb/amd64-linux-nat.c =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/amd64-linux-nat.c 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/amd64-linux-nat.c 2008-12-14 21:24:19.000000000 +0100 -@@ -50,6 +50,9 @@ - #include "amd64-tdep.h" +--- gdb-6.8.50.20090802.orig/gdb/amd64-linux-nat.c 2009-06-17 20:44:23.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/amd64-linux-nat.c 2009-08-03 15:49:33.000000000 +0200 +@@ -51,6 +51,9 @@ #include "i386-linux-tdep.h" #include "amd64-nat.h" + #include "i386-nat.h" +#include "i387-tdep.h" +#include "elf-bfd.h" +#include "gdb_procfs32.h" /* Mapping between the general-purpose registers in GNU/Linux x86-64 `struct user' format and GDB's register cache layout. */ -@@ -84,6 +87,35 @@ static int amd64_linux_gregset64_reg_off +@@ -85,6 +88,35 @@ static int amd64_linux_gregset64_reg_off GNU/Linux i386 registers are all 32-bit, but since we're little-endian we get away with that. */ @@ -73,7 +73,7 @@ Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c /* From on GNU/Linux i386. */ static int amd64_linux_gregset32_reg_offset[] = { -@@ -102,6 +134,96 @@ static int amd64_linux_gregset32_reg_off +@@ -103,6 +135,96 @@ static int amd64_linux_gregset32_reg_off }; @@ -84,7 +84,7 @@ Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c +amd64_linux_elfcore_write_prpsinfo (bfd *abfd, char *buf, int *bufsiz, + const char *fname, const char *psargs) +{ -+ if (gdbarch_ptr_bit(current_gdbarch) == 32) ++ if (gdbarch_ptr_bit (target_gdbarch) == 32) + { + int note_type; + char *note_name = "CORE"; @@ -118,7 +118,7 @@ Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c +amd64_linux_elfcore_write_prstatus (bfd *abfd, char *buf, int *bufsiz, + long pid, int cursig, const void *gregs) +{ -+ if (gdbarch_ptr_bit(current_gdbarch) == 32) ++ if (gdbarch_ptr_bit (target_gdbarch) == 32) + { + char *note_name = "CORE"; + struct elf_prstatus32 prstat; @@ -151,7 +151,7 @@ Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c + int *bufsiz, const void *fpregs, int size, + struct regcache *regcache) +{ -+ if (gdbarch_ptr_bit(current_gdbarch) == 32) ++ if (gdbarch_ptr_bit (target_gdbarch) == 32) + { + char *note_name = "CORE"; + elf_fpregset32_t fpregs32; @@ -170,7 +170,7 @@ Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c /* Transfering the general-purpose registers between GDB, inferiors and core files. */ -@@ -431,6 +553,11 @@ _initialize_amd64_linux_nat (void) +@@ -682,6 +804,11 @@ _initialize_amd64_linux_nat (void) t->to_fetch_registers = amd64_linux_fetch_inferior_registers; t->to_store_registers = amd64_linux_store_inferior_registers; @@ -182,11 +182,11 @@ Index: gdb-6.8.50.20081214/gdb/amd64-linux-nat.c /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, amd64_linux_new_thread); -Index: gdb-6.8.50.20081214/gdb/config.in +Index: gdb-6.8.50.20090802/gdb/config.in =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/config.in 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/config.in 2008-12-14 21:34:50.000000000 +0100 -@@ -136,6 +136,9 @@ +--- gdb-6.8.50.20090802.orig/gdb/config.in 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/config.in 2009-08-03 15:48:31.000000000 +0200 +@@ -146,6 +146,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ELF_HP_H @@ -196,7 +196,7 @@ Index: gdb-6.8.50.20081214/gdb/config.in /* Define to 1 if your system has the etext variable. */ #undef HAVE_ETEXT -@@ -465,6 +468,9 @@ +@@ -487,6 +490,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_POLL_H @@ -206,7 +206,7 @@ Index: gdb-6.8.50.20081214/gdb/config.in /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PROCFS_H -@@ -492,6 +498,9 @@ +@@ -514,6 +520,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H @@ -216,11 +216,11 @@ Index: gdb-6.8.50.20081214/gdb/config.in /* Define to 1 if you have the header file. */ #undef HAVE_SYS_USER_H -Index: gdb-6.8.50.20081214/gdb/configure +Index: gdb-6.8.50.20090802/gdb/configure =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/configure 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/configure 2008-12-14 21:33:30.000000000 +0100 -@@ -12026,6 +12026,268 @@ _ACEOF +--- gdb-6.8.50.20090802.orig/gdb/configure 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/configure 2009-08-03 15:48:31.000000000 +0200 +@@ -12545,6 +12545,268 @@ _ACEOF fi @@ -489,11 +489,11 @@ Index: gdb-6.8.50.20081214/gdb/configure # elf_hp.h is for HP/UX 64-bit shared library support. # FIXME: kettenis/20030102: In most cases we include these (ctype.h, time.h) # unconditionally, so what's the point in checking these? -Index: gdb-6.8.50.20081214/gdb/configure.ac +Index: gdb-6.8.50.20090802/gdb/configure.ac =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/configure.ac 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/configure.ac 2008-12-14 21:32:35.000000000 +0100 -@@ -686,6 +686,11 @@ AC_SUBST(PYTHON_CFLAGS) +--- gdb-6.8.50.20090802.orig/gdb/configure.ac 2009-08-03 09:50:57.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/configure.ac 2009-08-03 15:48:31.000000000 +0200 +@@ -744,6 +744,11 @@ AC_SUBST(PYTHON_CFLAGS) AC_HEADER_DIRENT AC_HEADER_STAT AC_HEADER_STDC @@ -505,11 +505,11 @@ Index: gdb-6.8.50.20081214/gdb/configure.ac # elf_hp.h is for HP/UX 64-bit shared library support. # FIXME: kettenis/20030102: In most cases we include these (ctype.h, time.h) # unconditionally, so what's the point in checking these? -Index: gdb-6.8.50.20081214/gdb/gcore.c +Index: gdb-6.8.50.20090802/gdb/gcore.c =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/gcore.c 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/gcore.c 2008-12-14 21:17:10.000000000 +0100 -@@ -320,6 +320,11 @@ gcore_create_callback (CORE_ADDR vaddr, +--- gdb-6.8.50.20090802.orig/gdb/gcore.c 2009-08-03 12:28:56.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/gcore.c 2009-08-03 15:48:31.000000000 +0200 +@@ -324,6 +324,11 @@ gcore_create_callback (CORE_ADDR vaddr, asection *osec; flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD; @@ -521,10 +521,10 @@ Index: gdb-6.8.50.20081214/gdb/gcore.c /* If the memory segment has no permissions set, ignore it, otherwise when we later try to access it for read/write, we'll get an error or jam the kernel. */ -Index: gdb-6.8.50.20081214/gdb/gdb_procfs32.h +Index: gdb-6.8.50.20090802/gdb/gdb_procfs32.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081214/gdb/gdb_procfs32.h 2008-12-14 21:32:56.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/gdb_procfs32.h 2009-08-03 15:48:31.000000000 +0200 @@ -0,0 +1,128 @@ +#ifdef HAVE_SYS_PROCFS32_H +#include @@ -654,10 +654,10 @@ Index: gdb-6.8.50.20081214/gdb/gdb_procfs32.h +#endif /* _SYS_PROCFS32_H */ + +#endif /* HAVE_SYS_PROCFS32_H */ -Index: gdb-6.8.50.20081214/gdb/gdb_user32.h +Index: gdb-6.8.50.20090802/gdb/gdb_user32.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081214/gdb/gdb_user32.h 2008-12-14 21:17:10.000000000 +0100 ++++ gdb-6.8.50.20090802/gdb/gdb_user32.h 2009-08-03 15:48:31.000000000 +0200 @@ -0,0 +1,108 @@ +#ifdef HAVE_SYS_USER32_H +#include @@ -767,11 +767,11 @@ Index: gdb-6.8.50.20081214/gdb/gdb_user32.h +#endif /* _SYS_USER32_H */ + +#endif /* HAVE_SYS_USER32_H */ -Index: gdb-6.8.50.20081214/gdb/linux-nat.c +Index: gdb-6.8.50.20090802/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/linux-nat.c 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/linux-nat.c 2008-12-14 21:24:20.000000000 +0100 -@@ -213,6 +213,21 @@ static LONGEST (*super_xfer_partial) (st +--- gdb-6.8.50.20090802.orig/gdb/linux-nat.c 2009-08-03 12:31:26.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/linux-nat.c 2009-08-03 15:48:31.000000000 +0200 +@@ -219,6 +219,21 @@ static LONGEST (*super_xfer_partial) (st const gdb_byte *, ULONGEST, LONGEST); @@ -793,7 +793,7 @@ Index: gdb-6.8.50.20081214/gdb/linux-nat.c static int debug_linux_nat; static void show_debug_linux_nat (struct ui_file *file, int from_tty, -@@ -3473,7 +3488,7 @@ linux_nat_do_thread_registers (bfd *obfd +@@ -3586,7 +3601,7 @@ linux_nat_do_thread_registers (bfd *obfd else fill_gregset (regcache, &gregs, -1); @@ -802,7 +802,7 @@ Index: gdb-6.8.50.20081214/gdb/linux-nat.c note_data, note_size, lwp, -@@ -3523,10 +3538,10 @@ linux_nat_do_thread_registers (bfd *obfd +@@ -3636,10 +3651,10 @@ linux_nat_do_thread_registers (bfd *obfd else fill_fpregset (regcache, &fpregs, -1); @@ -815,7 +815,7 @@ Index: gdb-6.8.50.20081214/gdb/linux-nat.c } return note_data; -@@ -3595,9 +3610,9 @@ linux_nat_make_corefile_notes (bfd *obfd +@@ -3822,9 +3837,9 @@ linux_nat_make_corefile_notes (bfd *obfd psargs_end - string_end); } } @@ -828,11 +828,11 @@ Index: gdb-6.8.50.20081214/gdb/linux-nat.c } /* Dump information for threads. */ -Index: gdb-6.8.50.20081214/gdb/linux-nat.h +Index: gdb-6.8.50.20090802/gdb/linux-nat.h =================================================================== ---- gdb-6.8.50.20081214.orig/gdb/linux-nat.h 2008-12-14 21:17:01.000000000 +0100 -+++ gdb-6.8.50.20081214/gdb/linux-nat.h 2008-12-14 21:24:11.000000000 +0100 -@@ -134,3 +134,12 @@ void linux_nat_switch_fork (ptid_t new_p +--- gdb-6.8.50.20090802.orig/gdb/linux-nat.h 2009-08-03 10:52:00.000000000 +0200 ++++ gdb-6.8.50.20090802/gdb/linux-nat.h 2009-08-03 15:48:31.000000000 +0200 +@@ -144,3 +144,12 @@ void linux_nat_switch_fork (ptid_t new_p /* Return the saved siginfo associated with PTID. */ struct siginfo *linux_nat_get_siginfo (ptid_t ptid); diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch index 2cf06d0..3d7aaf1 100644 --- a/gdb-6.6-buildid-locate-rpm.patch +++ b/gdb-6.6-buildid-locate-rpm.patch @@ -1,7 +1,7 @@ -Index: gdb-6.8.50.20090302/gdb/event-top.c +Index: gdb-6.8.50.20090803/gdb/event-top.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/event-top.c 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/event-top.c 2009-03-07 17:25:06.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/event-top.c 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/event-top.c 2009-08-03 16:17:59.000000000 +0200 @@ -33,6 +33,7 @@ #include "cli/cli-script.h" /* for reset_command_nest_depth */ #include "main.h" @@ -28,11 +28,11 @@ Index: gdb-6.8.50.20090302/gdb/event-top.c /* Each interpreter has its own rules on displaying the command prompt. */ if (!current_interp_display_prompt_p ()) -Index: gdb-6.8.50.20090302/gdb/symfile.c +Index: gdb-6.8.50.20090803/gdb/symfile.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.c 2009-03-07 17:22:21.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/symfile.c 2009-03-07 17:26:47.000000000 +0100 -@@ -55,6 +55,7 @@ +--- gdb-6.8.50.20090803.orig/gdb/symfile.c 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile.c 2009-08-03 16:17:59.000000000 +0200 +@@ -56,6 +56,7 @@ #include "solib.h" #include "remote.h" #include "libbfd.h" @@ -40,7 +40,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c #include #include -@@ -63,6 +64,7 @@ +@@ -64,6 +65,7 @@ #include #include #include @@ -48,7 +48,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c int (*deprecated_ui_load_progress_hook) (const char *section, unsigned long num); -@@ -1684,8 +1686,352 @@ build_id_to_filename (struct build_id *b +@@ -1692,8 +1694,352 @@ build_id_to_filename (struct build_id *b return retval; } @@ -402,7 +402,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c avoidance. */ struct missing_filepair -@@ -1739,11 +2085,17 @@ missing_filepair_change (void) +@@ -1747,11 +2093,17 @@ missing_filepair_change (void) /* All their memory came just from missing_filepair_OBSTACK. */ missing_filepair_hash = NULL; } @@ -420,7 +420,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c missing_filepair_change (); } -@@ -1802,14 +2154,33 @@ debug_print_missing (const char *binary, +@@ -1818,14 +2170,33 @@ debug_print_missing (const char *binary, *slot = missing_filepair; @@ -461,11 +461,11 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c } static char * -Index: gdb-6.8.50.20090302/gdb/symfile.h +Index: gdb-6.8.50.20090803/gdb/symfile.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.h 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/symfile.h 2009-03-07 17:25:06.000000000 +0100 -@@ -378,6 +378,7 @@ extern struct build_id *build_id_addr_ge +--- gdb-6.8.50.20090803.orig/gdb/symfile.h 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile.h 2009-08-03 16:17:59.000000000 +0200 +@@ -394,6 +394,7 @@ extern struct build_id *build_id_addr_ge extern char *build_id_to_filename (struct build_id *build_id, char **link_return, int add_debug_suffix); extern void debug_print_missing (const char *binary, const char *debug); @@ -473,11 +473,11 @@ Index: gdb-6.8.50.20090302/gdb/symfile.h /* From dwarf2read.c */ -Index: gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/lib/gdb.exp =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/lib/gdb.exp 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp 2009-03-07 17:25:06.000000000 +0100 -@@ -1230,7 +1230,7 @@ proc default_gdb_start { } { +--- gdb-6.8.50.20090803.orig/gdb/testsuite/lib/gdb.exp 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/lib/gdb.exp 2009-08-03 16:17:59.000000000 +0200 +@@ -1248,7 +1248,7 @@ proc default_gdb_start { } { warning "Couldn't set the width to 0." } } @@ -486,8 +486,10 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp send_gdb "set build-id-verbose 0\n" gdb_expect 10 { -re "$gdb_prompt $" { ---- ./gdb/testsuite/lib/mi-support.exp 2009-03-22 16:37:58.000000000 +0100 -+++ ./gdb/testsuite/lib/mi-support.exp 2009-03-22 16:37:12.000000000 +0100 +Index: gdb-6.8.50.20090803/gdb/testsuite/lib/mi-support.exp +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/testsuite/lib/mi-support.exp 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/lib/mi-support.exp 2009-08-03 16:17:59.000000000 +0200 @@ -221,7 +221,7 @@ proc default_mi_gdb_start { args } { } } @@ -497,10 +499,10 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp send_gdb "190-gdb-set build-id-verbose 0\n" gdb_expect 10 { -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" { -Index: gdb-6.8.50.20090302/gdb/tui/tui-interp.c +Index: gdb-6.8.50.20090803/gdb/tui/tui-interp.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/tui/tui-interp.c 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/tui/tui-interp.c 2009-03-07 17:25:06.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/tui/tui-interp.c 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/tui/tui-interp.c 2009-08-03 16:17:59.000000000 +0200 @@ -30,6 +30,7 @@ #include "tui/tui.h" #include "tui/tui-io.h" @@ -518,10 +520,10 @@ Index: gdb-6.8.50.20090302/gdb/tui/tui-interp.c /* Tell readline what the prompt to display is and what function it will need to call after a whole line is read. This also displays the first prompt. */ -Index: gdb-6.8.50.20090302/gdb/aclocal.m4 +Index: gdb-6.8.50.20090803/gdb/aclocal.m4 =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/aclocal.m4 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/aclocal.m4 2009-03-07 17:25:06.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/aclocal.m4 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/aclocal.m4 2009-08-03 16:19:22.000000000 +0200 @@ -11,6 +11,162 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @@ -685,47 +687,11 @@ Index: gdb-6.8.50.20090302/gdb/aclocal.m4 # Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation -@@ -468,6 +624,27 @@ AC_DEFUN([AM_PROG_INSTALL_SH], - install_sh=${install_sh-"$am_aux_dir/install-sh"} - AC_SUBST(install_sh)]) - -+# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -+# -+# This file is free software; the Free Software Foundation -+# gives unlimited permission to copy and/or distribute it, -+# with or without modifications, as long as this notice is preserved. -+ -+# serial 2 -+ -+# Check whether the underlying file-system supports filenames -+# with a leading dot. For instance MS-DOS doesn't. -+AC_DEFUN([AM_SET_LEADING_DOT], -+[rm -rf .tst 2>/dev/null -+mkdir .tst 2>/dev/null -+if test -d .tst; then -+ am__leading_dot=. -+else -+ am__leading_dot=_ -+fi -+rmdir .tst 2>/dev/null -+AC_SUBST([am__leading_dot])]) -+ - # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- - # From Jim Meyering - -@@ -868,7 +1045,4 @@ m4_include([gnulib/m4/onceonly_2_57.m4]) - m4_include([gnulib/m4/stdint.m4]) - m4_include([gnulib/m4/string_h.m4]) - m4_include([gnulib/m4/wchar.m4]) --m4_include([../config/extensions.m4]) --m4_include([../config/lead-dot.m4]) --m4_include([../config/proginstall.m4]) - m4_include([acinclude.m4]) -Index: gdb-6.8.50.20090302/gdb/config.in +Index: gdb-6.8.50.20090803/gdb/config.in =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/config.in 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/config.in 2009-03-07 17:25:06.000000000 +0100 -@@ -38,6 +38,9 @@ +--- gdb-6.8.50.20090803.orig/gdb/config.in 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/config.in 2009-08-03 16:17:59.000000000 +0200 +@@ -39,6 +39,9 @@ /* Define to BFD's default target vector. */ #undef DEFAULT_BFD_VEC @@ -735,7 +701,7 @@ Index: gdb-6.8.50.20090302/gdb/config.in /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS -@@ -211,6 +214,9 @@ +@@ -218,6 +221,9 @@ /* Define if Python 2.6 is being used. */ #undef HAVE_LIBPYTHON2_6 @@ -745,16 +711,16 @@ Index: gdb-6.8.50.20090302/gdb/config.in /* Define if libunwind library is being used. */ #undef HAVE_LIBUNWIND -Index: gdb-6.8.50.20090302/gdb/configure +Index: gdb-6.8.50.20090803/gdb/configure =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/configure 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/configure 2009-03-07 17:25:06.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/configure 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/configure 2009-08-03 16:20:09.000000000 +0200 @@ -314,7 +314,7 @@ ac_subdirs_all="$ac_subdirs_all doc test ac_subdirs_all="$ac_subdirs_all gdbtk" ac_subdirs_all="$ac_subdirs_all multi-ice" ac_subdirs_all="$ac_subdirs_all gdbserver" --ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE GDB_DATADIR_PATH pythondir subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG LIBICONV LIBICONV_INCLUDE LIBICONV_LIBDIR READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' -+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE GDB_DATADIR_PATH pythondir PKG_CONFIG ac_pt_PKG_CONFIG RPM_CFLAGS RPM_LIBS subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG LIBICONV LIBICONV_INCLUDE LIBICONV_LIBDIR READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' +-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE DEBUGDIR GDB_DATADIR GDB_DATADIR_PATH pythondir subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE SYSTEM_GDBINIT WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags GDB_NM_FILE datarootdir docdir htmldir pdfdir LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE DEBUGDIR GDB_DATADIR GDB_DATADIR_PATH pythondir PKG_CONFIG ac_pt_PKG_CONFIG RPM_CFLAGS RPM_LIBS subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE SYSTEM_GDBINIT WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags GDB_NM_FILE datarootdir docdir htmldir pdfdir LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' ac_subst_files='host_makefile_frag' ac_pwd=`pwd` @@ -777,16 +743,16 @@ Index: gdb-6.8.50.20090302/gdb/configure # # Report the --help message. -@@ -886,6 +898,8 @@ Optional Packages: +@@ -895,6 +907,8 @@ Optional Packages: [DATADIR/gdb] --with-pythondir install Python data files in this path [DATADIR/gdb/python] + --with-rpm query rpm database for missing debuginfos + [yes/no,], [def.], [auto=librpm.so] - --with-libunwind Use libunwind frame unwinding support - --with-pkgversion=PKG Use PKG in the version string in place of "GDB" - --with-bugurl=URL Direct users to URL to report a bug -@@ -913,6 +927,9 @@ Some influential environment variables: + --with-libunwind use libunwind frame unwinding support + --with-curses use the curses library instead of the termcap + library +@@ -932,6 +946,9 @@ Some influential environment variables: CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor @@ -796,56 +762,7 @@ Index: gdb-6.8.50.20090302/gdb/configure Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. -@@ -6556,7 +6573,6 @@ am__api_version="1.9" - # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" - # OS/2's system install, which has a completely different semantic - # ./install, which can be erroneously created by make from ./install.sh. --# Reject install programs that cannot install multiple files. - echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 - echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 - if test -z "$INSTALL"; then -@@ -6590,18 +6606,8 @@ case $as_dir/ in - # program-specific install script used by HP pwplus--don't use. - : - else -- rm -rf conftest.one conftest.two conftest.dir -- echo one > conftest.one -- echo two > conftest.two -- mkdir conftest.dir -- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && -- test -s conftest.one && test -s conftest.two && -- test -s conftest.dir/conftest.one && -- test -s conftest.dir/conftest.two -- then -- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -- break 3 -- fi -+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -+ break 3 - fi - fi - done -@@ -6610,16 +6616,15 @@ case $as_dir/ in - esac - done - --rm -rf conftest.one conftest.two conftest.dir - - fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else -- # As a last resort, use the slow shell script. Don't cache a -- # value for INSTALL within a source directory, because that will -+ # As a last resort, use the slow shell script. We don't cache a -+ # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is -- # removed, or if the value is a relative name. -+ # removed, or if the path is relative. - INSTALL=$ac_install_sh - fi - fi -@@ -7202,6 +7207,559 @@ _ACEOF +@@ -7290,6 +7307,559 @@ _ACEOF fi @@ -1405,57 +1322,8 @@ Index: gdb-6.8.50.20090302/gdb/configure -@@ -8623,7 +9181,6 @@ done - # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" - # OS/2's system install, which has a completely different semantic - # ./install, which can be erroneously created by make from ./install.sh. --# Reject install programs that cannot install multiple files. - echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 - echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 - if test -z "$INSTALL"; then -@@ -8657,18 +9214,8 @@ case $as_dir/ in - # program-specific install script used by HP pwplus--don't use. - : - else -- rm -rf conftest.one conftest.two conftest.dir -- echo one > conftest.one -- echo two > conftest.two -- mkdir conftest.dir -- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && -- test -s conftest.one && test -s conftest.two && -- test -s conftest.dir/conftest.one && -- test -s conftest.dir/conftest.two -- then -- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -- break 3 -- fi -+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -+ break 3 - fi - fi - done -@@ -8677,16 +9224,15 @@ case $as_dir/ in - esac - done - --rm -rf conftest.one conftest.two conftest.dir - - fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else -- # As a last resort, use the slow shell script. Don't cache a -- # value for INSTALL within a source directory, because that will -+ # As a last resort, use the slow shell script. We don't cache a -+ # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is -- # removed, or if the value is a relative name. -+ # removed, or if the path is relative. - INSTALL=$ac_install_sh - fi - fi -@@ -22270,6 +22816,10 @@ s,@am__fastdepCC_TRUE@,$am__fastdepCC_TR - s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +@@ -22513,6 +23083,10 @@ s,@DEBUGDIR@,$DEBUGDIR,;t t + s,@GDB_DATADIR@,$GDB_DATADIR,;t t s,@GDB_DATADIR_PATH@,$GDB_DATADIR_PATH,;t t s,@pythondir@,$pythondir,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t @@ -1465,11 +1333,11 @@ Index: gdb-6.8.50.20090302/gdb/configure s,@subdirs@,$subdirs,;t t s,@TARGET_OBS@,$TARGET_OBS,;t t s,@PKGVERSION@,$PKGVERSION,;t t -Index: gdb-6.8.50.20090302/gdb/configure.ac +Index: gdb-6.8.50.20090803/gdb/configure.ac =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/configure.ac 2009-03-07 17:13:33.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/configure.ac 2009-03-07 17:25:06.000000000 +0100 -@@ -162,6 +162,199 @@ else +--- gdb-6.8.50.20090803.orig/gdb/configure.ac 2009-08-03 16:17:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/configure.ac 2009-08-03 16:17:59.000000000 +0200 +@@ -153,6 +153,199 @@ else fi AC_SUBST(pythondir) diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch index 36a5147..006669f 100644 --- a/gdb-6.6-buildid-locate.patch +++ b/gdb-6.6-buildid-locate.patch @@ -1,7 +1,7 @@ -Index: gdb-6.8.50.20090302/gdb/corelow.c +Index: gdb-6.8.50.20090803/gdb/corelow.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/corelow.c 2009-02-23 01:03:48.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/corelow.c 2009-03-07 17:04:57.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/corelow.c 2009-07-31 17:25:21.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/corelow.c 2009-08-04 06:32:12.000000000 +0200 @@ -45,6 +45,10 @@ #include "exceptions.h" #include "solib.h" @@ -13,7 +13,7 @@ Index: gdb-6.8.50.20090302/gdb/corelow.c #ifndef O_LARGEFILE -@@ -267,6 +271,50 @@ add_to_thread_list (bfd *abfd, asection +@@ -273,6 +277,50 @@ add_to_thread_list (bfd *abfd, asection inferior_ptid = ptid; /* Yes, make it current */ } @@ -64,7 +64,7 @@ Index: gdb-6.8.50.20090302/gdb/corelow.c /* This routine opens and sets up the core file bfd. */ static void -@@ -363,6 +417,12 @@ core_open (char *filename, int from_tty) +@@ -371,6 +419,12 @@ core_open (char *filename, int from_tty) push_target (&core_ops); discard_cleanups (old_chain); @@ -77,7 +77,7 @@ Index: gdb-6.8.50.20090302/gdb/corelow.c add_inferior_silent (corelow_pid); /* Do this before acknowledging the inferior, so if -@@ -751,4 +811,11 @@ _initialize_corelow (void) +@@ -878,4 +932,11 @@ _initialize_corelow (void) init_core_ops (); add_target (&core_ops); @@ -89,11 +89,11 @@ Index: gdb-6.8.50.20090302/gdb/corelow.c + NULL, NULL, NULL, + &setlist, &showlist); } -Index: gdb-6.8.50.20090302/gdb/doc/gdb.texinfo +Index: gdb-6.8.50.20090803/gdb/doc/gdb.texinfo =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/doc/gdb.texinfo 2009-03-07 17:04:56.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/doc/gdb.texinfo 2009-03-07 17:04:57.000000000 +0100 -@@ -13294,6 +13294,27 @@ information files. +--- gdb-6.8.50.20090803.orig/gdb/doc/gdb.texinfo 2009-08-04 06:31:59.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/doc/gdb.texinfo 2009-08-04 06:32:12.000000000 +0200 +@@ -13733,6 +13733,27 @@ information files. @end table @@ -121,11 +121,11 @@ Index: gdb-6.8.50.20090302/gdb/doc/gdb.texinfo @cindex @code{.gnu_debuglink} sections @cindex debug link sections A debug link is a special section of the executable file named -Index: gdb-6.8.50.20090302/gdb/solib-svr4.c +Index: gdb-6.8.50.20090803/gdb/solib-svr4.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/solib-svr4.c 2009-03-07 17:04:52.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/solib-svr4.c 2009-03-07 17:04:57.000000000 +0100 -@@ -1000,9 +1000,33 @@ svr4_current_sos (void) +--- gdb-6.8.50.20090803.orig/gdb/solib-svr4.c 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/solib-svr4.c 2009-08-04 06:32:12.000000000 +0200 +@@ -1101,9 +1101,33 @@ svr4_current_sos (void) safe_strerror (errcode)); else { @@ -162,11 +162,11 @@ Index: gdb-6.8.50.20090302/gdb/solib-svr4.c } xfree (buffer); -Index: gdb-6.8.50.20090302/gdb/symfile.c +Index: gdb-6.8.50.20090803/gdb/symfile.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.c 2009-03-07 17:04:53.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/symfile.c 2009-03-07 17:22:21.000000000 +0100 -@@ -54,6 +54,7 @@ +--- gdb-6.8.50.20090803.orig/gdb/symfile.c 2009-08-04 06:31:58.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile.c 2009-08-04 06:32:12.000000000 +0200 +@@ -55,6 +55,7 @@ #include "elf-bfd.h" #include "solib.h" #include "remote.h" @@ -174,8 +174,8 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c #include #include -@@ -1185,16 +1186,65 @@ symbol_file_clear (int from_tty) - printf_unfiltered (_("No symbol file now.\n")); +@@ -1193,16 +1194,65 @@ symbol_file_clear (int from_tty) + printf_unfiltered (_("No symbol file now.\n")); } +/* Locate NT_GNU_BUILD_ID and return its matching debug filename. @@ -242,7 +242,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c { struct build_id *retval; -@@ -1210,6 +1260,348 @@ build_id_bfd_get (bfd *abfd) +@@ -1218,6 +1268,348 @@ build_id_bfd_get (bfd *abfd) return retval; } @@ -591,7 +591,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c /* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value. */ static int -@@ -1227,7 +1619,7 @@ build_id_verify (const char *filename, s +@@ -1235,7 +1627,7 @@ build_id_verify (const char *filename, s if (abfd == NULL) return 0; @@ -600,7 +600,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c if (found == NULL) warning (_("File \"%s\" has no build-id, file skipped"), filename); -@@ -1246,8 +1638,9 @@ build_id_verify (const char *filename, s +@@ -1254,8 +1646,9 @@ build_id_verify (const char *filename, s return retval; } @@ -612,7 +612,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c { char *link, *s, *retval = NULL; gdb_byte *data = build_id->data; -@@ -1255,7 +1648,9 @@ build_id_to_debug_filename (struct build +@@ -1263,7 +1656,9 @@ build_id_to_debug_filename (struct build /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */ link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1 @@ -623,7 +623,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c s = link + sprintf (link, "%s/.build-id/", debug_file_directory); if (size > 0) { -@@ -1266,12 +1661,14 @@ build_id_to_debug_filename (struct build +@@ -1274,12 +1669,14 @@ build_id_to_debug_filename (struct build *s++ = '/'; while (size-- > 0) s += sprintf (s, "%02x", (unsigned) *data++); @@ -640,7 +640,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c if (retval != NULL && !build_id_verify (retval, build_id)) { -@@ -1279,9 +1676,150 @@ build_id_to_debug_filename (struct build +@@ -1287,9 +1684,150 @@ build_id_to_debug_filename (struct build retval = NULL; } @@ -791,7 +791,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c static char * get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out) { -@@ -1364,32 +1894,36 @@ static char * +@@ -1372,32 +1910,36 @@ static char * find_separate_debug_file (struct objfile *objfile) { asection *sect; @@ -836,7 +836,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c } basename = get_debug_link_info (objfile, &crc32); -@@ -1397,7 +1931,7 @@ find_separate_debug_file (struct objfile +@@ -1405,7 +1947,7 @@ find_separate_debug_file (struct objfile if (basename == NULL) /* There's no separate debug info, hence there's no way we could load it => no warning. */ @@ -845,7 +845,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c dir = xstrdup (objfile->name); -@@ -1413,23 +1947,19 @@ find_separate_debug_file (struct objfile +@@ -1421,23 +1963,19 @@ find_separate_debug_file (struct objfile gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i])); dir[i+1] = '\0'; @@ -876,7 +876,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c /* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */ strcpy (debugfile, dir); -@@ -1438,11 +1968,7 @@ find_separate_debug_file (struct objfile +@@ -1446,11 +1984,7 @@ find_separate_debug_file (struct objfile strcat (debugfile, basename); if (separate_debug_file_exists (debugfile, crc32, objfile->name)) @@ -889,7 +889,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c /* Then try in the global debugfile directory. */ strcpy (debugfile, debug_file_directory); -@@ -1451,11 +1977,7 @@ find_separate_debug_file (struct objfile +@@ -1459,11 +1993,7 @@ find_separate_debug_file (struct objfile strcat (debugfile, basename); if (separate_debug_file_exists (debugfile, crc32, objfile->name)) @@ -902,7 +902,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c /* If the file is in the sysroot, try using its base path in the global debugfile directory. */ -@@ -1470,20 +1992,18 @@ find_separate_debug_file (struct objfile +@@ -1478,20 +2008,18 @@ find_separate_debug_file (struct objfile strcat (debugfile, basename); if (separate_debug_file_exists (debugfile, crc32, objfile->name)) @@ -931,7 +931,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c } -@@ -4216,4 +4736,16 @@ Show printing of symbol loading messages +@@ -4243,4 +4771,16 @@ Show printing of symbol loading messages NULL, NULL, &setprintlist, &showprintlist); @@ -948,11 +948,11 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c + + observer_attach_executable_changed (debug_print_executable_changed); } -Index: gdb-6.8.50.20090302/gdb/symfile.h +Index: gdb-6.8.50.20090803/gdb/symfile.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.h 2009-03-07 17:04:52.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/symfile.h 2009-03-07 17:13:33.000000000 +0100 -@@ -372,6 +372,13 @@ extern int symfile_map_offsets_to_segmen +--- gdb-6.8.50.20090803.orig/gdb/symfile.h 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/symfile.h 2009-08-04 06:32:12.000000000 +0200 +@@ -388,6 +388,13 @@ extern int symfile_map_offsets_to_segmen struct symfile_segment_data *get_symfile_segment_data (bfd *abfd); void free_symfile_segment_data (struct symfile_segment_data *data); @@ -966,11 +966,11 @@ Index: gdb-6.8.50.20090302/gdb/symfile.h /* From dwarf2read.c */ extern int dwarf2_has_info (struct objfile *); -Index: gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/lib/gdb.exp =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/lib/gdb.exp 2009-03-07 17:04:52.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp 2009-03-07 17:13:33.000000000 +0100 -@@ -1230,6 +1230,16 @@ proc default_gdb_start { } { +--- gdb-6.8.50.20090803.orig/gdb/testsuite/lib/gdb.exp 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/lib/gdb.exp 2009-08-04 06:32:12.000000000 +0200 +@@ -1248,6 +1248,16 @@ proc default_gdb_start { } { warning "Couldn't set the width to 0." } } @@ -987,8 +987,10 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp return 0; } ---- ./gdb/testsuite/lib/mi-support.exp 2009-03-21 21:09:09.000000000 +0100 -+++ ./gdb/testsuite/lib/mi-support.exp 2009-03-22 16:37:58.000000000 +0100 +Index: gdb-6.8.50.20090803/gdb/testsuite/lib/mi-support.exp +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/testsuite/lib/mi-support.exp 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/lib/mi-support.exp 2009-08-04 06:32:12.000000000 +0200 @@ -221,6 +221,16 @@ proc default_mi_gdb_start { args } { } } diff --git a/gdb-6.6-multifork-debugreg.patch b/gdb-6.6-multifork-debugreg.patch index 8e8bca5..d069ee8 100644 --- a/gdb-6.6-multifork-debugreg.patch +++ b/gdb-6.6-multifork-debugreg.patch @@ -28,12 +28,12 @@ http://sourceware.org/ml/gdb-patches/2008-01/msg00042.html * s390-nat.c (s390_fix_watch_points): Fix its compilation failure - rename it to S390_FIX_WATCH_POINTS_LIST. -Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c +Index: gdb-6.8.50.20090803/gdb/amd64-linux-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/amd64-linux-nat.c 2009-02-09 16:02:27.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/amd64-linux-nat.c 2009-02-09 16:03:30.000000000 +0100 -@@ -408,25 +408,43 @@ amd64_linux_dr_set (ptid_t ptid, int reg - void +--- gdb-6.8.50.20090803.orig/gdb/amd64-linux-nat.c 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/amd64-linux-nat.c 2009-08-04 07:17:58.000000000 +0200 +@@ -411,25 +411,43 @@ amd64_linux_dr_set (ptid_t ptid, int reg + static void amd64_linux_dr_set_control (unsigned long control) { - struct lwp_info *lp; @@ -58,7 +58,7 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c + } } - void + static void amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr) { - struct lwp_info *lp; @@ -85,8 +85,8 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c + } } - void -@@ -451,6 +469,41 @@ amd64_linux_new_thread (ptid_t ptid) + static void +@@ -454,6 +472,42 @@ amd64_linux_new_thread (ptid_t ptid) amd64_linux_dr_set (ptid, DR_CONTROL, amd64_linux_dr[DR_CONTROL]); } @@ -108,7 +108,7 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c + /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */ + amd64_linux_detach_breakpoints_pid = 0; + -+ return i386_remove_watchpoint (addr, len, type); ++ return target_remove_watchpoint (addr, len, type); +} + +static void @@ -116,6 +116,7 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c +{ + struct cleanup *old_chain = save_inferior_ptid (); + int i; ++ extern void i386_detach_breakpoints (int detached_pid); + + amd64_linux_detach_breakpoints_pid = detached_pid; + /* Depend on `!is_lwp (inferior_ptid)' for the I386_* macros. */ @@ -128,7 +129,7 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c /* This function is called by libthread_db as part of its handling of -@@ -755,6 +808,42 @@ amd64_linux_siginfo_fixup (struct siginf +@@ -767,6 +821,42 @@ amd64_linux_siginfo_fixup (struct siginf return 0; } @@ -171,7 +172,7 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_amd64_linux_nat (void); -@@ -791,6 +880,9 @@ _initialize_amd64_linux_nat (void) +@@ -809,6 +899,9 @@ _initialize_amd64_linux_nat (void) linux_elfcore_write_prstatus = amd64_linux_elfcore_write_prstatus; linux_elfcore_write_prfpreg = amd64_linux_elfcore_write_prfpreg; @@ -181,24 +182,11 @@ Index: gdb-6.8.50.20090209/gdb/amd64-linux-nat.c /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, amd64_linux_new_thread); -Index: gdb-6.8.50.20090209/gdb/config/i386/nm-i386.h +Index: gdb-6.8.50.20090803/gdb/i386-linux-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/config/i386/nm-i386.h 2009-01-03 06:57:54.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/config/i386/nm-i386.h 2009-02-09 16:02:42.000000000 +0100 -@@ -120,6 +120,8 @@ extern int i386_stopped_by_watchpoint (v - - #endif /* I386_WATCHPOINTS_IN_TARGET_VECTOR */ - -+extern void i386_detach_breakpoints (int detached_pid); -+ - #endif /* I386_USE_GENERIC_WATCHPOINTS */ - - #endif /* NM_I386_H */ -Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c -=================================================================== ---- gdb-6.8.50.20090209.orig/gdb/i386-linux-nat.c 2009-01-03 06:57:51.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/i386-linux-nat.c 2009-02-09 16:02:42.000000000 +0100 -@@ -634,21 +634,42 @@ i386_linux_dr_set_control (unsigned long +--- gdb-6.8.50.20090803.orig/gdb/i386-linux-nat.c 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/i386-linux-nat.c 2009-08-04 07:26:43.000000000 +0200 +@@ -637,21 +637,42 @@ i386_linux_dr_set_control (unsigned long ptid_t ptid; i386_linux_dr[DR_CONTROL] = control; @@ -220,7 +208,7 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c + } } - void + static void i386_linux_dr_set_addr (int regnum, CORE_ADDR addr) { - struct lwp_info *lp; @@ -247,8 +235,8 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c + } } - void -@@ -673,6 +694,41 @@ i386_linux_new_thread (ptid_t ptid) + static void +@@ -676,6 +697,42 @@ i386_linux_new_thread (ptid_t ptid) i386_linux_dr_set (ptid, DR_CONTROL, i386_linux_dr[DR_CONTROL]); } @@ -270,7 +258,7 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c + /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */ + i386_linux_detach_breakpoints_pid = 0; + -+ return i386_remove_watchpoint (addr, len, type); ++ return target_remove_watchpoint (addr, len, type); +} + +static void @@ -278,6 +266,7 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c +{ + struct cleanup *old_chain = save_inferior_ptid (); + int i; ++ extern void i386_detach_breakpoints (int detached_pid); + + i386_linux_detach_breakpoints_pid = detached_pid; + /* Depend on `!is_lwp (inferior_ptid)' for the I386_* macros. */ @@ -290,7 +279,7 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c /* Called by libthread_db. Returns a pointer to the thread local -@@ -812,6 +868,40 @@ i386_linux_child_post_startup_inferior ( +@@ -818,6 +875,40 @@ i386_linux_child_post_startup_inferior ( super_post_startup_inferior (ptid); } @@ -331,7 +320,7 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c void _initialize_i386_linux_nat (void) { -@@ -833,6 +923,9 @@ _initialize_i386_linux_nat (void) +@@ -845,6 +936,9 @@ _initialize_i386_linux_nat (void) t->to_fetch_registers = i386_linux_fetch_inferior_registers; t->to_store_registers = i386_linux_store_inferior_registers; @@ -341,11 +330,11 @@ Index: gdb-6.8.50.20090209/gdb/i386-linux-nat.c /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, i386_linux_new_thread); -Index: gdb-6.8.50.20090209/gdb/i386-nat.c +Index: gdb-6.8.50.20090803/gdb/i386-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/i386-nat.c 2009-01-03 06:57:51.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/i386-nat.c 2009-02-09 16:02:42.000000000 +0100 -@@ -546,6 +546,17 @@ i386_remove_watchpoint (CORE_ADDR addr, +--- gdb-6.8.50.20090803.orig/gdb/i386-nat.c 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/i386-nat.c 2009-08-04 07:17:58.000000000 +0200 +@@ -520,6 +520,18 @@ i386_remove_watchpoint (CORE_ADDR addr, return retval; } @@ -355,18 +344,19 @@ Index: gdb-6.8.50.20090209/gdb/i386-nat.c + int i; + + /* Do not touch any DR_MIRROR or DR_CONTROL_MIRROR mirrors here. */ -+ I386_DR_LOW_SET_CONTROL (0); -+ ALL_DEBUG_REGISTERS(i) -+ I386_DR_LOW_RESET_ADDR (i); ++ i386_dr_low.set_control (0); ++ if (i386_dr_low.reset_addr) ++ ALL_DEBUG_REGISTERS(i) ++ i386_dr_low.reset_addr (i); +} + /* Return non-zero if we can watch a memory region that starts at address ADDR and whose length is LEN bytes. */ -Index: gdb-6.8.50.20090209/gdb/ia64-linux-nat.c +Index: gdb-6.8.50.20090803/gdb/ia64-linux-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/ia64-linux-nat.c 2009-02-09 15:48:43.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/ia64-linux-nat.c 2009-02-09 16:02:42.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/ia64-linux-nat.c 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/ia64-linux-nat.c 2009-08-04 07:17:58.000000000 +0200 @@ -583,6 +583,12 @@ ia64_linux_insert_watchpoint (CORE_ADDR return 0; } @@ -415,7 +405,7 @@ Index: gdb-6.8.50.20090209/gdb/ia64-linux-nat.c ia64_linux_new_thread (ptid_t ptid) { int i, any; -@@ -805,6 +832,40 @@ ia64_linux_xfer_partial (struct target_o +@@ -807,6 +834,40 @@ ia64_linux_xfer_partial (struct target_o offset, len); } @@ -456,7 +446,7 @@ Index: gdb-6.8.50.20090209/gdb/ia64-linux-nat.c void _initialize_ia64_linux_nat (void); /* -@@ -899,6 +960,9 @@ _initialize_ia64_linux_nat (void) +@@ -901,6 +962,9 @@ _initialize_ia64_linux_nat (void) t->to_insert_watchpoint = ia64_linux_insert_watchpoint; t->to_remove_watchpoint = ia64_linux_remove_watchpoint; @@ -466,11 +456,11 @@ Index: gdb-6.8.50.20090209/gdb/ia64-linux-nat.c /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, ia64_linux_new_thread); -Index: gdb-6.8.50.20090209/gdb/ppc-linux-nat.c +Index: gdb-6.8.50.20090803/gdb/ppc-linux-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/ppc-linux-nat.c 2009-01-03 06:57:52.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/ppc-linux-nat.c 2009-02-09 16:02:42.000000000 +0100 -@@ -1118,6 +1118,12 @@ ppc_linux_insert_watchpoint (CORE_ADDR a +--- gdb-6.8.50.20090803.orig/gdb/ppc-linux-nat.c 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/ppc-linux-nat.c 2009-08-04 07:17:58.000000000 +0200 +@@ -1377,6 +1377,12 @@ ppc_linux_insert_watchpoint (CORE_ADDR a return 0; } @@ -483,7 +473,7 @@ Index: gdb-6.8.50.20090209/gdb/ppc-linux-nat.c static int ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw) { -@@ -1125,6 +1131,11 @@ ppc_linux_remove_watchpoint (CORE_ADDR a +@@ -1384,6 +1390,11 @@ ppc_linux_remove_watchpoint (CORE_ADDR a ptid_t ptid; long dabr_value = 0; @@ -495,7 +485,7 @@ Index: gdb-6.8.50.20090209/gdb/ppc-linux-nat.c saved_dabr_value = 0; ALL_LWPS (lp, ptid) if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0, saved_dabr_value) < 0) -@@ -1138,6 +1149,15 @@ ppc_linux_new_thread (ptid_t ptid) +@@ -1397,6 +1408,15 @@ ppc_linux_new_thread (ptid_t ptid) ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0, saved_dabr_value); } @@ -511,7 +501,7 @@ Index: gdb-6.8.50.20090209/gdb/ppc-linux-nat.c static int ppc_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p) { -@@ -1318,6 +1338,40 @@ ppc_linux_read_description (struct targe +@@ -1629,6 +1649,40 @@ ppc_linux_read_description (struct targe return isa205? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l; } @@ -552,9 +542,9 @@ Index: gdb-6.8.50.20090209/gdb/ppc-linux-nat.c void _initialize_ppc_linux_nat (void); void -@@ -1343,6 +1397,9 @@ _initialize_ppc_linux_nat (void) - +@@ -1655,6 +1709,9 @@ _initialize_ppc_linux_nat (void) t->to_read_description = ppc_linux_read_description; + t->to_auxv_parse = ppc_linux_auxv_parse; + ppc_linux_super_follow_fork = t->to_follow_fork; + t->to_follow_fork = ppc_linux_follow_fork; @@ -562,11 +552,11 @@ Index: gdb-6.8.50.20090209/gdb/ppc-linux-nat.c /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, ppc_linux_new_thread); -Index: gdb-6.8.50.20090209/gdb/s390-nat.c +Index: gdb-6.8.50.20090803/gdb/s390-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/s390-nat.c 2007-11-07 07:36:57.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/s390-nat.c 2009-02-09 16:02:42.000000000 +0100 -@@ -283,21 +283,15 @@ s390_stopped_by_watchpoint (void) +--- gdb-6.8.50.20090803.orig/gdb/s390-nat.c 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/s390-nat.c 2009-08-04 07:17:58.000000000 +0200 +@@ -285,21 +285,15 @@ s390_stopped_by_watchpoint (void) } static void @@ -590,7 +580,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c { watch_lo_addr = min (watch_lo_addr, area->lo_addr); watch_hi_addr = max (watch_hi_addr, area->hi_addr); -@@ -309,7 +303,7 @@ s390_fix_watch_points (ptid_t ptid) +@@ -311,7 +305,7 @@ s390_fix_watch_points (ptid_t ptid) if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea) < 0) perror_with_name (_("Couldn't retrieve watchpoint status")); @@ -599,7 +589,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c { per_info.control_regs.bits.em_storage_alteration = 1; per_info.control_regs.bits.storage_alt_space_ctl = 1; -@@ -326,6 +320,18 @@ s390_fix_watch_points (ptid_t ptid) +@@ -328,6 +322,18 @@ s390_fix_watch_points (ptid_t ptid) perror_with_name (_("Couldn't modify watchpoint status")); } @@ -618,7 +608,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c static int s390_insert_watchpoint (CORE_ADDR addr, int len, int type) { -@@ -347,6 +353,12 @@ s390_insert_watchpoint (CORE_ADDR addr, +@@ -349,6 +355,12 @@ s390_insert_watchpoint (CORE_ADDR addr, return 0; } @@ -631,7 +621,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c static int s390_remove_watchpoint (CORE_ADDR addr, int len, int type) { -@@ -354,6 +366,11 @@ s390_remove_watchpoint (CORE_ADDR addr, +@@ -356,6 +368,11 @@ s390_remove_watchpoint (CORE_ADDR addr, ptid_t ptid; struct watch_area *area, **parea; @@ -643,7 +633,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c for (parea = &watch_base; *parea; parea = &(*parea)->next) if ((*parea)->lo_addr == addr && (*parea)->hi_addr == addr + len - 1) -@@ -361,8 +378,10 @@ s390_remove_watchpoint (CORE_ADDR addr, +@@ -363,8 +380,10 @@ s390_remove_watchpoint (CORE_ADDR addr, if (!*parea) { @@ -654,7 +644,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c return -1; } -@@ -375,6 +394,15 @@ s390_remove_watchpoint (CORE_ADDR addr, +@@ -377,6 +396,15 @@ s390_remove_watchpoint (CORE_ADDR addr, return 0; } @@ -670,7 +660,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c static int s390_can_use_hw_breakpoint (int type, int cnt, int othertype) { -@@ -387,6 +415,39 @@ s390_region_ok_for_hw_watchpoint (CORE_A +@@ -389,6 +417,39 @@ s390_region_ok_for_hw_watchpoint (CORE_A return 1; } @@ -710,7 +700,7 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c void _initialize_s390_nat (void); -@@ -410,6 +471,9 @@ _initialize_s390_nat (void) +@@ -412,6 +473,9 @@ _initialize_s390_nat (void) t->to_insert_watchpoint = s390_insert_watchpoint; t->to_remove_watchpoint = s390_remove_watchpoint; @@ -720,10 +710,10 @@ Index: gdb-6.8.50.20090209/gdb/s390-nat.c /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, s390_fix_watch_points); -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c 2009-02-09 16:02:42.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c 2009-08-04 07:17:58.000000000 +0200 @@ -0,0 +1,172 @@ +/* Test case for forgotten hw-watchpoints after fork()-off of a process. + @@ -897,10 +887,10 @@ Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c +#else +# error "!FOLLOW_PARENT && !FOLLOW_CHILD" +#endif -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c 2009-02-09 16:02:42.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c 2009-08-04 07:17:58.000000000 +0200 @@ -0,0 +1,154 @@ +/* Test case for forgotten hw-watchpoints after fork()-off of a process. + @@ -1056,10 +1046,10 @@ Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c + + return 0; +} -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork.c 2009-02-09 16:02:42.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork.c 2009-08-04 07:17:58.000000000 +0200 @@ -0,0 +1,56 @@ +/* Test case for forgotten hw-watchpoints after fork()-off of a process. + @@ -1117,10 +1107,10 @@ Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork.c + + return 0; +} -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork.exp 2009-02-09 16:02:42.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/watchpoint-fork.exp 2009-08-04 07:17:58.000000000 +0200 @@ -0,0 +1,140 @@ +# Copyright 2008 Free Software Foundation, Inc. + @@ -1262,11 +1252,11 @@ Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/watchpoint-fork.exp +if {[istarget "*-*-linux*"]} { + test child FOLLOW_CHILD +} -Index: gdb-6.8.50.20090209/gdb/doc/gdb.texinfo +Index: gdb-6.8.50.20090803/gdb/doc/gdb.texinfo =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/doc/gdb.texinfo 2009-02-09 16:02:35.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/doc/gdb.texinfo 2009-02-09 16:02:42.000000000 +0100 -@@ -3588,6 +3588,14 @@ confident that no other thread can becom +--- gdb-6.8.50.20090803.orig/gdb/doc/gdb.texinfo 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/doc/gdb.texinfo 2009-08-04 07:17:58.000000000 +0200 +@@ -3625,6 +3625,14 @@ confident that no other thread can becom software watchpoints as usual. However, @value{GDBN} may not notice when a non-current thread's activity changes the expression. (Hardware watchpoints, in contrast, watch an expression in all threads.) @@ -1281,15 +1271,14 @@ Index: gdb-6.8.50.20090209/gdb/doc/gdb.texinfo @end quotation @xref{set remote hardware-watchpoint-limit}. -Index: gdb-6.8.50.20090209/gdb/config/i386/nm-linux.h +Index: gdb-6.8.50.20090803/gdb/config/i386/nm-linux.h =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/config/i386/nm-linux.h 2009-01-03 06:57:54.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/config/i386/nm-linux.h 2009-02-09 16:02:42.000000000 +0100 -@@ -46,6 +46,16 @@ extern void i386_linux_dr_reset_addr (in - extern unsigned long i386_linux_dr_get_status (void); - #define I386_DR_LOW_GET_STATUS() \ - i386_linux_dr_get_status () -+ +--- gdb-6.8.50.20090803.orig/gdb/config/i386/nm-linux.h 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/config/i386/nm-linux.h 2009-08-04 07:17:58.000000000 +0200 +@@ -29,4 +29,14 @@ + #define FILL_FPXREGSET + #endif + +/* Remove a watchpoint that watched the memory region which starts at + * address ADDR, whose length is LEN bytes, and for accesses of the + * type TYPE. Return 0 on success, -1 on failure. */ @@ -1299,13 +1288,12 @@ Index: gdb-6.8.50.20090209/gdb/config/i386/nm-linux.h + insertion/removal to support threads. */ +#define target_remove_watchpoint(addr, len, type) \ + i386_linux_remove_watchpoint (addr, len, type) - - - #ifdef HAVE_PTRACE_GETFPXREGS -Index: gdb-6.8.50.20090209/gdb/config/i386/nm-linux64.h ++ + #endif /* nm-linux.h */ +Index: gdb-6.8.50.20090803/gdb/config/i386/nm-linux64.h =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/config/i386/nm-linux64.h 2009-01-03 06:57:54.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/config/i386/nm-linux64.h 2009-02-09 16:02:42.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/config/i386/nm-linux64.h 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/config/i386/nm-linux64.h 2009-08-04 07:17:58.000000000 +0200 @@ -51,4 +51,14 @@ extern unsigned long amd64_linux_dr_get_ #define I386_DR_LOW_GET_STATUS() \ amd64_linux_dr_get_status () @@ -1321,12 +1309,15 @@ Index: gdb-6.8.50.20090209/gdb/config/i386/nm-linux64.h + amd64_linux_remove_watchpoint (addr, len, type) + #endif /* nm-linux64.h */ -Index: gdb-6.8.50.20090209/gdb/target.h +Index: gdb-6.8.50.20090803/gdb/target.h =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/target.h 2009-02-09 15:49:25.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/target.h 2009-02-09 16:02:42.000000000 +0100 -@@ -1113,7 +1113,9 @@ extern char *normal_pid_to_str (ptid_t p - #ifndef target_insert_watchpoint +--- gdb-6.8.50.20090803.orig/gdb/target.h 2009-08-04 07:17:19.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/target.h 2009-08-04 07:35:13.000000000 +0200 +@@ -1114,11 +1114,15 @@ extern char *normal_pid_to_str (ptid_t p + for write, 1 for read, and 2 for read/write accesses. Returns 0 for + success, non-zero for failure. */ + ++#ifndef target_insert_watchpoint #define target_insert_watchpoint(addr, len, type) \ (*current_target.to_insert_watchpoint) (addr, len, type) +#endif @@ -1334,4 +1325,7 @@ Index: gdb-6.8.50.20090209/gdb/target.h +#ifndef target_remove_watchpoint #define target_remove_watchpoint(addr, len, type) \ (*current_target.to_remove_watchpoint) (addr, len, type) - #endif ++#endif + + #define target_insert_hw_breakpoint(gdbarch, bp_tgt) \ + (*current_target.to_insert_hw_breakpoint) (gdbarch, bp_tgt) diff --git a/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch b/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch index cdf9225..5b5917d 100644 --- a/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch +++ b/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch @@ -21,11 +21,11 @@ Port to GDB-6.8pre. -Index: gdb-6.8.50.20081209/gdb/inferior.h +Index: gdb-6.8.50.20090803/gdb/inferior.h =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/inferior.h 2008-11-20 01:35:23.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/inferior.h 2008-12-10 01:22:23.000000000 +0100 -@@ -168,7 +168,15 @@ extern void reopen_exec_file (void); +--- gdb-6.8.50.20090803.orig/gdb/inferior.h 2009-06-28 02:20:22.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/inferior.h 2009-08-03 17:19:56.000000000 +0200 +@@ -181,7 +181,15 @@ extern void reopen_exec_file (void); /* The `resume' routine should only be called in special circumstances. Normally, use `proceed', which handles a lot of bookkeeping. */ @@ -42,20 +42,20 @@ Index: gdb-6.8.50.20081209/gdb/inferior.h /* From misc files */ -Index: gdb-6.8.50.20081209/gdb/infrun.c +Index: gdb-6.8.50.20090803/gdb/infrun.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/infrun.c 2008-12-02 20:20:23.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/infrun.c 2008-12-10 01:23:46.000000000 +0100 -@@ -73,7 +73,7 @@ static int follow_fork (void); +--- gdb-6.8.50.20090803.orig/gdb/infrun.c 2009-07-31 01:01:27.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/infrun.c 2009-08-03 21:39:28.000000000 +0200 +@@ -74,7 +74,7 @@ static int follow_fork (void); static void set_schedlock_func (char *args, int from_tty, struct cmd_list_element *c); -static int currently_stepping (struct thread_info *tp); +static enum resume_step currently_stepping (struct thread_info *tp); - static int currently_stepping_callback (struct thread_info *tp, void *data); - -@@ -961,7 +961,7 @@ set_schedlock_func (char *args, int from + static int currently_stepping_or_nexting_callback (struct thread_info *tp, + void *data); +@@ -1137,7 +1137,7 @@ maybe_software_singlestep (struct gdbarc STEP nonzero if we should step (zero to continue instead). SIG is the signal to give the inferior (zero for none). */ void @@ -64,7 +64,7 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c { int should_resume = 1; struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0); -@@ -975,10 +975,12 @@ resume (int step, enum target_signal sig +@@ -1149,10 +1149,12 @@ resume (int step, enum target_signal sig QUIT; if (debug_infrun) @@ -81,7 +81,7 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c /* Some targets (e.g. Solaris x86) have a kernel bug when stepping over an instruction that causes a page fault without triggering -@@ -1127,9 +1129,10 @@ a command like `return' or `jump' to con +@@ -1271,9 +1273,10 @@ a command like `return' or `jump' to con individually. */ resume_ptid = inferior_ptid; } @@ -94,16 +94,16 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c { /* User-settable 'scheduler' mode requires solo thread resume. */ resume_ptid = inferior_ptid; -@@ -1302,7 +1305,7 @@ proceed (CORE_ADDR addr, enum target_sig - struct gdbarch *gdbarch = get_regcache_arch (regcache); +@@ -1474,7 +1477,7 @@ proceed (CORE_ADDR addr, enum target_sig + struct gdbarch *gdbarch; struct thread_info *tp; - CORE_ADDR pc = regcache_read_pc (regcache); + CORE_ADDR pc; - int oneproc = 0; + enum resume_step resume_step = RESUME_STEP_CONTINUE; - if (step > 0) - step_start_function = find_pc_function (pc); -@@ -1322,13 +1325,13 @@ proceed (CORE_ADDR addr, enum target_sig + /* If we're stopped at a fork/vfork, follow the branch set by the + "set follow-fork-mode" command; otherwise, we'll just proceed +@@ -1508,13 +1511,13 @@ proceed (CORE_ADDR addr, enum target_sig actually be executing the breakpoint insn anyway. We'll be (un-)executing the previous instruction. */ @@ -119,7 +119,7 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c } else { -@@ -1359,13 +1362,13 @@ proceed (CORE_ADDR addr, enum target_sig +@@ -1545,13 +1548,13 @@ proceed (CORE_ADDR addr, enum target_sig is required it returns TRUE and sets the current thread to the old thread. */ if (prepare_to_proceed (step)) @@ -135,7 +135,7 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c { tp->trap_expected = 1; /* If displaced stepping is enabled, we can step over the -@@ -1451,8 +1454,13 @@ proceed (CORE_ADDR addr, enum target_sig +@@ -1637,8 +1640,13 @@ proceed (CORE_ADDR addr, enum target_sig /* Reset to normal state. */ init_infwait_state (); @@ -150,16 +150,21 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c /* Wait for it to stop (if not standalone) and in any case decode why it stopped, and act accordingly. */ -@@ -3690,10 +3698,16 @@ currently_stepping_callback (struct thre - return tp != data && currently_stepping_thread (tp); - } +@@ -4171,13 +4179,18 @@ infrun: not switching back to stepped th + + /* Is thread TP in the middle of single-stepping? */ -static int +static enum resume_step currently_stepping (struct thread_info *tp) { -- return currently_stepping_thread (tp) || bpstat_should_step (); -+ if (currently_stepping_thread (tp)) +- return ((tp->step_range_end && tp->step_resume_breakpoint == NULL) +- || tp->trap_expected +- || tp->stepping_through_solib_after_catch +- || bpstat_should_step ()); ++ if ((tp->step_range_end && tp->step_resume_breakpoint == NULL) ++ || tp->trap_expected ++ || tp->stepping_through_solib_after_catch) + return RESUME_STEP_USER; + + if (bpstat_should_step ()) @@ -168,12 +173,12 @@ Index: gdb-6.8.50.20081209/gdb/infrun.c + return RESUME_STEP_CONTINUE; } - /* Inferior has stepped into a subroutine call with source code that -Index: gdb-6.8.50.20081209/gdb/linux-nat.c + /* Returns true if any thread *but* the one passed in "data" is in the +Index: gdb-6.8.50.20090803/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/linux-nat.c 2008-12-02 08:57:36.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/linux-nat.c 2008-12-10 01:22:23.000000000 +0100 -@@ -2343,7 +2343,10 @@ count_events_callback (struct lwp_info * +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.c 2009-07-31 17:25:21.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.c 2009-08-03 21:39:10.000000000 +0200 +@@ -2351,7 +2351,10 @@ count_events_callback (struct lwp_info * static int select_singlestep_lwp_callback (struct lwp_info *lp, void *data) { @@ -185,10 +190,10 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c return 1; else return 0; -Index: gdb-6.8.50.20081209/gdb/linux-nat.h +Index: gdb-6.8.50.20090803/gdb/linux-nat.h =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/linux-nat.h 2008-07-27 23:12:40.000000000 +0200 -+++ gdb-6.8.50.20081209/gdb/linux-nat.h 2008-12-10 01:22:23.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.h 2009-05-18 19:11:25.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.h 2009-08-03 21:39:09.000000000 +0200 @@ -55,8 +55,8 @@ struct lwp_info /* If non-zero, a pending wait status. */ int status; diff --git a/gdb-6.6-step-thread-exit.patch b/gdb-6.6-step-thread-exit.patch deleted file mode 100644 index 142c77d..0000000 --- a/gdb-6.6-step-thread-exit.patch +++ /dev/null @@ -1,61 +0,0 @@ -Index: gdb-6.8.50.20090226/gdb/linux-nat.c -=================================================================== ---- gdb-6.8.50.20090226.orig/gdb/linux-nat.c 2009-02-27 00:04:35.000000000 +0100 -+++ gdb-6.8.50.20090226/gdb/linux-nat.c 2009-02-27 07:51:44.000000000 +0100 -@@ -1790,15 +1790,17 @@ resume_set_callback (struct lwp_info *lp - - static void - linux_nat_resume (struct target_ops *ops, -- ptid_t ptid, int step, enum target_signal signo) -+ ptid_t ptid, int step_int, enum target_signal signo) - { - struct lwp_info *lp; - int resume_all; -+ enum resume_step step = step_int; - - if (debug_linux_nat) - fprintf_unfiltered (gdb_stdlog, - "LLR: Preparing to %s %s, %s, inferior_ptid %s\n", -- step ? "step" : "resume", -+ (step == RESUME_STEP_NEEDED -+ ? "needed" : (step ? "step" : "resume")), - target_pid_to_str (ptid), - signo ? strsignal (signo) : "0", - target_pid_to_str (inferior_ptid)); -@@ -2740,6 +2742,9 @@ linux_nat_filter_event (int lwpid, int s - /* Check if the thread has exited. */ - if ((WIFEXITED (status) || WIFSIGNALED (status)) && num_lwps > 1) - { -+ enum resume_step step = lp->step; -+ pid_t pid = GET_PID (lp->ptid); -+ - /* If this is the main thread, we must stop all threads and - verify if they are still alive. This is because in the nptl - thread model, there is no signal issued for exiting LWPs -@@ -2763,6 +2768,26 @@ linux_nat_filter_event (int lwpid, int s - - exit_lwp (lp); - -+ if (step == RESUME_STEP_USER) -+ { -+ /* Now stop the closest LWP's ... */ -+ lp = find_lwp_pid (pid_to_ptid (pid)); -+ if (!lp) -+ lp = lwp_list; -+ gdb_assert (lp != NULL); -+ errno = 0; -+ ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0, -+ (void *) (unsigned long) SIGSTOP); -+ if (debug_linux_nat) -+ fprintf_unfiltered (gdb_stdlog, -+ "PTRACE_CONT %s, 0, 0 (%s)\n", -+ target_pid_to_str (lp->ptid), -+ errno ? safe_strerror (errno) -+ : "OK"); -+ /* Avoid the silent `delayed SIGSTOP' handling. */ -+ lp->signalled = 0; -+ } -+ - /* If there is at least one more LWP, then the exit signal was - not the end of the debugged application and should be - ignored. */ diff --git a/gdb-6.7-testsuite-stable-results.patch b/gdb-6.7-testsuite-stable-results.patch index 50273e4..ea8ae4c 100644 --- a/gdb-6.7-testsuite-stable-results.patch +++ b/gdb-6.7-testsuite-stable-results.patch @@ -116,93 +116,3 @@ frames-invalid can happen asynchronously. "array partial with expressions" 4 "intarray2\[3\]" gdb_test "print intarray2\[2\] == 0" " = 1" "element 2 not changed, == 4" ---- gdb-6.8.50.20090209/gdb/testsuite/gdb.base/annota1.exp-orig 2009-02-09 16:31:11.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.base/annota1.exp 2009-02-09 21:27:38.000000000 +0100 -@@ -286,7 +286,7 @@ if [target_info exists gdb,nosignals] { - } else { - send_gdb "signal SIGUSR1\n" - gdb_expect { -- -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n${escapedsrcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ -+ -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\r\n(\r\n\032\032frames-invalid\r\n)*\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n${escapedsrcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ - { pass "send SIGUSR1" } - -re "\r\n\032\032post-prompt\r\nContinuing with signal SIGUSR1.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032breakpoint 2\r\n\r\nBreakpoint 2, \r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nhandle_USR1\r\n\032\032frame-args\r\n \\(\r\n\032\032arg-begin\r\nsig\r\n\032\032arg-name-end\r\n=\r\n\032\032arg-value -\r\n$decimal\r\n\032\032arg-end\r\n\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*${srcfile}\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source.*annota1.c:.*:.*:beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ - { setup_xfail "*-*-*" 1270 ---- ./gdb/testsuite/gdb.base/auxv.exp 2009-02-11 00:54:54.000000000 +0100 -+++ ./gdb/testsuite/gdb.base/auxv.exp 2009-02-11 00:51:30.000000000 +0100 -@@ -78,8 +78,10 @@ proc fetch_auxv {test} { - - set auxv_lines {} - set bad -1 -+ # Former trailing `\[\r\n\]+' may eat just \r leaving \n in the buffer -+ # corrupting the next matches. - if {[gdb_test_multiple "info auxv" $test { -- -re "info auxv\[\r\n\]+" { -+ -re "info auxv\r\n" { - exp_continue - } - -ex "The program has no auxiliary information now" { -@@ -94,20 +96,20 @@ proc fetch_auxv {test} { - set bad 1 - exp_continue - } -- -re "^\[0-9\]+\[ \t\]+(AT_\[^ \t\]+)\[^\r\n\]+\[\r\n\]+" { -+ -re "^\[0-9\]+\[ \t\]+(AT_\[^ \t\]+)\[^\r\n\]+\r\n" { - lappend auxv_lines $expect_out(0,string) - exp_continue - } -- -re "^\[0-9\]+\[ \t\]+\\?\\?\\?\[^\r\n\]+\[\r\n\]+" { -+ -re "^\[0-9\]+\[ \t\]+\\?\\?\\?\[^\r\n\]+\r\n" { - warning "Unrecognized tag value: $expect_out(0,string)" - set bad 1 - lappend auxv_lines $expect_out(0,string) - exp_continue - } -- -re ".*$gdb_prompt $" { -+ -re "$gdb_prompt $" { - incr bad - } -- -re "^\[^\r\n\]+\[\r\n\]+" { -+ -re "^\[^\r\n\]+\r\n" { - if {!$bad} { - warning "Unrecognized output: $expect_out(0,string)" - set bad 1 ---- ./gdb/testsuite/gdb.base/callfuncs.exp 2009-01-03 06:58:03.000000000 +0100 -+++ ./gdb/testsuite/gdb.base/callfuncs.exp 2009-02-11 00:51:42.000000000 +0100 -@@ -249,15 +249,17 @@ proc fetch_all_registers {test} { - - set all_registers_lines {} - set bad -1 -+ # Former trailing `\[\r\n\]+' may eat just \r leaving \n in the buffer -+ # corrupting the next matches. - if {[gdb_test_multiple "info all-registers" $test { -- -re "info all-registers\[\r\n\]+" { -+ -re "info all-registers\r\n" { - exp_continue - } - -ex "The program has no registers now" { - set bad 1 - exp_continue - } -- -re "^bspstore\[ \t\]+\[^\r\n\]+\[\r\n\]+" { -+ -re "^bspstore\[ \t\]+\[^\r\n\]+\r\n" { - if [istarget "ia64-*-*"] { - # Filter out bspstore which is specially tied to bsp, - # giving spurious differences. -@@ -266,14 +268,14 @@ proc fetch_all_registers {test} { - } - exp_continue - } -- -re "^\[^ \t\]+\[ \t\]+\[^\r\n\]+\[\r\n\]+" { -+ -re "^\[^ \t\]+\[ \t\]+\[^\r\n\]+\r\n" { - lappend all_registers_lines $expect_out(0,string) - exp_continue - } -- -re ".*$gdb_prompt $" { -+ -re "$gdb_prompt $" { - incr bad - } -- -re "^\[^\r\n\]+\[\r\n\]+" { -+ -re "^\[^\r\n\]+\r\n" { - if {!$bad} { - warning "Unrecognized output: $expect_out(0,string)" - set bad 1 diff --git a/gdb-6.8-attach-signalled-detach-stopped.patch b/gdb-6.8-attach-signalled-detach-stopped.patch index a297ec4..4c462e1 100644 --- a/gdb-6.8-attach-signalled-detach-stopped.patch +++ b/gdb-6.8-attach-signalled-detach-stopped.patch @@ -1,8 +1,8 @@ -Index: gdb-6.8.50.20090209/gdb/linux-nat.c +Index: gdb-6.8.50.20090803/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/linux-nat.c 2009-02-09 16:12:23.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/linux-nat.c 2009-02-09 16:15:30.000000000 +0100 -@@ -204,6 +204,9 @@ blocked. */ +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.c 2009-08-03 17:24:03.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.c 2009-08-03 17:27:23.000000000 +0200 +@@ -202,6 +202,9 @@ blocked. */ static struct target_ops *linux_ops; static struct target_ops linux_ops_saved; @@ -12,10 +12,10 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c /* The method to call, if any, when a new thread is attached. */ static void (*linux_nat_new_thread) (ptid_t); -@@ -902,7 +905,14 @@ linux_child_follow_fork (struct target_o - fork_save_infrun_state (fp, 0); +@@ -790,7 +793,14 @@ linux_child_follow_fork (struct target_o + linux_parent_pid = parent_pid; } - else + else if (detach_fork) - target_detach (NULL, 0); + { + /* We should check PID_WAS_STOPPED and detach it stopped accordingly. @@ -27,8 +27,8 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c + } inferior_ptid = ptid_build (child_pid, child_pid, 0); - -@@ -1229,6 +1239,7 @@ linux_nat_post_attach_wait (ptid_t ptid, + add_thread (inferior_ptid); +@@ -1231,6 +1241,7 @@ linux_nat_post_attach_wait (ptid_t ptid, if (debug_linux_nat) fprintf_unfiltered (gdb_stdlog, "LNPAW: Attaching to a stopped process\n"); @@ -36,7 +36,7 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c /* The process is definitely stopped. It is in a job control stop, unless the kernel predates the TASK_STOPPED / -@@ -1561,6 +1572,9 @@ GPT: lwp %s had signal %s, but it is in +@@ -1512,6 +1523,9 @@ GPT: lwp %s had signal %s, but it is in *status = lp->status; } @@ -46,7 +46,7 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c return 0; } -@@ -1671,6 +1685,8 @@ linux_nat_detach (struct target_ops *ops +@@ -1621,6 +1635,8 @@ linux_nat_detach (struct target_ops *ops } else linux_ops->to_detach (ops, args, from_tty); @@ -55,7 +55,7 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c } /* Resume LP. */ -@@ -1825,6 +1841,14 @@ linux_nat_resume (ptid_t ptid, int step_ +@@ -1774,6 +1790,14 @@ linux_nat_resume (struct target_ops *ops resume_callback. */ lp->stopped = 0; @@ -67,10 +67,10 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c + if (!step && lp && pid_was_stopped == GET_PID (lp->ptid)) + pid_was_stopped = 0; + - if (resume_all) - iterate_over_lwps (resume_callback, NULL); + if (resume_many) + iterate_over_lwps (ptid, resume_callback, NULL); -@@ -3316,6 +3340,8 @@ linux_nat_mourn_inferior (struct target_ +@@ -3322,6 +3346,8 @@ linux_nat_mourn_inferior (struct target_ there are other viable forks to debug. Delete the exiting one and context-switch to the first available. */ linux_fork_mourn_inferior (); @@ -79,10 +79,10 @@ Index: gdb-6.8.50.20090209/gdb/linux-nat.c } /* Convert a native/host siginfo object, into/from the siginfo in the -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/attach-stopped.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/attach-stopped.exp =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/testsuite/gdb.threads/attach-stopped.exp 2009-01-03 06:58:07.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/attach-stopped.exp 2009-02-09 16:12:41.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.threads/attach-stopped.exp 2009-01-03 06:58:07.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/attach-stopped.exp 2009-08-03 17:26:22.000000000 +0200 @@ -62,7 +62,65 @@ proc corefunc { threadtype } { gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} @@ -150,10 +150,10 @@ Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/attach-stopped.exp set test "$threadtype: attach2 to stopped, after setting file" gdb_test_multiple "attach $testpid" "$test" { -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/attachstop-mt.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/attachstop-mt.exp =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/testsuite/gdb.threads/attachstop-mt.exp 2009-01-03 06:58:07.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.threads/attachstop-mt.exp 2009-02-09 16:12:41.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.threads/attachstop-mt.exp 2009-01-03 06:58:07.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.threads/attachstop-mt.exp 2009-08-03 17:26:22.000000000 +0200 @@ -176,12 +176,23 @@ gdb_test "bt" ".*sleep.*(func|main).*" " # Exit and detach the process. gdb_exit diff --git a/gdb-6.8-bz254229-gcore-prpsinfo.patch b/gdb-6.8-bz254229-gcore-prpsinfo.patch index c2d79be..f22b052 100644 --- a/gdb-6.8-bz254229-gcore-prpsinfo.patch +++ b/gdb-6.8-bz254229-gcore-prpsinfo.patch @@ -1,8 +1,8 @@ -Index: gdb-6.8.50.20081209/bfd/elf-bfd.h +Index: gdb-6.8.50.20090803/bfd/elf-bfd.h =================================================================== ---- gdb-6.8.50.20081209.orig/bfd/elf-bfd.h 2008-12-03 15:50:57.000000000 +0100 -+++ gdb-6.8.50.20081209/bfd/elf-bfd.h 2008-12-10 01:35:08.000000000 +0100 -@@ -2154,7 +2154,7 @@ extern Elf_Internal_Phdr * _bfd_elf_find +--- gdb-6.8.50.20090803.orig/bfd/elf-bfd.h 2009-07-23 15:00:20.000000000 +0200 ++++ gdb-6.8.50.20090803/bfd/elf-bfd.h 2009-08-03 17:21:25.000000000 +0200 +@@ -2115,7 +2115,7 @@ extern Elf_Internal_Phdr * _bfd_elf_find extern char *elfcore_write_note (bfd *, char *, int *, const char *, int, const void *, int); extern char *elfcore_write_prpsinfo @@ -11,11 +11,11 @@ Index: gdb-6.8.50.20081209/bfd/elf-bfd.h extern char *elfcore_write_prstatus (bfd *, char *, int *, long, int, const void *); extern char * elfcore_write_pstatus -Index: gdb-6.8.50.20081209/bfd/elf.c +Index: gdb-6.8.50.20090803/bfd/elf.c =================================================================== ---- gdb-6.8.50.20081209.orig/bfd/elf.c 2008-12-03 15:50:57.000000000 +0100 -+++ gdb-6.8.50.20081209/bfd/elf.c 2008-12-10 01:35:08.000000000 +0100 -@@ -8345,6 +8345,7 @@ char * +--- gdb-6.8.50.20090803.orig/bfd/elf.c 2009-07-23 15:00:20.000000000 +0200 ++++ gdb-6.8.50.20090803/bfd/elf.c 2009-08-03 17:23:13.000000000 +0200 +@@ -8381,6 +8381,7 @@ char * elfcore_write_prpsinfo (bfd *abfd, char *buf, int *bufsiz, @@ -23,7 +23,7 @@ Index: gdb-6.8.50.20081209/bfd/elf.c const char *fname, const char *psargs) { -@@ -8371,9 +8372,15 @@ elfcore_write_prpsinfo (bfd *abfd, +@@ -8407,9 +8408,15 @@ elfcore_write_prpsinfo (bfd *abfd, int note_type = NT_PRPSINFO; #endif @@ -42,7 +42,7 @@ Index: gdb-6.8.50.20081209/bfd/elf.c return elfcore_write_note (abfd, buf, bufsiz, note_name, note_type, &data, sizeof (data)); } -@@ -8388,9 +8395,15 @@ elfcore_write_prpsinfo (bfd *abfd, +@@ -8424,9 +8431,15 @@ elfcore_write_prpsinfo (bfd *abfd, int note_type = NT_PRPSINFO; #endif @@ -61,19 +61,19 @@ Index: gdb-6.8.50.20081209/bfd/elf.c return elfcore_write_note (abfd, buf, bufsiz, note_name, note_type, &data, sizeof (data)); } -Index: gdb-6.8.50.20081209/gdb/amd64-linux-nat.c +Index: gdb-6.8.50.20090803/gdb/amd64-linux-nat.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/amd64-linux-nat.c 2008-12-10 01:28:28.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/amd64-linux-nat.c 2008-12-10 01:35:08.000000000 +0100 -@@ -139,6 +139,7 @@ static int amd64_linux_gregset32_reg_off +--- gdb-6.8.50.20090803.orig/gdb/amd64-linux-nat.c 2009-08-03 17:19:57.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/amd64-linux-nat.c 2009-08-03 17:21:25.000000000 +0200 +@@ -140,6 +140,7 @@ static int amd64_linux_gregset32_reg_off static char * amd64_linux_elfcore_write_prpsinfo (bfd *abfd, char *buf, int *bufsiz, + void *info, const char *fname, const char *psargs) { - if (gdbarch_ptr_bit(current_gdbarch) == 32) -@@ -148,14 +149,20 @@ amd64_linux_elfcore_write_prpsinfo (bfd + if (gdbarch_ptr_bit (target_gdbarch) == 32) +@@ -149,14 +150,20 @@ amd64_linux_elfcore_write_prpsinfo (bfd struct elf_prpsinfo32 data; note_type = NT_PRPSINFO; @@ -98,11 +98,11 @@ Index: gdb-6.8.50.20081209/gdb/amd64-linux-nat.c } static void -Index: gdb-6.8.50.20081209/gdb/fbsd-nat.c +Index: gdb-6.8.50.20090803/gdb/fbsd-nat.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/fbsd-nat.c 2008-10-28 16:22:12.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/fbsd-nat.c 2008-12-10 01:35:08.000000000 +0100 -@@ -210,6 +210,7 @@ fbsd_make_corefile_notes (bfd *obfd, int +--- gdb-6.8.50.20090803.orig/gdb/fbsd-nat.c 2009-07-02 19:21:06.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/fbsd-nat.c 2009-08-03 17:21:25.000000000 +0200 +@@ -211,6 +211,7 @@ fbsd_make_corefile_notes (bfd *obfd, int psargs = reconcat (psargs, psargs, " ", get_inferior_args (), NULL); note_data = elfcore_write_prpsinfo (obfd, note_data, note_size, @@ -110,19 +110,19 @@ Index: gdb-6.8.50.20081209/gdb/fbsd-nat.c fname, psargs); } -Index: gdb-6.8.50.20081209/gdb/linux-nat.c +Index: gdb-6.8.50.20090803/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/linux-nat.c 2008-12-10 01:28:14.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/linux-nat.c 2008-12-10 01:35:25.000000000 +0100 -@@ -53,6 +53,7 @@ - #include - #include "gdb_dirent.h" +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.c 2009-08-03 17:19:56.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.c 2009-08-03 17:24:03.000000000 +0200 +@@ -55,6 +55,7 @@ #include "xml-support.h" + #include "terminal.h" + #include +#include "gdb_procfs32.h" /* for struct elf_prpsinfo32 */ - #ifdef HAVE_PERSONALITY - # include -@@ -216,7 +217,7 @@ static LONGEST (*super_xfer_partial) (st + #ifndef SPUFS_MAGIC + #define SPUFS_MAGIC 0x23c9b64e +@@ -222,7 +223,7 @@ static LONGEST (*super_xfer_partial) (st /* This functions make elfcore note sections. They may get overriden by code adjusting data for multi-target builds. */ char *(*linux_elfcore_write_prpsinfo) @@ -131,8 +131,8 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c char *(*linux_elfcore_write_prstatus) (bfd *, char *, int *, long, int, const void *) = elfcore_write_prstatus; static char * -@@ -3614,6 +3615,159 @@ linux_nat_corefile_thread_callback (stru - return 0; +@@ -3840,6 +3841,159 @@ linux_spu_make_corefile_notes (bfd *obfd + return args.note_data; } +/* Should be always true for Linux */ @@ -242,7 +242,7 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c + +#if ULONG_MAX > 0xffffffffU + /* We skip this code on 32-bit gdb. */ -+ if (gdbarch_ptr_bit (current_gdbarch) == 64) ++ if (gdbarch_ptr_bit (target_gdbarch) == 64) + { + struct elf_prpsinfo *info = xzalloc (sizeof (*info)); + @@ -263,7 +263,7 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c + return info; + } +#endif -+ if (gdbarch_ptr_bit (current_gdbarch) == 32) ++ if (gdbarch_ptr_bit (target_gdbarch) == 32) + { + struct elf_prpsinfo32 *info = xzalloc (sizeof (*info)); + @@ -291,7 +291,7 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c /* Fills the "to_make_corefile_note" target vector. Builds the note section for a corefile, and returns it in a malloc buffer. */ -@@ -3633,8 +3787,14 @@ linux_nat_make_corefile_notes (bfd *obfd +@@ -3860,8 +4014,14 @@ linux_nat_make_corefile_notes (bfd *obfd if (get_exec_file (0)) { @@ -306,7 +306,7 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c if (get_inferior_args ()) { char *string_end; -@@ -3650,9 +3810,15 @@ linux_nat_make_corefile_notes (bfd *obfd +@@ -3877,9 +4037,15 @@ linux_nat_make_corefile_notes (bfd *obfd psargs_end - string_end); } } @@ -324,11 +324,11 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.c } /* Dump information for threads. */ -Index: gdb-6.8.50.20081209/gdb/linux-nat.h +Index: gdb-6.8.50.20090803/gdb/linux-nat.h =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/linux-nat.h 2008-12-10 01:27:33.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/linux-nat.h 2008-12-10 01:35:08.000000000 +0100 -@@ -138,7 +138,7 @@ struct siginfo *linux_nat_get_siginfo (p +--- gdb-6.8.50.20090803.orig/gdb/linux-nat.h 2009-08-03 17:19:56.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/linux-nat.h 2009-08-03 17:21:25.000000000 +0200 +@@ -148,7 +148,7 @@ struct siginfo *linux_nat_get_siginfo (p /* These functions make elfcore note sections. They may get overriden by code adjusting data for multi-target builds. */ extern char *(*linux_elfcore_write_prpsinfo) @@ -337,11 +337,11 @@ Index: gdb-6.8.50.20081209/gdb/linux-nat.h extern char *(*linux_elfcore_write_prstatus) (bfd *, char *, int *, long, int, const void *); extern char *(*linux_elfcore_write_prfpreg) -Index: gdb-6.8.50.20081209/gdb/procfs.c +Index: gdb-6.8.50.20090803/gdb/procfs.c =================================================================== ---- gdb-6.8.50.20081209.orig/gdb/procfs.c 2008-11-09 12:27:17.000000000 +0100 -+++ gdb-6.8.50.20081209/gdb/procfs.c 2008-12-10 01:35:08.000000000 +0100 -@@ -6181,6 +6181,7 @@ procfs_make_note_section (bfd *obfd, int +--- gdb-6.8.50.20090803.orig/gdb/procfs.c 2009-08-01 02:02:04.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/procfs.c 2009-08-03 17:21:25.000000000 +0200 +@@ -6147,6 +6147,7 @@ procfs_make_note_section (bfd *obfd, int note_data = (char *) elfcore_write_prpsinfo (obfd, note_data, note_size, diff --git a/gdb-6.8-bz436037-reg-no-longer-active.patch b/gdb-6.8-bz436037-reg-no-longer-active.patch index e03d45b..4987714 100644 --- a/gdb-6.8-bz436037-reg-no-longer-active.patch +++ b/gdb-6.8-bz436037-reg-no-longer-active.patch @@ -1,8 +1,9 @@ -diff -d -urpN src.0/gdb/valops.c src.1/gdb/valops.c ---- src.0/gdb/valops.c 2008-07-27 04:00:03.000000000 +0200 -+++ src.1/gdb/valops.c 2008-07-31 15:17:42.000000000 +0200 -@@ -813,10 +813,18 @@ value_assign (struct value *toval, struc - struct frame_info *frame; +Index: gdb-6.8.50.20090803/gdb/valops.c +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/valops.c 2009-08-04 06:30:45.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/valops.c 2009-08-04 06:33:05.000000000 +0200 +@@ -926,10 +926,18 @@ value_assign (struct value *toval, struc + struct gdbarch *gdbarch; int value_reg; - /* Figure out which frame this is in currently. */ @@ -21,4 +22,4 @@ diff -d -urpN src.0/gdb/valops.c src.1/gdb/valops.c + /* Probably never happens. */ if (!frame) error (_("Value being assigned to is no longer active.")); - + diff --git a/gdb-6.8-bz457187-largefile.patch b/gdb-6.8-bz457187-largefile.patch index 6e297d7..8ffc120 100644 --- a/gdb-6.8-bz457187-largefile.patch +++ b/gdb-6.8-bz457187-largefile.patch @@ -5,9 +5,10 @@ gdb/ * config.in: Regenerate. * configure: Regenerate. -diff -up -rup gdb-orig/configure.ac gdb/configure.ac ---- ./gdb-orig/configure.ac 2009-03-02 23:39:01.000000000 +0100 -+++ ./gdb/configure.ac 2009-03-02 23:40:46.000000000 +0100 +Index: gdb-6.8.50.20090803/gdb/configure.ac +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/configure.ac 2009-08-04 06:32:39.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/configure.ac 2009-08-04 06:33:51.000000000 +0200 @@ -30,6 +30,7 @@ AC_GNU_SOURCE AC_AIX AC_ISC_POSIX @@ -16,10 +17,11 @@ diff -up -rup gdb-orig/configure.ac gdb/configure.ac AM_PROG_CC_STDC AC_CONFIG_AUX_DIR(..) -diff -up -rup gdb-orig/config.in gdb/config.in ---- ./gdb-orig/config.in 2009-03-02 23:39:01.000000000 +0100 -+++ ./gdb/config.in 2009-03-02 23:40:53.000000000 +0100 -@@ -725,6 +725,9 @@ +Index: gdb-6.8.50.20090803/gdb/config.in +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/config.in 2009-08-04 06:32:39.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/config.in 2009-08-04 06:33:51.000000000 +0200 +@@ -744,6 +744,9 @@ # undef _ALL_SOURCE #endif @@ -29,7 +31,7 @@ diff -up -rup gdb-orig/config.in gdb/config.in /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE -@@ -734,6 +737,9 @@ +@@ -753,6 +756,9 @@ problem on IRIX 5. */ #undef _KMEMUSER @@ -39,18 +41,19 @@ diff -up -rup gdb-orig/config.in gdb/config.in /* Define to 1 if on MINIX. */ #undef _MINIX -diff -up -rup gdb-orig/configure gdb/configure ---- ./gdb-orig/configure 2009-03-02 23:39:01.000000000 +0100 -+++ ./gdb/configure 2009-03-02 23:40:49.000000000 +0100 -@@ -862,6 +862,7 @@ Optional Features: +Index: gdb-6.8.50.20090803/gdb/configure +=================================================================== +--- gdb-6.8.50.20090803.orig/gdb/configure 2009-08-04 06:32:39.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/configure 2009-08-04 06:33:51.000000000 +0200 +@@ -874,6 +874,7 @@ Optional Features: --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer + --disable-largefile omit support for large files --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors - --enable-targets alternative target configurations -@@ -3313,6 +3314,370 @@ _ACEOF + --enable-targets=TARGETS +@@ -3347,6 +3348,370 @@ _ACEOF diff --git a/gdb-6.8-bz466901-backtrace-full-prelinked.patch b/gdb-6.8-bz466901-backtrace-full-prelinked.patch index 9a96ac8..f0fca32 100644 --- a/gdb-6.8-bz466901-backtrace-full-prelinked.patch +++ b/gdb-6.8-bz466901-backtrace-full-prelinked.patch @@ -1,10 +1,10 @@ Fix resolving of variables at locations lists in prelinked libs (BZ 466901). -Index: gdb-6.8.50.20081128/gdb/dwarf2loc.c +Index: gdb-6.8.50.20090803/gdb/dwarf2loc.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/dwarf2loc.c 2008-12-08 11:00:45.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/dwarf2loc.c 2008-12-08 18:02:49.000000000 +0100 -@@ -55,7 +55,9 @@ find_location_expression (struct dwarf2_ +--- gdb-6.8.50.20090803.orig/gdb/dwarf2loc.c 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/dwarf2loc.c 2009-08-04 06:33:35.000000000 +0200 +@@ -56,7 +56,9 @@ find_location_expression (struct dwarf2_ CORE_ADDR low, high; gdb_byte *loc_ptr, *buf_end; int length; @@ -13,12 +13,12 @@ Index: gdb-6.8.50.20081128/gdb/dwarf2loc.c + struct objfile *objfile = objfile1->separate_debug_objfile + ? objfile1->separate_debug_objfile : objfile1; struct gdbarch *gdbarch = get_objfile_arch (objfile); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu); - CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1)); -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked.exp 2008-12-08 18:00:43.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked.exp 2009-08-04 06:33:35.000000000 +0200 @@ -0,0 +1,102 @@ +# Copyright 2008 Free Software Foundation, Inc. + @@ -122,10 +122,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked.exp + +# `abort' can get expressed as `*__GI_abort'. +gdb_test "bt full" "in \[^ \]*abort \\(.*in func \\(.*\r\n\[\t \]+i = -?\[0-9\].*in main \\(.*" "Backtrace after abort()" -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-main.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-main.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-main.c 2008-12-08 18:00:43.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-main.c 2009-08-04 06:33:35.000000000 +0200 @@ -0,0 +1,26 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -153,10 +153,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-main.c + func (); + return 0; +} -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-func.S +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-func.S =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-func.S 2008-12-08 18:00:43.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.dwarf2/dw2-loclist-prelinked-func.S 2009-08-04 06:33:35.000000000 +0200 @@ -0,0 +1,328 @@ +/* This testcase is part of GDB, the GNU debugger. + diff --git a/gdb-6.8-constant-watchpoints.patch b/gdb-6.8-constant-watchpoints.patch index baa242b..df29d8d 100644 --- a/gdb-6.8-constant-watchpoints.patch +++ b/gdb-6.8-constant-watchpoints.patch @@ -18,11 +18,11 @@ gdb.base/watchpoint.c (global_ptr_ptr): New variable. (func4): New testing code for GLOBAL_PTR_PTR. -Index: gdb-6.8.50.20090209/gdb/breakpoint.c +Index: gdb-6.8.50.20090803/gdb/breakpoint.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/breakpoint.c 2009-02-09 15:39:01.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/breakpoint.c 2009-02-09 16:04:10.000000000 +0100 -@@ -769,7 +769,15 @@ is_hardware_watchpoint (struct breakpoin +--- gdb-6.8.50.20090803.orig/gdb/breakpoint.c 2009-08-04 06:29:47.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/breakpoint.c 2009-08-04 06:32:50.000000000 +0200 +@@ -823,7 +823,15 @@ is_hardware_watchpoint (struct breakpoin If VAL_CHAIN is non-NULL, *VAL_CHAIN will be released from the value chain. The caller must free the values individually. If VAL_CHAIN is NULL, all generated values will be left on the value @@ -39,16 +39,16 @@ Index: gdb-6.8.50.20090209/gdb/breakpoint.c static void fetch_watchpoint_value (struct expression *exp, struct value **valp, -@@ -5862,7 +5870,7 @@ watch_command_1 (char *arg, int accessfl +@@ -6301,7 +6309,7 @@ watch_command_1 (char *arg, int accessfl struct symtab_and_line sal; struct expression *exp; struct block *exp_valid_block; - struct value *val, *mark; + struct value *val, *mark, *val_chain; struct frame_info *frame; - struct frame_info *prev_frame = NULL; char *exp_start = NULL; -@@ -5954,6 +5962,27 @@ watch_command_1 (char *arg, int accessfl + char *exp_end = NULL; +@@ -6392,6 +6400,27 @@ watch_command_1 (char *arg, int accessfl exp_valid_block = innermost_block; mark = value_mark (); fetch_watchpoint_value (exp, &val, NULL, NULL); @@ -76,11 +76,11 @@ Index: gdb-6.8.50.20090209/gdb/breakpoint.c if (val != NULL) release_value (val); -Index: gdb-6.8.50.20090209/gdb/gdbtypes.h +Index: gdb-6.8.50.20090803/gdb/gdbtypes.h =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/gdbtypes.h 2009-02-09 15:51:57.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/gdbtypes.h 2009-02-09 16:04:10.000000000 +0100 -@@ -70,7 +70,22 @@ enum type_code +--- gdb-6.8.50.20090803.orig/gdb/gdbtypes.h 2009-08-04 06:31:58.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/gdbtypes.h 2009-08-04 06:32:50.000000000 +0200 +@@ -71,7 +71,22 @@ enum type_code TYPE_CODE_UNION, /* C union or Pascal variant part */ TYPE_CODE_ENUM, /* Enumeration type */ TYPE_CODE_FLAGS, /* Bit flags type */ @@ -104,11 +104,11 @@ Index: gdb-6.8.50.20090209/gdb/gdbtypes.h TYPE_CODE_INT, /* Integer type */ /* Floating type. This is *NOT* a complex type. Beware, there are parts -Index: gdb-6.8.50.20090209/gdb/doc/gdb.texinfo +Index: gdb-6.8.50.20090803/gdb/doc/gdb.texinfo =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/doc/gdb.texinfo 2009-02-09 16:02:42.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/doc/gdb.texinfo 2009-02-09 16:04:10.000000000 +0100 -@@ -3480,6 +3480,18 @@ This command prints a list of watchpoint +--- gdb-6.8.50.20090803.orig/gdb/doc/gdb.texinfo 2009-08-04 06:32:39.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/doc/gdb.texinfo 2009-08-04 06:32:50.000000000 +0200 +@@ -3517,6 +3517,18 @@ This command prints a list of watchpoint it is the same as @code{info break} (@pxref{Set Breaks}). @end table @@ -127,10 +127,10 @@ Index: gdb-6.8.50.20090209/gdb/doc/gdb.texinfo @value{GDBN} sets a @dfn{hardware watchpoint} if possible. Hardware watchpoints execute very quickly, and the debugger reports a change in value at the exact instruction where the change occurs. If @value{GDBN} -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.base/watchpoint.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.base/watchpoint.c =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/testsuite/gdb.base/watchpoint.c 2008-03-03 14:24:12.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.base/watchpoint.c 2009-02-09 16:04:10.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.base/watchpoint.c 2008-03-03 14:24:12.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.base/watchpoint.c 2009-08-04 06:32:50.000000000 +0200 @@ -40,6 +40,7 @@ struct foo struct1, struct2, *ptr1, *ptr int doread = 0; @@ -150,10 +150,10 @@ Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.base/watchpoint.c } int main () -Index: gdb-6.8.50.20090209/gdb/testsuite/gdb.base/watchpoint.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.base/watchpoint.exp =================================================================== ---- gdb-6.8.50.20090209.orig/gdb/testsuite/gdb.base/watchpoint.exp 2009-01-03 06:58:03.000000000 +0100 -+++ gdb-6.8.50.20090209/gdb/testsuite/gdb.base/watchpoint.exp 2009-02-09 16:05:03.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.base/watchpoint.exp 2009-01-03 06:58:03.000000000 +0100 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.base/watchpoint.exp 2009-08-04 06:32:50.000000000 +0200 @@ -641,7 +641,21 @@ proc test_watchpoint_and_breakpoint {} { } } diff --git a/gdb-6.8-ctors-dtors-unique.patch b/gdb-6.8-ctors-dtors-unique.patch deleted file mode 100644 index 21e8729..0000000 --- a/gdb-6.8-ctors-dtors-unique.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- ./gdb/linespec.c 2008-08-27 00:27:33.000000000 +0200 -+++ ./gdb/linespec.c 2008-08-27 00:53:16.000000000 +0200 -@@ -284,6 +284,15 @@ find_methods (struct type *t, char *name - } - - static int -+add_minsym_members_compar (const void *ap, const void *bp) -+{ -+ const char *a = *(const char **) ap; -+ const char *b = *(const char **) bp; -+ -+ return strcmp (a, b); -+} -+ -+static int - add_minsym_members (const char *class_name, - const char *member_name, - struct minimal_symbol **msym_arr) -@@ -293,6 +302,7 @@ add_minsym_members (const char *class_na - int i; - int comp_len; - int counter = 0; -+ int src_i, dst_i; - - /* To find the member, we first cheat and use symbol completion. - This will give us a list of all the member names including -@@ -307,6 +317,28 @@ add_minsym_members (const char *class_na - strcat (completion_name, "("); - list = make_symbol_completion_list (completion_name, - completion_name+1); -+ if (list == NULL || list[0] == NULL) -+ { -+ xfree (completion_name); -+ return 0; -+ } -+ -+ /* Make the list entries unique - Multi-PC breakpoints are already resolved -+ by GDB-6.8+. */ -+ counter = 0; -+ while (list && list[counter] != NULL) -+ counter++; -+ qsort (list, counter, sizeof (*list), add_minsym_members_compar); -+ src_i = dst_i = 0; -+ while (src_i + 1 < counter) -+ { -+ if (strcmp (list[src_i], list[src_i + 1]) != 0) -+ list[dst_i++] = list[src_i]; -+ src_i++; -+ } -+ list[dst_i++] = list[src_i++]; -+ gdb_assert (list[src_i] == NULL); -+ list[dst_i] = 0; - - /* Now that we have the list, we generate an array of their - corresponding minimal symbols. */ -@@ -319,6 +351,8 @@ add_minsym_members (const char *class_na - - xfree (list); - -+#if 0 /* Multi-PC breakpoints are already resolved by GDB-6.8+. */ -+ - /* In the case of constructors, there may be in-charge vs not-in-charge - constructors. Check for names with $base which indicates not-in-charge - constructors. */ -@@ -353,6 +387,8 @@ add_minsym_members (const char *class_na - } - xfree (list); - -+#endif /* Multi-PC breakpoints are already resolved by GDB-6.8+. */ -+ - xfree (completion_name); - - return counter; diff --git a/gdb-6.8-fortran-tag-constant.patch b/gdb-6.8-fortran-tag-constant.patch index 408e02b..8614395 100644 --- a/gdb-6.8-fortran-tag-constant.patch +++ b/gdb-6.8-fortran-tag-constant.patch @@ -1,8 +1,8 @@ -Index: gdb-6.8.50.20090302/gdb/dwarf2read.c +Index: gdb-6.8.50.20090803/gdb/dwarf2read.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/dwarf2read.c 2009-05-09 20:04:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/dwarf2read.c 2009-05-09 20:04:56.000000000 +0200 -@@ -2029,6 +2029,7 @@ scan_partial_symbols (struct partial_die +--- gdb-6.8.50.20090803.orig/gdb/dwarf2read.c 2009-08-04 06:32:58.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/dwarf2read.c 2009-08-04 06:33:18.000000000 +0200 +@@ -2459,6 +2459,7 @@ scan_partial_symbols (struct partial_die add_partial_subprogram (pdi, lowpc, highpc, need_pc, cu); break; case DW_TAG_variable: @@ -10,7 +10,7 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c case DW_TAG_typedef: case DW_TAG_union_type: if (!pdi->is_declaration) -@@ -2244,6 +2245,7 @@ add_partial_symbol (struct partial_die_i +@@ -2654,6 +2655,7 @@ add_partial_symbol (struct partial_die_i } break; case DW_TAG_variable: @@ -18,7 +18,7 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c if (pdi->is_external) { /* Global Variable. -@@ -4272,7 +4274,8 @@ dwarf2_add_field (struct field_info *fip +@@ -4790,7 +4792,8 @@ dwarf2_add_field (struct field_info *fip fip->non_public_fields = 1; } } @@ -28,7 +28,7 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c { /* C++ static member. */ -@@ -4762,7 +4765,8 @@ read_structure_type (struct die_info *di +@@ -5297,7 +5300,8 @@ read_structure_type (struct die_info *di while (child_die && child_die->tag) { if (child_die->tag == DW_TAG_member @@ -38,7 +38,7 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c { /* NOTE: carlton/2002-11-05: A C++ static data member should be a DW_TAG_member that is a declaration, but -@@ -4881,6 +4885,7 @@ process_structure_scope (struct die_info +@@ -5416,6 +5420,7 @@ process_structure_scope (struct die_info { if (child_die->tag == DW_TAG_member || child_die->tag == DW_TAG_variable @@ -46,15 +46,15 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c || child_die->tag == DW_TAG_inheritance) { /* Do nothing. */ -@@ -6656,6 +6661,7 @@ load_partial_dies (bfd *abfd, gdb_byte * +@@ -6926,6 +6931,7 @@ load_partial_dies (bfd *abfd, gdb_byte * && abbrev->tag != DW_TAG_subprogram && abbrev->tag != DW_TAG_lexical_block && abbrev->tag != DW_TAG_variable + && abbrev->tag != DW_TAG_constant && abbrev->tag != DW_TAG_namespace - && abbrev->tag != DW_TAG_module && abbrev->tag != DW_TAG_member) -@@ -6764,6 +6770,7 @@ load_partial_dies (bfd *abfd, gdb_byte * + { +@@ -7033,6 +7039,7 @@ load_partial_dies (bfd *abfd, gdb_byte * if (load_all || abbrev->tag == DW_TAG_subprogram || abbrev->tag == DW_TAG_variable @@ -62,7 +62,7 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c || abbrev->tag == DW_TAG_namespace || part_die->is_declaration) { -@@ -8549,6 +8556,11 @@ new_symbol (struct die_info *die, struct +@@ -8840,6 +8847,11 @@ new_symbol (struct die_info *die, struct /* Do not add the symbol to any lists. It will be found via BLOCK_FUNCTION from the blockvector. */ break; diff --git a/gdb-6.8-inlining-addon.patch b/gdb-6.8-inlining-addon.patch index c2af6ff..72d2142 100644 --- a/gdb-6.8-inlining-addon.patch +++ b/gdb-6.8-inlining-addon.patch @@ -5,10 +5,10 @@ causing: FAIL: gdb.base/unwindonsignal.exp: unwindonsignal, stack unwound resume() -> target_resume() move of clear_inline_frame_state() is for: gdb.mi/mi-nsmoribund.exp -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-bt.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-bt.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.c 2009-03-25 22:34:02.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.opt/inline-bt.c 2009-06-28 02:20:24.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-bt.c 2009-08-03 16:57:40.000000000 +0200 @@ -13,10 +13,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -28,42 +28,10 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.c inline int func1(void) { -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-cmds.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-bt.exp 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.exp 2009-03-25 22:34:02.000000000 +0100 -@@ -41,18 +41,19 @@ if { [skip_inline_frame_tests] } { - return - } - --set line1 [gdb_get_line_number "set breakpoint 1 here" ${fullsrcfile2}] --gdb_breakpoint $srcfile2:$line1 -+set line1 [gdb_get_line_number "set breakpoint 1 here" ${srcfile}] -+gdb_breakpoint $srcfile:$line1 - - gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)" - gdb_test "backtrace" "#0 bar.*#1 .*main.*" "backtrace from bar (1)" --gdb_test "info frame" ".*called by frame.*" "bar not inlined" -+gdb_test "info frame" ".*inlined into frame.*" "bar inlined" - --gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)" --gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*main.*" \ -- "backtrace from bar (2)" --gdb_test "up" "#1 .*func1.*" "up from bar (2)" --gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)" -+# gcc-4.3.1 omits the line number information for (2). -+#gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)" -+#gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*main.*" \ -+# "backtrace from bar (2)" -+#gdb_test "up" "#1 .*func1.*" "up from bar (2)" -+#gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)" - - gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (3)" - gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*func2.*#3 .*main.*" \ -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-cmds.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.c 2009-03-25 22:34:02.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.opt/inline-cmds.c 2009-06-28 02:20:24.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-cmds.c 2009-08-03 16:57:40.000000000 +0200 @@ -13,13 +13,19 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -86,49 +54,11 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.c inline int func1(void) { bar (); -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-cmds.exp =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-cmds.exp 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp 2009-03-25 22:34:02.000000000 +0100 -@@ -45,28 +45,28 @@ if { [skip_inline_frame_tests] } { - - # First, check that the things we expected to be inlined really were, - # and those that shouldn't be weren't. --set line1 [gdb_get_line_number "set breakpoint 1 here" ${fullsrcfile2}] -+set line1 [gdb_get_line_number "set breakpoint 1 here" ${srcfile2}] - gdb_breakpoint $srcfile2:$line1 --set line2 [gdb_get_line_number "set breakpoint 2 here" ${fullsrcfile2}] -+set line2 [gdb_get_line_number "set breakpoint 2 here" ${srcfile2}] - gdb_breakpoint $srcfile2:$line2 - --gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)" -+gdb_test "continue" "set breakpoint 1 here.*" "continue to bar (1)" - gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*main.*" \ - "backtrace from bar (1)" - gdb_test "up" "#1 .*func1.*" "up from bar (1)" --gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (1)" -+gdb_test "info frame" "inlined into frame.*" "func1 inlined (1)" - --gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)" -+gdb_test "continue" "set breakpoint 1 here.*" "continue to bar (2)" - gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*func2.*#3 .*main.*" \ - "backtrace from bar (2)" - gdb_test "up" "#1 .*func1.*" "up from bar (2)" --gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)" -+gdb_test "info frame" "inlined into frame.*" "func1 inlined (2)" - gdb_test "up" "#2 .*func2.*" "up from func1 (2)" --gdb_test "info frame" ".*inlined into frame.*" "func2 inlined (2)" -+gdb_test "info frame" "inlined into frame.*" "func2 inlined (2)" - --gdb_test "continue" ".*set breakpoint 2 here.*" "continue to marker" -+gdb_test "continue" "set breakpoint 2 here.*" "continue to marker" - gdb_test "backtrace" "#0 marker.*#1 .*main.*" "backtrace from marker" --gdb_test "info frame" ".*called by frame.*" "marker not inlined" -+gdb_test "info frame" "\n called by frame.*" "marker not inlined" - - # Next, check that we can next over inlined functions. We should not end up - # inside any of them. -@@ -201,7 +201,7 @@ set line3 [gdb_get_line_number "set brea +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.opt/inline-cmds.exp 2009-06-28 02:20:24.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-cmds.exp 2009-08-03 16:57:40.000000000 +0200 +@@ -230,7 +230,7 @@ set line3 [gdb_get_line_number "set brea gdb_breakpoint $line3 gdb_continue_to_breakpoint "consecutive func1" @@ -137,7 +67,7 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp set msg "next to second func1" gdb_test_multiple "next" $msg { -re ".*func1 .*second call.*$gdb_prompt $" { -@@ -224,16 +224,16 @@ set line4 [gdb_get_line_number "set brea +@@ -253,16 +253,16 @@ set line4 [gdb_get_line_number "set brea gdb_breakpoint $line4 gdb_continue_to_breakpoint "func1 then func3" @@ -158,7 +88,7 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp gdb_test "finish" "func1 \\\(\\\);" "finish from marker to func1" gdb_test "step" "bar \\\(\\\);" "step into func1 for finish" -@@ -268,12 +268,12 @@ gdb_test "step" "noinline \\\(\\\) at .* +@@ -297,12 +297,12 @@ gdb_test "step" "noinline \\\(\\\) at .* gdb_test "bt" "#0 noinline.*#1 .*outer_inline1.*#2 .*outer_inline2.*#3 main.*" "backtrace at noinline from outer_inline1" gdb_test "step" "inlined_fn \\\(\\\) at .*" "enter inlined_fn from noinline" gdb_test "bt" "#0 inlined_fn.*#1 noinline.*#2 .*outer_inline1.*#3 .*outer_inline2.*#4 main.*" "backtrace at inlined_fn from noinline" @@ -180,10 +110,10 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp +gdb_test "info frame" "inlined into frame.*" "outer_inline2 inlined" +gdb_test "fini" "" "up from outer_inline2" +gdb_test "info frame" " in main \[^\n\]*\n source language.*" "main not inlined" -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-locals.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-locals.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.c 2009-03-25 22:34:02.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.opt/inline-locals.c 2009-06-28 02:20:24.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-locals.c 2009-08-03 16:57:40.000000000 +0200 @@ -13,11 +13,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -203,21 +133,10 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.c inline int func1(int arg1) { -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.exp +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-locals.exp =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-locals.exp 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.exp 2009-03-25 22:34:02.000000000 +0100 -@@ -43,8 +43,8 @@ if { [skip_inline_var_tests] } { - - set no_frames [skip_inline_frame_tests] - --set line1 [gdb_get_line_number "set breakpoint 1 here" ${fullsrcfile2}] --gdb_breakpoint $srcfile2:$line1 -+set line1 [gdb_get_line_number "set breakpoint 1 here" ${srcfile}] -+gdb_breakpoint $srcfile:$line1 - - gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)" - +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.opt/inline-locals.exp 2009-06-30 17:50:27.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-locals.exp 2009-08-03 16:57:40.000000000 +0200 @@ -77,6 +77,9 @@ if { ! $no_frames } { # Make sure that locals on the stack are found. This is an array to @@ -236,11 +155,11 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.exp + setup_kfail *-*-* "gcc/debug.optimization" +} gdb_test "print array\[0\]" "\\\$$decimal = 184" "print local (3)" -Index: gdb-6.8.50.20090302/gdb/frame.c +Index: gdb-6.8.50.20090803/gdb/frame.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/frame.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/frame.c 2009-03-25 22:34:02.000000000 +0100 -@@ -269,7 +269,7 @@ fprint_frame (struct ui_file *file, stru +--- gdb-6.8.50.20090803.orig/gdb/frame.c 2009-08-03 15:56:08.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/frame.c 2009-08-03 16:57:40.000000000 +0200 +@@ -276,7 +276,7 @@ fprint_frame (struct ui_file *file, stru static struct frame_info * skip_inlined_frames (struct frame_info *frame) { @@ -249,7 +168,7 @@ Index: gdb-6.8.50.20090302/gdb/frame.c frame = get_prev_frame (frame); return frame; -@@ -1670,6 +1670,7 @@ get_frame_address_in_block (struct frame +@@ -1715,6 +1715,7 @@ get_frame_address_in_block (struct frame { /* A draft address. */ CORE_ADDR pc = get_frame_pc (this_frame); @@ -257,7 +176,7 @@ Index: gdb-6.8.50.20090302/gdb/frame.c struct frame_info *next_frame = this_frame->next; -@@ -1712,6 +1713,9 @@ get_frame_address_in_block (struct frame +@@ -1757,6 +1758,9 @@ get_frame_address_in_block (struct frame while in an inlined function, then the code address of the "calling" normal function should not be adjusted either. */ @@ -267,7 +186,7 @@ Index: gdb-6.8.50.20090302/gdb/frame.c while (get_frame_type (next_frame) == INLINE_FRAME) next_frame = next_frame->next; -@@ -1743,7 +1747,7 @@ find_frame_sal (struct frame_info *frame +@@ -1788,7 +1792,7 @@ find_frame_sal (struct frame_info *frame sym = inline_skipped_symbol (inferior_ptid); init_sal (sal); @@ -276,19 +195,19 @@ Index: gdb-6.8.50.20090302/gdb/frame.c { sal->symtab = SYMBOL_SYMTAB (sym); sal->line = SYMBOL_LINE (sym); -Index: gdb-6.8.50.20090302/gdb/breakpoint.c +Index: gdb-6.8.50.20090803/gdb/breakpoint.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/breakpoint.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/breakpoint.c 2009-03-25 22:34:02.000000000 +0100 -@@ -57,6 +57,7 @@ - #include "top.h" +--- gdb-6.8.50.20090803.orig/gdb/breakpoint.c 2009-08-03 16:56:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/breakpoint.c 2009-08-03 17:19:24.000000000 +0200 +@@ -60,6 +60,7 @@ #include "wrapper.h" #include "valprint.h" + #include "parser-defs.h" +#include "inline-frame.h" - #include "mi/mi-common.h" - -@@ -2902,10 +2903,24 @@ bpstat_check_breakpoint_conditions (bpst + /* readline include files */ + #include "readline/readline.h" +@@ -3065,10 +3066,24 @@ bpstat_check_breakpoint_conditions (bpst const struct bp_location *bl = bs->breakpoint_at; struct breakpoint *b = bl->owner; @@ -317,7 +236,7 @@ Index: gdb-6.8.50.20090302/gdb/breakpoint.c { int value_is_zero = 0; -@@ -3044,6 +3059,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p +@@ -3215,6 +3230,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p bs->print = 0; } bs->commands = copy_command_lines (bs->commands); @@ -330,7 +249,7 @@ Index: gdb-6.8.50.20090302/gdb/breakpoint.c } /* Print nothing for this entry if we dont stop or if we dont print. */ -@@ -5169,9 +5190,9 @@ set_momentary_breakpoint (struct symtab_ +@@ -5164,9 +5185,9 @@ set_momentary_breakpoint (struct gdbarch { struct breakpoint *b; @@ -341,13 +260,13 @@ Index: gdb-6.8.50.20090302/gdb/breakpoint.c + shortcut the case of returning _from_ an inline frame we still may be + returning from non-inlined frame _to_ an inlined frame. */ - b = set_raw_breakpoint (sal, type); + b = set_raw_breakpoint (gdbarch, sal, type); b->enable_state = bp_enabled; -Index: gdb-6.8.50.20090302/gdb/inline-frame.c +Index: gdb-6.8.50.20090803/gdb/inline-frame.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/inline-frame.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/inline-frame.c 2009-03-25 22:34:02.000000000 +0100 -@@ -183,6 +183,12 @@ inline_frame_sniffer (const struct frame +--- gdb-6.8.50.20090803.orig/gdb/inline-frame.c 2009-06-28 02:20:22.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/inline-frame.c 2009-08-03 16:57:40.000000000 +0200 +@@ -195,6 +195,12 @@ inline_frame_sniffer (const struct frame if (frame_block == NULL) return 0; @@ -360,7 +279,7 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.c /* Calculate DEPTH, the number of inlined functions at this location. */ depth = 0; -@@ -192,6 +198,10 @@ inline_frame_sniffer (const struct frame +@@ -204,6 +210,10 @@ inline_frame_sniffer (const struct frame if (block_inlined_p (cur_block)) depth++; @@ -371,7 +290,7 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.c cur_block = BLOCK_SUPERBLOCK (cur_block); } -@@ -275,7 +285,6 @@ skip_inline_frames (ptid_t ptid) +@@ -287,7 +297,6 @@ skip_inline_frames (ptid_t ptid) { CORE_ADDR this_pc; struct block *frame_block, *cur_block; @@ -379,7 +298,7 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.c int skip_count = 0; struct inline_state *state; -@@ -296,10 +305,7 @@ skip_inline_frames (ptid_t ptid) +@@ -308,10 +317,7 @@ skip_inline_frames (ptid_t ptid) of BLOCK_START. */ if (BLOCK_START (cur_block) == this_pc || block_starting_point_at (this_pc, cur_block)) @@ -391,7 +310,7 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.c else break; } -@@ -311,7 +317,6 @@ skip_inline_frames (ptid_t ptid) +@@ -323,7 +329,6 @@ skip_inline_frames (ptid_t ptid) state = allocate_inline_frame_state (ptid); state->skipped_frames = skip_count; state->saved_pc = this_pc; @@ -399,7 +318,7 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.c if (skip_count != 0) reinit_frame_cache (); -@@ -329,6 +334,23 @@ step_into_inline_frame (ptid_t ptid) +@@ -341,6 +346,23 @@ step_into_inline_frame (ptid_t ptid) reinit_frame_cache (); } @@ -423,10 +342,10 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.c /* Return the number of hidden functions inlined into the current frame. */ -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-markers.c +Index: gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-markers.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/inline-markers.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-markers.c 2009-03-25 22:34:02.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/testsuite/gdb.opt/inline-markers.c 2009-06-28 02:20:24.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/testsuite/gdb.opt/inline-markers.c 2009-08-03 16:57:40.000000000 +0200 @@ -15,11 +15,6 @@ extern int x, y; @@ -439,11 +358,11 @@ Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-markers.c void marker(void) { x += y; /* set breakpoint 2 here */ -Index: gdb-6.8.50.20090302/gdb/gdbthread.h +Index: gdb-6.8.50.20090803/gdb/gdbthread.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/gdbthread.h 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/gdbthread.h 2009-03-25 22:34:02.000000000 +0100 -@@ -180,6 +180,12 @@ struct thread_info +--- gdb-6.8.50.20090803.orig/gdb/gdbthread.h 2009-08-03 15:55:53.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/gdbthread.h 2009-08-03 16:57:40.000000000 +0200 +@@ -187,6 +187,12 @@ struct thread_info /* Private data used by the target vector implementation. */ struct private_thread_info *private; @@ -456,11 +375,11 @@ Index: gdb-6.8.50.20090302/gdb/gdbthread.h }; /* Create an empty thread list, or empty the existing one. */ -Index: gdb-6.8.50.20090302/gdb/infcmd.c +Index: gdb-6.8.50.20090803/gdb/infcmd.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infcmd.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/infcmd.c 2009-03-25 22:34:02.000000000 +0100 -@@ -1391,11 +1391,11 @@ finish_command_continuation (void *arg) +--- gdb-6.8.50.20090803.orig/gdb/infcmd.c 2009-07-02 23:57:27.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/infcmd.c 2009-08-03 17:17:24.000000000 +0200 +@@ -1408,11 +1408,11 @@ finish_command_continuation (void *arg) struct type *value_type; value_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (a->function)); @@ -474,7 +393,7 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c print_return_value (SYMBOL_TYPE (a->function), value_type); } -@@ -1499,6 +1499,16 @@ finish_forward (struct symbol *function, +@@ -1514,6 +1514,16 @@ finish_forward (struct symbol *function, old_chain = make_cleanup_delete_breakpoint (breakpoint); @@ -489,9 +408,9 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c + tp->current_pc_is_notcurrent = 1; + tp->proceed_to_finish = 1; /* We want stop_registers, please... */ - make_cleanup_restore_integer (&suppress_stop_observer); - suppress_stop_observer = 1; -@@ -1522,7 +1532,9 @@ finish_forward (struct symbol *function, + proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); + +@@ -1535,7 +1545,9 @@ finish_forward (struct symbol *function, static void finish_command (char *arg, int from_tty) { @@ -502,7 +421,7 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c struct symbol *function; int async_exec = 0; -@@ -1553,46 +1565,63 @@ finish_command (char *arg, int from_tty) +@@ -1566,45 +1578,63 @@ finish_command (char *arg, int from_tty) if (!target_has_execution) error (_("The program is not running.")); @@ -523,16 +442,15 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c - == INLINE_FRAME) + if (get_frame_type (current_frame) == INLINE_FRAME) { - struct thread_info *tp = inferior_thread (); -- - /* Claim we are stepping in the calling frame. An empty step - range means that we will stop once we aren't in a function - called by that frame. We don't use the magic "1" value for - step_range_end, because then infrun will think this is nexti, - and not step over the rest of this inlined function call. */ + struct thread_info *tp = inferior_thread (); struct symtab_and_line empty_sal; - init_sal (&empty_sal); -- set_step_info (tp, frame, empty_sal); +- set_step_info (frame, empty_sal); - tp->step_range_start = tp->step_range_end = get_frame_pc (frame); - tp->step_over_calls = STEP_OVER_ALL; + struct block *frame_block; @@ -544,8 +462,8 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c printf_filtered (_("Run till exit from ")); - print_stack_frame (get_selected_frame (NULL), 1, LOCATION); + print_stack_frame (current_frame, 1, LOCATION); - } - ++ } ++ + /* Even just a single stepi would get us out of the caller function PC + range. */ + @@ -561,15 +479,15 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c + tp->current_pc_is_notcurrent = 1; + normal_stop (); + return; -+ } -+ + } + + /* Claim we are stepping in the calling frame. An empty step + range means that we will stop once we aren't in a function + called by that frame. We don't use the magic "1" value for + step_range_end, because then infrun will think this is nexti, + and not step over the rest of this inlined function call. */ + init_sal (&empty_sal); -+ set_step_info (tp, prev_frame, empty_sal); ++ set_step_info (prev_frame, empty_sal); + tp->step_range_start = tp->step_range_end = get_frame_pc (prev_frame); + tp->step_over_calls = STEP_OVER_ALL; + @@ -584,7 +502,7 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c /* Print info on the selected frame, including level number but not source. */ -@@ -1606,10 +1635,14 @@ finish_command (char *arg, int from_tty) +@@ -1618,10 +1648,14 @@ finish_command (char *arg, int from_tty) print_stack_frame (get_selected_frame (NULL), 1, LOCATION); } @@ -600,41 +518,11 @@ Index: gdb-6.8.50.20090302/gdb/infcmd.c } -Index: gdb-6.8.50.20090302/gdb/infrun.c +Index: gdb-6.8.50.20090803/gdb/target.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infrun.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/infrun.c 2009-03-25 22:34:02.000000000 +0100 -@@ -1152,8 +1152,6 @@ a command like `return' or `jump' to con - step = 0; - } - -- clear_inline_frame_state (resume_ptid); -- - if (debug_displaced - && use_displaced_stepping (gdbarch) - && tp->trap_expected) -@@ -1205,6 +1203,8 @@ clear_proceed_status_thread (struct thre - - /* Discard any remaining commands or status from previous stop. */ - bpstat_clear (&tp->stop_bpstat); -+ -+ tp->current_pc_is_notcurrent = 0; - } - - static int -Index: gdb-6.8.50.20090302/gdb/target.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/target.c 2009-03-25 22:26:51.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/target.c 2009-03-25 22:34:02.000000000 +0100 -@@ -41,6 +41,7 @@ - #include "target-descriptions.h" - #include "gdbthread.h" - #include "solib.h" -+#include "inline-frame.h" - - static void target_info (char *, int); - -@@ -1925,6 +1926,7 @@ target_resume (ptid_t ptid, int step, en +--- gdb-6.8.50.20090803.orig/gdb/target.c 2009-08-03 16:04:15.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/target.c 2009-08-03 16:57:40.000000000 +0200 +@@ -2079,6 +2079,7 @@ target_resume (ptid_t ptid, int step, en { struct target_ops *t; @@ -642,10 +530,10 @@ Index: gdb-6.8.50.20090302/gdb/target.c dcache_invalidate (target_dcache); for (t = current_target.beneath; t != NULL; t = t->beneath) -Index: gdb-6.8.50.20090302/gdb/inline-frame.h +Index: gdb-6.8.50.20090803/gdb/inline-frame.h =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/inline-frame.h 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/inline-frame.h 2009-03-25 22:34:02.000000000 +0100 +--- gdb-6.8.50.20090803.orig/gdb/inline-frame.h 2009-06-28 02:20:22.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/inline-frame.h 2009-08-03 16:57:40.000000000 +0200 @@ -43,6 +43,10 @@ void clear_inline_frame_state (ptid_t pt void step_into_inline_frame (ptid_t ptid); @@ -657,41 +545,19 @@ Index: gdb-6.8.50.20090302/gdb/inline-frame.h /* Return the number of hidden functions inlined into the current frame. */ -Index: gdb-6.8.50.20090302/gdb/infcall.c +Index: gdb-6.8.50.20090803/gdb/dwarf2read.c =================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infcall.c 2009-03-25 22:33:02.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/infcall.c 2009-03-25 22:34:02.000000000 +0100 -@@ -898,8 +898,15 @@ The program being debugged exited while - - if (unwind_on_signal_p) - { -- /* The user wants the context restored. Calling error will -- run inf_status_cleanup, which does all the work. */ -+ /* The user wants the context restored. */ -+ -+ /* We must get back to the frame we were before the -+ dummy call. */ -+ dummy_frame_pop (dummy_id); -+ -+ /* We also need to restore inferior status to that before the -+ dummy call. */ -+ restore_inferior_status (inf_status); - - /* FIXME: Insert a bunch of wrap_here; name can be very - long if it's a C++ name with arguments and stuff. */ -Index: gdb-6.8.50.20090302/gdb/dwarf2read.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/dwarf2read.c 2009-03-25 22:33:44.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/dwarf2read.c 2009-03-25 22:34:11.000000000 +0100 -@@ -3471,6 +3471,7 @@ read_func_scope (struct die_info *die, s - unsigned die_children; - struct attribute *call_line, *call_file; +--- gdb-6.8.50.20090803.orig/gdb/dwarf2read.c 2009-08-03 16:56:10.000000000 +0200 ++++ gdb-6.8.50.20090803/gdb/dwarf2read.c 2009-08-03 16:57:40.000000000 +0200 +@@ -4107,6 +4107,7 @@ read_func_scope (struct die_info *die, s + struct block *block; + unsigned die_children = 0; int inlined_func = (die->tag == DW_TAG_inlined_subroutine); + struct type *type; if (inlined_func) { -@@ -3513,7 +3514,10 @@ read_func_scope (struct die_info *die, s +@@ -4148,7 +4149,10 @@ read_func_scope (struct die_info *die, s add_to_cu_func_list (name, lowpc, highpc, cu); new = push_context (0, lowpc); @@ -703,11 +569,3 @@ Index: gdb-6.8.50.20090302/gdb/dwarf2read.c /* If there is a location expression for DW_AT_frame_base, record it. */ -@@ -8751,6 +8755,7 @@ read_type_die (struct die_info *die, str - break; - case DW_TAG_subprogram: - case DW_TAG_subroutine_type: -+ case DW_TAG_inlined_subroutine: - this_type = read_subroutine_type (die, cu); - break; - case DW_TAG_array_type: diff --git a/gdb-6.8-inlining.patch b/gdb-6.8-inlining.patch deleted file mode 100644 index 674afc0..0000000 --- a/gdb-6.8-inlining.patch +++ /dev/null @@ -1,3260 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2008-07/msg00442.html -with pre-applied and post-unapplied (the patch is currently 2008-12-06 not -applied upstream) -http://sourceware.org/ml/gdb-patches/2008-07/msg00317.html - -Removed dwarf_expr_frame_base NULL check duplicity with *-vla.patch. - -Index: gdb-6.8.50.20090302/gdb/NEWS -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/NEWS 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/NEWS 2009-05-09 21:27:23.000000000 +0200 -@@ -1,6 +1,11 @@ - What has changed in GDB? - (Organized release by release) - -+*** Fedora changes -+ -+* Inlined functions are now supported. They show up in backtraces, and -+the "step", "next", and "finish" commands handle them automatically. -+ - *** Changes since GDB 6.8 - - * GDB now has support for multi-byte and wide character sets on the -Index: gdb-6.8.50.20090302/gdb/block.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/block.c 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/block.c 2009-05-09 21:27:23.000000000 +0200 -@@ -47,8 +47,16 @@ contained_in (const struct block *a, con - { - if (!a || !b) - return 0; -- return BLOCK_START (a) >= BLOCK_START (b) -- && BLOCK_END (a) <= BLOCK_END (b); -+ -+ do -+ { -+ if (a == b) -+ return 1; -+ a = BLOCK_SUPERBLOCK (a); -+ } -+ while (a != NULL); -+ -+ return 0; - } - - -@@ -60,12 +68,21 @@ contained_in (const struct block *a, con - struct symbol * - block_linkage_function (const struct block *bl) - { -- while (BLOCK_FUNCTION (bl) == 0 && BLOCK_SUPERBLOCK (bl) != 0) -+ while ((BLOCK_FUNCTION (bl) == NULL || block_inlined_p (bl)) -+ && BLOCK_SUPERBLOCK (bl) != NULL) - bl = BLOCK_SUPERBLOCK (bl); - - return BLOCK_FUNCTION (bl); - } - -+/* Return one if BL represents an inlined function. */ -+ -+int -+block_inlined_p (const struct block *bl) -+{ -+ return BLOCK_FUNCTION (bl) != NULL && SYMBOL_INLINED (BLOCK_FUNCTION (bl)); -+} -+ - /* Return the blockvector immediately containing the innermost lexical - block containing the specified pc value and section, or 0 if there - is none. PBLOCK is a pointer to the block. If PBLOCK is NULL, we -Index: gdb-6.8.50.20090302/gdb/block.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/block.h 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/block.h 2009-05-09 21:27:23.000000000 +0200 -@@ -65,7 +65,7 @@ struct block - CORE_ADDR endaddr; - - /* The symbol that names this block, if the block is the body of a -- function; otherwise, zero. */ -+ function (real or inlined); otherwise, zero. */ - - struct symbol *function; - -@@ -144,6 +144,8 @@ enum { GLOBAL_BLOCK = 0, STATIC_BLOCK = - - extern struct symbol *block_linkage_function (const struct block *); - -+extern int block_inlined_p (const struct block *block); -+ - extern int contained_in (const struct block *, const struct block *); - - extern struct blockvector *blockvector_for_pc (CORE_ADDR, struct block **); -Index: gdb-6.8.50.20090302/gdb/blockframe.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/blockframe.c 2009-01-03 06:57:50.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/blockframe.c 2009-05-09 21:27:23.000000000 +0200 -@@ -36,6 +36,7 @@ - #include "command.h" - #include "gdbcmd.h" - #include "block.h" -+#include "inline-frame.h" - - /* Prototypes for exported functions. */ - -@@ -61,11 +62,29 @@ struct block * - get_frame_block (struct frame_info *frame, CORE_ADDR *addr_in_block) - { - const CORE_ADDR pc = get_frame_address_in_block (frame); -+ struct frame_info *next_frame; -+ struct block *bl; -+ int inline_count; - - if (addr_in_block) - *addr_in_block = pc; - -- return block_for_pc (pc); -+ bl = block_for_pc (pc); -+ if (bl == NULL) -+ return NULL; -+ -+ inline_count = frame_inlined_callees (frame); -+ -+ while (inline_count > 0) -+ { -+ if (block_inlined_p (bl)) -+ inline_count--; -+ -+ bl = BLOCK_SUPERBLOCK (bl); -+ gdb_assert (bl != NULL); -+ } -+ -+ return bl; - } - - CORE_ADDR -@@ -104,9 +123,14 @@ struct symbol * - get_frame_function (struct frame_info *frame) - { - struct block *bl = get_frame_block (frame, 0); -- if (bl == 0) -- return 0; -- return block_linkage_function (bl); -+ -+ if (bl == NULL) -+ return NULL; -+ -+ while (BLOCK_FUNCTION (bl) == NULL && BLOCK_SUPERBLOCK (bl) != NULL) -+ bl = BLOCK_SUPERBLOCK (bl); -+ -+ return BLOCK_FUNCTION (bl); - } - - -@@ -350,8 +374,8 @@ block_innermost_frame (struct block *blo - frame = get_current_frame (); - while (frame != NULL) - { -- calling_pc = get_frame_address_in_block (frame); -- if (calling_pc >= start && calling_pc < end) -+ struct block *frame_block = get_frame_block (frame, NULL); -+ if (frame_block != NULL && contained_in (frame_block, block)) - return frame; - - frame = get_prev_frame (frame); -Index: gdb-6.8.50.20090302/gdb/breakpoint.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/breakpoint.c 2009-05-09 21:27:15.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/breakpoint.c 2009-05-09 21:27:23.000000000 +0200 -@@ -2641,19 +2641,21 @@ watchpoint_check (void *p) - within_current_scope = 1; - else - { -- /* There is no current frame at this moment. If we're going to have -- any chance of handling watchpoints on local variables, we'll need -- the frame chain (so we can determine if we're in scope). */ -- reinit_frame_cache (); - fr = frame_find_by_id (b->watchpoint_frame); - within_current_scope = (fr != NULL); - - /* If we've gotten confused in the unwinder, we might have - returned a frame that can't describe this variable. */ -- if (within_current_scope -- && (block_linkage_function (b->exp_valid_block) -- != get_frame_function (fr))) -- within_current_scope = 0; -+ if (within_current_scope) -+ { -+ struct symbol *function; -+ -+ function = get_frame_function (fr); -+ if (function == NULL -+ || !contained_in (b->exp_valid_block, -+ SYMBOL_BLOCK_VALUE (function))) -+ within_current_scope = 0; -+ } - - /* in_function_epilogue_p() returns a non-zero value if we're still - in the function but the stack frame has already been invalidated. -@@ -2665,10 +2667,9 @@ watchpoint_check (void *p) - that the watchpoint frame couldn't be found by frame_find_by_id() - because the current PC is currently in an epilogue. Calling - gdbarch_in_function_epilogue_p() also when fr == NULL fixes that. */ -- if ((!within_current_scope || fr == get_current_frame ()) -- && gdbarch_in_function_epilogue_p (current_gdbarch, read_pc ())) -+ if (gdbarch_in_function_epilogue_p (current_gdbarch, read_pc ())) - return WP_VALUE_NOT_CHANGED; -- if (fr && within_current_scope) -+ if (within_current_scope) - /* If we end up stopping, the current frame will get selected - in normal_stop. So this call to select_frame won't affect - the user. */ -@@ -2902,7 +2903,7 @@ bpstat_check_breakpoint_conditions (bpst - struct breakpoint *b = bl->owner; - - if (frame_id_p (b->frame_id) -- && !frame_id_eq (b->frame_id, get_frame_id (get_current_frame ()))) -+ && !frame_id_eq (b->frame_id, get_stack_frame_id (get_current_frame ()))) - bs->stop = 0; - else if (bs->stop) - { -@@ -2917,8 +2918,12 @@ bpstat_check_breakpoint_conditions (bpst - - if (bl->cond && bl->owner->disposition != disp_del_at_next_stop) - { -- /* Need to select the frame, with all that implies -- so that the conditions will have the right context. */ -+ /* Need to select the frame, with all that implies so that -+ the conditions will have the right context. Because we -+ use the frame, we will not see an inlined function's -+ variables when we arrive at a breakpoint at the start -+ of the inlined function; the current frame will be the -+ call site. */ - select_frame (get_current_frame ()); - value_is_zero - = catch_errors (breakpoint_cond_eval, (bl->cond), -@@ -5163,6 +5168,11 @@ set_momentary_breakpoint (struct symtab_ - enum bptype type) - { - struct breakpoint *b; -+ -+ /* If FRAME_ID is valid, it should be a real frame, not an inlined -+ one. */ -+ gdb_assert (!frame_id_inlined_p (frame_id)); -+ - b = set_raw_breakpoint (sal, type); - b->enable_state = bp_enabled; - b->disposition = disp_donttouch; -@@ -6208,7 +6218,6 @@ watch_command_1 (char *arg, int accessfl - struct block *exp_valid_block; - struct value *val, *mark, *val_chain; - struct frame_info *frame; -- struct frame_info *prev_frame = NULL; - char *exp_start = NULL; - char *exp_end = NULL; - char *tok, *id_tok_start, *end_tok; -@@ -6369,34 +6378,34 @@ watch_command_1 (char *arg, int accessfl - bp_type = bp_watchpoint; - - frame = block_innermost_frame (exp_valid_block); -- if (frame) -- prev_frame = get_prev_frame (frame); -- else -- prev_frame = NULL; - - /* If the expression is "local", then set up a "watchpoint scope" - breakpoint at the point where we've left the scope of the watchpoint - expression. Create the scope breakpoint before the watchpoint, so - that we will encounter it first in bpstat_stop_status. */ -- if (innermost_block && prev_frame) -+ if (innermost_block && frame) - { -- scope_breakpoint = create_internal_breakpoint (get_frame_pc (prev_frame), -- bp_watchpoint_scope); -+ if (frame_id_p (frame_unwind_id (frame))) -+ { -+ scope_breakpoint -+ = create_internal_breakpoint (frame_pc_unwind (frame), -+ bp_watchpoint_scope); - -- scope_breakpoint->enable_state = bp_enabled; -+ scope_breakpoint->enable_state = bp_enabled; - -- /* Automatically delete the breakpoint when it hits. */ -- scope_breakpoint->disposition = disp_del; -+ /* Automatically delete the breakpoint when it hits. */ -+ scope_breakpoint->disposition = disp_del; - -- /* Only break in the proper frame (help with recursion). */ -- scope_breakpoint->frame_id = get_frame_id (prev_frame); -+ /* Only break in the proper frame (help with recursion). */ -+ scope_breakpoint->frame_id = frame_unwind_id (frame); - -- /* Set the address at which we will stop. */ -- scope_breakpoint->loc->requested_address -- = get_frame_pc (prev_frame); -- scope_breakpoint->loc->address -- = adjust_breakpoint_address (scope_breakpoint->loc->requested_address, -- scope_breakpoint->type); -+ /* Set the address at which we will stop. */ -+ scope_breakpoint->loc->requested_address -+ = frame_pc_unwind (frame); -+ scope_breakpoint->loc->address -+ = adjust_breakpoint_address (scope_breakpoint->loc->requested_address, -+ scope_breakpoint->type); -+ } - } - - /* Now set up the breakpoint. */ -@@ -6577,7 +6586,6 @@ until_break_command (char *arg, int from - struct symtabs_and_lines sals; - struct symtab_and_line sal; - struct frame_info *frame = get_selected_frame (NULL); -- struct frame_info *prev_frame = get_prev_frame (frame); - struct breakpoint *breakpoint; - struct breakpoint *breakpoint2 = NULL; - struct cleanup *old_chain; -@@ -6610,20 +6618,22 @@ until_break_command (char *arg, int from - we don't specify a frame at which we need to stop. */ - breakpoint = set_momentary_breakpoint (sal, null_frame_id, bp_until); - else -- /* Otherwise, specify the current frame, because we want to stop only -+ /* Otherwise, specify the selected frame, because we want to stop only - at the very same frame. */ -- breakpoint = set_momentary_breakpoint (sal, get_frame_id (frame), -+ breakpoint = set_momentary_breakpoint (sal, get_stack_frame_id (frame), - bp_until); - - old_chain = make_cleanup_delete_breakpoint (breakpoint); - - /* Keep within the current frame, or in frames called by the current - one. */ -- if (prev_frame) -+ -+ if (frame_id_p (frame_unwind_id (frame))) - { -- sal = find_pc_line (get_frame_pc (prev_frame), 0); -- sal.pc = get_frame_pc (prev_frame); -- breakpoint2 = set_momentary_breakpoint (sal, get_frame_id (prev_frame), -+ sal = find_pc_line (frame_pc_unwind (frame), 0); -+ sal.pc = frame_pc_unwind (frame); -+ breakpoint2 = set_momentary_breakpoint (sal, -+ frame_unwind_id (frame), - bp_until); - make_cleanup_delete_breakpoint (breakpoint2); - } -Index: gdb-6.8.50.20090302/gdb/buildsym.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/buildsym.c 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/buildsym.c 2009-05-09 21:27:23.000000000 +0200 -@@ -1155,6 +1155,12 @@ end_symtab (CORE_ADDR end_addr, struct o - struct symbol *sym; - struct dict_iterator iter; - -+ /* Inlined functions may have symbols not in the global or static -+ symbol lists. */ -+ if (BLOCK_FUNCTION (block) != NULL) -+ if (SYMBOL_SYMTAB (BLOCK_FUNCTION (block)) == NULL) -+ SYMBOL_SYMTAB (BLOCK_FUNCTION (block)) = symtab; -+ - for (sym = dict_iterator_first (BLOCK_DICT (block), &iter); - sym != NULL; - sym = dict_iterator_next (&iter)) -Index: gdb-6.8.50.20090302/gdb/doc/gdb.texinfo -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/doc/gdb.texinfo 2009-05-09 21:27:15.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/doc/gdb.texinfo 2009-05-09 21:27:23.000000000 +0200 -@@ -137,6 +137,7 @@ software in general. We will miss him. - * Stack:: Examining the stack - * Source:: Examining source files - * Data:: Examining data -+* Optimized Code:: Debugging optimized code - * Macros:: Preprocessor Macros - * Tracepoints:: Debugging remote targets non-intrusively - * Overlays:: Debugging programs that use overlays -@@ -1824,7 +1825,7 @@ To request debugging information, specif - the compiler. - - Programs that are to be shipped to your customers are compiled with --optimizations, using the @samp{-O} compiler option. However, many -+optimizations, using the @samp{-O} compiler option. However, some - compilers are unable to handle the @samp{-g} and @samp{-O} options - together. Using those compilers, you cannot generate optimized - executables containing debugging information. -@@ -1833,22 +1834,7 @@ executables containing debugging informa - without @samp{-O}, making it possible to debug optimized code. We - recommend that you @emph{always} use @samp{-g} whenever you compile a - program. You may think your program is correct, but there is no sense --in pushing your luck. -- --@cindex optimized code, debugging --@cindex debugging optimized code --When you debug a program compiled with @samp{-g -O}, remember that the --optimizer is rearranging your code; the debugger shows you what is --really there. Do not be too surprised when the execution path does not --exactly match your source file! An extreme example: if you define a --variable, but never use it, @value{GDBN} never sees that --variable---because the compiler optimizes it out of existence. -- --Some things do not work as well with @samp{-g -O} as with just --@samp{-g}, particularly on machines with instruction scheduling. If in --doubt, recompile with @samp{-g} alone, and if this fixes the problem, --please report it to us as a bug (including a test case!). --@xref{Variables}, for more information about debugging optimized code. -+in pushing your luck. For more information, see @ref{Optimized Code}. - - Older versions of the @sc{gnu} C compiler permitted a variant option - @w{@samp{-gg}} for debugging information. @value{GDBN} no longer supports this -@@ -8406,6 +8392,107 @@ $1 = 1 - $2 = (void *) 0x8049560 - @end smallexample - -+@node Optimized Code -+@chapter Debugging Optimized Code -+@cindex optimized code, debugging -+@cindex debugging optimized code -+ -+Almost all compilers support optimization. With optimization -+disabled, the compiler generates assembly code that corresponds -+directly to your source code, in a simplistic way. As the compiler -+applies more powerful optimizations, the generated assembly code -+diverges from your original source code. With help from debugging -+information generated by the compiler, @value{GDBN} can map from -+the running program back to constructs from your original source. -+ -+@value{GDBN} is more accurate with optimization disabled. If you -+can recompile without optimization, it is easier to follow the -+progress of your program during debugging. But, there are many cases -+where you may need to debug an optimized version. -+ -+When you debug a program compiled with @samp{-g -O}, remember that the -+optimizer has rearranged your code; the debugger shows you what is -+really there. Do not be too surprised when the execution path does not -+exactly match your source file! An extreme example: if you define a -+variable, but never use it, @value{GDBN} never sees that -+variable---because the compiler optimizes it out of existence. -+ -+Some things do not work as well with @samp{-g -O} as with just -+@samp{-g}, particularly on machines with instruction scheduling. If in -+doubt, recompile with @samp{-g} alone, and if this fixes the problem, -+please report it to us as a bug (including a test case!). -+@xref{Variables}, for more information about debugging optimized code. -+ -+@menu -+* Inline Functions:: How @value{GDBN} presents inlining -+@end menu -+ -+@node Inline Functions -+@section Inline Functions -+@cindex inline functions, debugging -+ -+@dfn{Inlining} is an optimization that inserts a copy of the function -+body directly at each call site, instead of jumping to a shared -+routine. @value{GDBN} displays inlined functions just like -+non-inlined functions. They appear in backtraces. You can view their -+arguments and local variables, step into them with @code{step}, skip -+them with @code{next}, and escape from them with @code{finish}. -+You can check whether a function was inlined by using the -+@code{info frame} command. -+ -+For @value{GDBN} to support inlined functions, the compiler must -+record information about inlining in the debug information --- -+@value{NGCC} using the @sc{dwarf 2} format does this, and several -+other compilers do also. @value{GDBN} only supports inlined functions -+when using @sc{dwarf 2}. Versions of @value{NGCC} before 4.1 -+do not emit two required attributes (@samp{DW_AT_call_file} and -+@samp{DW_AT_call_line}); @value{GDBN} does not display inlined -+function calls with earlier versions of @value{NGCC}. It instead -+displays the arguments and local variables of inlined functions as -+local variables in the caller. -+ -+The body of an inlined function is directly included at its call site; -+unlike a non-inlined function, there are no instructions devoted to -+the call. @value{GDBN} still pretends that the call site and the -+start of the inlined function are different instructions. Stepping to -+the call site shows the call site, and then stepping again shows -+the first line of the inlined function, even though no additional -+instructions are executed. -+ -+This makes source-level debugging much clearer; you can see both the -+context of the call and then the effect of the call. Only stepping by -+a single instruction using @code{stepi} or @code{nexti} does not do -+this; single instruction steps always show the inlined body. -+ -+There are some ways that @value{GDBN} does not pretend that inlined -+function calls are the same as normal calls: -+ -+@itemize @bullet -+@item -+You cannot set breakpoints on inlined functions. @value{GDBN} -+either reports that there is no symbol with that name, or else sets the -+breakpoint only on non-inlined copies of the function. This limitation -+will be removed in a future version of @value{GDBN}; until then, -+set a breakpoint by line number on the first line of the inlined -+function instead. -+ -+@item -+Setting breakpoints at the call site of an inlined function may not -+work, because the call site does not contain any code. @value{GDBN} -+may incorrectly move the breakpoint to the next line of the enclosing -+function, after the call. This limitation will be removed in a future -+version of @value{GDBN}; until then, set a breakpoint on an earlier line -+or inside the inlined function instead. -+ -+@item -+@value{GDBN} cannot locate the return value of inlined calls after -+using the @code{finish} command. This is a limitation of compiler-generated -+debugging information; after @code{finish}, you can step to the next line -+and print a variable where your program stored the return value. -+ -+@end itemize -+ -+ - @node Macros - @chapter C Preprocessor Macros - -Index: gdb-6.8.50.20090302/gdb/dwarf2loc.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/dwarf2loc.c 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/dwarf2loc.c 2009-05-09 21:27:23.000000000 +0200 -@@ -31,6 +31,7 @@ - #include "regcache.h" - #include "objfiles.h" - #include "exceptions.h" -+#include "block.h" - - #include "elf/dwarf2.h" - #include "dwarf2expr.h" -@@ -150,7 +151,10 @@ dwarf_expr_frame_base (void *baton, gdb_ - struct symbol *framefunc; - struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton; - -- framefunc = get_frame_function (debaton->frame); -+ /* Use block_linkage_function, which returns a real (not inlined) -+ function, instead of get_frame_function, which may return an -+ inlined function. */ -+ framefunc = block_linkage_function (get_frame_block (debaton->frame, NULL)); - - /* If we found a frame-relative symbol then it was certainly within - some function associated with a frame. If we can't find the frame, -Index: gdb-6.8.50.20090302/gdb/dwarf2read.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/dwarf2read.c 2009-05-09 21:27:15.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/dwarf2read.c 2009-05-09 21:27:23.000000000 +0200 -@@ -3024,12 +3024,8 @@ process_die (struct die_info *die, struc - read_file_scope (die, cu); - break; - case DW_TAG_subprogram: -- read_func_scope (die, cu); -- break; - case DW_TAG_inlined_subroutine: -- /* FIXME: These are ignored for now. -- They could be used to set breakpoints on all inlined instances -- of a function and make GDB `next' properly over inlined functions. */ -+ read_func_scope (die, cu); - break; - case DW_TAG_lexical_block: - case DW_TAG_try_block: -@@ -3516,6 +3512,22 @@ read_func_scope (struct die_info *die, s - CORE_ADDR baseaddr; - struct block *block; - unsigned die_children; -+ struct attribute *call_line, *call_file; -+ int inlined_func = (die->tag == DW_TAG_inlined_subroutine); -+ -+ if (inlined_func) -+ { -+ /* If we do not have call site information, we can't show the -+ caller of this inlined function. That's too confusing, so -+ only use the scope for local variables. */ -+ call_line = dwarf2_attr (die, DW_AT_call_line, cu); -+ call_file = dwarf2_attr (die, DW_AT_call_file, cu); -+ if (call_line == NULL || call_file == NULL) -+ { -+ read_lexical_block_scope (die, cu); -+ return; -+ } -+ } - - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - -@@ -7725,6 +7737,9 @@ die_specification (struct die_info *die, - *spec_cu); - - if (spec_attr == NULL) -+ spec_attr = dwarf2_attr (die, DW_AT_abstract_origin, *spec_cu); -+ -+ if (spec_attr == NULL) - return NULL; - else - return follow_die_ref (die, spec_attr, spec_cu); -@@ -8408,6 +8423,7 @@ new_symbol (struct die_info *die, struct - struct attribute *attr = NULL; - struct attribute *attr2 = NULL; - CORE_ADDR baseaddr; -+ int inlined_func = (die->tag == DW_TAG_inlined_subroutine); - - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - -@@ -8464,13 +8480,17 @@ new_symbol (struct die_info *die, struct - SYMBOL_TYPE (sym) = type; - else - SYMBOL_TYPE (sym) = die_type (die, cu); -- attr = dwarf2_attr (die, DW_AT_decl_line, cu); -+ attr = dwarf2_attr (die, -+ inlined_func ? DW_AT_call_line : DW_AT_decl_line, -+ cu); - if (attr) - { - SYMBOL_LINE (sym) = DW_UNSND (attr); - } - -- attr = dwarf2_attr (die, DW_AT_decl_file, cu); -+ attr = dwarf2_attr (die, -+ inlined_func ? DW_AT_call_file : DW_AT_decl_file, -+ cu); - if (attr) - { - int file_index = DW_UNSND (attr); -@@ -8517,6 +8537,14 @@ new_symbol (struct die_info *die, struct - add_symbol_to_list (sym, cu->list_in_scope); - } - break; -+ case DW_TAG_inlined_subroutine: -+ /* SYMBOL_BLOCK_VALUE (sym) will be filled in later by -+ finish_block. */ -+ SYMBOL_CLASS (sym) = LOC_BLOCK; -+ SYMBOL_INLINED (sym) = 1; -+ /* Do not add the symbol to any lists. It will be found via -+ BLOCK_FUNCTION from the blockvector. */ -+ break; - case DW_TAG_variable: - /* Compilation with minimal debug info may result in variables - with missing type entries. Change the misleading `void' type -@@ -8583,7 +8611,14 @@ new_symbol (struct die_info *die, struct - } - break; - case DW_TAG_formal_parameter: -- SYMBOL_IS_ARGUMENT (sym) = 1; -+ /* If we are inside a function, mark this as an argument. If -+ not, we might be looking at an argument to an inlined function -+ when we do not have enough information to show inlined frames; -+ pretend it's a local variable in that case so that the user can -+ still see it. */ -+ if (context_stack_depth > 0 -+ && context_stack[context_stack_depth - 1].name != NULL) -+ SYMBOL_IS_ARGUMENT (sym) = 1; - attr = dwarf2_attr (die, DW_AT_location, cu); - if (attr) - { -Index: gdb-6.8.50.20090302/gdb/frame-unwind.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/frame-unwind.c 2009-01-03 06:57:51.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/frame-unwind.c 2009-05-09 21:27:23.000000000 +0200 -@@ -21,6 +21,7 @@ - #include "frame.h" - #include "frame-unwind.h" - #include "dummy-frame.h" -+#include "inline-frame.h" - #include "value.h" - #include "regcache.h" - -@@ -51,8 +52,10 @@ frame_unwind_init (struct obstack *obsta - can't override this. */ - table->list = OBSTACK_ZALLOC (obstack, struct frame_unwind_table_entry); - table->list->unwinder = dummy_frame_unwind; -+ table->list->next = OBSTACK_ZALLOC (obstack, struct frame_unwind_table_entry); -+ table->list->next->unwinder = inline_frame_unwind; - /* The insertion point for OSABI sniffers. */ -- table->osabi_head = &table->list->next; -+ table->osabi_head = &table->list->next->next; - return table; - } - -Index: gdb-6.8.50.20090302/gdb/frame.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/frame.c 2009-05-09 21:27:11.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/frame.c 2009-05-09 21:27:23.000000000 +0200 -@@ -41,8 +41,14 @@ - #include "objfiles.h" - #include "exceptions.h" - #include "gdbthread.h" -+#include "block.h" -+#include "inline-frame.h" - - static struct frame_info *get_prev_frame_1 (struct frame_info *this_frame); -+static struct frame_info *get_prev_frame_raw (struct frame_info *this_frame); -+ -+static void deprecated_update_frame_pc_hack (struct frame_info *frame, -+ CORE_ADDR pc); - - /* We keep a cache of stack frames, each of which is a "struct - frame_info". The innermost one gets allocated (in -@@ -183,6 +189,8 @@ fprint_frame_id (struct ui_file *file, s - fprint_field (file, "code", id.code_addr_p, id.code_addr); - fprintf_unfiltered (file, ","); - fprint_field (file, "special", id.special_addr_p, id.special_addr); -+ if (id.inline_depth) -+ fprintf_unfiltered (file, ",inlined=%d", id.inline_depth); - fprintf_unfiltered (file, "}"); - } - -@@ -197,6 +205,12 @@ fprint_frame_type (struct ui_file *file, - case DUMMY_FRAME: - fprintf_unfiltered (file, "DUMMY_FRAME"); - return; -+ case INLINE_FRAME: -+ fprintf_unfiltered (file, "INLINE_FRAME"); -+ return; -+ case SENTINEL_FRAME: -+ fprintf_unfiltered (file, "SENTINEL_FRAME"); -+ return; - case SIGTRAMP_FRAME: - fprintf_unfiltered (file, "SIGTRAMP_FRAME"); - return; -@@ -249,6 +263,18 @@ fprint_frame (struct ui_file *file, stru - fprintf_unfiltered (file, "}"); - } - -+/* Given FRAME, return the enclosing normal frame for inlined -+ function frames. Otherwise return the original frame. */ -+ -+static struct frame_info * -+skip_inlined_frames (struct frame_info *frame) -+{ -+ while (get_frame_type (frame) == INLINE_FRAME) -+ frame = get_prev_frame (frame); -+ -+ return frame; -+} -+ - /* Return a frame uniq ID that can be used to, later, re-find the - frame. */ - -@@ -281,13 +307,21 @@ get_frame_id (struct frame_info *fi) - } - - struct frame_id -+get_stack_frame_id (struct frame_info *next_frame) -+{ -+ return get_frame_id (skip_inlined_frames (next_frame)); -+} -+ -+struct frame_id - frame_unwind_id (struct frame_info *next_frame) - { - /* Use prev_frame, and not get_prev_frame. The latter will truncate - the frame chain, leading to this function unintentionally - returning a null_frame_id (e.g., when a caller requests the frame - ID of "main()"s caller. */ -- return get_frame_id (get_prev_frame_1 (next_frame)); -+ -+ next_frame = skip_inlined_frames (next_frame); -+ return get_frame_id (skip_inlined_frames (get_prev_frame_1 (next_frame))); - } - - const struct frame_id null_frame_id; /* All zeros. */ -@@ -342,6 +376,15 @@ frame_id_p (struct frame_id l) - } - - int -+frame_id_inlined_p (struct frame_id l) -+{ -+ if (!frame_id_p (l)) -+ return 0; -+ -+ return (l.inline_depth != 0); -+} -+ -+int - frame_id_eq (struct frame_id l, struct frame_id r) - { - int eq; -@@ -352,21 +395,22 @@ frame_id_eq (struct frame_id l, struct f - else if (l.stack_addr != r.stack_addr) - /* If .stack addresses are different, the frames are different. */ - eq = 0; -- else if (!l.code_addr_p || !r.code_addr_p) -- /* An invalid code addr is a wild card, always succeed. */ -- eq = 1; -- else if (l.code_addr != r.code_addr) -- /* If .code addresses are different, the frames are different. */ -+ else if (l.code_addr_p && r.code_addr_p && l.code_addr != r.code_addr) -+ /* An invalid code addr is a wild card. If .code addresses are -+ different, the frames are different. */ - eq = 0; -- else if (!l.special_addr_p || !r.special_addr_p) -- /* An invalid special addr is a wild card (or unused), always succeed. */ -- eq = 1; -- else if (l.special_addr == r.special_addr) -+ else if (l.special_addr_p && r.special_addr_p -+ && l.special_addr != r.special_addr) -+ /* An invalid special addr is a wild card (or unused). Otherwise -+ if special addresses are different, the frames are different. */ -+ eq = 0; -+ else if (l.inline_depth != r.inline_depth) -+ /* If inline depths are different, the frames must be different. */ -+ eq = 0; -+ else - /* Frames are equal. */ - eq = 1; -- else -- /* No luck. */ -- eq = 0; -+ - if (frame_debug) - { - fprintf_unfiltered (gdb_stdlog, "{ frame_id_eq (l="); -@@ -411,6 +455,29 @@ frame_id_inner (struct gdbarch *gdbarch, - if (!l.stack_addr_p || !r.stack_addr_p) - /* Like NaN, any operation involving an invalid ID always fails. */ - inner = 0; -+ else if (l.inline_depth > r.inline_depth -+ && l.stack_addr == r.stack_addr -+ && l.code_addr_p == r.code_addr_p -+ && l.special_addr_p == r.special_addr_p -+ && l.special_addr == r.special_addr) -+ { -+ /* Same function, different inlined functions. */ -+ struct block *lb, *rb; -+ -+ gdb_assert (l.code_addr_p && r.code_addr_p); -+ -+ lb = block_for_pc (l.code_addr); -+ rb = block_for_pc (r.code_addr); -+ -+ if (lb == NULL || rb == NULL) -+ /* Something's gone wrong. */ -+ inner = 0; -+ else -+ /* This will return true if LB and RB are the same block, or -+ if the block with the smaller depth lexically encloses the -+ block with the greater depth. */ -+ inner = contained_in (lb, rb); -+ } - else - /* Only return non-zero when strictly inner than. Note that, per - comment in "frame.h", there is some fuzz here. Frameless -@@ -463,8 +530,8 @@ frame_find_by_id (struct frame_id id) - return NULL; - } - --CORE_ADDR --frame_pc_unwind (struct frame_info *this_frame) -+static CORE_ADDR -+frame_unwind_pc (struct frame_info *this_frame) - { - if (!this_frame->prev_pc.p) - { -@@ -503,6 +570,12 @@ frame_pc_unwind (struct frame_info *this - } - - CORE_ADDR -+frame_pc_unwind (struct frame_info *this_frame) -+{ -+ return frame_unwind_pc (skip_inlined_frames (this_frame)); -+} -+ -+CORE_ADDR - get_frame_func (struct frame_info *this_frame) - { - struct frame_info *next_frame = this_frame->next; -@@ -1226,7 +1299,6 @@ frame_register_unwind_location (struct f - static struct frame_info * - get_prev_frame_1 (struct frame_info *this_frame) - { -- struct frame_info *prev_frame; - struct frame_id this_id; - struct gdbarch *gdbarch; - -@@ -1266,6 +1338,14 @@ get_prev_frame_1 (struct frame_info *thi - this_frame->prev_p = 1; - this_frame->stop_reason = UNWIND_NO_REASON; - -+ /* If we are unwinding from an inline frame, all of the below tests -+ were already performed when we unwound from the next non-inline -+ frame. We must skip them, since we can not get THIS_FRAME's ID -+ until we have unwound all the way down to the previous non-inline -+ frame. */ -+ if (get_frame_type (this_frame) == INLINE_FRAME) -+ return get_prev_frame_raw (this_frame); -+ - /* Check that this frame's ID was valid. If it wasn't, don't try to - unwind to the prev frame. Be careful to not apply this test to - the sentinel frame. */ -@@ -1333,7 +1413,8 @@ get_prev_frame_1 (struct frame_info *thi - if (this_frame->level > 0 - && gdbarch_pc_regnum (gdbarch) >= 0 - && get_frame_type (this_frame) == NORMAL_FRAME -- && get_frame_type (this_frame->next) == NORMAL_FRAME) -+ && (get_frame_type (this_frame->next) == NORMAL_FRAME -+ || get_frame_type (this_frame->next) == INLINE_FRAME)) - { - int optimized, realnum, nrealnum; - enum lval_type lval, nlval; -@@ -1362,6 +1443,17 @@ get_prev_frame_1 (struct frame_info *thi - } - } - -+ return get_prev_frame_raw (this_frame); -+} -+ -+/* Construct a new "struct frame_info" and link it previous to -+ this_frame. */ -+ -+static struct frame_info * -+get_prev_frame_raw (struct frame_info *this_frame) -+{ -+ struct frame_info *prev_frame; -+ - /* Allocate the new frame but do not wire it in to the frame chain. - Some (bad) code in INIT_FRAME_EXTRA_INFO tries to look along - frame->next to pull some fancy tricks (of course such code is, by -@@ -1484,7 +1576,7 @@ get_prev_frame (struct frame_info *this_ - the main function when we created the dummy frame, the dummy frame will - point inside the main function. */ - if (this_frame->level >= 0 -- && get_frame_type (this_frame) != DUMMY_FRAME -+ && get_frame_type (this_frame) == NORMAL_FRAME - && !backtrace_past_main - && inside_main_func (this_frame)) - /* Don't unwind past main(). Note, this is done _before_ the -@@ -1529,8 +1621,9 @@ get_prev_frame (struct frame_info *this_ - from main returns directly to the caller of main. Since we don't - stop at main, we should at least stop at the entry point of the - application. */ -- if (!backtrace_past_entry -- && get_frame_type (this_frame) != DUMMY_FRAME && this_frame->level >= 0 -+ if (this_frame->level >= 0 -+ && get_frame_type (this_frame) == NORMAL_FRAME -+ && !backtrace_past_entry - && inside_entry_func (this_frame)) - { - frame_debug_got_null_frame (this_frame, "inside entry func"); -@@ -1541,7 +1634,8 @@ get_prev_frame (struct frame_info *this_ - like a SIGSEGV or a dummy frame, and hence that NORMAL frames - will never unwind a zero PC. */ - if (this_frame->level > 0 -- && get_frame_type (this_frame) == NORMAL_FRAME -+ && (get_frame_type (this_frame) == NORMAL_FRAME -+ || get_frame_type (this_frame) == INLINE_FRAME) - && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME - && get_frame_pc (this_frame) == 0) - { -@@ -1566,7 +1660,7 @@ CORE_ADDR - get_frame_pc (struct frame_info *frame) - { - gdb_assert (frame->next != NULL); -- return frame_pc_unwind (frame->next); -+ return frame_unwind_pc (frame->next); - } - - /* Return an address that falls within THIS_FRAME's code block. */ -@@ -1611,17 +1705,58 @@ get_frame_address_in_block (struct frame - We check the type of NEXT_FRAME first, since it is already - known; frame type is determined by the unwinder, and since - we have THIS_FRAME we've already selected an unwinder for -- NEXT_FRAME. */ -+ NEXT_FRAME. -+ -+ If the next frame is inlined, we need to keep going until we find -+ the real function - for instance, if a signal handler is invoked -+ while in an inlined function, then the code address of the -+ "calling" normal function should not be adjusted either. */ -+ -+ while (get_frame_type (next_frame) == INLINE_FRAME) -+ next_frame = next_frame->next; -+ - if (get_frame_type (next_frame) == NORMAL_FRAME -- && get_frame_type (this_frame) == NORMAL_FRAME) -+ && (get_frame_type (this_frame) == NORMAL_FRAME -+ || get_frame_type (this_frame) == INLINE_FRAME)) - return pc - 1; - - return pc; - } - --static int --pc_notcurrent (struct frame_info *frame) -+void -+find_frame_sal (struct frame_info *frame, struct symtab_and_line *sal) - { -+ struct frame_info *next_frame; -+ int notcurrent; -+ -+ /* If the next frame represents an inlined function call, this frame's -+ sal is the "call site" of that inlined function, which can not -+ be inferred from get_frame_pc. */ -+ next_frame = get_next_frame (frame); -+ if (frame_inlined_callees (frame) > 0) -+ { -+ struct symbol *sym; -+ -+ if (next_frame) -+ sym = get_frame_function (next_frame); -+ else -+ sym = inline_skipped_symbol (inferior_ptid); -+ -+ init_sal (sal); -+ if (SYMBOL_LINE (sym) != 0) -+ { -+ sal->symtab = SYMBOL_SYMTAB (sym); -+ sal->line = SYMBOL_LINE (sym); -+ } -+ else -+ /* If the symbol does not have a location, we don't know where -+ the call site is. Do not pretend to. This is jarring, but -+ we can't do much better. */ -+ sal->pc = get_frame_pc (frame); -+ -+ return; -+ } -+ - /* If FRAME is not the innermost frame, that normally means that - FRAME->pc points at the return instruction (which is *after* the - call instruction), and we want to get the line containing the -@@ -1631,15 +1766,8 @@ pc_notcurrent (struct frame_info *frame) - PC and such a PC indicates the current (rather than next) - instruction/line, consequently, for such cases, want to get the - line containing fi->pc. */ -- struct frame_info *next = get_next_frame (frame); -- int notcurrent = (next != NULL && get_frame_type (next) == NORMAL_FRAME); -- return notcurrent; --} -- --void --find_frame_sal (struct frame_info *frame, struct symtab_and_line *sal) --{ -- (*sal) = find_pc_line (get_frame_pc (frame), pc_notcurrent (frame)); -+ notcurrent = (get_frame_pc (frame) != get_frame_address_in_block (frame)); -+ (*sal) = find_pc_line (get_frame_pc (frame), notcurrent); - } - - /* Per "frame.h", return the ``address'' of the frame. Code should -Index: gdb-6.8.50.20090302/gdb/frame.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/frame.h 2009-02-05 18:28:20.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/frame.h 2009-05-09 21:27:23.000000000 +0200 -@@ -34,6 +34,9 @@ - frame_unwind_WHAT...(): Unwind THIS frame's WHAT from the NEXT - frame. - -+ get_stack_frame_WHAT...(): Get WHAT for THIS frame, but if THIS is -+ inlined, skip to the containing stack frame. -+ - put_frame_WHAT...(): Put a value into this frame (unsafe, need to - invalidate the frame / regcache afterwards) (better name more - strongly hinting at its unsafeness) -@@ -101,6 +104,10 @@ struct frame_id - Typically, it is set to the address of the entry point of the - frame's function (as returned by get_frame_func). - -+ For inlined functions (INLINE_DEPTH != 0), this is the address of -+ the first executed instruction in the block corresponding to the -+ inlined function. -+ - This field is valid only if code_addr_p is true. Otherwise, this - frame is considered to have a wildcard code address, i.e. one that - matches every address value in frame comparisons. */ -@@ -122,6 +129,10 @@ struct frame_id - unsigned int stack_addr_p : 1; - unsigned int code_addr_p : 1; - unsigned int special_addr_p : 1; -+ -+ /* The inline depth of this frame. A frame representing a "called" -+ inlined function will have this set to a nonzero value. */ -+ int inline_depth; - }; - - /* Methods for constructing and comparing Frame IDs. */ -@@ -157,6 +168,10 @@ extern struct frame_id frame_id_build_wi - non-zero .base). */ - extern int frame_id_p (struct frame_id l); - -+/* Returns non-zero when L is a valid frame representing an inlined -+ function. */ -+extern int frame_id_inlined_p (struct frame_id l); -+ - /* Returns non-zero when L and R identify the same frame, or, if - either L or R have a zero .func, then the same frame base. */ - extern int frame_id_eq (struct frame_id l, struct frame_id r); -@@ -177,6 +192,9 @@ enum frame_type - /* A fake frame, created by GDB when performing an inferior function - call. */ - DUMMY_FRAME, -+ /* A frame representing an inlined function, associated with an -+ upcoming (next, inner, younger) NORMAL_FRAME. */ -+ INLINE_FRAME, - /* In a signal handler, various OSs handle this in various ways. - The main thing is that the frame may be far from normal. */ - SIGTRAMP_FRAME, -@@ -345,6 +363,7 @@ extern CORE_ADDR get_frame_base (struct - - instead, since that avoids the bug. */ - extern struct frame_id get_frame_id (struct frame_info *fi); -+extern struct frame_id get_stack_frame_id (struct frame_info *fi); - extern struct frame_id frame_unwind_id (struct frame_info *next_frame); - - /* Assuming that a frame is `normal', return its base-address, or 0 if -Index: gdb-6.8.50.20090302/gdb/gdbthread.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/gdbthread.h 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/gdbthread.h 2009-05-09 21:27:23.000000000 +0200 -@@ -83,6 +83,13 @@ struct thread_info - This is how we know when we step into a subroutine call, and how - to set the frame for the breakpoint used to step out. */ - struct frame_id step_frame_id; -+ -+ /* Similarly, the frame ID of the underlying stack frame (skipping any -+ inlined frames). */ -+ struct frame_id step_stack_frame_id; -+ -+ /* The source file and line at the beginning of the current step -+ operation. Only valid when step_frame_id is set. */ - int current_line; - struct symtab *current_symtab; - -Index: gdb-6.8.50.20090302/gdb/infcall.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infcall.c 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/infcall.c 2009-05-09 21:27:23.000000000 +0200 -@@ -898,15 +898,8 @@ The program being debugged exited while - - if (unwind_on_signal_p) - { -- /* The user wants the context restored. */ -- -- /* We must get back to the frame we were before the -- dummy call. */ -- dummy_frame_pop (dummy_id); -- -- /* We also need to restore inferior status to that before the -- dummy call. */ -- restore_inferior_status (inf_status); -+ /* The user wants the context restored. Calling error will -+ run inf_status_cleanup, which does all the work. */ - - /* FIXME: Insert a bunch of wrap_here; name can be very - long if it's a C++ name with arguments and stuff. */ -Index: gdb-6.8.50.20090302/gdb/infcmd.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infcmd.c 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/infcmd.c 2009-05-09 21:27:23.000000000 +0200 -@@ -52,6 +52,7 @@ - #include "cli/cli-decode.h" - #include "gdbthread.h" - #include "valprint.h" -+#include "inline-frame.h" - - /* Functions exported for general use, in inferior.h: */ - -@@ -744,6 +745,17 @@ Can't resume all threads and specify pro - continue_1 (all_threads); - } - -+/* Record the starting point of a "step" or "next" command. */ -+ -+static void -+set_step_frame (struct thread_info *tp) -+{ -+ struct symtab_and_line sal; -+ -+ find_frame_sal (get_current_frame (), &sal); -+ set_step_info (tp, get_current_frame (), sal); -+} -+ - /* Step until outside of current statement. */ - - static void -@@ -921,6 +933,20 @@ step_once (int skip_subroutines, int sin - THREAD is set. */ - struct thread_info *tp = inferior_thread (); - clear_proceed_status (); -+ set_step_frame (tp); -+ -+ /* Step at an inlined function behaves like "down". */ -+ if (!skip_subroutines && !single_inst -+ && inline_skipped_frames (inferior_ptid)) -+ { -+ step_into_inline_frame (inferior_ptid); -+ if (count > 1) -+ step_once (skip_subroutines, single_inst, count - 1, thread); -+ else -+ /* Pretend that we've stopped. */ -+ normal_stop (); -+ return; -+ } - - frame = get_current_frame (); - tp->step_frame_id = get_frame_id (frame); -@@ -1173,6 +1199,7 @@ until_next_command (int from_tty) - clear_proceed_status (); - - frame = get_current_frame (); -+ set_step_frame (tp); - - /* Step until either exited from this function or greater - than the current line (if in symbolic section) or pc (if -@@ -1200,7 +1227,6 @@ until_next_command (int from_tty) - } - - tp->step_over_calls = STEP_OVER_ALL; -- tp->step_frame_id = get_frame_id (frame); - - tp->step_multi = 0; /* Only one call to proceed */ - -@@ -1533,6 +1559,37 @@ finish_command (char *arg, int from_tty) - - clear_proceed_status (); - -+ /* Finishing from an inline frame is completely different. We don't -+ try to show the "return value" - no way to locate it. So we do -+ not need a completion. */ -+ if (get_frame_type (get_selected_frame (_("No selected frame."))) -+ == INLINE_FRAME) -+ { -+ struct thread_info *tp = inferior_thread (); -+ -+ /* Claim we are stepping in the calling frame. An empty step -+ range means that we will stop once we aren't in a function -+ called by that frame. We don't use the magic "1" value for -+ step_range_end, because then infrun will think this is nexti, -+ and not step over the rest of this inlined function call. */ -+ struct symtab_and_line empty_sal; -+ init_sal (&empty_sal); -+ set_step_info (tp, frame, empty_sal); -+ tp->step_range_start = tp->step_range_end = get_frame_pc (frame); -+ tp->step_over_calls = STEP_OVER_ALL; -+ -+ /* Print info on the selected frame, including level number but not -+ source. */ -+ if (from_tty) -+ { -+ printf_filtered (_("Run till exit from ")); -+ print_stack_frame (get_selected_frame (NULL), 1, LOCATION); -+ } -+ -+ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1); -+ return; -+ } -+ - /* Find the function we will return from. */ - - function = find_pc_function (get_frame_pc (get_selected_frame (NULL))); -Index: gdb-6.8.50.20090302/gdb/inferior.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/inferior.h 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/inferior.h 2009-05-09 21:27:23.000000000 +0200 -@@ -259,6 +259,9 @@ extern void error_is_running (void); - /* Calls error_is_running if the current thread is running. */ - extern void ensure_not_running (void); - -+void set_step_info (struct thread_info *tp, struct frame_info *frame, -+ struct symtab_and_line sal); -+ - /* From infcmd.c */ - - extern void tty_command (char *, int); -Index: gdb-6.8.50.20090302/gdb/infrun.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/infrun.c 2009-05-09 21:27:14.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/infrun.c 2009-05-09 21:27:23.000000000 +0200 -@@ -48,6 +48,7 @@ - #include "gdb_assert.h" - #include "mi/mi-common.h" - #include "event-top.h" -+#include "inline-frame.h" - - /* Prototypes for local functions */ - -@@ -205,7 +206,7 @@ static unsigned char *signal_program; - - /* Value to pass to target_resume() to cause all threads to resume */ - --#define RESUME_ALL (pid_to_ptid (-1)) -+#define RESUME_ALL minus_one_ptid - - /* Command list pointer for the "stop" placeholder. */ - -@@ -1151,6 +1152,8 @@ a command like `return' or `jump' to con - step = 0; - } - -+ clear_inline_frame_state (resume_ptid); -+ - if (debug_displaced - && use_displaced_stepping (gdbarch) - && tp->trap_expected) -@@ -1192,6 +1195,7 @@ clear_proceed_status_thread (struct thre - tp->step_range_start = 0; - tp->step_range_end = 0; - tp->step_frame_id = null_frame_id; -+ tp->step_stack_frame_id = null_frame_id; - tp->step_over_calls = STEP_OVER_UNDEBUGGABLE; - tp->stop_requested = 0; - -@@ -1536,6 +1540,9 @@ init_wait_for_inferior (void) - init_infwait_state (); - - displaced_step_clear (); -+ -+ /* Discard any skipped inlined frames. */ -+ clear_inline_frame_state (minus_one_ptid); - } - - -@@ -1591,7 +1598,7 @@ struct execution_control_state - int wait_some_more; - }; - --void init_execution_control_state (struct execution_control_state *ecs); -+static void init_execution_control_state (struct execution_control_state *ecs); - - void handle_inferior_event (struct execution_control_state *ecs); - -@@ -1975,10 +1982,21 @@ fetch_inferior_event (void *client_data) - display_gdb_prompt (0); - } - -+/* Record the frame and location we're currently stepping through. */ -+void -+set_step_info (struct thread_info *tp, struct frame_info *frame, -+ struct symtab_and_line sal) -+{ -+ tp->step_frame_id = get_frame_id (frame); -+ tp->step_stack_frame_id = get_stack_frame_id (frame); -+ tp->current_symtab = sal.symtab; -+ tp->current_line = sal.line; -+} -+ - /* Prepare an execution control state for looping through a - wait_for_inferior-type loop. */ - --void -+static void - init_execution_control_state (struct execution_control_state *ecs) - { - ecs->random_signal = 0; -@@ -1989,16 +2007,10 @@ init_execution_control_state (struct exe - void - init_thread_stepping_state (struct thread_info *tss) - { -- struct symtab_and_line sal; -- - tss->stepping_over_breakpoint = 0; - tss->step_after_step_resume_breakpoint = 0; - tss->stepping_through_solib_after_catch = 0; - tss->stepping_through_solib_catchpoints = NULL; -- -- sal = find_pc_line (tss->prev_pc, 0); -- tss->current_line = sal.line; -- tss->current_symtab = sal.symtab; - } - - /* Return the cached copy of the last pid/waitstatus returned by -@@ -2212,6 +2224,22 @@ deal_with_syscall_event (struct executio - } - } - -+static int -+stepped_in_from (struct frame_info *frame, struct frame_id step_frame_id) -+{ -+ for (frame = get_prev_frame (frame); -+ frame != NULL; -+ frame = get_prev_frame (frame)) -+ { -+ if (frame_id_eq (get_frame_id (frame), step_frame_id)) -+ return 1; -+ if (get_frame_type (frame) != INLINE_FRAME) -+ break; -+ } -+ -+ return 0; -+} -+ - /* Given an execution control state that has been freshly filled in - by an event from the inferior, figure out what it means and take - appropriate action. */ -@@ -2906,6 +2934,12 @@ targets should add new threads to the th - ecs->random_signal = 0; - stopped_by_random_signal = 0; - -+ /* Hide inlined functions starting here, unless we just performed stepi or -+ nexti. After stepi and nexti, always show the innermost frame (not any -+ inline function call sites). */ -+ if (ecs->event_thread->step_range_end != 1) -+ skip_inline_frames (ecs->ptid); -+ - if (ecs->event_thread->stop_signal == TARGET_SIGNAL_TRAP - && ecs->event_thread->trap_expected - && gdbarch_single_step_through_delay_p (current_gdbarch) -@@ -3138,8 +3172,8 @@ process_event_stop_test: - && ecs->event_thread->stop_signal != TARGET_SIGNAL_0 - && (ecs->event_thread->step_range_start <= stop_pc - && stop_pc < ecs->event_thread->step_range_end) -- && frame_id_eq (get_frame_id (get_current_frame ()), -- ecs->event_thread->step_frame_id) -+ && frame_id_eq (get_stack_frame_id (get_current_frame ()), -+ ecs->event_thread->step_stack_frame_id) - && ecs->event_thread->step_resume_breakpoint == NULL) - { - /* The inferior is about to take a signal that will take it -@@ -3525,10 +3559,10 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( - NOTE: frame_id_eq will never report two invalid frame IDs as - being equal, so to get into this block, both the current and - previous frame must have valid frame IDs. */ -- if (!frame_id_eq (get_frame_id (get_current_frame ()), -- ecs->event_thread->step_frame_id) -+ if (!frame_id_eq (get_stack_frame_id (get_current_frame ()), -+ ecs->event_thread->step_stack_frame_id) - && (frame_id_eq (frame_unwind_id (get_current_frame ()), -- ecs->event_thread->step_frame_id) -+ ecs->event_thread->step_stack_frame_id) - || execution_direction == EXEC_REVERSE)) - { - CORE_ADDR real_stop_pc; -@@ -3771,6 +3805,82 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( - return; - } - -+ /* Look for "calls" to inlined functions, part one. If the inline -+ frame machinery detected some skipped call sites, we have entered -+ a new inline function. */ -+ -+ if (frame_id_eq (get_frame_id (get_current_frame ()), -+ ecs->event_thread->step_frame_id) -+ && inline_skipped_frames (ecs->ptid)) -+ { -+ struct symtab_and_line call_sal; -+ -+ if (debug_infrun) -+ fprintf_unfiltered (gdb_stdlog, -+ "infrun: stepped into inlined function\n"); -+ -+ find_frame_sal (get_current_frame (), &call_sal); -+ -+ if (ecs->event_thread->step_over_calls != STEP_OVER_ALL) -+ { -+ /* For "step", we're going to stop. But if the call site -+ for this inlined function is on the same source line as -+ we were previously stepping, go down into the function -+ first. Otherwise stop at the call site. */ -+ -+ if (call_sal.line == ecs->event_thread->current_line -+ && call_sal.symtab == ecs->event_thread->current_symtab) -+ step_into_inline_frame (ecs->ptid); -+ -+ ecs->event_thread->stop_step = 1; -+ print_stop_reason (END_STEPPING_RANGE, 0); -+ stop_stepping (ecs); -+ return; -+ } -+ else -+ { -+ /* For "next", we should stop at the call site if it is on a -+ different source line. Otherwise continue through the -+ inlined function. */ -+ if (call_sal.line == ecs->event_thread->current_line -+ && call_sal.symtab == ecs->event_thread->current_symtab) -+ keep_going (ecs); -+ else -+ { -+ ecs->event_thread->stop_step = 1; -+ print_stop_reason (END_STEPPING_RANGE, 0); -+ stop_stepping (ecs); -+ } -+ return; -+ } -+ } -+ -+ /* Look for "calls" to inlined functions, part two. If we are still -+ in the same real function we were stepping through, but we have -+ to go further up to find the exact frame ID, we are stepping -+ through a more inlined call beyond its call site. */ -+ -+ if (get_frame_type (get_current_frame ()) == INLINE_FRAME -+ && !frame_id_eq (get_frame_id (get_current_frame ()), -+ ecs->event_thread->step_frame_id) -+ && stepped_in_from (get_current_frame (), -+ ecs->event_thread->step_frame_id)) -+ { -+ if (debug_infrun) -+ fprintf_unfiltered (gdb_stdlog, -+ "infrun: stepping through inlined function\n"); -+ -+ if (ecs->event_thread->step_over_calls == STEP_OVER_ALL) -+ keep_going (ecs); -+ else -+ { -+ ecs->event_thread->stop_step = 1; -+ print_stop_reason (END_STEPPING_RANGE, 0); -+ stop_stepping (ecs); -+ } -+ return; -+ } -+ - if ((stop_pc == stop_pc_sal.pc) - && (ecs->event_thread->current_line != stop_pc_sal.line - || ecs->event_thread->current_symtab != stop_pc_sal.symtab)) -@@ -3796,9 +3906,7 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( - - ecs->event_thread->step_range_start = stop_pc_sal.pc; - ecs->event_thread->step_range_end = stop_pc_sal.end; -- ecs->event_thread->step_frame_id = get_frame_id (get_current_frame ()); -- ecs->event_thread->current_line = stop_pc_sal.line; -- ecs->event_thread->current_symtab = stop_pc_sal.symtab; -+ set_step_info (ecs->event_thread, get_current_frame (), stop_pc_sal); - - if (debug_infrun) - fprintf_unfiltered (gdb_stdlog, "infrun: keep going\n"); -@@ -5050,6 +5158,7 @@ struct inferior_status - CORE_ADDR step_range_start; - CORE_ADDR step_range_end; - struct frame_id step_frame_id; -+ struct frame_id step_stack_frame_id; - enum step_over_calls_kind step_over_calls; - CORE_ADDR step_resume_break_address; - int stop_after_trap; -@@ -5079,6 +5188,7 @@ save_inferior_status (void) - inf_status->step_range_start = tp->step_range_start; - inf_status->step_range_end = tp->step_range_end; - inf_status->step_frame_id = tp->step_frame_id; -+ inf_status->step_stack_frame_id = tp->step_stack_frame_id; - inf_status->step_over_calls = tp->step_over_calls; - inf_status->stop_after_trap = stop_after_trap; - inf_status->stop_soon = inf->stop_soon; -@@ -5132,6 +5242,7 @@ restore_inferior_status (struct inferior - tp->step_range_start = inf_status->step_range_start; - tp->step_range_end = inf_status->step_range_end; - tp->step_frame_id = inf_status->step_frame_id; -+ tp->step_stack_frame_id = inf_status->step_stack_frame_id; - tp->step_over_calls = inf_status->step_over_calls; - stop_after_trap = inf_status->stop_after_trap; - inf->stop_soon = inf_status->stop_soon; -Index: gdb-6.8.50.20090302/gdb/inline-frame.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/inline-frame.c 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,382 @@ -+/* Inline frame unwinder for GDB. -+ -+ Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include "defs.h" -+#include "addrmap.h" -+#include "block.h" -+#include "frame-unwind.h" -+#include "inferior.h" -+#include "symtab.h" -+#include "vec.h" -+ -+#include "gdb_assert.h" -+ -+/* We need to save a few variables for every thread stopped at the -+ virtual call site of an inlined function. If there was always a -+ "struct thread_info", we could hang it off that; in the mean time, -+ keep our own list. */ -+struct inline_state -+{ -+ /* The thread this data relates to. It should be a currently -+ stopped thread; we assume thread IDs never change while the -+ thread is stopped. */ -+ ptid_t ptid; -+ -+ /* The number of inlined functions we are skipping. Each of these -+ functions can be stepped in to. */ -+ int skipped_frames; -+ -+ /* Only valid if SKIPPED_FRAMES is non-zero. This is the PC used -+ when calculating SKIPPED_FRAMES; used to check whether we have -+ moved to a new location by user request. If so, we invalidate -+ any skipped frames. */ -+ CORE_ADDR saved_pc; -+ -+ /* Only valid if SKIPPED_FRAMES is non-zero. This is the symbol -+ of the outermost skipped inline function. It's used to find the -+ call site of the current frame. */ -+ struct symbol *skipped_symbol; -+}; -+ -+typedef struct inline_state inline_state_s; -+DEF_VEC_O(inline_state_s); -+ -+static VEC(inline_state_s) *inline_states; -+ -+/* Locate saved inlined frame state for PTID, if it exists. */ -+ -+static struct inline_state * -+find_inline_frame_state (ptid_t ptid) -+{ -+ struct inline_state *state; -+ int ix; -+ -+ for (ix = 0; VEC_iterate (inline_state_s, inline_states, ix, state); ix++) -+ { -+ if (ptid_equal (state->ptid, ptid)) -+ return state; -+ } -+ -+ return NULL; -+} -+ -+/* Allocate saved inlined frame state for PTID. */ -+ -+static struct inline_state * -+allocate_inline_frame_state (ptid_t ptid) -+{ -+ struct inline_state *state; -+ -+ state = VEC_safe_push (inline_state_s, inline_states, NULL); -+ memset (state, 0, sizeof (*state)); -+ state->ptid = ptid; -+ -+ return state; -+} -+ -+/* Forget about any hidden inlined functions in PTID, which is new or -+ about to be resumed. If PTID is minus_one_ptid, forget about all -+ hidden inlined functions. */ -+ -+void -+clear_inline_frame_state (ptid_t ptid) -+{ -+ struct inline_state *state; -+ int ix; -+ -+ if (ptid_equal (ptid, minus_one_ptid)) -+ { -+ VEC_free (inline_state_s, inline_states); -+ return; -+ } -+ -+ for (ix = 0; VEC_iterate (inline_state_s, inline_states, ix, state); ix++) -+ if (ptid_equal (state->ptid, ptid)) -+ { -+ VEC_unordered_remove (inline_state_s, inline_states, ix); -+ return; -+ } -+} -+ -+static void -+inline_frame_this_id (struct frame_info *this_frame, -+ void **this_cache, -+ struct frame_id *this_id) -+{ -+ struct symbol *func; -+ -+ /* In order to have a stable frame ID for a given inline function, -+ we must get the stack / special addresses from the underlying -+ real frame's this_id method. So we must call get_prev_frame. -+ Because we are inlined into some function, there must be previous -+ frames, so this is safe - as long as we're careful not to -+ create any cycles. */ -+ *this_id = get_frame_id (get_prev_frame (this_frame)); -+ -+ /* We need a valid frame ID, so we need to be based on a valid -+ frame. FSF submission NOTE: this would be a good assertion to -+ apply to all frames, all the time. That would fix the ambiguity -+ of null_frame_id (between "no/any frame" and "the outermost -+ frame"). This will take work. */ -+ gdb_assert (frame_id_p (*this_id)); -+ -+ /* Future work NOTE: Alexandre Oliva applied a patch to GCC 4.3 -+ which generates DW_AT_entry_pc for inlined functions when -+ possible. If this attribute is available, we should use it -+ in the frame ID (and eventually, to set breakpoints). */ -+ func = get_frame_function (this_frame); -+ gdb_assert (func != NULL); -+ (*this_id).code_addr = BLOCK_START (SYMBOL_BLOCK_VALUE (func)); -+ (*this_id).inline_depth++; -+} -+ -+static struct value * -+inline_frame_prev_register (struct frame_info *this_frame, void **this_cache, -+ int regnum) -+{ -+ /* Use get_frame_register_value instead of -+ frame_unwind_got_register, to avoid requiring this frame's ID. -+ This frame's ID depends on the previous frame's ID (unusual), and -+ the previous frame's ID depends on this frame's unwound -+ registers. If unwinding registers from this frame called -+ get_frame_id, there would be a loop. -+ -+ Do not copy this code into any other unwinder! Inlined functions -+ are special; other unwinders must not have a dependency on the -+ previous frame's ID, and therefore can and should use -+ frame_unwind_got_register instead. */ -+ return get_frame_register_value (this_frame, regnum); -+} -+ -+/* Check whether we are at an inlining site that does not already -+ have an associated frame. */ -+ -+static int -+inline_frame_sniffer (const struct frame_unwind *self, -+ struct frame_info *this_frame, -+ void **this_cache) -+{ -+ CORE_ADDR this_pc; -+ struct block *frame_block, *cur_block; -+ int depth; -+ struct frame_info *next_frame; -+ struct inline_state *state = find_inline_frame_state (inferior_ptid); -+ -+ this_pc = get_frame_address_in_block (this_frame); -+ frame_block = block_for_pc (this_pc); -+ if (frame_block == NULL) -+ return 0; -+ -+ /* Calculate DEPTH, the number of inlined functions at this -+ location. */ -+ depth = 0; -+ cur_block = frame_block; -+ while (BLOCK_SUPERBLOCK (cur_block)) -+ { -+ if (block_inlined_p (cur_block)) -+ depth++; -+ -+ cur_block = BLOCK_SUPERBLOCK (cur_block); -+ } -+ -+ /* Check how many inlined functions already have frames. */ -+ for (next_frame = get_next_frame (this_frame); -+ next_frame && get_frame_type (next_frame) == INLINE_FRAME; -+ next_frame = get_next_frame (next_frame)) -+ { -+ gdb_assert (depth > 0); -+ depth--; -+ } -+ -+ /* If this is the topmost frame, or all frames above us are inlined, -+ then check whether we were requested to skip some frames (so they -+ can be stepped into later). */ -+ if (state != NULL && state->skipped_frames > 0 && next_frame == NULL) -+ { -+ if (this_pc != state->saved_pc) -+ state->skipped_frames = 0; -+ else -+ { -+ gdb_assert (depth >= state->skipped_frames); -+ depth -= state->skipped_frames; -+ } -+ } -+ -+ /* If all the inlined functions here already have frames, then pass -+ to the normal unwinder for this PC. */ -+ if (depth == 0) -+ return 0; -+ -+ /* If the next frame is an inlined function, but not the outermost, then -+ we are the next outer. If it is not an inlined function, then we -+ are the innermost inlined function of a different real frame. */ -+ return 1; -+} -+ -+const struct frame_unwind inline_frame_unwinder = { -+ INLINE_FRAME, -+ inline_frame_this_id, -+ inline_frame_prev_register, -+ NULL, -+ inline_frame_sniffer -+}; -+ -+const struct frame_unwind *const inline_frame_unwind = &inline_frame_unwinder; -+ -+/* Return non-zero if BLOCK, an inlined function block containing PC, -+ has a group of contiguous instructions starting at PC (but not -+ before it). */ -+ -+static int -+block_starting_point_at (CORE_ADDR pc, struct block *block) -+{ -+ struct blockvector *bv; -+ struct block *new_block; -+ -+ bv = blockvector_for_pc (pc, NULL); -+ if (BLOCKVECTOR_MAP (bv) == NULL) -+ return 0; -+ -+ new_block = addrmap_find (BLOCKVECTOR_MAP (bv), pc - 1); -+ if (new_block == NULL) -+ return 1; -+ -+ if (new_block == block || contained_in (new_block, block)) -+ return 0; -+ -+ /* The immediately preceeding address belongs to a different block, -+ which is not a child of this one. Treat this as an entrance into -+ BLOCK. */ -+ return 1; -+} -+ -+/* Skip all inlined functions whose call sites are at the current PC. -+ Frames for the hidden functions will not appear in the backtrace until the -+ user steps into them. */ -+ -+void -+skip_inline_frames (ptid_t ptid) -+{ -+ CORE_ADDR this_pc; -+ struct block *frame_block, *cur_block; -+ struct symbol *last_sym = NULL; -+ int skip_count = 0; -+ struct inline_state *state; -+ -+ /* This function is called right after reinitializing the frame -+ cache. We try not to do more unwinding than absolutely -+ necessary, for performance. */ -+ this_pc = get_frame_pc (get_current_frame ()); -+ frame_block = block_for_pc (this_pc); -+ -+ if (frame_block != NULL) -+ { -+ cur_block = frame_block; -+ while (BLOCK_SUPERBLOCK (cur_block)) -+ { -+ if (block_inlined_p (cur_block)) -+ { -+ /* See comments in inline_frame_this_id about this use -+ of BLOCK_START. */ -+ if (BLOCK_START (cur_block) == this_pc -+ || block_starting_point_at (this_pc, cur_block)) -+ { -+ skip_count++; -+ last_sym = BLOCK_FUNCTION (cur_block); -+ } -+ else -+ break; -+ } -+ cur_block = BLOCK_SUPERBLOCK (cur_block); -+ } -+ } -+ -+ gdb_assert (find_inline_frame_state (ptid) == NULL); -+ state = allocate_inline_frame_state (ptid); -+ state->skipped_frames = skip_count; -+ state->saved_pc = this_pc; -+ state->skipped_symbol = last_sym; -+ -+ if (skip_count != 0) -+ reinit_frame_cache (); -+} -+ -+/* Step into an inlined function by unhiding it. */ -+ -+void -+step_into_inline_frame (ptid_t ptid) -+{ -+ struct inline_state *state = find_inline_frame_state (ptid); -+ -+ gdb_assert (state != NULL && state->skipped_frames > 0); -+ state->skipped_frames--; -+ reinit_frame_cache (); -+} -+ -+/* Return the number of hidden functions inlined into the current -+ frame. */ -+ -+int -+inline_skipped_frames (ptid_t ptid) -+{ -+ struct inline_state *state = find_inline_frame_state (ptid); -+ -+ if (state == NULL) -+ return 0; -+ else -+ return state->skipped_frames; -+} -+ -+/* If one or more inlined functions are hidden, return the symbol for -+ the function inlined into the current frame. */ -+ -+struct symbol * -+inline_skipped_symbol (ptid_t ptid) -+{ -+ struct inline_state *state = find_inline_frame_state (ptid); -+ -+ gdb_assert (state != NULL); -+ return state->skipped_symbol; -+} -+ -+/* Return the number of functions inlined into THIS_FRAME. Some of -+ the callees may not have associated frames (see -+ skip_inline_frames). */ -+ -+int -+frame_inlined_callees (struct frame_info *this_frame) -+{ -+ struct frame_info *next_frame; -+ int inline_count = 0; -+ -+ /* First count how many inlined functions at this PC have frames -+ above FRAME (are inlined into FRAME). */ -+ for (next_frame = get_next_frame (this_frame); -+ next_frame && get_frame_type (next_frame) == INLINE_FRAME; -+ next_frame = get_next_frame (next_frame)) -+ inline_count++; -+ -+ /* Simulate some most-inner inlined frames which were suppressed, so -+ they can be stepped into later. If we are unwinding already -+ outer frames from some non-inlined frame this does not apply. */ -+ if (next_frame == NULL) -+ inline_count += inline_skipped_frames (inferior_ptid); -+ -+ return inline_count; -+} -Index: gdb-6.8.50.20090302/gdb/inline-frame.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/inline-frame.h 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,62 @@ -+/* Definitions for inline frame support. -+ -+ Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#if !defined (INLINE_FRAME_H) -+#define INLINE_FRAME_H 1 -+ -+struct frame_info; -+struct frame_unwind; -+ -+/* The inline frame unwinder. */ -+ -+extern const struct frame_unwind *const inline_frame_unwind; -+ -+/* Skip all inlined functions whose call sites are at the current PC. -+ Frames for the hidden functions will not appear in the backtrace until the -+ user steps into them. */ -+ -+void skip_inline_frames (ptid_t ptid); -+ -+/* Forget about any hidden inlined functions in PTID, which is new or -+ about to be resumed. If PTID is minus_one_ptid, forget about all -+ hidden inlined functions. */ -+ -+void clear_inline_frame_state (ptid_t ptid); -+ -+/* Step into an inlined function by unhiding it. */ -+ -+void step_into_inline_frame (ptid_t ptid); -+ -+/* Return the number of hidden functions inlined into the current -+ frame. */ -+ -+int inline_skipped_frames (ptid_t ptid); -+ -+/* If one or more inlined functions are hidden, return the symbol for -+ the function inlined into the current frame. */ -+ -+struct symbol *inline_skipped_symbol (ptid_t ptid); -+ -+/* Return the number of functions inlined into THIS_FRAME. Some of -+ the callees may not have associated frames (see -+ skip_inline_frames). */ -+ -+int frame_inlined_callees (struct frame_info *this_frame); -+ -+#endif /* !defined (INLINE_FRAME_H) */ -Index: gdb-6.8.50.20090302/gdb/minsyms.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/minsyms.c 2009-05-09 21:27:14.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/minsyms.c 2009-05-09 21:27:23.000000000 +0200 -@@ -795,7 +795,7 @@ prim_record_minimal_symbol_and_info (con - - if (msym_bunch_index == BUNCH_SIZE) - { -- new = (struct msym_bunch *) xmalloc (sizeof (struct msym_bunch)); -+ new = XCALLOC (1, struct msym_bunch); - msym_bunch_index = 0; - new->next = msym_bunch; - msym_bunch = new; -Index: gdb-6.8.50.20090302/gdb/s390-tdep.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/s390-tdep.c 2009-02-22 02:02:19.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/s390-tdep.c 2009-05-09 21:27:23.000000000 +0200 -@@ -1182,6 +1182,7 @@ s390_prologue_frame_unwind_cache (struct - CORE_ADDR prev_sp; - int frame_pointer; - int size; -+ struct frame_info *next_frame; - - /* Try to find the function start address. If we can't find it, we don't - bother searching for it -- with modern compilers this would be mostly -@@ -1215,7 +1216,10 @@ s390_prologue_frame_unwind_cache (struct - /* FIXME: cagney/2004-05-01: This sanity check shouldn't be - needed, instead the code should simpliy rely on its - analysis. */ -- if (get_next_frame (this_frame) -+ next_frame = get_next_frame (this_frame); -+ while (next_frame && get_frame_type (next_frame) == INLINE_FRAME) -+ next_frame = get_next_frame (next_frame); -+ if (next_frame - && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME) - return 0; - -@@ -1261,8 +1265,11 @@ s390_prologue_frame_unwind_cache (struct - This can only happen in an innermost frame. */ - /* FIXME: cagney/2004-05-01: This sanity check shouldn't be needed, - instead the code should simpliy rely on its analysis. */ -+ next_frame = get_next_frame (this_frame); -+ while (next_frame && get_frame_type (next_frame) == INLINE_FRAME) -+ next_frame = get_next_frame (next_frame); - if (size > 0 -- && (!get_next_frame (this_frame) -+ && (next_frame == NULL - || get_frame_type (get_next_frame (this_frame)) != NORMAL_FRAME)) - { - /* See the comment in s390_in_function_epilogue_p on why this is -Index: gdb-6.8.50.20090302/gdb/stack.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/stack.c 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/stack.c 2009-05-09 21:27:23.000000000 +0200 -@@ -45,6 +45,7 @@ - #include "valprint.h" - #include "gdbthread.h" - #include "cp-support.h" -+#include "inline-frame.h" - - #include "gdb_assert.h" - #include -@@ -98,6 +99,30 @@ print_stack_frame_stub (void *args) - return 0; - } - -+/* Return 1 if we should display the address in addition to the location, -+ because we are in the middle of a statement. */ -+ -+static int -+frame_show_address (struct frame_info *frame, -+ struct symtab_and_line sal) -+{ -+ /* If there is a line number, but no PC, then there is no location -+ information associated with this sal. The only way that should -+ happen is for the call sites of inlined functions (SAL comes from -+ find_frame_sal). Otherwise, we would have some PC range if the -+ SAL came from a line table. */ -+ if (sal.line != 0 && sal.pc == 0 && sal.end == 0) -+ { -+ if (get_next_frame (frame) == NULL) -+ gdb_assert (inline_skipped_frames (inferior_ptid) > 0); -+ else -+ gdb_assert (get_frame_type (get_next_frame (frame)) == INLINE_FRAME); -+ return 0; -+ } -+ -+ return get_frame_pc (frame) != sal.pc; -+} -+ - /* Show or print a stack frame FRAME briefly. The output is format - according to PRINT_LEVEL and PRINT_WHAT printing the frame's - relative level, function name, argument list, and file name and -@@ -538,7 +563,7 @@ print_frame_info (struct frame_info *fra - { - int done = 0; - int mid_statement = ((print_what == SRC_LINE) -- && (get_frame_pc (frame) != sal.pc)); -+ && frame_show_address (frame, sal)); - - if (annotation_level) - done = identify_source_line (sal.symtab, sal.line, mid_statement, -@@ -591,7 +616,7 @@ find_frame_funname (struct frame_info *f - *funname = NULL; - *funlang = language_unknown; - -- func = find_pc_function (get_frame_address_in_block (frame)); -+ func = get_frame_function (frame); - if (func) - { - /* In certain pathological cases, the symtabs give the wrong -@@ -612,8 +637,13 @@ find_frame_funname (struct frame_info *f - changed (and we'll create a find_pc_minimal_function or some - such). */ - -- struct minimal_symbol *msymbol = -- lookup_minimal_symbol_by_pc (get_frame_address_in_block (frame)); -+ struct minimal_symbol *msymbol = NULL; -+ -+ /* Don't attempt to do this for inlined functions, which do not -+ have a corresponding minimal symbol. */ -+ if (!block_inlined_p (SYMBOL_BLOCK_VALUE (func))) -+ msymbol -+ = lookup_minimal_symbol_by_pc (get_frame_address_in_block (frame)); - - if (msymbol != NULL - && (SYMBOL_VALUE_ADDRESS (msymbol) -@@ -687,7 +717,7 @@ print_frame (struct frame_info *frame, i - } - get_user_print_options (&opts); - if (opts.addressprint) -- if (get_frame_pc (frame) != sal.pc || !sal.symtab -+ if (frame_show_address (frame, sal) || !sal.symtab - || print_what == LOC_AND_ADDRESS) - { - annotate_frame_address (); -@@ -867,8 +897,16 @@ parse_frame_specification_1 (const char - { - if (frame_id_eq (id, get_frame_id (fid))) - { -- while (frame_id_eq (id, frame_unwind_id (fid))) -- fid = get_prev_frame (fid); -+ struct frame_info *prev_frame; -+ -+ while (1) -+ { -+ prev_frame = get_prev_frame (fid); -+ if (!prev_frame -+ || !frame_id_eq (id, get_frame_id (prev_frame))) -+ break; -+ fid = prev_frame; -+ } - return fid; - } - } -@@ -1002,8 +1040,10 @@ frame_info (char *addr_exp, int from_tty - printf_filtered (_(" Outermost frame: %s\n"), - frame_stop_reason_string (reason)); - } -- -- if (calling_frame_info) -+ else if (get_frame_type (fi) == INLINE_FRAME) -+ printf_filtered (" inlined into frame %d", -+ frame_relative_level (get_prev_frame (fi))); -+ else - { - printf_filtered (" called by frame at "); - fputs_filtered (paddress (get_frame_base (calling_frame_info)), -@@ -1465,7 +1505,9 @@ print_frame_local_vars (struct frame_inf - if (print_block_frame_locals (block, frame, num_tabs, stream)) - values_printed = 1; - /* After handling the function's top-level block, stop. Don't -- continue to its superblock, the block of per-file symbols. */ -+ continue to its superblock, the block of per-file symbols. -+ Also do not continue to the containing function of an inlined -+ function. */ - if (BLOCK_FUNCTION (block)) - break; - block = BLOCK_SUPERBLOCK (block); -@@ -1536,7 +1578,9 @@ print_frame_label_vars (struct frame_inf - return; - - /* After handling the function's top-level block, stop. Don't -- continue to its superblock, the block of per-file symbols. */ -+ continue to its superblock, the block of per-file symbols. -+ Also do not continue to the containing function of an inlined -+ function. */ - if (BLOCK_FUNCTION (block)) - break; - block = BLOCK_SUPERBLOCK (block); -@@ -1806,6 +1850,9 @@ return_command (char *retval_exp, int fr - thisframe = get_selected_frame ("No selected frame."); - thisfun = get_frame_function (thisframe); - -+ if (get_frame_type (get_current_frame ()) == INLINE_FRAME) -+ error (_("Can not force return from an inlined function.")); -+ - /* Compute the return value. If the computation triggers an error, - let it bail. If the return type can't be handled, set - RETURN_VALUE to NULL, and QUERY_PREFIX to an informational -Index: gdb-6.8.50.20090302/gdb/symtab.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symtab.c 2009-05-09 21:27:14.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/symtab.c 2009-05-09 21:28:06.000000000 +0200 -@@ -1420,11 +1420,14 @@ lookup_symbol_aux_local (const char *nam - sym = lookup_symbol_aux_block (name, linkage_name, block_iterator, domain); - if (sym != NULL) - return sym; -+ -+ if (BLOCK_FUNCTION (block) != NULL && block_inlined_p (block)) -+ break; - - block_iterator = BLOCK_SUPERBLOCK (block_iterator); - } - -- /* We've reached the global block without finding a result. */ -+ /* We've reached the edge of the function without finding a result. */ - - return NULL; - } -@@ -2681,6 +2684,7 @@ find_function_start_sal (struct symbol * - - CORE_ADDR pc; - struct symtab_and_line sal; -+ struct block *b, *function_block; - - pc = BLOCK_START (block); - fixup_symbol_section (sym, objfile); -@@ -2719,6 +2723,25 @@ find_function_start_sal (struct symbol * - - sal.pc = pc; - -+ /* Check if we are now inside an inlined function. If we can, -+ use the call site of the function instead. */ -+ b = block_for_pc_sect (sal.pc, SYMBOL_OBJ_SECTION (sym)); -+ function_block = NULL; -+ while (b != NULL) -+ { -+ if (BLOCK_FUNCTION (b) != NULL && block_inlined_p (b)) -+ function_block = b; -+ else if (BLOCK_FUNCTION (b) != NULL) -+ break; -+ b = BLOCK_SUPERBLOCK (b); -+ } -+ if (function_block != NULL -+ && SYMBOL_LINE (BLOCK_FUNCTION (function_block)) != 0) -+ { -+ sal.line = SYMBOL_LINE (BLOCK_FUNCTION (function_block)); -+ sal.symtab = SYMBOL_SYMTAB (BLOCK_FUNCTION (function_block)); -+ } -+ - return sal; - } - -@@ -3741,6 +3764,24 @@ add_macro_name (const char *name, const - datum->text, datum->word); - } - -+static void -+completion_list_add_fields (struct symbol *sym, char *sym_text, -+ int sym_text_len, char *text, char *word) -+{ -+ if (SYMBOL_CLASS (sym) == LOC_TYPEDEF) -+ { -+ struct type *t = SYMBOL_TYPE (sym); -+ enum type_code c = TYPE_CODE (t); -+ int j; -+ -+ if (c == TYPE_CODE_UNION || c == TYPE_CODE_STRUCT) -+ for (j = TYPE_N_BASECLASSES (t); j < TYPE_NFIELDS (t); j++) -+ if (TYPE_FIELD_NAME (t, j)) -+ completion_list_add_name (TYPE_FIELD_NAME (t, j), -+ sym_text, sym_text_len, text, word); -+ } -+} -+ - char ** - default_make_symbol_completion_list (char *text, char *word) - { -@@ -3753,9 +3794,9 @@ default_make_symbol_completion_list (cha - struct partial_symtab *ps; - struct minimal_symbol *msymbol; - struct objfile *objfile; -- struct block *b, *surrounding_static_block = 0; -+ struct block *b; -+ const struct block *surrounding_static_block, *surrounding_global_block; - struct dict_iterator iter; -- int j; - struct partial_symbol **psym; - /* The symbol we are completing on. Points in same buffer as text. */ - char *sym_text; -@@ -3865,41 +3906,43 @@ default_make_symbol_completion_list (cha - } - - /* Search upwards from currently selected frame (so that we can -- complete on local vars. */ -+ complete on local vars). Also catch fields of types defined in -+ this places which match our text string. Only complete on types -+ visible from current context. */ -+ -+ b = get_selected_block (0); -+ surrounding_static_block = block_static_block (b); -+ surrounding_global_block = block_global_block (b); -+ if (surrounding_static_block != NULL) -+ while (b != surrounding_static_block) -+ { -+ QUIT; - -- for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) -- { -- if (!BLOCK_SUPERBLOCK (b)) -- { -- surrounding_static_block = b; /* For elmin of dups */ -- } -+ ALL_BLOCK_SYMBOLS (b, iter, sym) -+ { -+ COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text, -+ word); -+ completion_list_add_fields (sym, sym_text, sym_text_len, text, -+ word); -+ } - -- /* Also catch fields of types defined in this places which match our -- text string. Only complete on types visible from current context. */ -+ /* Stop when we encounter an enclosing function. Do not stop for -+ non-inlined functions - the locals of the enclosing function -+ are in scope for a nested function. */ -+ if (BLOCK_FUNCTION (b) != NULL && block_inlined_p (b)) -+ break; -+ b = BLOCK_SUPERBLOCK (b); -+ } - -- ALL_BLOCK_SYMBOLS (b, iter, sym) -- { -- QUIT; -- COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text, word); -- if (SYMBOL_CLASS (sym) == LOC_TYPEDEF) -- { -- struct type *t = SYMBOL_TYPE (sym); -- enum type_code c = TYPE_CODE (t); -+ /* Add fields from the file's types; symbols will be added below. */ - -- if (c == TYPE_CODE_UNION || c == TYPE_CODE_STRUCT) -- { -- for (j = TYPE_N_BASECLASSES (t); j < TYPE_NFIELDS (t); j++) -- { -- if (TYPE_FIELD_NAME (t, j)) -- { -- completion_list_add_name (TYPE_FIELD_NAME (t, j), -- sym_text, sym_text_len, text, word); -- } -- } -- } -- } -- } -- } -+ if (surrounding_static_block != NULL) -+ ALL_BLOCK_SYMBOLS (surrounding_static_block, iter, sym) -+ completion_list_add_fields (sym, sym_text, sym_text_len, text, word); -+ -+ if (surrounding_global_block != NULL) -+ ALL_BLOCK_SYMBOLS (surrounding_global_block, iter, sym) -+ completion_list_add_fields (sym, sym_text, sym_text_len, text, word); - - /* Go through the symtabs and check the externs and statics for - symbols which match. */ -@@ -3918,9 +3961,6 @@ default_make_symbol_completion_list (cha - { - QUIT; - b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK); -- /* Don't do this block twice. */ -- if (b == surrounding_static_block) -- continue; - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text, word); -@@ -4387,6 +4427,25 @@ skip_prologue_using_sal (CORE_ADDR func_ - line mark the prologue -> body transition. */ - if (sal.line >= prologue_sal.line) - break; -+ -+ /* The line number is smaller. Check that it's from the -+ same function, not something inlined. If it's inlined, -+ then there is no point comparing the line numbers. */ -+ bl = block_for_pc (prologue_sal.end); -+ while (bl) -+ { -+ if (block_inlined_p (bl)) -+ break; -+ if (BLOCK_FUNCTION (bl)) -+ { -+ bl = NULL; -+ break; -+ } -+ bl = BLOCK_SUPERBLOCK (bl); -+ } -+ if (bl != NULL) -+ break; -+ - /* The case in which compiler's optimizer/scheduler has - moved instructions into the prologue. We look ahead in - the function looking for address ranges whose -Index: gdb-6.8.50.20090302/gdb/symtab.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symtab.h 2009-05-09 21:27:09.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/symtab.h 2009-05-09 21:27:23.000000000 +0200 -@@ -565,9 +565,18 @@ struct symbol - - unsigned is_argument : 1; - -- /* Line number of definition. FIXME: Should we really make the assumption -- that nobody will try to debug files longer than 64K lines? What about -- machine generated programs? */ -+ /* Whether this is an inlined function (class LOC_BLOCK only). */ -+ unsigned is_inlined : 1; -+ -+ /* Line number of this symbol's definition, except for inlined -+ functions. For an inlined function (class LOC_BLOCK and -+ SYMBOL_INLINED set) this is the line number of the function's call -+ site. Inlined function symbols are not definitions, and they are -+ never found by symbol table lookup. -+ -+ FIXME: Should we really make the assumption that nobody will try -+ to debug files longer than 64K lines? What about machine -+ generated programs? */ - - unsigned short line; - -@@ -598,6 +607,7 @@ struct symbol - #define SYMBOL_DOMAIN(symbol) (symbol)->domain - #define SYMBOL_CLASS(symbol) (symbol)->aclass - #define SYMBOL_IS_ARGUMENT(symbol) (symbol)->is_argument -+#define SYMBOL_INLINED(symbol) (symbol)->is_inlined - #define SYMBOL_TYPE(symbol) (symbol)->type - #define SYMBOL_LINE(symbol) (symbol)->line - #define SYMBOL_SYMTAB(symbol) (symbol)->symtab -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.base/break.exp -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.base/break.exp 2009-01-19 20:05:01.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.base/break.exp 2009-05-09 21:27:23.000000000 +0200 -@@ -880,6 +880,13 @@ gdb_expect { - # marker4() is defined at line 46 when compiled with -DPROTOTYPES - pass "run until breakpoint set at small function, optimized file (line bp_location14)" - } -+ -re "Breakpoint $decimal, factorial \\(.*\\) .*\{\r\n$gdb_prompt" { -+ # GCC 4.3 emits bad line number information - see gcc/36748. -+ if { [test_compiler_info "gcc-4-3-*"] } { -+ setup_xfail *-*-* -+ } -+ fail "run until breakpoint set at small function, optimized file" -+ } - -re ".*$gdb_prompt " { - fail "run until breakpoint set at small function, optimized file" - } -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.cp/annota2.exp -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.cp/annota2.exp 2009-01-03 06:58:04.000000000 +0100 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.cp/annota2.exp 2009-05-09 21:27:23.000000000 +0200 -@@ -119,10 +119,11 @@ gdb_expect { - # continue until exit - # this will test: - # annotate-exited -+# `a.x is 1' is asynchronous regarding to `frames-invalid'. - # - send_gdb "continue\n" - gdb_expect { -- -re "\r\n\032\032post-prompt\r\nContinuing.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\na.x is 1\r\n\r\n\032\032exited 0\r\n\r\nProgram exited normally.\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ -+ -re "\r\n\032\032post-prompt\r\nContinuing.\r\n\r\n\032\032starting\r\n(\r\n\032\032frames-invalid\r\n)*a.x is 1\r\n(\r\n\032\032frames-invalid\r\n)*\r\n\032\032exited 0\r\n\r\nProgram exited normally.\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ - { pass "continue until exit" } - -re ".*$gdb_prompt$" { fail "continue to exit" } - timeout { fail "continue to exit (timeout)" } -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.c 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,47 @@ -+/* Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+int x, y; -+volatile int result; -+ -+void bar(void); -+ -+inline int func1(void) -+{ -+ bar (); -+ return x * y; -+} -+ -+inline int func2(void) -+{ -+ return x * func1 (); -+} -+ -+int main (void) -+{ -+ int val; -+ -+ x = 7; -+ y = 8; -+ bar (); -+ -+ val = func1 (); -+ result = val; -+ -+ val = func2 (); -+ result = val; -+ -+ return 0; -+} -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.exp -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-bt.exp 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,63 @@ -+# Copyright 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile "inline-bt" -+set srcfile ${testfile}.c -+set srcfile2 "inline-markers.c" -+set fullsrcfile "${srcdir}/${subdir}/${srcfile}" -+set fullsrcfile2 "${srcdir}/${subdir}/${srcfile2}" -+set sources [list ${fullsrcfile} ${fullsrcfile2}] -+set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile ${sources} ${binfile} \ -+ executable {debug optimize=-O2}] != "" } { -+ untested inline-bt.exp -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+runto_main -+ -+get_compiler_info $binfile -+get_debug_format -+if { [skip_inline_frame_tests] } { -+ untested inline-bt.exp -+ return -+} -+ -+set line1 [gdb_get_line_number "set breakpoint 1 here" ${fullsrcfile2}] -+gdb_breakpoint $srcfile2:$line1 -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)" -+gdb_test "backtrace" "#0 bar.*#1 .*main.*" "backtrace from bar (1)" -+gdb_test "info frame" ".*called by frame.*" "bar not inlined" -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)" -+gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*main.*" \ -+ "backtrace from bar (2)" -+gdb_test "up" "#1 .*func1.*" "up from bar (2)" -+gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)" -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (3)" -+gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*func2.*#3 .*main.*" \ -+ "backtrace from bar (3)" -+gdb_test "up" "#1 .*func1.*" "up from bar (3)" -+gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (3)" -+gdb_test "up" "#2 .*func2.*" "up from func1 (3)" -+gdb_test "info frame" ".*inlined into frame.*" "func2 inlined (3)" -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.c 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,85 @@ -+/* Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+int x, y; -+volatile int result; -+ -+void bar(void); -+void marker(void); -+void noinline(void); -+ -+inline int func1(void) -+{ -+ bar (); -+ return x * y; -+} -+ -+inline int func2(void) -+{ -+ return x * func1 (); -+} -+ -+inline void func3(void) -+{ -+ bar (); -+} -+ -+inline void outer_inline1(void) -+{ -+ noinline (); -+} -+ -+inline void outer_inline2(void) -+{ -+ outer_inline1 (); -+} -+ -+int main (void) -+{ /* start of main */ -+ int val; -+ -+ x = 7; -+ y = 8; -+ -+ result = func1 (); -+ result = func2 (); -+ marker (); -+ -+ result = 0; -+ result = 0; /* set breakpoint 3 here */ -+ -+ func1 (); /* first call */ -+ func1 (); /* second call */ -+ marker (); -+ -+ result = 0; -+ result = 0; /* set breakpoint 4 here */ -+ -+ func1 (); -+ func3 (); -+ marker (); -+ -+ result = 0; -+ result = 0; /* set breakpoint 5 here */ -+ -+ marker (); -+ func1 (); -+ func3 (); -+ marker (); /* set breakpoint 6 here */ -+ -+ outer_inline2 (); -+ -+ return 0; -+} -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-cmds.exp 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,279 @@ -+# Copyright 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile "inline-cmds" -+set srcfile "${testfile}.c" -+set srcfile2 "inline-markers.c" -+set fullsrcfile "${srcdir}/${subdir}/${srcfile}" -+set fullsrcfile2 "${srcdir}/${subdir}/${srcfile2}" -+set sources [list ${fullsrcfile} ${fullsrcfile2}] -+set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile $sources ${binfile} \ -+ executable {debug optimize=-O2}] != "" } { -+ untested inline-cmds.exp -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+gdb_test "set listsize 1" "" -+ -+runto_main -+ -+get_compiler_info $binfile -+get_debug_format -+if { [skip_inline_frame_tests] } { -+ untested inline-cmds.exp -+ return -+} -+ -+# First, check that the things we expected to be inlined really were, -+# and those that shouldn't be weren't. -+set line1 [gdb_get_line_number "set breakpoint 1 here" ${fullsrcfile2}] -+gdb_breakpoint $srcfile2:$line1 -+set line2 [gdb_get_line_number "set breakpoint 2 here" ${fullsrcfile2}] -+gdb_breakpoint $srcfile2:$line2 -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)" -+gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*main.*" \ -+ "backtrace from bar (1)" -+gdb_test "up" "#1 .*func1.*" "up from bar (1)" -+gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (1)" -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)" -+gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*func2.*#3 .*main.*" \ -+ "backtrace from bar (2)" -+gdb_test "up" "#1 .*func1.*" "up from bar (2)" -+gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)" -+gdb_test "up" "#2 .*func2.*" "up from func1 (2)" -+gdb_test "info frame" ".*inlined into frame.*" "func2 inlined (2)" -+ -+gdb_test "continue" ".*set breakpoint 2 here.*" "continue to marker" -+gdb_test "backtrace" "#0 marker.*#1 .*main.*" "backtrace from marker" -+gdb_test "info frame" ".*called by frame.*" "marker not inlined" -+ -+# Next, check that we can next over inlined functions. We should not end up -+# inside any of them. -+delete_breakpoints -+runto_main -+ -+# The lines before the first inlined call. -+set first "x = 7|y = 8" -+ -+# Some extra lines that end up in our stepping due to code motion. -+set opt "start of main|result = 0" -+ -+# We start this test with a "list" instead of a "next", in case the -+# first non-prologue instruction in main comes from the inlined function. -+set msg "next over inlined functions" -+gdb_test_multiple "list" $msg { -+ -re "($first|result = func1|result = func2|$opt).*$gdb_prompt $" { -+ send_gdb "next\r" -+ exp_continue -+ } -+ -re "marker \\\(\\\);\r\n$gdb_prompt $" { -+ pass $msg -+ } -+} -+ -+# Check that when next shows the call of func1, it has not happened yet. -+runto_main -+ -+# Like the return value of gdb_test: -1 something is wrong, 0 passed, 1 failed. -+set bt_test -1 -+set x_test -1 -+ -+set msg "next past inlined func1" -+gdb_test_multiple "list" $msg { -+ -re "($first|$opt).*$gdb_prompt $" { -+ send_gdb "next\r" -+ exp_continue -+ } -+ -re "result = func1 \\\(\\\);\r\n$gdb_prompt $" { -+ # Check whether x has been set. If 0, we may be doing something -+ # else associated with this line besides the inlined call - e.g. -+ # loading the address of result. If 7, we may be at the call site. -+ # If 15, though, we are past the call and back at the store to -+ # result - that's bad, we should have stepped out of func1 and -+ # kept stepping until the line changed. -+ set x_val -1 -+ gdb_test_multiple "print x" "" { -+ -re "\\\$$decimal = (\[0-9\]*)\r\n$gdb_prompt $" { -+ set x_val $expect_out(1,string) -+ } -+ -re "$gdb_prompt $" { } -+ } -+ if { $x_val == 0 || $x_val == 7 } { -+ if { $x_test != 1 } { -+ set x_test 0 -+ } -+ } else { -+ set x_test 1 -+ } -+ -+ # func1 should not show up on backtraces yet. -+ if { $bt_test != 1 } { -+ set bt_test [gdb_test "backtrace" "#0 \[^#]*main.*" ""] -+ } -+ -+ send_gdb "next\r" -+ exp_continue -+ } -+ -+ -re "result = func2 \\\(\\\);\r\n$gdb_prompt $" { -+ pass $msg -+ } -+} -+ -+if { $x_test == 0 } { -+ pass "print x before func1" -+} else { -+ fail "print x before func1" -+} -+ -+if { $bt_test == 0 } { -+ pass "backtrace does not include func1" -+} else { -+ fail "backtrace does not include func1" -+} -+ -+# Next, check that we can single step into inlined functions. We should always -+# "stop" at the call sites before entering them. -+runto_main -+ -+set msg "step into func1" -+set saw_call_site 0 -+gdb_test_multiple "list" $msg { -+ -re "($first|$opt).*$gdb_prompt $" { -+ send_gdb "step\r" -+ exp_continue -+ } -+ -re "result = func1.*$gdb_prompt $" { -+ set saw_call_site 1 -+ send_gdb "step\r" -+ exp_continue -+ } -+ -re "func1 \\\(\\\) at .*\r\n$decimal.*bar \\\(\\\);\r\n$gdb_prompt $" { -+ if { $saw_call_site } { -+ pass $msg -+ } else { -+ fail $msg -+ } -+ } -+} -+ -+# Check finish out of an inlined function. -+set msg "finish from func1" -+gdb_test_multiple "finish" $msg { -+ -re "result = func1 \\\(\\\);\r\n$gdb_prompt $" { -+ pass $msg -+ } -+ -re "($first|$opt).*$gdb_prompt $" { -+ # Whoops. We finished, but ended up back at an earlier line. Keep -+ # trying. -+ send_gdb "step\r" -+ exp_continue -+ } -+ -re "func1 \\\(\\\) at .*\r\n$decimal.*bar \\\(\\\);\r\n$gdb_prompt $" { -+ send_gdb "finish\r" -+ exp_continue -+ } -+} -+ -+# Test some corner cases involving consecutive inlined functions. -+set line3 [gdb_get_line_number "set breakpoint 3 here"] -+gdb_breakpoint $line3 -+gdb_continue_to_breakpoint "consecutive func1" -+ -+gdb_test "next" ".*func1 .*first call.*" "next to first func1" -+set msg "next to second func1" -+gdb_test_multiple "next" $msg { -+ -re ".*func1 .*second call.*$gdb_prompt $" { -+ pass $msg -+ } -+ -re ".*marker .*$gdb_prompt $" { -+ # This assembles to two consecutive call instructions. -+ # Both appear to be at the same line, because they're -+ # in the body of the same inlined function. This is -+ # reasonable for the line table. GDB should take the -+ # containing block and/or function into account when -+ # deciding how far to step. The single line table entry -+ # is actually two consecutive instances of the same line. -+ kfail gdb/NNNN $msg -+ } -+} -+ -+# It is easier when the two inlined functions are not on the same line. -+set line4 [gdb_get_line_number "set breakpoint 4 here"] -+gdb_breakpoint $line4 -+gdb_continue_to_breakpoint "func1 then func3" -+ -+gdb_test "next" ".*func1 \\\(\\\);" "next to func1 before func3" -+gdb_test "next" ".*func3 \\\(\\\);" "next to func3" -+ -+# Test finishing out of one thing and into another. -+set line5 [gdb_get_line_number "set breakpoint 5 here"] -+gdb_breakpoint $line5 -+gdb_continue_to_breakpoint "finish into func1" -+ -+gdb_test "next" ".*marker \\\(\\\);" "next to finish marker" -+gdb_test "step" ".*set breakpoint 2 here.*" "step into finish marker" -+gdb_test "finish" "func1 \\\(\\\);" "finish from marker to func1" -+ -+gdb_test "step" "bar \\\(\\\);" "step into func1 for finish" -+gdb_test "finish" "func3 \\\(\\\);" "finish from func1 to func3" -+ -+# Test a deeper call stack. -+set line6 [gdb_get_line_number "set breakpoint 6 here"] -+gdb_breakpoint $line6 -+gdb_continue_to_breakpoint "before the outer_inline call" -+gdb_test "step" "marker \\\(\\\) at .*" "reach 1 the outer_inline call" -+gdb_test "finish" "main \\\(\\\) at .*outer_inline2 \\\(\\\);" "reach outer_inline2" -+gdb_test "bt" "#0 main.*" "backtrace at main of outer_inline" -+gdb_test "step" "outer_inline2 \\\(\\\) at .*" "enter outer_inline2" -+gdb_test "bt" "#0 outer_inline2.*#1 main.*" "backtrace at outer_inline2" -+gdb_test "step" "outer_inline1 \\\(\\\) at .*" "enter outer_inline1 from outer_inline2" -+ -+set msg "backtrace at outer_inline1" -+gdb_test_multiple "bt" $msg { -+ -re "#0 outer_inline1.*#1 outer_inline2.*#2 main.*$gdb_prompt $" { -+ pass $msg -+ } -+ -re "#0 $hex in outer_inline1.*#1 outer_inline2.*#2 main.*$gdb_prompt $" { -+ # Binutils PR gas/6717. Gas moves .loc past .p2align and the -+ # leading nop of the inlined call appears to be on the same line -+ # as main's call to marker. -+ xfail $msg -+ gdb_test "step" "noinline \\\(\\\);" "step to call of noinline" -+ } -+} -+ -+gdb_test "step" "noinline \\\(\\\) at .*" "enter noinline from outer_inline1" -+gdb_test "bt" "#0 noinline.*#1 .*outer_inline1.*#2 .*outer_inline2.*#3 main.*" "backtrace at noinline from outer_inline1" -+gdb_test "step" "inlined_fn \\\(\\\) at .*" "enter inlined_fn from noinline" -+gdb_test "bt" "#0 inlined_fn.*#1 noinline.*#2 .*outer_inline1.*#3 .*outer_inline2.*#4 main.*" "backtrace at inlined_fn from noinline" -+gdb_test "info frame" ".*inlined into frame.*" "inlined_fn from noinline inlined" -+gdb_test "up" "#1 noinline.*" "up to noinline" -+gdb_test "info frame" ".*\n called by frame.*" "noinline from outer_inline1 not inlined" -+gdb_test "up" "#2 .*outer_inline1.*" "up to outer_inline1" -+gdb_test "info frame" ".*inlined into frame.*" "outer_inline1 inlined" -+gdb_test "up" "#3 .*outer_inline2.*" "up to outer_inline2" -+gdb_test "info frame" ".*inlined into frame.*" "outer_inline2 inlined" -+gdb_test "up" "#4 main.*" "up from outer_inline2" -+gdb_test "info frame" ".*\n caller of frame.*" "main not inlined" -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.c 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,52 @@ -+/* Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+int x, y; -+volatile int result; -+volatile int *array_p; -+ -+void bar(void); -+ -+inline int func1(int arg1) -+{ -+ int array[64]; -+ array_p = array; -+ array[0] = result; -+ array[1] = arg1; -+ bar (); -+ return x * y + array_p[0] * arg1; -+} -+ -+inline int func2(int arg2) -+{ -+ return x * func1 (arg2); -+} -+ -+int main (void) -+{ -+ int val; -+ -+ x = 7; -+ y = 8; -+ bar (); -+ -+ val = func1 (result); -+ result = val; -+ -+ val = func2 (result); -+ result = val; -+ -+ return 0; -+} -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.exp -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-locals.exp 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,118 @@ -+# Copyright 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile "inline-locals" -+set srcfile ${testfile}.c -+set srcfile2 "inline-markers.c" -+set fullsrcfile "${srcdir}/${subdir}/${srcfile}" -+set fullsrcfile2 "${srcdir}/${subdir}/${srcfile2}" -+set sources [list ${fullsrcfile} ${fullsrcfile2}] -+set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile ${sources} ${binfile} \ -+ executable {debug optimize=-O2}] != "" } { -+ untested inline-locals.exp -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+runto_main -+ -+get_compiler_info $binfile -+get_debug_format -+if { [skip_inline_var_tests] } { -+ untested inline-bt.exp -+ return -+} -+ -+set no_frames [skip_inline_frame_tests] -+ -+set line1 [gdb_get_line_number "set breakpoint 1 here" ${fullsrcfile2}] -+gdb_breakpoint $srcfile2:$line1 -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (1)" -+ -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (2)" -+ -+if { ! $no_frames } { -+ gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*main.*" \ -+ "backtrace from bar (2)" -+ gdb_test "up" "#1 .*func1 .* at .*" "up from bar (2)" -+ gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (2)" -+ gdb_test "info locals" "array = {.*}" "info locals above bar (2)" -+ -+ set msg "info args above bar (2)" -+ gdb_test_multiple "info args" $msg { -+ -re "arg1 = $decimal\r\n$gdb_prompt $" { -+ pass $msg -+ } -+ -re "arg1 = \r\n$gdb_prompt $" { -+ # GCC 4.3 loses location information for arg1. GCC 4.2 is OK. -+ if { [test_compiler_info "gcc-4-3-*"] } { -+ setup_xfail *-*-* -+ } -+ fail $msg -+ } -+ } -+} else { -+ gdb_test "up" "#1 .*main .* at .*" "up from bar (2)" -+ gdb_test "info locals" ".*arg1 = 0.*" "info locals above bar (2)" -+} -+ -+# Make sure that locals on the stack are found. This is an array to -+# prevent it from living in a register. -+gdb_test "print array\[0\]" "\\\$$decimal = 0" "print local (2)" -+ -+if { ! $no_frames } { -+ # Verify that we do not print out variables from the inlined -+ # function's caller. -+ gdb_test "print val" "No symbol \"val\" in current context\\." \ -+ "print out of scope local" -+} -+ -+# Repeat the tests from a depth of two inlined functions, and with a -+# more interesting value in the local array. -+gdb_test "continue" ".*set breakpoint 1 here.*" "continue to bar (3)" -+if { ! $no_frames } { -+ gdb_test "backtrace" "#0 bar.*#1 .*func1.*#2 .*func2.*#3 .*main.*" \ -+ "backtrace from bar (3)" -+ gdb_test "up" "#1 .*func1 .* at .*" "up from bar (3)" -+ gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (3)" -+ gdb_test "info locals" "array = {.*}" "info locals above bar (3)" -+ -+ set msg "info args above bar (3)" -+ gdb_test_multiple "info args" $msg { -+ -re "arg1 = $decimal\r\n$gdb_prompt $" { -+ pass $msg -+ } -+ -re "arg1 = \r\n$gdb_prompt $" { -+ # GCC 4.3 loses location information for arg1. GCC 4.2 is OK. -+ if { [test_compiler_info "gcc-4-3-*"] } { -+ setup_xfail *-*-* -+ } -+ fail $msg -+ } -+ } -+} else { -+ gdb_test "up" "#1 .*main .* at .*" "up from bar (3)" -+ gdb_test "info locals" ".*arg1 = 1.*" "info locals above bar (3a)" -+ gdb_test "info locals" ".*arg2 = 184.*" "info locals above bar (3b)" -+} -+ -+gdb_test "print array\[0\]" "\\\$$decimal = 184" "print local (3)" -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-markers.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/inline-markers.c 2009-05-09 21:27:23.000000000 +0200 -@@ -0,0 +1,36 @@ -+/* Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+extern int x, y; -+ -+void bar(void) -+{ -+ x += y; /* set breakpoint 1 here */ -+} -+ -+void marker(void) -+{ -+ x += y; /* set breakpoint 2 here */ -+} -+ -+inline void inlined_fn(void) -+{ -+ x += y; -+} -+ -+void noinline(void) -+{ -+ inlined_fn (); /* inlined */ -+} -Index: gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/lib/gdb.exp 2009-05-09 21:27:14.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/testsuite/lib/gdb.exp 2009-05-09 21:27:23.000000000 +0200 -@@ -1474,6 +1474,37 @@ proc skip_hp_tests {} { - return $skip_hp - } - -+# Return whether we should skip tests for showing inlined functions in -+# backtraces. Requires get_compiler_info and get_debug_format. -+ -+proc skip_inline_frame_tests {} { -+ # GDB only recognizes inlining information in DWARF 2 (DWARF 3). -+ if { ! [test_debug_format "DWARF 2"] } { -+ return 1 -+ } -+ -+ # GCC before 4.1 does not emit DW_AT_call_file / DW_AT_call_line. -+ if { ([test_compiler_info "gcc-2-*"] -+ || [test_compiler_info "gcc-3-*"] -+ || [test_compiler_info "gcc-4-0-*"]) } { -+ return 1 -+ } -+ -+ return 0 -+} -+ -+# Return whether we should skip tests for showing variables from -+# inlined functions. Requires get_compiler_info and get_debug_format. -+ -+proc skip_inline_var_tests {} { -+ # GDB only recognizes inlining information in DWARF 2 (DWARF 3). -+ if { ! [test_debug_format "DWARF 2"] } { -+ return 1 -+ } -+ -+ return 0 -+} -+ - set compiler_info "unknown" - set gcc_compiled 0 - set hp_cc_compiler 0 -Index: gdb-6.8.50.20090302/gdb/valops.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/valops.c 2009-05-09 21:27:10.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/valops.c 2009-05-09 21:27:23.000000000 +0200 -@@ -1072,7 +1072,7 @@ value_of_variable (struct symbol *var, s - frame = block_innermost_frame (b); - if (!frame) - { -- if (BLOCK_FUNCTION (b) -+ if (BLOCK_FUNCTION (b) && !block_inlined_p (b) - && SYMBOL_PRINT_NAME (BLOCK_FUNCTION (b))) - error (_("No frame is currently executing in block %s."), - SYMBOL_PRINT_NAME (BLOCK_FUNCTION (b))); -Index: gdb-6.8.50.20090302/gdb/Makefile.in -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/Makefile.in 2009-05-09 21:27:14.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/Makefile.in 2009-05-09 21:27:23.000000000 +0200 -@@ -667,6 +667,7 @@ SFILES = ada-exp.y ada-lang.c ada-typepr - inf-loop.c \ - infcall.c \ - infcmd.c inflow.c infrun.c \ -+ inline-frame.c \ - interps.c \ - jv-exp.y jv-lang.c jv-valprint.c jv-typeprint.c \ - language.c linespec.c \ -@@ -839,6 +840,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $ - user-regs.o \ - frame.o frame-unwind.o doublest.o \ - frame-base.o \ -+ inline-frame.o \ - gnu-v2-abi.o gnu-v3-abi.o cp-abi.o cp-support.o \ - cp-namespace.o \ - reggroups.o regset.o \ -Index: gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/Makefile.in -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/testsuite/gdb.opt/Makefile.in 2008-04-18 01:06:54.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/testsuite/gdb.opt/Makefile.in 2009-05-09 21:27:23.000000000 +0200 -@@ -1,7 +1,7 @@ - VPATH = @srcdir@ - srcdir = @srcdir@ - --EXECUTABLES = hello/hello -+EXECUTABLES = clobbered-registers-O2 inline-bt inline-cmds inline-locals - - MISCELLANEOUS = - diff --git a/gdb-6.8.50.20090302-upstream.patch b/gdb-6.8.50.20090302-upstream.patch deleted file mode 100644 index 513690d..0000000 --- a/gdb-6.8.50.20090302-upstream.patch +++ /dev/null @@ -1,747 +0,0 @@ -http://sourceware.org/ml/gdb-cvs/2009-06/msg00076.html - -gdb/ -2009-06-15 Phil Muldoon - - * infcall.c (show_unwind_on_terminating_exception_p): New - function. - (call_function_by_hand): Create breakpoint and clean-up call for - std::terminate.breakpoint. Add unwind_on_terminating_exception_p - gate. Pop frame on breakpoint hit. - (_initialize_infcall): Add add_setshow_boolean_cmd for - unwind-on-terminating-exception. - -gdb/doc/ -2009-06-15 Phil Muldoon - - * doc/gdb.texinfo (Calling): Document - set-unwind-on-terminating-exception usage. - -gdb/testsuite/ -2009-06-15 Phil Muldoon - - * gdb.cp/gdb2495.cc: New file. - * gdb.cp/gdb2495.exp: New file. - ---- src/gdb/infcall.c 2009/05/28 00:53:51 1.114 -+++ src/gdb/infcall.c 2009/06/15 12:11:36 1.115 -@@ -98,6 +98,30 @@ - value); - } - -+/* This boolean tells what gdb should do if a std::terminate call is -+ made while in a function called from gdb (call dummy). -+ As the confines of a single dummy stack prohibit out-of-frame -+ handlers from handling a raised exception, and as out-of-frame -+ handlers are common in C++, this can lead to no handler being found -+ by the unwinder, and a std::terminate call. This is a false positive. -+ If set, gdb unwinds the stack and restores the context to what it -+ was before the call. -+ -+ The default is to unwind the frame if a std::terminate call is -+ made. */ -+ -+static int unwind_on_terminating_exception_p = 1; -+ -+static void -+show_unwind_on_terminating_exception_p (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, -+ const char *value) -+ -+{ -+ fprintf_filtered (file, _("\ -+Unwind stack if a C++ exception is unhandled while in a call dummy is %s.\n"), -+ value); -+} - - /* Perform the standard coercions that are specified - for arguments to be passed to C or Ada functions. -@@ -416,6 +440,8 @@ - struct cleanup *args_cleanup; - struct frame_info *frame; - struct gdbarch *gdbarch; -+ struct breakpoint *terminate_bp = NULL; -+ struct minimal_symbol *tm; - ptid_t call_thread_ptid; - struct gdb_exception e; - const char *name; -@@ -716,6 +742,27 @@ - bpt->disposition = disp_del; - } - -+ /* Create a breakpoint in std::terminate. -+ If a C++ exception is raised in the dummy-frame, and the -+ exception handler is (normally, and expected to be) out-of-frame, -+ the default C++ handler will (wrongly) be called in an inferior -+ function call. This is wrong, as an exception can be normally -+ and legally handled out-of-frame. The confines of the dummy frame -+ prevent the unwinder from finding the correct handler (or any -+ handler, unless it is in-frame). The default handler calls -+ std::terminate. This will kill the inferior. Assert that -+ terminate should never be called in an inferior function -+ call. Place a momentary breakpoint in the std::terminate function -+ and if triggered in the call, rewind. */ -+ if (unwind_on_terminating_exception_p) -+ { -+ struct minimal_symbol *tm = lookup_minimal_symbol ("std::terminate()", -+ NULL, NULL); -+ if (tm != NULL) -+ terminate_bp = set_momentary_breakpoint_at_pc -+ (SYMBOL_VALUE_ADDRESS (tm), bp_breakpoint); -+ } -+ - /* Everything's ready, push all the info needed to restore the - caller (and identify the dummy-frame) onto the dummy-frame - stack. */ -@@ -726,6 +773,10 @@ - or discard it. */ - discard_cleanups (inf_status_cleanup); - -+ /* Register a clean-up for unwind_on_terminating_exception_breakpoint. */ -+ if (terminate_bp) -+ make_cleanup_delete_breakpoint (terminate_bp); -+ - /* - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - - If you're looking to implement asynchronous dummy-frames, then - just below is the place to chop this function in two.. */ -@@ -881,6 +932,38 @@ - - if (!stop_stack_dummy) - { -+ -+ /* Check if unwind on terminating exception behaviour is on. */ -+ if (unwind_on_terminating_exception_p) -+ { -+ /* Check that the breakpoint is our special std::terminate -+ breakpoint. If it is, we do not want to kill the inferior -+ in an inferior function call. Rewind, and warn the -+ user. */ -+ -+ if (terminate_bp != NULL -+ && (inferior_thread()->stop_bpstat->breakpoint_at->address -+ == terminate_bp->loc->address)) -+ { -+ /* We must get back to the frame we were before the -+ dummy call. */ -+ dummy_frame_pop (dummy_id); -+ -+ /* We also need to restore inferior status to that before the -+ dummy call. */ -+ restore_inferior_status (inf_status); -+ -+ error (_("\ -+The program being debugged entered a std::terminate call, most likely\n\ -+caused by an unhandled C++ exception. GDB blocked this call in order\n\ -+to prevent the program from being terminated, and has restored the\n\ -+context to its original state before the call.\n\ -+To change this behaviour use \"set unwind-on-terminating-exception off\".\n\ -+Evaluation of the expression containing the function (%s)\n\ -+will be abandoned."), -+ name); -+ } -+ } - /* We hit a breakpoint inside the FUNCTION. - Keep the dummy frame, the user may want to examine its state. - Discard inferior status, we're not at the same point -@@ -989,4 +1072,19 @@ - NULL, - show_unwind_on_signal_p, - &setlist, &showlist); -+ -+ add_setshow_boolean_cmd ("unwind-on-terminating-exception", no_class, -+ &unwind_on_terminating_exception_p, _("\ -+Set unwinding of stack if std::terminate is called while in call dummy."), _("\ -+Show unwinding of stack if std::terminate() is called while in a call dummy."), _("\ -+The unwind on terminating exception flag lets the user determine\n\ -+what gdb should do if a std::terminate() call is made from the\n\ -+default exception handler. If set, gdb unwinds the stack and restores\n\ -+the context to what it was before the call. If unset, gdb allows the\n\ -+std::terminate call to proceed.\n\ -+The default is to unwind the frame."), -+ NULL, -+ show_unwind_on_terminating_exception_p, -+ &setlist, &showlist); -+ - } ---- src/gdb/doc/gdb.texinfo 2009/06/11 11:57:46 1.599 -+++ src/gdb/doc/gdb.texinfo 2009/06/15 12:11:36 1.600 -@@ -12895,6 +12895,16 @@ - the function, or if you passed it incorrect arguments). What happens - in that case is controlled by the @code{set unwindonsignal} command. - -+Similarly, with a C@t{++} program it is possible for the function you -+call via the @code{print} or @code{call} command to generate an -+exception that is not handled due to the constraints of the dummy -+frame. In this case, any exception that is raised in the frame, but has -+an out-of-frame exception handler will not be found. GDB builds a -+dummy-frame for the inferior function call, and the unwinder cannot -+seek for exception handlers outside of this dummy-frame. What happens -+in that case is controlled by the -+@code{set unwind-on-terminating-exception} command. -+ - @table @code - @item set unwindonsignal - @kindex set unwindonsignal -@@ -12911,6 +12921,23 @@ - @kindex show unwindonsignal - Show the current setting of stack unwinding in the functions called by - @value{GDBN}. -+ -+@item set unwind-on-terminating-exception -+@kindex set unwind-on-terminating-exception -+@cindex unwind stack in called functions with unhandled exceptions -+@cindex call dummy stack unwinding on unhandled exception. -+Set unwinding of the stack if a C@t{++} exception is raised, but left -+unhandled while in a function that @value{GDBN} called in the program being -+debugged. If set to on (the default), @value{GDBN} unwinds the stack -+it created for the call and restores the context to what it was before -+the call. If set to off, @value{GDBN} the exception is delivered to -+the default C@t{++} exception handler and the inferior terminated. -+ -+@item show unwind-on-terminating-exception -+@kindex show unwind-on-terminating-exception -+Show the current setting of stack unwinding in the functions called by -+@value{GDBN}. -+ - @end table - - @cindex weak alias functions ---- src/gdb/testsuite/gdb.cp/gdb2495.cc -+++ src/gdb/testsuite/gdb.cp/gdb2495.cc 2009-06-16 12:49:45.874202000 +0000 -@@ -0,0 +1,89 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ */ -+ -+#include -+#include -+ -+using namespace std; -+ -+class SimpleException -+{ -+ -+public: -+ -+ void raise_signal (int dummy) -+ { -+ if (dummy > 0) -+ raise(SIGABRT); -+ } -+ -+ int no_throw_function () -+ { -+ return 1; -+ } -+ -+ void throw_function () -+ { -+ throw 1; -+ } -+ -+ int throw_function_with_handler () -+ { -+ try -+ { -+ throw 1; -+ } -+ catch (...) -+ { -+ cout << "Handled" << endl; -+ } -+ -+ return 2; -+ } -+ -+ void call_throw_function_no_handler () -+ { -+ throw_function (); -+ } -+ -+ void call_throw_function_handler () -+ { -+ throw_function_with_handler (); -+ } -+}; -+SimpleException exceptions; -+ -+int -+main() -+{ -+ /* Have to call these functions so GCC does not optimize them -+ away. */ -+ exceptions.raise_signal (-1); -+ exceptions.no_throw_function (); -+ exceptions.throw_function_with_handler (); -+ exceptions.call_throw_function_handler (); -+ try -+ { -+ exceptions.throw_function (); -+ exceptions.call_throw_function_no_handler (); -+ } -+ catch (...) -+ { -+ } -+ return 0; -+} ---- src/gdb/testsuite/gdb.cp/gdb2495.exp -+++ src/gdb/testsuite/gdb.cp/gdb2495.exp 2009-06-16 12:49:46.889492000 +0000 -@@ -0,0 +1,157 @@ -+# Copyright 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+ -+# In gdb inferior function calls, if a C++ exception is raised in the -+# dummy-frame, and the exception handler is (normally, and expected to -+# be) out-of-frame, the default C++ handler will (wrongly) be called -+# in an inferior function call. -+# This is incorrect as an exception can normally and legally be handled -+# out-of-frame. The confines of the dummy frame prevent the unwinder -+# from finding the correct handler (or any handler, unless it is -+# in-frame). The default handler calls std::terminate. This will kill -+# the inferior. Assert that terminate should never be called in an -+# inferior function call. These tests test the functionality around -+# unwinding that sequence and also tests the flag behaviour gating this -+# functionality. -+ -+# This test is largely based of gdb.base/callfuncs.exp. -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+if { [skip_cplus_tests] } { continue } -+ -+set prms_id 2495 -+set bug_id 0 -+ -+set testfile "gdb2495" -+set srcfile ${testfile}.cc -+set binfile $objdir/$subdir/$testfile -+ -+# Create and source the file that provides information about the compiler -+# used to compile the test case. -+if [get_compiler_info ${binfile} "c++"] { -+ return -1 -+} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { -+ untested gdb2495.exp -+ return -1 -+} -+ -+# Some targets can't do function calls, so don't even bother with this -+# test. -+if [target_info exists gdb,cannot_call_functions] { -+ setup_xfail "*-*-*" 2416 -+ fail "This target can not call functions" -+ continue -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+if ![runto_main] then { -+ perror "couldn't run to main" -+ continue -+} -+ -+# See http://sourceware.org/gdb/bugs/2495 -+ -+# Test normal baseline behaviour. Call a function that -+# does not raise an exception. -+gdb_test "p exceptions.no_throw_function()" " = 1" -+# And one that does but handles it in-frame. -+gdb_test "p exceptions.throw_function_with_handler()" " = 2" -+# Both should return normally. -+ -+# Test basic unwind. Call a function that raises an exception but -+# does not handle it. It should be rewound. -+gdb_test "p exceptions.throw_function()" \ -+ "The program being debugged entered a std::terminate call, .*" \ -+ "Call a function that raises an exception without a handler." -+ -+# Make sure that after rewinding we are back at the call parent. -+gdb_test "bt" \ -+ "#0 main.*" \ -+ "bt after returning from a popped frame" -+ -+# Make sure the only breakpoint is the one set via the runto_main -+# call and that the std::terminate breakpoint has evaporated and -+# cleaned-up. -+gdb_test "info breakpoints" \ -+ "gdb.cp/gdb2495\.cc.*" -+ -+# Turn off this new behaviour. -+gdb_test_multiple "set unwind-on-terminating-exception off" \ -+ "Turn unwind-on-terminating-exception off" { -+ -re "$gdb_prompt $" {pass "set unwinn-on-terminating-exception off"} -+ timeout {fail "(timeout) set unwind-on-terminating-exception off"} -+} -+ -+# Check that it is turned off. -+gdb_test "show unwind-on-terminating-exception" \ -+ "exception is unhandled while in a call dummy is off.*" \ -+ "Turn off unwind on terminating exception flag" -+ -+# Check that the old behaviour is restored. -+gdb_test "p exceptions.throw_function()" \ -+ "The program being debugged was signaled while in a function called .*" \ -+ "Call a function that raises an exception with unwinding off.." -+ -+# Restart the inferior back at main. -+if ![runto_main] then { -+ perror "couldn't run to main" -+ continue -+} -+ -+ -+# Check to see if the new behaviour alters the unwind signal -+# behaviour; it should not. Test both on and off states. -+ -+# Turn on unwind on signal behaviour. -+gdb_test_multiple "set unwindonsignal on" "Turn unwindonsignal on" { -+ -re "$gdb_prompt $" {pass "set unwindonsignal on"} -+ timeout {fail "(timeout) set unwindonsignal on"} -+} -+ -+# Check that it is turned on. -+gdb_test "show unwindonsignal" \ -+ "signal is received while in a call dummy is on.*" \ -+ "Turn on unwind on signal" -+ -+# Check to see if new behaviour interferes with -+# normal signal handling in inferior function calls. -+gdb_test "p exceptions.raise_signal(1)" \ -+ "To change this behavior use \"set unwindonsignal off\".*" -+ -+# And reverse - turn off again. -+gdb_test_multiple "set unwindonsignal off" "Turn unwindonsignal off" { -+ -re "$gdb_prompt $" {pass "set unwindonsignal off"} -+ timeout {fail "(timeout) set unwindonsignal off"} -+} -+ -+# Check that it is actually turned off. -+gdb_test "show unwindonsignal" \ -+ "signal is received while in a call dummy is off.*" \ -+ "Turn off unwind on signal" -+ -+# Check to see if new behaviour interferes with -+# normal signal handling in inferior function calls. -+gdb_test "p exceptions.raise_signal(1)" \ -+ "To change this behavior use \"set unwindonsignal on\".*" ---- src/gdb/testsuite/gdb.cp/Makefile.in 2009/02/03 01:09:01 1.5 -+++ src/gdb/testsuite/gdb.cp/Makefile.in 2009/06/15 12:11:37 1.6 -@@ -4,7 +4,7 @@ - EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \ - derivation inherit local member-ptr method misc \ - overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace \ -- ref-types ref-params method2 pr9594 -+ ref-types ref-params method2 pr9594 gdb2495 - - all info install-info dvi install uninstall installcheck check: - @echo "Nothing to be done for $@..." - - - -https://bugzilla.redhat.com/show_bug.cgi?id=471819 - -http://sourceware.org/ml/gdb-patches/2009-06/msg00837.html -http://sourceware.org/ml/gdb-cvs/2009-06/msg00194.html - -gdb/ -2009-06-29 Pedro Alves - - * infrun.c (handle_inferior_event): Context switch to the new - thread when resuming for a new_thread_event. - -http://sourceware.org/ml/gdb-patches/2009-06/msg00841.html -http://sourceware.org/ml/gdb-cvs/2009-06/msg00195.html - -gdb/testsuite/ -2009-06-29 Jan Kratochvil - - * gdb.threads/current-lwp-dead.exp, gdb.threads/current-lwp-dead.c: New. - ---- src/gdb/infrun.c 2009/06/28 00:20:22 1.396 -+++ src/gdb/infrun.c 2009/06/29 18:27:23 1.397 -@@ -2746,6 +2746,8 @@ - in either the OS or the native code). Therefore we need to - continue all threads in order to make progress. */ - -+ if (!ptid_equal (ecs->ptid, inferior_ptid)) -+ context_switch (ecs->ptid); - target_resume (RESUME_ALL, 0, TARGET_SIGNAL_0); - prepare_to_wait (ecs); - return; ---- src/gdb/testsuite/gdb.threads/current-lwp-dead.c -+++ src/gdb/testsuite/gdb.threads/current-lwp-dead.c 2009-06-29 18:59:59.860807000 +0000 -@@ -0,0 +1,75 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ -+ Do not use threads as we need to exploit a bug in LWP code masked by the -+ threads code otherwise. -+ -+ INFERIOR_PTID must point to exited LWP. Here we use the initial LWP as it -+ is automatically INFERIOR_PTID for GDB. -+ -+ Finally we need to call target_resume (RESUME_ALL, ...) which we invoke by -+ NEW_THREAD_EVENT (called from the new LWP as initial LWP is exited now). */ -+ -+#define _GNU_SOURCE -+#include -+#include -+#include -+#include -+ -+#define STACK_SIZE 0x1000 -+ -+static int -+fn_return (void *unused) -+{ -+ return 0; /* at-fn_return */ -+} -+ -+static int -+fn (void *unused) -+{ -+ int i; -+ unsigned char *stack; -+ int new_pid; -+ -+ i = sleep (1); -+ assert (i == 0); -+ -+ stack = malloc (STACK_SIZE); -+ assert (stack != NULL); -+ -+ new_pid = clone (fn_return, stack + STACK_SIZE, CLONE_FILES | CLONE_VM, NULL, -+ NULL, NULL, NULL); -+ assert (new_pid > 0); -+ -+ return 0; -+} -+ -+int -+main (int argc, char **argv) -+{ -+ unsigned char *stack; -+ int new_pid; -+ -+ stack = malloc (STACK_SIZE); -+ assert (stack != NULL); -+ -+ new_pid = clone (fn, stack + STACK_SIZE, CLONE_FILES | CLONE_VM, NULL, NULL, -+ NULL, NULL); -+ assert (new_pid > 0); -+ -+ return 0; -+} ---- src/gdb/testsuite/gdb.threads/current-lwp-dead.exp -+++ src/gdb/testsuite/gdb.threads/current-lwp-dead.exp 2009-06-29 19:00:01.014652000 +0000 -@@ -0,0 +1,31 @@ -+# This testcase is part of GDB, the GNU debugger. -+ -+# Copyright 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Please email any bugs, comments, and/or additions to this file to: -+# bug-gdb@gnu.org -+ -+if { [prepare_for_testing current-lwp-dead.exp current-lwp-dead] } { -+ return -1 -+} -+ -+if {[runto_main] <= 0} { -+ untested current-lwp-dead.exp -+ return -1 -+} -+ -+gdb_breakpoint "fn_return" -+gdb_continue_to_breakpoint "fn_return" ".*at-fn_return.*" - - - -[patch] testsuite: Fix multiple runs in parallel on a single host - -http://sourceware.org/ml/gdb-patches/2009-07/msg00008.html -http://sourceware.org/ml/gdb-cvs/2009-07/msg00051.html - -2009-07-06 Jan Kratochvil - - * lib/gdbserver-support.exp (gdbserver_start): Loop spawning - gdbserver increasing $portnum if "Can't bind address" has been seen. - ---- src/gdb/testsuite/lib/gdbserver-support.exp 2009/01/03 05:58:08 1.14 -+++ src/gdb/testsuite/lib/gdbserver-support.exp 2009/07/06 18:51:10 1.15 -@@ -209,26 +209,39 @@ - - set gdbserver [find_gdbserver] - -- # Export the host:port pair. -- set gdbport $debughost$portnum -- -- # Fire off the debug agent. -- set gdbserver_command "$gdbserver" -- if { $options != "" } { -- append gdbserver_command " $options" -- } -- append gdbserver_command " :$portnum" -- if { $arguments != "" } { -- append gdbserver_command " $arguments" -- } -+ # Loop till we find a free port. -+ while 1 { -+ # Export the host:port pair. -+ set gdbport $debughost$portnum -+ -+ # Fire off the debug agent. -+ set gdbserver_command "$gdbserver" -+ if { $options != "" } { -+ append gdbserver_command " $options" -+ } -+ append gdbserver_command " :$portnum" -+ if { $arguments != "" } { -+ append gdbserver_command " $arguments" -+ } - -- set server_spawn_id [remote_spawn target $gdbserver_command] -+ set server_spawn_id [remote_spawn target $gdbserver_command] - -- # Wait for the server to open its TCP socket, so that GDB can connect. -- expect { -- -i $server_spawn_id -- -notransfer -- -re "Listening on" { } -+ # Wait for the server to open its TCP socket, so that GDB can connect. -+ expect { -+ -i $server_spawn_id -+ -notransfer -+ -re "Listening on" { } -+ -re "Can't bind address: Address already in use\\.\r\n" { -+ verbose -log "Port $portnum is already in use." -+ if ![target_info exists gdb,socketport] { -+ # Bump the port number to avoid the conflict. -+ wait -i $expect_out(spawn_id) -+ incr portnum -+ continue -+ } -+ } -+ } -+ break - } - - # We can't just call close, because if gdbserver is local then that means - - - -http://sourceware.org/ml/gdb-cvs/2009-06/msg00203.html - -2009-06-30 Jan Kratochvil - - Remove racy FAILs relying just on the timeouts. - * gdb.base/setshow.exp (set annotate 2, show annotate (2)) - (annotation_level 2): Remove racy FAILs. - ---- src/gdb/testsuite/gdb.base/setshow.exp 2009/01/03 05:58:03 1.10 -+++ src/gdb/testsuite/gdb.base/setshow.exp 2009/06/30 18:28:12 1.11 -@@ -60,7 +60,6 @@ - gdb_expect { - -re ".*\032\032pre-prompt.*$gdb_prompt .*\032\032prompt.*$" \ - { pass "set annotate 2" } -- -re ".*$gdb_prompt $" { fail "set annotate 2" } - timeout { fail "(timeout) set annotate 2" } - } - -@@ -68,7 +67,6 @@ - gdb_expect { - -re ".*\032\032post-prompt.*Annotation_level is 2..*\032\032pre-prompt.*$gdb_prompt .*\032\032prompt.*$" \ - { pass "show annotate (2)" } -- -re ".*$gdb_prompt $" { fail "show annotate (2)" } - timeout { fail "(timeout) show annotate (2)" } - } - -@@ -77,7 +75,6 @@ - gdb_expect { - -re ".*\032\032post-prompt.*Line 1 of .* is at address .* but contains no code.*:1:0:beg:0x.*\032\032pre-prompt.*$gdb_prompt .*\032\032prompt.*$" \ - { pass "annotation_level 2" } -- -re ".*$gdb_prompt $" { fail "annotation_level 2" } - timeout { fail "(timeout) annotation_level 2" } - } - - - - -http://sourceware.org/ml/gdb-cvs/2009-06/msg00204.html - -2009-06-30 Jan Kratochvil - - * lib/mi-support.exp (mi_check_thread_states): Permit any output before - the expected result record. - ---- src/gdb/testsuite/lib/mi-support.exp 2009/05/28 01:09:20 1.84 -+++ src/gdb/testsuite/lib/mi-support.exp 2009/06/30 20:23:05 1.85 -@@ -1808,7 +1808,7 @@ - proc mi_check_thread_states { xstates test } { - global expect_out - set states [mi_reverse_list $xstates] -- set pattern "\\^done,threads=\\\[" -+ set pattern ".*\\^done,threads=\\\[" - foreach s $states { - set pattern "${pattern}(.*)state=\"$s\"" - } diff --git a/gdb-DW_OP_call_frame_cfa.patch b/gdb-DW_OP_call_frame_cfa.patch deleted file mode 100644 index 087f107..0000000 --- a/gdb-DW_OP_call_frame_cfa.patch +++ /dev/null @@ -1,167 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2009-06/msg00191.html - -GCC developers would like to change GCC to emit DW_OP_call_frame_cfa, -as this would reduce the size of the generated debuginfo. - -A prerequisite to this is that GDB understand this. So, this patch -implements this feature. This is PR 10224. - -I'm interested in feedback on this. I am not sure whether the -implementation of dwarf2_frame_cfa is ok. - -No test case since at some point GCC will start generating this -(perhaps optionally -- but I feel certain we'll do it by default in -Fedora), and since it therefore seemed like a lot of work for little -payoff. - -Tom - -2009-06-08 Tom Tromey - - PR gdb/10224: - * dwarf2loc.c: Include dwarf2-frame.h. - (dwarf_expr_frame_cfa): New function. - (dwarf2_evaluate_loc_desc): Initialize new field. - (needs_frame_frame_cfa): New function. - (dwarf2_loc_desc_needs_frame): Initialize new field. - * dwarf2expr.h (struct dwarf_expr_context) : New - field. - * dwarf2expr.c (execute_stack_op) : New - case. - * dwarf2-frame.h (dwarf2_frame_cfa): Declare. - * dwarf2-frame.c (no_get_frame_cfa): New function. - (execute_stack_op): Initialize new field. - (dwarf2_frame_cfa): New function. - -[ Backported for Fedora Rawhide. ] - ---- ./gdb/dwarf2-frame.c 2009-06-12 11:12:51.000000000 +0200 -+++ ./gdb/dwarf2-frame.c 2009-06-12 11:13:30.000000000 +0200 -@@ -306,6 +306,13 @@ no_get_frame_base (void *baton, gdb_byte - } - - static CORE_ADDR -+no_get_frame_cfa (void *baton) -+{ -+ internal_error (__FILE__, __LINE__, -+ _("Support for DW_OP_call_frame_cfa is unimplemented")); -+} -+ -+static CORE_ADDR - no_get_tls_address (void *baton, CORE_ADDR offset) - { - internal_error (__FILE__, __LINE__, -@@ -356,6 +363,7 @@ execute_stack_op (gdb_byte *exp, ULONGES - ctx->read_reg = read_reg; - ctx->read_mem = read_mem; - ctx->get_frame_base = no_get_frame_base; -+ ctx->get_frame_cfa = no_get_frame_cfa; - ctx->get_tls_address = no_get_tls_address; - - dwarf_expr_push (ctx, initial); -@@ -1221,6 +1229,13 @@ dwarf2_frame_base_address (struct frame_ - return cache->cfa; - } - -+CORE_ADDR -+dwarf2_frame_cfa (struct frame_info *this_frame) -+{ -+ void *cache = NULL; -+ return dwarf2_frame_base_address (this_frame, &cache); -+} -+ - static const struct frame_base dwarf2_frame_base = - { - &dwarf2_frame_unwind, ---- ./gdb/dwarf2-frame.h 2009-01-03 06:57:51.000000000 +0100 -+++ ./gdb/dwarf2-frame.h 2009-06-12 11:13:30.000000000 +0200 -@@ -118,4 +118,8 @@ extern const struct frame_base * - - void dwarf2_frame_build_info (struct objfile *objfile); - -+/* Compute the DWARF CFA for a frame. */ -+ -+CORE_ADDR dwarf2_frame_cfa (struct frame_info *this_frame); -+ - #endif /* dwarf2-frame.h */ ---- ./gdb/dwarf2expr.c 2009-06-12 11:12:51.000000000 +0200 -+++ ./gdb/dwarf2expr.c 2009-06-12 11:13:44.000000000 +0200 -@@ -697,6 +697,10 @@ execute_stack_op (struct dwarf_expr_cont - } - break; - -+ case DW_OP_call_frame_cfa: -+ result = (ctx->get_frame_cfa) (ctx->baton); -+ break; -+ - case DW_OP_GNU_push_tls_address: - /* Variable is at a constant offset in the thread-local - storage block into the objfile for the current thread and ---- ./gdb/dwarf2expr.h 2009-06-12 11:12:51.000000000 +0200 -+++ ./gdb/dwarf2expr.h 2009-06-12 11:15:36.000000000 +0200 -@@ -55,6 +55,9 @@ struct dwarf_expr_context - expression evaluation is complete. */ - void (*get_frame_base) (void *baton, gdb_byte **start, size_t *length); - -+ /* Return the CFA for the frame. */ -+ CORE_ADDR (*get_frame_cfa) (void *baton); -+ - /* Return the thread-local storage address for - DW_OP_GNU_push_tls_address. */ - CORE_ADDR (*get_tls_address) (void *baton, CORE_ADDR offset); ---- ./gdb/dwarf2loc.c 2009-06-12 11:12:55.000000000 +0200 -+++ ./gdb/dwarf2loc.c 2009-06-12 11:15:07.000000000 +0200 -@@ -32,6 +32,7 @@ - #include "objfiles.h" - #include "exceptions.h" - #include "block.h" -+#include "dwarf2-frame.h" - - #include "elf/dwarf2.h" - #include "dwarf2expr.h" -@@ -200,6 +201,13 @@ dwarf_expr_frame_base (void *baton, gdb_ - SYMBOL_PRINT_NAME (framefunc)); - } - -+static CORE_ADDR -+dwarf_expr_frame_cfa (void *baton) -+{ -+ struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton; -+ return dwarf2_frame_cfa (debaton->frame); -+} -+ - /* Using the objfile specified in BATON, find the address for the - current thread's thread-local storage with offset OFFSET. */ - static CORE_ADDR -@@ -286,6 +294,7 @@ dwarf_expr_prep_ctx (struct frame_info * - ctx->read_reg = dwarf_expr_read_reg; - ctx->read_mem = dwarf_expr_read_mem; - ctx->get_frame_base = dwarf_expr_frame_base; -+ ctx->get_frame_cfa = dwarf_expr_frame_cfa; - ctx->get_tls_address = dwarf_expr_tls_address; - ctx->get_object_address = dwarf_expr_object_address; - -@@ -439,6 +448,15 @@ needs_frame_frame_base (void *baton, gdb - nf_baton->needs_frame = 1; - } - -+/* CFA accesses require a frame. */ -+static CORE_ADDR -+needs_frame_frame_cfa (void *baton) -+{ -+ struct needs_frame_baton *nf_baton = baton; -+ nf_baton->needs_frame = 1; -+ return 1; -+} -+ - /* Thread-local accesses do require a frame. */ - static CORE_ADDR - needs_frame_tls_address (void *baton, CORE_ADDR offset) -@@ -468,6 +486,7 @@ dwarf2_loc_desc_needs_frame (gdb_byte *d - ctx->read_reg = needs_frame_read_reg; - ctx->read_mem = needs_frame_read_mem; - ctx->get_frame_base = needs_frame_frame_base; -+ ctx->get_frame_cfa = needs_frame_frame_cfa; - ctx->get_tls_address = needs_frame_tls_address; - - dwarf_expr_eval (ctx, data, size); diff --git a/gdb-archer.patch b/gdb-archer.patch index b96eef4..6ad7170 100644 --- a/gdb-archer.patch +++ b/gdb-archer.patch @@ -2,3725 +2,25 @@ http://sourceware.org/gdb/wiki/ProjectArcher http://sourceware.org/gdb/wiki/ArcherBranchManagement GIT snapshot: -commit 17bfc0488f54aeeb7a9e20ef3caa7e31e8e985fb +commit 0222cb1f4ddd1eda32965e464cb60b1e44e110b2 branch `archer' - the merge of branches: -archer-jankratochvil-merge-expr - archer-keiths-expr-cumulative - (archer-swagiaal-using-directive) -archer-jankratochvil-misc -archer-jankratochvil-python - archer-jankratochvil-type-refcount - archer-tromey-python -archer-jankratochvil-vla - archer-jankratochvil-type-refcount -archer-pmuldoon-exception-rewind-master -archer-sergio-catch-syscall -archer-tromey-charset +archer-tromey-call-frame-cfa archer-tromey-delayed-symfile +archer-tromey-dw-op-value +archer-jankratochvil-vla +archer-jankratochvil-misc +archer-jankratochvil-expr-cumulative + archer-keiths-expr-cumulative +archer-jankratochvil-python + archer-tromey-python -diff --git a/bfd/po/es.po b/bfd/po/es.po -index 9f2ec21..e4410d7 100644 ---- a/bfd/po/es.po -+++ b/bfd/po/es.po -@@ -1,13 +1,14 @@ --# Mensajes en español para bfd 2.17.90. --# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. --# Cristian Othón Martínez Vera , 2002, 2003, 2004, 2005, 2006, 2007 -+# Mensajes en español para bfd 2.18.90. -+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -+# This file is distributed under the same license as the binutils package. -+# Cristian Othón Martínez Vera , 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 - # - msgid "" - msgstr "" --"Project-Id-Version: bfd 2.17.90\n" --"Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2007-08-06 16:21-0400\n" --"PO-Revision-Date: 2007-09-08 08:57-0500\n" -+"Project-Id-Version: bfd 2.18.90\n" -+"Report-Msgid-Bugs-To: bug-binutils@gnu.org\n" -+"POT-Creation-Date: 2008-09-09 15:56+0930\n" -+"PO-Revision-Date: 2009-03-03 22:20-0600\n" - "Last-Translator: Cristian Othón Martínez Vera \n" - "Language-Team: Spanish \n" - "MIME-Version: 1.0\n" -@@ -31,143 +32,143 @@ msgstr "%B: Tipo de reubicaci - msgid "%B: Bad relocation record imported: %d" - msgstr "%B: Registro de reubicación importado erróneo: %d" - --#: aoutx.h:1268 aoutx.h:1602 -+#: aoutx.h:1268 aoutx.h:1604 - #, c-format - msgid "%s: can not represent section `%s' in a.out object file format" - msgstr "%s: no se puede representar la sección `%s' en el fichero objeto de formato a.out" - --#: aoutx.h:1568 -+#: aoutx.h:1570 - #, c-format - msgid "%s: can not represent section for symbol `%s' in a.out object file format" - msgstr "%s: no se puede representar la sección para el símbolo `%s' en el fichero objeto de formato a.out" - --#: aoutx.h:1570 -+#: aoutx.h:1572 - msgid "*unknown*" - msgstr "*desconocido*" - --#: aoutx.h:3987 aoutx.h:4313 -+#: aoutx.h:3989 aoutx.h:4315 - msgid "%P: %B: unexpected relocation type\n" - msgstr "%P: %B: tipo de reubicación inesperado\n" - --#: aoutx.h:5347 -+#: aoutx.h:5349 - #, c-format - msgid "%s: relocatable link from %s to %s not supported" - msgstr "%s: no se admite el enlace reubicable de %s a %s" - --#: archive.c:1766 -+#: archive.c:2046 - msgid "Warning: writing archive was slow: rewriting timestamp\n" - msgstr "Aviso: la escritura del fichero fue lenta: se reescribe la marca de tiempo\n" - - # ¡Uff! Si utilizáramos file=archivo, esta traducción sería imposible. cfuga --#: archive.c:2029 -+#: archive.c:2309 - msgid "Reading archive file mod timestamp" - msgstr "Se lee el archivo de la modificación de marca de tiempo del fichero" - --#: archive.c:2053 -+#: archive.c:2333 - msgid "Writing updated armap timestamp" - msgstr "Se escribe la marca de tiempo actualizada de armap" - --#: bfd.c:289 -+#: bfd.c:368 - msgid "No error" - msgstr "No hay error" - --#: bfd.c:290 -+#: bfd.c:369 - msgid "System call error" - msgstr "Error en la llamada al sistema" - --#: bfd.c:291 -+#: bfd.c:370 - msgid "Invalid bfd target" - msgstr "Objetivo bfd inválido" - --#: bfd.c:292 -+#: bfd.c:371 - msgid "File in wrong format" - msgstr "Fichero en formato erróneo" - --#: bfd.c:293 -+#: bfd.c:372 - msgid "Archive object file in wrong format" - msgstr "Archivo de ficheros objeto en formato erróneo" - --#: bfd.c:294 -+#: bfd.c:373 - msgid "Invalid operation" - msgstr "Operación inválida" - --#: bfd.c:295 -+#: bfd.c:374 - msgid "Memory exhausted" - msgstr "Memoria agotada" - --#: bfd.c:296 -+#: bfd.c:375 - msgid "No symbols" - msgstr "No hay símbolos" - --#: bfd.c:297 -+#: bfd.c:376 - msgid "Archive has no index; run ranlib to add one" - msgstr "El archivo no tiene índice; ejecute ranlib para agregar uno" - --#: bfd.c:298 -+#: bfd.c:377 - msgid "No more archived files" - msgstr "No hay más ficheros archivados" - --#: bfd.c:299 -+#: bfd.c:378 - msgid "Malformed archive" - msgstr "Archivo malformado" - --#: bfd.c:300 -+#: bfd.c:379 - msgid "File format not recognized" - msgstr "No se reconoce el formato del fichero" - --#: bfd.c:301 -+#: bfd.c:380 - msgid "File format is ambiguous" - msgstr "El formato del fichero es ambiguo" - --#: bfd.c:302 -+#: bfd.c:381 - msgid "Section has no contents" - msgstr "La sección no tiene contenidos" - --#: bfd.c:303 -+#: bfd.c:382 - msgid "Nonrepresentable section on output" - msgstr "Sección no representable en la salida" - --#: bfd.c:304 -+#: bfd.c:383 - msgid "Symbol needs debug section which does not exist" - msgstr "Un símbolo requiere de una sección de depuración, la cual no existe" - --#: bfd.c:305 -+#: bfd.c:384 - msgid "Bad value" - msgstr "Valor erróneo" - --#: bfd.c:306 -+#: bfd.c:385 - msgid "File truncated" - msgstr "Fichero truncado" - --#: bfd.c:307 -+#: bfd.c:386 - msgid "File too big" - msgstr "Fichero demasiado grande" - --#: bfd.c:308 -+#: bfd.c:387 - #, c-format - msgid "Error reading %s: %s" - msgstr "Error al leer %s: %s" - --#: bfd.c:309 -+#: bfd.c:388 - msgid "#" - msgstr "#" - --#: bfd.c:830 -+#: bfd.c:912 - #, c-format - msgid "BFD %s assertion fail %s:%d" - msgstr "falló la aseveración BFD %s %s:%d" - --#: bfd.c:842 -+#: bfd.c:924 - #, c-format - msgid "BFD %s internal error, aborting at %s line %d in %s\n" - msgstr "error interno de BFD %s, se aborta en %s línea %d en %s\n" - --#: bfd.c:846 -+#: bfd.c:928 - #, c-format - msgid "BFD %s internal error, aborting at %s line %d\n" - msgstr "error interno de BFD %s, se aborta en %s línea %d\n" - --#: bfd.c:848 -+#: bfd.c:930 - msgid "Please report this bug.\n" - msgstr "Por favor reporte este bicho.\n" - -@@ -186,14 +187,10 @@ msgstr "no se mapea: no se estableci - msgid "Warning: Writing section `%s' to huge (ie negative) file offset 0x%lx." - msgstr "Aviso: Se escribe la sección `%s' a un desplazamiento de fichero grande (pe negativo) 0x%lx." - --#: cache.c:238 -+#: cache.c:222 - msgid "reopening %B: %s\n" - msgstr "se reabre %B: %s\n" - --#: coff64-rs6000.c:2126 coff-rs6000.c:3624 --msgid "%B: symbol `%s' has unrecognized smclas %d" --msgstr "%B: el símbolo `%s' tiene smclas %d que no se reconoce" -- - #: coff-alpha.c:490 - msgid "" - "%B: Cannot handle compressed Alpha binaries.\n" -@@ -206,7 +203,7 @@ msgstr "" - msgid "%B: unknown/unsupported relocation type %d" - msgstr "%B: tipo de reubicación %d desconocida/no admitida" - --#: coff-alpha.c:899 coff-alpha.c:936 coff-alpha.c:2024 coff-mips.c:1002 -+#: coff-alpha.c:899 coff-alpha.c:936 coff-alpha.c:2024 coff-mips.c:1003 - msgid "GP relative relocation used when GP not defined" - msgstr "se usó una reubicación GP relativa cuando GP no estaba definido" - -@@ -222,22 +219,22 @@ msgstr "%B: tipo de reubicaci - msgid "%B: unsupported relocation: ALPHA_R_GPRELLOW" - msgstr "%B: tipo de reubicación no admitida: ALPHA_R_GPRELLOW" - --#: coff-alpha.c:1574 elf32-m32r.c:2487 elf64-alpha.c:3953 elf64-alpha.c:4106 --#: elf32-ia64.c:4675 elf64-ia64.c:4675 -+#: coff-alpha.c:1574 elf32-m32r.c:2487 elf64-alpha.c:3970 elf64-alpha.c:4125 -+#: elf32-ia64.c:4465 elf64-ia64.c:4465 - msgid "%B: unknown relocation type %d" - msgstr "%B: tipo de reubicación %d desconocido" - --#: coff-arm.c:1036 -+#: coff-arm.c:1039 - #, c-format - msgid "%B: unable to find THUMB glue '%s' for `%s'" - msgstr "%B: no se puede encontrar el pegamento THUMB '%s' para `%s'" - --#: coff-arm.c:1065 -+#: coff-arm.c:1068 - #, c-format - msgid "%B: unable to find ARM glue '%s' for `%s'" - msgstr "%B: no se puede encontrar el pegamento ARM '%s' para `%s'" - --#: coff-arm.c:1367 elf32-arm.c:4167 -+#: coff-arm.c:1370 elf32-arm.c:5453 - #, c-format - msgid "" - "%B(%s): warning: interworking not enabled.\n" -@@ -246,7 +243,7 @@ msgstr "" - "%B(%s): aviso: no se activó la interoperabilidad.\n" - " primer suceso: %B: llamada arm a thumb" - --#: coff-arm.c:1457 -+#: coff-arm.c:1460 - #, c-format - msgid "" - "%B(%s): warning: interworking not enabled.\n" -@@ -257,188 +254,118 @@ msgstr "" - " primer suceso: %B: llamada arm a thumb\n" - " considere reenlazar con --support-old-code activado" - --#: coff-arm.c:1750 cofflink.c:3018 coff-tic80.c:695 -+#: coff-arm.c:1755 coff-tic80.c:695 cofflink.c:3018 - msgid "%B: bad reloc address 0x%lx in section `%A'" - msgstr "%B: dirección de reubicación 0x%lx errónea en la sección `%A'" - --#: coff-arm.c:2075 -+#: coff-arm.c:2080 - msgid "%B: illegal symbol index in reloc: %d" - msgstr "%B: índice de símbolos ilegal en la reubicación: %d" - --#: coff-arm.c:2206 -+#: coff-arm.c:2211 - #, c-format - msgid "ERROR: %B is compiled for APCS-%d, whereas %B is compiled for APCS-%d" - msgstr "ERROR: %B está compilado para APCS-%d, mientras que %B está compilado para APCS-%d" - --#: coff-arm.c:2222 elf32-arm.c:7072 -+#: coff-arm.c:2227 elf32-arm.c:8563 - #, c-format - msgid "ERROR: %B passes floats in float registers, whereas %B passes them in integer registers" - msgstr "ERROR: %B pasa números de coma flotante en registros de coma flotante, mientras que %B los pasa en registros enteros" - --#: coff-arm.c:2225 elf32-arm.c:7076 -+#: coff-arm.c:2230 elf32-arm.c:8567 - #, c-format - msgid "ERROR: %B passes floats in integer registers, whereas %B passes them in float registers" - msgstr "ERROR: %B pasa números de coma flotante en registros enteros, mientras que %B los pasa en registros de coma flotante" - --#: coff-arm.c:2239 -+#: coff-arm.c:2244 - #, c-format - msgid "ERROR: %B is compiled as position independent code, whereas target %B is absolute position" - msgstr "ERROR: %B está compilado como código independiente de posición, mientras que el objetivo %B es de posición absoluta" - --#: coff-arm.c:2242 -+#: coff-arm.c:2247 - #, c-format - msgid "ERROR: %B is compiled as absolute position code, whereas target %B is position independent" - msgstr "ERROR: %B está compilado como código de posición absoluta, mientras que el objetivo %B es independiente de posición" - --#: coff-arm.c:2270 elf32-arm.c:7141 -+#: coff-arm.c:2275 elf32-arm.c:8632 - #, c-format - msgid "Warning: %B supports interworking, whereas %B does not" - msgstr "Aviso: %B admite interoperabilidad, mientras que %B no" - --#: coff-arm.c:2273 elf32-arm.c:7147 -+#: coff-arm.c:2278 elf32-arm.c:8638 - #, c-format - msgid "Warning: %B does not support interworking, whereas %B does" - msgstr "Aviso: %B no admite interoperabilidad, mientras que %B sí" - --#: coff-arm.c:2297 -+#: coff-arm.c:2302 - #, c-format - msgid "private flags = %x:" - msgstr "opciones privadas = %x:" - --#: coff-arm.c:2305 elf32-arm.c:7198 -+#: coff-arm.c:2310 elf32-arm.c:8689 - #, c-format - msgid " [floats passed in float registers]" - msgstr "[números de coma flotante pasados en registros de coma flotante]" - --#: coff-arm.c:2307 -+#: coff-arm.c:2312 - #, c-format - msgid " [floats passed in integer registers]" - msgstr "[números de coma flotante pasados en registros enteros]" - --#: coff-arm.c:2310 elf32-arm.c:7201 -+#: coff-arm.c:2315 elf32-arm.c:8692 - #, c-format - msgid " [position independent]" - msgstr "[independiente de posición]" - --#: coff-arm.c:2312 -+#: coff-arm.c:2317 - #, c-format - msgid " [absolute position]" - msgstr "[posición absoluta]" - --#: coff-arm.c:2316 -+#: coff-arm.c:2321 - #, c-format - msgid " [interworking flag not initialised]" - msgstr "[no se inicializó la opción de interoperabilidad]" - --#: coff-arm.c:2318 -+#: coff-arm.c:2323 - #, c-format - msgid " [interworking supported]" - msgstr "[admite interoperabilidad]" - --#: coff-arm.c:2320 -+#: coff-arm.c:2325 - #, c-format - msgid " [interworking not supported]" - msgstr "[no admite interoperabilidad]" - --#: coff-arm.c:2366 elf32-arm.c:6578 -+#: coff-arm.c:2371 elf32-arm.c:8050 - #, c-format - msgid "Warning: Not setting interworking flag of %B since it has already been specified as non-interworking" - msgstr "Aviso: No se establece la opción de interoperabilidad de %B ya que se había especificado con anterioridad como no interoperable" - --#: coff-arm.c:2370 elf32-arm.c:6582 -+#: coff-arm.c:2375 elf32-arm.c:8054 - #, c-format - msgid "Warning: Clearing the interworking flag of %B due to outside request" - msgstr "Aviso: Se limpia la opción de interoperabilidad de %B debido a una petición externa" - --#: coffcode.h:850 --msgid "%B: warning: COMDAT symbol '%s' does not match section name '%s'" --msgstr "%B: aviso: el símbolo COMDAT '%s' no coincide con el nombre de sección '%s'" -- --#. Generate a warning message rather using the 'unhandled' --#. variable as this will allow some .sys files generate by --#. other toolchains to be processed. See bugzilla issue 196. --#: coffcode.h:1062 --msgid "%B: Warning: Ignoring section flag IMAGE_SCN_MEM_NOT_PAGED in section %s" --msgstr "%B: Aviso: Se descarta la opción de sección IMAGE_SCN_MEM_NOT_PAGED en la sección %s" -- --#: coffcode.h:1117 --msgid "%B (%s): Section flag %s (0x%x) ignored" --msgstr "%B (%s): Se descarta la opción de sección %s (0x%x)" -- --#: coffcode.h:2236 --#, c-format --msgid "Unrecognized TI COFF target id '0x%x'" --msgstr "No se reconoce el id de objetivo TI COFF '0x%x'" -- --#: coffcode.h:2551 --msgid "%B: reloc against a non-existant symbol index: %ld" --msgstr "%B: reubicación contra un índice símbolo que no existe: %ld" -- --#: coffcode.h:4296 --msgid "%B: warning: line number table read failed" --msgstr "%B: aviso: falló la lectura de tabla de números de línea" -- --#: coffcode.h:4329 --msgid "%B: warning: illegal symbol index %ld in line numbers" --msgstr "%B: aviso: índice de símbolos %ld ilegal en los números de línea" -- --#: coffcode.h:4343 --msgid "%B: warning: duplicate line number information for `%s'" --msgstr "%B: aviso: información duplicada de números de línea para `%s'" -- --#: coffcode.h:4735 --msgid "%B: Unrecognized storage class %d for %s symbol `%s'" --msgstr "%B: Clase de almacenamiento %d no reconocida para %s símbolo `%s'" -- --#: coffcode.h:4861 --msgid "warning: %B: local symbol `%s' has no section" --msgstr "aviso: %B: el símbolo local `%s' no tiene sección" -- --#: coffcode.h:4966 coff-i860.c:601 coff-tic54x.c:393 --msgid "%B: warning: illegal symbol index %ld in relocs" --msgstr "%B: aviso: índice de símbolos %ld ilegal en reubicaciones" -- --#: coffcode.h:5004 --msgid "%B: illegal relocation type %d at address 0x%lx" --msgstr "%B: tipo de reubicación %d ilegal en la dirección 0x%lx" -- --#: coffgen.c:1518 --msgid "%B: bad string table size %lu" --msgstr "%B: tamaño de tabla de cadenas %lu erróneo" -- - #: coff-h8300.c:1122 - #, c-format - msgid "cannot handle R_MEM_INDIRECT reloc when using %s output" - msgstr "no se puede manejar la reubicación R_MEM_INDIRECT cuando se utiliza la salida %s" - --#: coff-i860.c:143 -+#: coff-i860.c:147 - #, c-format - msgid "Relocation `%s' not yet implemented\n" - msgstr "La reubicación `%s' aún no está implementada\n" - --#: coff-i960.c:138 coff-i960.c:501 -+#: coff-i860.c:605 coff-tic54x.c:398 coffcode.h:4975 -+msgid "%B: warning: illegal symbol index %ld in relocs" -+msgstr "%B: aviso: índice de símbolos %ld ilegal en reubicaciones" -+ -+#: coff-i960.c:143 coff-i960.c:506 - msgid "uncertain calling convention for non-COFF symbol" - msgstr "convención de llamada incierta para un símbolo que no es COFF" - --#: cofflink.c:513 elflink.c:4175 --msgid "Warning: type of symbol `%s' changed from %d to %d in %B" --msgstr "Aviso: el tipo del símbolo `%s' cambió de %d a %d en %B" -- --#: cofflink.c:2296 --msgid "%B: relocs in section `%A', but it has no contents" --msgstr "%B: reubicaciones en la sección `%A', pero no tiene contenido" -- --#: cofflink.c:2627 coffswap.h:824 --#, c-format --msgid "%s: %s: reloc overflow: 0x%lx > 0xffff" --msgstr "%s: %s: desbordamiento de reubicación: 0x%lx > 0xffff" -- --#: cofflink.c:2636 coffswap.h:810 --#, c-format --msgid "%s: warning: %s: line number overflow: 0x%lx > 0xffff" --msgstr "%s: aviso: %s: desbordamiento de número de línea: 0x%lx > 0xffff" -- --#: coff-m68k.c:506 elf32-bfin.c:5434 elf32-m68k.c:2393 -+#: coff-m68k.c:506 elf32-bfin.c:5510 elf32-m68k.c:3938 - msgid "unsupported reloc type" - msgstr "no se admite el tipo de reubicación" - -@@ -462,31 +389,35 @@ msgstr "La direcci - msgid "Unrecognized Reloc Type" - msgstr "Tipo de Reubicación no Reconocida" - --#: coff-mips.c:687 elf32-mips.c:958 elf32-score.c:345 elf64-mips.c:1911 --#: elfn32-mips.c:1752 -+#: coff-mips.c:688 elf32-mips.c:1014 elf32-score.c:345 elf64-mips.c:1991 -+#: elfn32-mips.c:1832 - msgid "GP relative relocation when _gp not defined" - msgstr "reubicación GP relativa cuando _gp no está definido" - --#: coff-or32.c:228 -+#: coff-or32.c:229 - msgid "Unrecognized reloc" - msgstr "Reubicación no reconocida" - --#: coff-rs6000.c:2799 -+#: coff-rs6000.c:2803 - #, c-format - msgid "%s: unsupported relocation type 0x%02x" - msgstr "%s: no se admite el tipo de reubicación 0x%02x" - --#: coff-rs6000.c:2892 -+#: coff-rs6000.c:2896 - #, c-format - msgid "%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry" - msgstr "%s: reubicación de TOC en 0x%x al símbolo `%s' sin entrada TOC" - --#: coff-tic4x.c:191 coff-tic54x.c:299 coff-tic80.c:458 -+#: coff-rs6000.c:3628 coff64-rs6000.c:2130 -+msgid "%B: symbol `%s' has unrecognized smclas %d" -+msgstr "%B: el símbolo `%s' tiene smclas %d que no se reconoce" -+ -+#: coff-tic4x.c:195 coff-tic54x.c:299 coff-tic80.c:458 - #, c-format - msgid "Unrecognized reloc type 0x%x" - msgstr "Tipo de reubicación 0x%x no reconocida" - --#: coff-tic4x.c:236 -+#: coff-tic4x.c:240 - #, c-format - msgid "%s: warning: illegal symbol index %ld in relocs" - msgstr "%s: aviso: íncide de símbolos %ld ilegal en reubicaciones" -@@ -496,6 +427,76 @@ msgstr "%s: aviso: - msgid "ignoring reloc %s\n" - msgstr "se descarta la reubicación %s\n" - -+#: coffcode.h:850 -+msgid "%B: warning: COMDAT symbol '%s' does not match section name '%s'" -+msgstr "%B: aviso: el símbolo COMDAT '%s' no coincide con el nombre de sección '%s'" -+ -+#. Generate a warning message rather using the 'unhandled' -+#. variable as this will allow some .sys files generate by -+#. other toolchains to be processed. See bugzilla issue 196. -+#: coffcode.h:1062 -+msgid "%B: Warning: Ignoring section flag IMAGE_SCN_MEM_NOT_PAGED in section %s" -+msgstr "%B: Aviso: Se descarta la opción de sección IMAGE_SCN_MEM_NOT_PAGED en la sección %s" -+ -+#: coffcode.h:1117 -+msgid "%B (%s): Section flag %s (0x%x) ignored" -+msgstr "%B (%s): Se descarta la opción de sección %s (0x%x)" -+ -+#: coffcode.h:2244 -+#, c-format -+msgid "Unrecognized TI COFF target id '0x%x'" -+msgstr "No se reconoce el id de objetivo TI COFF '0x%x'" -+ -+#: coffcode.h:2559 -+msgid "%B: reloc against a non-existant symbol index: %ld" -+msgstr "%B: reubicación contra un índice símbolo que no existe: %ld" -+ -+#: coffcode.h:4309 -+msgid "%B: warning: line number table read failed" -+msgstr "%B: aviso: falló la lectura de tabla de números de línea" -+ -+#: coffcode.h:4339 -+msgid "%B: warning: illegal symbol index %ld in line numbers" -+msgstr "%B: aviso: índice de símbolos %ld ilegal en los números de línea" -+ -+#: coffcode.h:4353 -+msgid "%B: warning: duplicate line number information for `%s'" -+msgstr "%B: aviso: información duplicada de números de línea para `%s'" -+ -+#: coffcode.h:4744 -+msgid "%B: Unrecognized storage class %d for %s symbol `%s'" -+msgstr "%B: Clase de almacenamiento %d no reconocida para %s símbolo `%s'" -+ -+#: coffcode.h:4870 -+msgid "warning: %B: local symbol `%s' has no section" -+msgstr "aviso: %B: el símbolo local `%s' no tiene sección" -+ -+#: coffcode.h:5013 -+msgid "%B: illegal relocation type %d at address 0x%lx" -+msgstr "%B: tipo de reubicación %d ilegal en la dirección 0x%lx" -+ -+#: coffgen.c:1518 -+msgid "%B: bad string table size %lu" -+msgstr "%B: tamaño de tabla de cadenas %lu erróneo" -+ -+#: cofflink.c:513 elflink.c:4218 -+msgid "Warning: type of symbol `%s' changed from %d to %d in %B" -+msgstr "Aviso: el tipo del símbolo `%s' cambió de %d a %d en %B" -+ -+#: cofflink.c:2296 -+msgid "%B: relocs in section `%A', but it has no contents" -+msgstr "%B: reubicaciones en la sección `%A', pero no tiene contenido" -+ -+#: cofflink.c:2627 coffswap.h:824 -+#, c-format -+msgid "%s: %s: reloc overflow: 0x%lx > 0xffff" -+msgstr "%s: %s: desbordamiento de reubicación: 0x%lx > 0xffff" -+ -+#: cofflink.c:2636 coffswap.h:810 -+#, c-format -+msgid "%s: warning: %s: line number overflow: 0x%lx > 0xffff" -+msgstr "%s: aviso: %s: desbordamiento de número de línea: 0x%lx > 0xffff" -+ - #: cpu-arm.c:189 cpu-arm.c:200 - msgid "ERROR: %B is compiled for the EP9312, whereas %B is compiled for XScale" - msgstr "ERROR: %B está compilado para el EP9312, mientras que %B está compilado para XScale" -@@ -505,66 +506,50 @@ msgstr "ERROR: %B est - msgid "warning: unable to update contents of %s section in %s" - msgstr "aviso: no se puede actualizar el contenido de la sección %s en %s" - --#: dwarf2.c:481 --msgid "Dwarf Error: Can't find .debug_str section." --msgstr "Error de Dwarf: No se puede encontrar la sección .debug_str." -- --#: dwarf2.c:499 -+#: dwarf2.c:424 - #, c-format --msgid "Dwarf Error: DW_FORM_strp offset (%lu) greater than or equal to .debug_str size (%lu)." --msgstr "Error de Dwarf: El desplazamiento DW_FROM_strp (%lu) es más grande o igual que el tamaño de .debug_str (%lu)." -+msgid "Dwarf Error: Can't find %s section." -+msgstr "Error de Dwarf: No se puede encontrar la sección %s." - --#: dwarf2.c:592 --msgid "Dwarf Error: Can't find .debug_abbrev section." --msgstr "Error de Dwarf: No se puede encontrar la sección .debug_abbrev." -+#: dwarf2.c:452 -+#, c-format -+msgid "Dwarf Error: unable to decompress %s section." -+msgstr "Error de Dwarf: no se puede descomprimir la sección %s." - --#: dwarf2.c:607 -+#: dwarf2.c:462 - #, c-format --msgid "Dwarf Error: Abbrev offset (%lu) greater than or equal to .debug_abbrev size (%lu)." --msgstr "Error de Dwarf: El desplazamiento de abreviatura (%lu) es más grande o igual que el tamaño de .debug_abbrev (%lu)." -+msgid "Dwarf Error: Offset (%lu) greater than or equal to %s size (%lu)." -+msgstr "Error de Dwarf: El desplazamiento (%lu) es mayor que o igual que el tamaño de %s (%lu)." - --#: dwarf2.c:822 -+#: dwarf2.c:849 - #, c-format - msgid "Dwarf Error: Invalid or unhandled FORM value: %u." - msgstr "Error de Dwarf: Valor de FORM inválido o no manejado: %u." - --#: dwarf2.c:1025 -+#: dwarf2.c:1063 - msgid "Dwarf Error: mangled line number section (bad file number)." - msgstr "Error de Dwarf: sección de números de línea revuelta (número erróneo de fichero)." - --#: dwarf2.c:1137 --msgid "Dwarf Error: Can't find .debug_line section." --msgstr "Error de Dwarf: No se puede encontrar lan sección .debug_line." -- --#: dwarf2.c:1154 --#, c-format --msgid "Dwarf Error: Line offset (%lu) greater than or equal to .debug_line size (%lu)." --msgstr "Error de Dwarf: El desplazamiento de línea (%lu) es más grande o igual que el tamaño de .debug_line (%lu)." -- --#: dwarf2.c:1380 -+#: dwarf2.c:1393 - msgid "Dwarf Error: mangled line number section." - msgstr "Error de Dwarf: sección de números de línea revuelta." - --#: dwarf2.c:1568 --msgid "Dwarf Error: Can't find .debug_ranges section." --msgstr "Error de Dwarf: No se puede encontrar lan sección .debug_ranges." -- --#: dwarf2.c:1731 dwarf2.c:1847 dwarf2.c:2119 -+#: dwarf2.c:1726 dwarf2.c:1842 dwarf2.c:2114 - #, c-format - msgid "Dwarf Error: Could not find abbrev number %u." - msgstr "Error de Dwarf: No se puede encontrar el número de abreviatura %u." - --#: dwarf2.c:2080 -+#: dwarf2.c:2075 - #, c-format - msgid "Dwarf Error: found dwarf version '%u', this reader only handles version 2 information." - msgstr "Error de Dwarf: se encontró la versión de dwarf '%u', este lector solamente maneja información de la versión 2." - --#: dwarf2.c:2087 -+#: dwarf2.c:2082 - #, c-format - msgid "Dwarf Error: found address size '%u', this reader can not handle sizes greater than '%u'." - msgstr "Error de Dwarf: se encontró el tamaño de dirección '%u', este lector no puede manejar tamaños más grandes que '%u'." - --#: dwarf2.c:2110 -+#: dwarf2.c:2105 - #, c-format - msgid "Dwarf Error: Bad abbrev number: %u." - msgstr "Error de Dwarf: Número de abreviación erróneo: %u." -@@ -646,35 +631,271 @@ msgstr "" - "\n" - " Tipo: %s" - --#: elf32-arm.c:2524 -+#: elf-attrs.c:582 -+msgid "ERROR: %B: Must be processed by '%s' toolchain" -+msgstr "ERROR: %B: Se debe procesar por la cadena de compilación '%s'" -+ -+#: elf-attrs.c:602 elf-attrs.c:621 -+msgid "ERROR: %B: Incompatible object tag '%s':%d" -+msgstr "ERROR: %B: Etiqueta de objeto '%s' incompatible:%d" -+ -+#: elf-eh-frame.c:866 -+msgid "%P: error in %B(%A); no .eh_frame_hdr table will be created.\n" -+msgstr "%P: error en %B(%A); no se creará la tabla .eh_frame_hdr.\n" -+ -+#: elf-eh-frame.c:1102 -+msgid "%P: fde encoding in %B(%A) prevents .eh_frame_hdr table being created.\n" -+msgstr "%P: la codificación fde en %B(%A) previene la creación de la tabla .eh_frame_hdr.\n" -+ -+#: elf-hppa.h:2241 elf-m10300.c:1546 elf32-arm.c:7954 elf32-i386.c:3582 -+#: elf32-m32r.c:2598 elf32-m68k.c:3516 elf32-ppc.c:7223 elf32-s390.c:3058 -+#: elf32-sh.c:3438 elf32-xtensa.c:3021 elf64-ppc.c:11528 elf64-s390.c:3019 -+#: elf64-sh64.c:1648 elf64-x86-64.c:3239 elfxx-sparc.c:3336 -+msgid "%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'" -+msgstr "%B(%A+0x%lx): reubicación %s sin resolución contra el símbolo `%s'" -+ -+#: elf-hppa.h:2266 elf-hppa.h:2280 -+msgid "%B(%A): warning: unresolvable relocation against symbol `%s'" -+msgstr "%B(%A): aviso: reubicación sin resolución contra el símbolo `%s'" -+ -+#: elf-m10200.c:456 elf-m10300.c:1609 elf32-avr.c:1250 elf32-bfin.c:3214 -+#: elf32-cr16.c:959 elf32-cr16c.c:790 elf32-cris.c:1538 elf32-crx.c:933 -+#: elf32-d10v.c:516 elf32-fr30.c:616 elf32-frv.c:4114 elf32-h8300.c:516 -+#: elf32-i860.c:1218 elf32-ip2k.c:1499 elf32-iq2000.c:691 elf32-m32c.c:560 -+#: elf32-m32r.c:3124 elf32-m68hc1x.c:1135 elf32-mep.c:541 elf32-msp430.c:493 -+#: elf32-mt.c:402 elf32-openrisc.c:411 elf32-score.c:2451 elf32-spu.c:4132 -+#: elf32-v850.c:1703 elf32-xstormy16.c:948 elf64-mmix.c:1533 -+msgid "internal error: out of range error" -+msgstr "error interno: error fuera de rango" -+ -+#: elf-m10200.c:460 elf-m10300.c:1613 elf32-avr.c:1254 elf32-bfin.c:3218 -+#: elf32-cr16.c:963 elf32-cr16c.c:794 elf32-cris.c:1542 elf32-crx.c:937 -+#: elf32-d10v.c:520 elf32-fr30.c:620 elf32-frv.c:4118 elf32-h8300.c:520 -+#: elf32-i860.c:1222 elf32-iq2000.c:695 elf32-m32c.c:564 elf32-m32r.c:3128 -+#: elf32-m68hc1x.c:1139 elf32-mep.c:545 elf32-msp430.c:497 -+#: elf32-openrisc.c:415 elf32-score.c:2455 elf32-spu.c:4136 elf32-v850.c:1707 -+#: elf32-xstormy16.c:952 elf64-mmix.c:1537 elfxx-mips.c:9065 -+msgid "internal error: unsupported relocation error" -+msgstr "error interno: error de reubicación no admitida" -+ -+#: elf-m10200.c:464 elf32-cr16.c:967 elf32-cr16c.c:798 elf32-crx.c:941 -+#: elf32-d10v.c:524 elf32-h8300.c:524 elf32-m32r.c:3132 elf32-m68hc1x.c:1143 -+#: elf32-score.c:2459 elf32-spu.c:4140 -+msgid "internal error: dangerous error" -+msgstr "error interno: error peligroso" -+ -+#: elf-m10200.c:468 elf-m10300.c:1626 elf32-avr.c:1262 elf32-bfin.c:3226 -+#: elf32-cr16.c:971 elf32-cr16c.c:802 elf32-cris.c:1550 elf32-crx.c:945 -+#: elf32-d10v.c:528 elf32-fr30.c:628 elf32-frv.c:4126 elf32-h8300.c:528 -+#: elf32-i860.c:1230 elf32-ip2k.c:1514 elf32-iq2000.c:703 elf32-m32c.c:572 -+#: elf32-m32r.c:3136 elf32-m68hc1x.c:1147 elf32-mep.c:553 elf32-msp430.c:505 -+#: elf32-mt.c:410 elf32-openrisc.c:423 elf32-score.c:2463 elf32-spu.c:4144 -+#: elf32-v850.c:1727 elf32-xstormy16.c:960 elf64-mmix.c:1545 -+msgid "internal error: unknown error" -+msgstr "error interno: error desconocido" -+ -+#: elf-m10300.c:1618 -+msgid "error: inappropriate relocation type for shared library (did you forget -fpic?)" -+msgstr "error: tipo de reubicación inapropiada para la biblioteca compartida (¿olvidó -fpic?)" -+ -+#: elf-m10300.c:1621 -+msgid "internal error: suspicious relocation type used in shared library" -+msgstr "error interno: se usó un tipo de reubicación sospechosa en una biblioteca compartida" -+ -+#: elf-m10300.c:4397 elf32-arm.c:9578 elf32-cris.c:2403 elf32-hppa.c:1921 -+#: elf32-i370.c:506 elf32-i386.c:1807 elf32-m32r.c:1931 elf32-m68k.c:2787 -+#: elf32-ppc.c:4693 elf32-s390.c:1687 elf32-sh.c:2583 elf32-vax.c:1055 -+#: elf64-ppc.c:6075 elf64-s390.c:1662 elf64-sh64.c:3432 elf64-x86-64.c:1641 -+#: elfxx-sparc.c:1828 -+#, c-format -+msgid "dynamic variable `%s' is zero size" -+msgstr "la variable dinámica `%s' es de tamaño cero" -+ -+#: elf.c:328 -+msgid "%B: invalid string offset %u >= %lu for section `%s'" -+msgstr "%B: desplazamiento de cadena inválido %u >= %lu para la sección `%s'" -+ -+#: elf.c:438 -+msgid "%B symbol number %lu references nonexistent SHT_SYMTAB_SHNDX section" -+msgstr "%B el número de símbolo %lu hace referencia a la sección inexistente SHT_SYMTAB_SHNDX" -+ -+#: elf.c:594 -+msgid "%B: Corrupt size field in group section header: 0x%lx" -+msgstr "%B: Tamaño de campo corrupto en el encabezado de la sección de grupo: 0x%lx" -+ -+#: elf.c:630 -+msgid "%B: invalid SHT_GROUP entry" -+msgstr "%B: entrada SHT_GROUP inválida" -+ -+#: elf.c:700 -+msgid "%B: no group info for section %A" -+msgstr "%B: no hay información de grupo para la sección %A" -+ -+#: elf.c:729 elf.c:2976 elflink.c:9746 -+msgid "%B: warning: sh_link not set for section `%A'" -+msgstr "%B: aviso: no se estableción sh_link para la sección `%A'" -+ -+#: elf.c:748 -+msgid "%B: sh_link [%d] in section `%A' is incorrect" -+msgstr "%B: sh_link [%d] en la sección `%A', es incorrecto" -+ -+#: elf.c:783 -+msgid "%B: unknown [%d] section `%s' in group [%s]" -+msgstr "%B: sección [%d] desconocida `%s' en el grupo [%s]" -+ -+#: elf.c:1159 -+#, c-format -+msgid "" -+"\n" -+"Program Header:\n" -+msgstr "" -+"\n" -+"Encabezado del Programa:\n" -+ -+#: elf.c:1201 -+#, c-format -+msgid "" -+"\n" -+"Dynamic Section:\n" -+msgstr "" -+"\n" -+"Sección Dinámica:\n" -+ -+#: elf.c:1337 -+#, c-format -+msgid "" -+"\n" -+"Version definitions:\n" -+msgstr "" -+"\n" -+"Definiciones de versión:\n" -+ -+#: elf.c:1362 -+#, c-format -+msgid "" -+"\n" -+"Version References:\n" -+msgstr "" -+"\n" -+"Referencias de Versión:\n" -+ -+#: elf.c:1367 -+#, c-format -+msgid " required from %s:\n" -+msgstr " requerido desde %s:\n" -+ -+#: elf.c:1755 -+msgid "%B: invalid link %lu for reloc section %s (index %u)" -+msgstr "%B: enlace %lu inválido para la sección de reubicación %s (índice %u)" -+ -+#: elf.c:1924 -+msgid "%B: don't know how to handle allocated, application specific section `%s' [0x%8x]" -+msgstr "%B: no se sabe cómo manejar lo reservado, aplicación específica de la sección `%s' [0x%8x]" -+ -+#: elf.c:1936 -+msgid "%B: don't know how to handle processor specific section `%s' [0x%8x]" -+msgstr "%B: no se sabe cómo manejar la sección específica de procesador `%s' [0x%8x]" -+ -+#: elf.c:1947 -+msgid "%B: don't know how to handle OS specific section `%s' [0x%8x]" -+msgstr "%B: no se sabe cómo manejar la sección específica de SO `%s' [0x%8x]" -+ -+#: elf.c:1957 -+msgid "%B: don't know how to handle section `%s' [0x%8x]" -+msgstr "%B: no se sabe cómo manejar la sección `%s' [0x%8x]" -+ -+#: elf.c:2555 -+#, c-format -+msgid "warning: section `%A' type changed to PROGBITS" -+msgstr "aviso: el tipo de la sección `%A' cambió a PROGBITS" -+ -+#: elf.c:2933 -+msgid "%B: sh_link of section `%A' points to discarded section `%A' of `%B'" -+msgstr "%B: sh_link de la sección `%A' apunta a la sección descartada `%A' de `%B'" -+ -+#: elf.c:2956 -+msgid "%B: sh_link of section `%A' points to removed section `%A' of `%B'" -+msgstr "%B: sh_link de la sección `%A' apunta a la sección descartada `%A' de `%B'" -+ -+#: elf.c:4300 -+msgid "%B: The first section in the PT_DYNAMIC segment is not the .dynamic section" -+msgstr "%B: La primera sección en el segmento PT_DYNAMIC no es la sección .dynamic" -+ -+#: elf.c:4327 -+msgid "%B: Not enough room for program headers, try linking with -N" -+msgstr "%B: No hay suficiente espacio para los encabezados del programa, pruebe enlazar con -N" -+ -+#: elf.c:4404 -+msgid "%B: section %A vma 0x%lx overlaps previous sections" -+msgstr "%B: la sección %A vma 0x%lx traslapa las secciones anteriores" -+ -+#: elf.c:4499 -+msgid "%B: section `%A' can't be allocated in segment %d" -+msgstr "%B: la sección `%A' no se puede asignar en el segmento %d" -+ -+#: elf.c:4549 -+msgid "%B: warning: allocated section `%s' not in segment" -+msgstr "%B: aviso: la sección asignada `%s' no está en el segmento" -+ -+#: elf.c:5064 -+msgid "%B: symbol `%s' required but not present" -+msgstr "%B: se requiere el símbolo `%s' pero no está presente" -+ -+#: elf.c:5403 -+msgid "%B: warning: Empty loadable segment detected, is this intentional ?\n" -+msgstr "%B: aviso: Se detectó un segmento cargable vacío, ¿ esto es intencional ?\n" -+ -+#: elf.c:6366 -+#, c-format -+msgid "Unable to find equivalent output section for symbol '%s' from section '%s'" -+msgstr "No se puede encontrar la sección de salida equivalente para el símbolo '%s' de la sección '%s'" -+ -+#: elf.c:7346 -+msgid "%B: unsupported relocation type %s" -+msgstr "%B: no se admite el tipo de reubicación %s" -+ -+#: elf32-arm.c:2846 elf32-arm.c:2878 -+msgid "" -+"%B(%s): warning: interworking not enabled.\n" -+" first occurrence: %B: Thumb call to ARM" -+msgstr "" -+"%B(%s): aviso: no se activó la interoperabilidad.\n" -+" primer suceso: %B: llamada Thumb para ARM" -+ -+#: elf32-arm.c:3041 -+#, c-format -+msgid "%s: cannot create stub entry %s" -+msgstr "%s: no se puede crear la entrada de cabo %s" -+ -+#: elf32-arm.c:3825 - #, c-format - msgid "unable to find THUMB glue '%s' for '%s'" - msgstr "no se puede encontrar el pegamento THUMB '%s' para `%s'" - --#: elf32-arm.c:2557 -+#: elf32-arm.c:3859 - #, c-format - msgid "unable to find ARM glue '%s' for '%s'" - msgstr "no se puede encontrar el pegamento ARM '%s' para `%s'" - --#: elf32-arm.c:3127 -+#: elf32-arm.c:4463 - msgid "%B: BE8 images only valid in big-endian mode." - msgstr "%B: las imágenes BE8 sólo son válidas en modo big-endian." - - #. Give a warning, but do as the user requests anyway. --#: elf32-arm.c:3331 -+#: elf32-arm.c:4678 - msgid "%B: warning: selected VFP11 erratum workaround is not necessary for target architecture" - msgstr "%B: aviso: no se necesita la alternativa para evita la errata del VFP11 seleccionado para la arquitectura objetivo" - --#: elf32-arm.c:3865 elf32-arm.c:3885 -+#: elf32-arm.c:5212 elf32-arm.c:5232 - msgid "%B: unable to find VFP11 veneer `%s'" - msgstr "%B: no se puede encontrar la chapa de VFP11 `%s'" - --#: elf32-arm.c:3930 -+#: elf32-arm.c:5278 - #, c-format - msgid "Invalid TARGET2 relocation type '%s'." - msgstr "Tipo de reubicación TARGET2 '%s' inválido." - --#: elf32-arm.c:4071 -+#: elf32-arm.c:5362 - msgid "" - "%B(%s): warning: interworking not enabled.\n" - " first occurrence: %B: thumb call to arm" -@@ -682,374 +903,326 @@ msgstr "" - "%s(%s): aviso: no se activó la interoperabilidad.\n" - " primer suceso: %B: llamada thumb para arm" - --#: elf32-arm.c:4759 -+#: elf32-arm.c:6094 - msgid "\\%B: Warning: Arm BLX instruction targets Arm function '%s'." - msgstr "\\%B: Aviso: La instrucción Arm BLX apunta a la función Arm '%s'." - --#: elf32-arm.c:5059 -+#: elf32-arm.c:6418 - msgid "%B: Warning: Thumb BLX instruction targets thumb function '%s'." - msgstr "%B: Aviso: La instrucción Thumb BLX apunta a la función thumb '%s'." - --#: elf32-arm.c:5689 -+#: elf32-arm.c:7095 - msgid "%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object" - msgstr "%B(%A+0x%lx): la reubicación R_ARM_TLS_LE32 no se permite en objetos compartidos" - --#: elf32-arm.c:5890 -+#: elf32-arm.c:7310 - msgid "%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations" - msgstr "%B(%A+0x%lx): Sólo se permiten las instrucciones ADD o SUB para la reubicación de grupo ALU" - --#: elf32-arm.c:5930 elf32-arm.c:6017 elf32-arm.c:6100 elf32-arm.c:6185 -+#: elf32-arm.c:7350 elf32-arm.c:7437 elf32-arm.c:7520 elf32-arm.c:7605 - msgid "%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s" - msgstr "%B(%A+0x%lx): Desborde al dividirse 0x%lx para la reubicación de grupo %s" - --#: elf32-arm.c:6369 elf32-sh.c:3304 elf64-sh64.c:1556 -+#: elf32-arm.c:7812 elf32-sh.c:3334 elf64-sh64.c:1556 - msgid "%B(%A+0x%lx): %s relocation against SEC_MERGE section" - msgstr "%B(%A+0x%lx): reubicación %s contra la sección SEC_MERGE" - --#: elf32-arm.c:6458 elf64-ppc.c:9973 -+#: elf32-arm.c:7930 elf32-xtensa.c:2759 elf64-ppc.c:10374 - msgid "%B(%A+0x%lx): %s used with TLS symbol %s" - msgstr "%B(%A+0x%lx): se usó %s con el símbolo TLS %s" - --#: elf32-arm.c:6459 elf64-ppc.c:9974 -+#: elf32-arm.c:7931 elf32-xtensa.c:2760 elf64-ppc.c:10375 - msgid "%B(%A+0x%lx): %s used with non-TLS symbol %s" - msgstr "%B(%A+0x%lx): se usó %s con el símbolo %s que no es TLS" - --#: elf32-arm.c:6482 elf32-i386.c:3310 elf32-m32r.c:2598 elf32-m68k.c:1982 --#: elf32-ppc.c:6796 elf32-s390.c:3048 elf32-sh.c:3408 elf32-xtensa.c:2290 --#: elf64-ppc.c:11138 elf64-s390.c:3009 elf64-sh64.c:1648 elf64-x86-64.c:3002 --#: elf-hppa.h:2194 elf-m10300.c:1460 elfxx-sparc.c:3256 --msgid "%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'" --msgstr "%B(%A+0x%lx): reubicación %s sin resolución contra el símbolo `%s'" -- --#: elf32-arm.c:6516 -+#: elf32-arm.c:7988 - msgid "out of range" - msgstr "fuera de rango" - --#: elf32-arm.c:6520 -+#: elf32-arm.c:7992 - msgid "unsupported relocation" - msgstr "no se admite la reubicación" - --#: elf32-arm.c:6528 -+#: elf32-arm.c:8000 - msgid "unknown error" - msgstr "error desconocido" - --#: elf32-arm.c:6628 -+#: elf32-arm.c:8099 - msgid "Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it" - msgstr "Aviso: Se limpia la opción de interoperación en %B porque se ha enlazado con él código no interoperable en %B" - --#: elf32-arm.c:6730 -+#: elf32-arm.c:8205 - msgid "ERROR: %B uses VFP register arguments, %B does not" - msgstr "ERROR: %B utiliza argumentos de registro VFP, mientras que %B no" - --#: elf32-arm.c:6780 -+#: elf32-arm.c:8254 - msgid "ERROR: %B: Conflicting architecture profiles %c/%c" - msgstr "ERROR: %B: Perfiles de arquitecturas en conflicto %c/%c" - --#: elf32-arm.c:6795 -+#: elf32-arm.c:8274 - msgid "Warning: %B: Conflicting platform configuration" - msgstr "Aviso: %B: Configuración de plataformas en conflicto" - --#: elf32-arm.c:6804 -+#: elf32-arm.c:8283 - msgid "ERROR: %B: Conflicting use of R9" - msgstr "ERROR: %B: Uso en conflicto de R9" - --#: elf32-arm.c:6816 -+#: elf32-arm.c:8295 - msgid "ERROR: %B: SB relative addressing conflicts with use of R9" - msgstr "ERROR: %B: El direccionamiento relativo a SB tiene conflictos con el uso de R9" - --#: elf32-arm.c:6838 --msgid "ERROR: %B: Conflicting definitions of wchar_t" --msgstr "ERROR: %B: Definiciones en conflicto de wchar_t" -+#: elf32-arm.c:8318 -+msgid "warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail" -+msgstr "aviso: %B usa wchar_t de %u bytes aunque la salida usa wchar_t de %u bytes; el uso de valores wchar_t entre objetos puede fallar" - --#: elf32-arm.c:6867 -+#: elf32-arm.c:8347 - msgid "warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail" - msgstr "aviso: %B usa %s enums aunque la salida usa %s enums; el uso de valores enum entre objetos puede fallar" - --#: elf32-arm.c:6880 -+#: elf32-arm.c:8360 - msgid "ERROR: %B uses iWMMXt register arguments, %B does not" - msgstr "ERROR: %B utiliza argumentos de registro iWMMXt, mientras que %B no" - --#: elf32-arm.c:6920 -+#: elf32-arm.c:8400 - msgid "Warning: %B: Unknown EABI object attribute %d" - msgstr "Aviso: %B: Atributo de objeto EABI %d desconocido" - --#: elf32-arm.c:7045 -+#: elf32-arm.c:8460 -+msgid "ERROR: %B is already in final BE8 format" -+msgstr "ERROR: %B ya está en el formato BE8 final" -+ -+#: elf32-arm.c:8536 - msgid "ERROR: Source object %B has EABI version %d, but target %B has EABI version %d" - msgstr "ERROR: El objeto fuente %B tiene EABI versión %d, pero el objetivo %B tiene EABI versión %d" - --#: elf32-arm.c:7061 -+#: elf32-arm.c:8552 - msgid "ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d" - msgstr "ERROR: %B está compilado para APCS-%d mientras que el objetivo %B usa APCS-%d" - --#: elf32-arm.c:7086 -+#: elf32-arm.c:8577 - msgid "ERROR: %B uses VFP instructions, whereas %B does not" - msgstr "ERROR: %B utiliza instrucciones VFP, mientras que %B no" - --#: elf32-arm.c:7090 -+#: elf32-arm.c:8581 - msgid "ERROR: %B uses FPA instructions, whereas %B does not" - msgstr "ERROR: %B utiliza instrucciones FPA, mientras que %B no" - --#: elf32-arm.c:7100 -+#: elf32-arm.c:8591 - msgid "ERROR: %B uses Maverick instructions, whereas %B does not" - msgstr "ERROR: %B utiliza instrucciones Maverick, mientras que %B no" - --#: elf32-arm.c:7104 -+#: elf32-arm.c:8595 - msgid "ERROR: %B does not use Maverick instructions, whereas %B does" - msgstr "ERROR: %B no utiliza instrucciones Maverick, mientras que %B sí" - --#: elf32-arm.c:7123 -+#: elf32-arm.c:8614 - msgid "ERROR: %B uses software FP, whereas %B uses hardware FP" - msgstr "ERROR: %B utiliza FP de software, mientras que %B utiliza FP de hardware" - --#: elf32-arm.c:7127 -+#: elf32-arm.c:8618 - msgid "ERROR: %B uses hardware FP, whereas %B uses software FP" - msgstr "ERROR: %B utiliza FP de hardware, mientras que %B utiliza FP de software" - - #. Ignore init flag - it may not be set, despite the flags field - #. containing valid data. - #. Ignore init flag - it may not be set, despite the flags field containing valid data. --#: elf32-arm.c:7174 elf32-bfin.c:4795 elf32-cris.c:3234 elf32-m68hc1x.c:1277 --#: elf32-m68k.c:620 elf32-score.c:3753 elf32-vax.c:538 elfxx-mips.c:11331 -+#: elf32-arm.c:8665 elf32-bfin.c:4899 elf32-cris.c:3235 elf32-m68hc1x.c:1279 -+#: elf32-m68k.c:774 elf32-score.c:3750 elf32-vax.c:538 elfxx-mips.c:12699 - #, c-format - msgid "private flags = %lx:" - msgstr "opciones privadas = %lx:" - --#: elf32-arm.c:7183 -+#: elf32-arm.c:8674 - #, c-format - msgid " [interworking enabled]" - msgstr " [interoperabilidad activada]" - --#: elf32-arm.c:7191 -+#: elf32-arm.c:8682 - #, c-format - msgid " [VFP float format]" - msgstr " [formato de coma flotante VFP]" - --#: elf32-arm.c:7193 -+#: elf32-arm.c:8684 - #, c-format - msgid " [Maverick float format]" - msgstr " [formato de coma flotante Maverick]" - --#: elf32-arm.c:7195 -+#: elf32-arm.c:8686 - #, c-format - msgid " [FPA float format]" - msgstr " [formato de coma flotante FPA]" - --#: elf32-arm.c:7204 -+#: elf32-arm.c:8695 - #, c-format - msgid " [new ABI]" - msgstr " [ABI nuevo]" - --#: elf32-arm.c:7207 -+#: elf32-arm.c:8698 - #, c-format - msgid " [old ABI]" - msgstr " [ABI antiguo]" - --#: elf32-arm.c:7210 -+#: elf32-arm.c:8701 - #, c-format - msgid " [software FP]" - msgstr " [FP por software]" - --#: elf32-arm.c:7219 -+#: elf32-arm.c:8710 - #, c-format - msgid " [Version1 EABI]" - msgstr " [EABI Version1]" - --#: elf32-arm.c:7222 elf32-arm.c:7233 -+#: elf32-arm.c:8713 elf32-arm.c:8724 - #, c-format - msgid " [sorted symbol table]" - msgstr " [tabla de símbolos ordenados]" - --#: elf32-arm.c:7224 elf32-arm.c:7235 -+#: elf32-arm.c:8715 elf32-arm.c:8726 - #, c-format - msgid " [unsorted symbol table]" - msgstr " [tabla de símbolos sin ordenar]" - --#: elf32-arm.c:7230 -+#: elf32-arm.c:8721 - #, c-format - msgid " [Version2 EABI]" - msgstr " [EABI Version2]" - --#: elf32-arm.c:7238 -+#: elf32-arm.c:8729 - #, c-format - msgid " [dynamic symbols use segment index]" - msgstr " [los símbolos dinámicos utilizan índices de segmento]" - --#: elf32-arm.c:7241 -+#: elf32-arm.c:8732 - #, c-format - msgid " [mapping symbols precede others]" - msgstr " [el mapeo de símbolos precede a otros]" - --#: elf32-arm.c:7248 -+#: elf32-arm.c:8739 - #, c-format - msgid " [Version3 EABI]" - msgstr " [EABI Version3]" - --#: elf32-arm.c:7252 -+#: elf32-arm.c:8743 - #, c-format - msgid " [Version4 EABI]" - msgstr " [EABI Version4]" - --#: elf32-arm.c:7256 -+#: elf32-arm.c:8747 - #, c-format - msgid " [Version5 EABI]" - msgstr " [EABI Version5]" - --#: elf32-arm.c:7259 -+#: elf32-arm.c:8750 - #, c-format - msgid " [BE8]" - msgstr " [BE8]" - --#: elf32-arm.c:7262 -+#: elf32-arm.c:8753 - #, c-format - msgid " [LE8]" - msgstr " [LE8]" - --#: elf32-arm.c:7268 -+#: elf32-arm.c:8759 - #, c-format - msgid " " - msgstr " " - --#: elf32-arm.c:7275 -+#: elf32-arm.c:8766 - #, c-format - msgid " [relocatable executable]" - msgstr " [ejecutable reubicable]" - --#: elf32-arm.c:7278 -+#: elf32-arm.c:8769 - #, c-format - msgid " [has entry point]" - msgstr " [tiene punto de entrada]" - --#: elf32-arm.c:7283 -+#: elf32-arm.c:8774 - #, c-format - msgid "" - msgstr "" - --#: elf32-arm.c:7522 elf32-i386.c:961 elf32-s390.c:1003 elf32-xtensa.c:814 --#: elf64-s390.c:958 elf64-x86-64.c:773 elfxx-sparc.c:1115 -+#: elf32-arm.c:9013 elf32-i386.c:1236 elf32-s390.c:1006 elf32-xtensa.c:999 -+#: elf64-s390.c:961 elf64-x86-64.c:1016 elfxx-sparc.c:1127 - msgid "%B: bad symbol index: %d" - msgstr "%B: índice de símbolos erróneo: %d" - --#: elf32-arm.c:8080 elf32-cris.c:2400 elf32-hppa.c:1906 elf32-i370.c:506 --#: elf32-i386.c:1522 elf32-m32r.c:1931 elf32-m68k.c:1331 elf32-ppc.c:4314 --#: elf32-s390.c:1679 elf32-sh.c:2584 elf32-vax.c:1050 elf64-ppc.c:5898 --#: elf64-s390.c:1654 elf64-sh64.c:3438 elf64-x86-64.c:1382 elf-m10300.c:4207 --#: elfxx-sparc.c:1797 --#, c-format --msgid "dynamic variable `%s' is zero size" --msgstr "la variable dinámica `%s' es de tamaño cero" -- --#: elf32-arm.c:8603 -+#: elf32-arm.c:10125 - #, c-format - msgid "Errors encountered processing file %s" - msgstr "Se encontraron errores al procesar el fichero %s" - --#: elf32-arm.c:9839 elf32-arm.c:9861 -+#: elf32-arm.c:11526 elf32-arm.c:11548 - msgid "%B: error: VFP11 veneer out of range" - msgstr "%B: error: la chapa VFP11 está fuera de rango" - --#: elf32-avr.c:1253 elf32-bfin.c:2795 elf32-cr16.c:887 elf32-cr16c.c:790 --#: elf32-cris.c:1538 elf32-crx.c:933 elf32-d10v.c:517 elf32-fr30.c:616 --#: elf32-frv.c:4129 elf32-h8300.c:516 elf32-i860.c:1218 elf32-ip2k.c:1499 --#: elf32-iq2000.c:647 elf32-m32c.c:560 elf32-m32r.c:3124 elf32-m68hc1x.c:1133 --#: elf32-mep.c:642 elf32-msp430.c:497 elf32-mt.c:402 elf32-openrisc.c:411 --#: elf32-score.c:2456 elf32-spu.c:2813 elf32-v850.c:1701 elf32-xstormy16.c:946 --#: elf64-mmix.c:1533 elf-m10200.c:456 elf-m10300.c:1523 --msgid "internal error: out of range error" --msgstr "error interno: error fuera de rango" -- --#: elf32-avr.c:1257 elf32-bfin.c:2799 elf32-cr16.c:891 elf32-cr16c.c:794 --#: elf32-cris.c:1542 elf32-crx.c:937 elf32-d10v.c:521 elf32-fr30.c:620 --#: elf32-frv.c:4133 elf32-h8300.c:520 elf32-i860.c:1222 elf32-iq2000.c:651 --#: elf32-m32c.c:564 elf32-m32r.c:3128 elf32-m68hc1x.c:1137 elf32-mep.c:646 --#: elf32-msp430.c:501 elf32-openrisc.c:415 elf32-score.c:2460 elf32-spu.c:2817 --#: elf32-v850.c:1705 elf32-xstormy16.c:950 elf64-mmix.c:1537 elf-m10200.c:460 --#: elf-m10300.c:1527 elfxx-mips.c:8025 --msgid "internal error: unsupported relocation error" --msgstr "error interno: error de reubicación no admitida" -- --#: elf32-avr.c:1261 elf32-bfin.c:2803 elf32-cris.c:1546 elf32-fr30.c:624 --#: elf32-frv.c:4137 elf32-i860.c:1226 elf32-ip2k.c:1510 elf32-iq2000.c:655 --#: elf32-m32c.c:568 elf32-mep.c:650 elf32-msp430.c:505 elf32-mt.c:406 --#: elf32-openrisc.c:419 elf32-v850.c:1709 elf32-xstormy16.c:954 -+#: elf32-avr.c:1258 elf32-bfin.c:3222 elf32-cris.c:1546 elf32-fr30.c:624 -+#: elf32-frv.c:4122 elf32-i860.c:1226 elf32-ip2k.c:1510 elf32-iq2000.c:699 -+#: elf32-m32c.c:568 elf32-mep.c:549 elf32-msp430.c:501 elf32-mt.c:406 -+#: elf32-openrisc.c:419 elf32-v850.c:1711 elf32-xstormy16.c:956 - #: elf64-mmix.c:1541 - msgid "internal error: dangerous relocation" - msgstr "error interno: reubicación peligrosa" - --#: elf32-avr.c:1265 elf32-bfin.c:2807 elf32-cr16.c:899 elf32-cr16c.c:802 --#: elf32-cris.c:1550 elf32-crx.c:945 elf32-d10v.c:529 elf32-fr30.c:628 --#: elf32-frv.c:4141 elf32-h8300.c:528 elf32-i860.c:1230 elf32-ip2k.c:1514 --#: elf32-iq2000.c:659 elf32-m32c.c:572 elf32-m32r.c:3136 elf32-m68hc1x.c:1145 --#: elf32-mep.c:654 elf32-msp430.c:509 elf32-mt.c:410 elf32-openrisc.c:423 --#: elf32-score.c:2468 elf32-spu.c:2825 elf32-v850.c:1725 elf32-xstormy16.c:958 --#: elf64-mmix.c:1545 elf-m10200.c:468 elf-m10300.c:1540 --msgid "internal error: unknown error" --msgstr "error interno: error desconocido" -- --#: elf32-avr.c:2369 elf32-hppa.c:595 elf32-m68hc1x.c:164 elf64-ppc.c:3802 -+#: elf32-avr.c:2396 elf32-hppa.c:605 elf32-m68hc1x.c:164 elf64-ppc.c:3983 - msgid "%B: cannot create stub entry %s" - msgstr "%B: no se puede crear la entrada de cabo %s" - --#: elf32-bfin.c:2274 -+#: elf32-bfin.c:1585 -+msgid "%B(%A+0x%lx): unresolvable relocation against symbol `%s'" -+msgstr "%B(%A+0x%lx): reubicación sin resolución contra el símbolo `%s'" -+ -+#: elf32-bfin.c:1618 elf32-i386.c:3623 elf32-m68k.c:3557 elf32-s390.c:3110 -+#: elf64-s390.c:3071 elf64-x86-64.c:3278 -+msgid "%B(%A+0x%lx): reloc against `%s': error %d" -+msgstr "%B(%A+0x%lx): reubicación contra `%s': error %d" -+ -+#: elf32-bfin.c:2711 - msgid "%B: relocation at `%A+0x%x' references symbol `%s' with nonzero addend" - msgstr "%B: la reubicación en `%A+0x%x' referencía al símbolo `%s' con adición que no es cero" - --#: elf32-bfin.c:2288 elf32-frv.c:2919 -+#: elf32-bfin.c:2725 elf32-frv.c:2904 - msgid "relocation references symbol not defined in the module" - msgstr "la reubicación referencía un símbolo que no está definido en el módulo" - --#: elf32-bfin.c:2385 -+#: elf32-bfin.c:2822 - msgid "R_BFIN_FUNCDESC references dynamic symbol with nonzero addend" - msgstr "R_BFIN_FUNCDESC referencía un símbolo dinámico con adición que no es cero" - --#: elf32-bfin.c:2424 elf32-bfin.c:2547 elf32-frv.c:3656 elf32-frv.c:3777 -+#: elf32-bfin.c:2861 elf32-bfin.c:2987 elf32-frv.c:3641 elf32-frv.c:3762 - msgid "cannot emit fixups in read-only section" - msgstr "no se pueden emitir composturas en la sección de sólo lectura" - --#: elf32-bfin.c:2452 elf32-bfin.c:2587 elf32-frv.c:3687 elf32-frv.c:3821 -+#: elf32-bfin.c:2889 elf32-bfin.c:3036 elf32-frv.c:3672 elf32-frv.c:3806 - msgid "cannot emit dynamic relocations in read-only section" --msgstr "no se pueden emitri reubicaciones dinámicas en la sección de sólo lectura" -+msgstr "no se pueden emitir reubicaciones dinámicas en la sección de sólo lectura" - --#: elf32-bfin.c:2505 -+#: elf32-bfin.c:2945 - msgid "R_BFIN_FUNCDESC_VALUE references dynamic symbol with nonzero addend" - msgstr "R_BFIN_FUNCDESC_VALUE referencía un símbolo dinámico con adición que no es cero" - --#: elf32-bfin.c:2673 -+#: elf32-bfin.c:3126 - msgid "relocations between different segments are not supported" - msgstr "no se admiten las reubicaciones entre segmentos diferentes" - --#: elf32-bfin.c:2674 -+#: elf32-bfin.c:3127 - msgid "warning: relocation references a different segment" - msgstr "aviso: la reubicación referencía un segmento diferente" - --#: elf32-bfin.c:3083 --msgid "%B(%A+0x%lx): unresolvable relocation against symbol `%s'" --msgstr "%B(%A+0x%lx): reubicación sin resolución contra el símbolo `%s'" -- --#: elf32-bfin.c:3116 elf32-i386.c:3351 elf32-m68k.c:2023 elf32-s390.c:3100 --#: elf64-s390.c:3061 elf64-x86-64.c:3041 --msgid "%B(%A+0x%lx): reloc against `%s': error %d" --msgstr "%B(%A+0x%lx): reubicación contra `%s': error %d" -- --#: elf32-bfin.c:4687 elf32-frv.c:6423 -+#: elf32-bfin.c:4791 elf32-frv.c:6404 - msgid "%B: unsupported relocation type %i" - msgstr "%B: no se admite el tipo de reubicación %i" - --#: elf32-bfin.c:4868 elf32-frv.c:6831 -+#: elf32-bfin.c:4944 elf32-frv.c:6812 - #, c-format - msgid "%s: cannot link non-fdpic object file into fdpic executable" - msgstr "%s: no se puede enlazar el fichero objeto que no es fdpic en un ejecutable fdpic" - --#: elf32-bfin.c:4872 elf32-frv.c:6835 -+#: elf32-bfin.c:4948 elf32-frv.c:6816 - #, c-format - msgid "%s: cannot link fdpic object file into non-fdpic executable" - msgstr "%s: no se puede enlazar el fichero objeto fdpic en un ejecutable que no es fdpic" - --#: elf32-cr16.c:895 elf32-cr16c.c:798 elf32-crx.c:941 elf32-d10v.c:525 --#: elf32-h8300.c:524 elf32-m32r.c:3132 elf32-m68hc1x.c:1141 elf32-score.c:2464 --#: elf32-spu.c:2821 elf-m10200.c:464 --msgid "internal error: dangerous error" --msgstr "error interno: error peligroso" -- - #: elf32-cris.c:1060 - msgid "%B, section %A: unresolvable relocation %s against symbol `%s'" - msgstr "%B, sección %A: reubicación %s sin resolución contra el símbolo `%s'" -@@ -1086,7 +1259,7 @@ msgstr "%B, secci - msgid "%B: Internal inconsistency; no relocation section %s" - msgstr "%B: Inconsistencia interna; no se encuentra la sección de reubicación %s" - --#: elf32-cris.c:2511 -+#: elf32-cris.c:2510 - msgid "" - "%B, section %A:\n" - " v10/v32 compatible object %s must not contain a PIC relocation" -@@ -1094,7 +1267,7 @@ msgstr "" - "%B, sección %A:\n" - " el objeto %s compatible con v10/v32 no debe contener una reubicación PIC" - --#: elf32-cris.c:2698 elf32-cris.c:2766 -+#: elf32-cris.c:2697 elf32-cris.c:2765 - msgid "" - "%B, section %A:\n" - " relocation %s should not be used in a shared object; recompile with -fPIC" -@@ -1102,129 +1275,129 @@ msgstr "" - "%B, sección %A:\n" - " la reubicación %s no se debe usar en un objeto compartido; recompile con -fPIC" - --#: elf32-cris.c:3183 -+#: elf32-cris.c:3184 - msgid "Unexpected machine number" - msgstr "Número de máquina inesperado" - --#: elf32-cris.c:3237 -+#: elf32-cris.c:3238 - #, c-format - msgid " [symbols have a _ prefix]" - msgstr " [los símbolos tiene un prefijo _]" - --#: elf32-cris.c:3240 -+#: elf32-cris.c:3241 - #, c-format - msgid " [v10 and v32]" - msgstr " [v10 y v32]" - --#: elf32-cris.c:3243 -+#: elf32-cris.c:3244 - #, c-format - msgid " [v32]" - msgstr " [v32]" - --#: elf32-cris.c:3288 -+#: elf32-cris.c:3289 - msgid "%B: uses _-prefixed symbols, but writing file with non-prefixed symbols" - msgstr "%B: utiliza símbolos con prefijo _, pero escribe el fichero con símbolos sin prefijo" - --#: elf32-cris.c:3289 -+#: elf32-cris.c:3290 - msgid "%B: uses non-prefixed symbols, but writing file with _-prefixed symbols" - msgstr "%B: utiliza símbolos sin prefijo, pero escribe el fichero con símbolos con prefijo _" - --#: elf32-cris.c:3308 -+#: elf32-cris.c:3309 - msgid "%B contains CRIS v32 code, incompatible with previous objects" - msgstr "%B contiene código CRIS v32, incompatible con objetos previos" - --#: elf32-cris.c:3310 -+#: elf32-cris.c:3311 - msgid "%B contains non-CRIS-v32 code, incompatible with previous objects" - msgstr "%B contiene código que no es CRIS v32, incompatible con objetos previos" - --#: elf32-frv.c:1523 elf32-frv.c:1672 -+#: elf32-frv.c:1507 elf32-frv.c:1656 - msgid "relocation requires zero addend" - msgstr "la reubicación requiere una adición cero" - --#: elf32-frv.c:2906 -+#: elf32-frv.c:2891 - msgid "%B(%A+0x%x): relocation to `%s+%x' may have caused the error above" - msgstr "%B(%A+0x%x): la reubicación a `%s+%x' tal vez causó el error anterior" - --#: elf32-frv.c:2995 -+#: elf32-frv.c:2980 - msgid "R_FRV_GETTLSOFF not applied to a call instruction" - msgstr "no se aplicó R_FRV_GETTLSOFF a una instrucción call" - --#: elf32-frv.c:3037 -+#: elf32-frv.c:3022 - msgid "R_FRV_GOTTLSDESC12 not applied to an lddi instruction" - msgstr "no se aplicó R_FRV_GOTTLSDESC12 a una instrucción lddi" - --#: elf32-frv.c:3108 -+#: elf32-frv.c:3093 - msgid "R_FRV_GOTTLSDESCHI not applied to a sethi instruction" - msgstr "no se aplicó R_FRV_GOTTLSDESCHI a una instrucción sethi" - --#: elf32-frv.c:3145 -+#: elf32-frv.c:3130 - msgid "R_FRV_GOTTLSDESCLO not applied to a setlo or setlos instruction" - msgstr "no se aplicó R_FRV_GOTTLSDESCLO a una instrucción setlo o setlos" - --#: elf32-frv.c:3193 -+#: elf32-frv.c:3178 - msgid "R_FRV_TLSDESC_RELAX not applied to an ldd instruction" - msgstr "no se aplicó R_FRV_GOTTLSDESC_RELAX a una instrucción ldd" - --#: elf32-frv.c:3277 -+#: elf32-frv.c:3262 - msgid "R_FRV_GETTLSOFF_RELAX not applied to a calll instruction" - msgstr "no se aplicó R_FRV_GETTLSOFF_RELAX a una instrucción calll" - --#: elf32-frv.c:3332 -+#: elf32-frv.c:3317 - msgid "R_FRV_GOTTLSOFF12 not applied to an ldi instruction" - msgstr "no se aplicó R_FRV_GOTTLSOFF12 a una instrucción ldi" - --#: elf32-frv.c:3362 -+#: elf32-frv.c:3347 - msgid "R_FRV_GOTTLSOFFHI not applied to a sethi instruction" - msgstr "no se aplicó R_FRV_GOTTLSOFFHI a una instrucción sethi" - --#: elf32-frv.c:3391 -+#: elf32-frv.c:3376 - msgid "R_FRV_GOTTLSOFFLO not applied to a setlo or setlos instruction" - msgstr "no se aplicó R_FRV_GOTTLSOFFLO a una instrucción setlo o setlos" - --#: elf32-frv.c:3422 -+#: elf32-frv.c:3407 - msgid "R_FRV_TLSOFF_RELAX not applied to an ld instruction" - msgstr "no se aplicó R_FRV_TLSOFF_RELAX a una instrucción ld" - --#: elf32-frv.c:3467 -+#: elf32-frv.c:3452 - msgid "R_FRV_TLSMOFFHI not applied to a sethi instruction" - msgstr "no se aplicó R_FRV_TLSMOFFHI a una instrucción sethi" - --#: elf32-frv.c:3494 -+#: elf32-frv.c:3479 - msgid "R_FRV_TLSMOFFLO not applied to a setlo or setlos instruction" - msgstr "no se aplicó R_FRV_TLSMOFFLO a una instrucción setlo o setlos" - --#: elf32-frv.c:3615 -+#: elf32-frv.c:3600 - msgid "R_FRV_FUNCDESC references dynamic symbol with nonzero addend" - msgstr "R_FRV_FUNCDESC referencía un símbolo dinámico con adición que no es cero" - --#: elf32-frv.c:3735 -+#: elf32-frv.c:3720 - msgid "R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend" - msgstr "R_FRV_FUNCDESC_VALUE referencía un símbolo dinámico con adición que no es cero" - --#: elf32-frv.c:3992 elf32-frv.c:4148 -+#: elf32-frv.c:3977 elf32-frv.c:4133 - msgid "%B(%A+0x%lx): reloc against `%s': %s" - msgstr "%B(%A+0x%lx): reubicación contra `%s': %s" - --#: elf32-frv.c:3994 elf32-frv.c:3998 -+#: elf32-frv.c:3979 elf32-frv.c:3983 - msgid "relocation references a different segment" - msgstr "la reubicación referencía un segmento diferente" - --#: elf32-frv.c:6745 -+#: elf32-frv.c:6726 - #, c-format - msgid "%s: compiled with %s and linked with modules that use non-pic relocations" - msgstr "%s: compilado con %s y enlazado con módulos que usan reubicaciones que no son pic" - --#: elf32-frv.c:6798 elf32-iq2000.c:808 elf32-m32c.c:819 -+#: elf32-frv.c:6779 elf32-iq2000.c:852 elf32-m32c.c:814 - #, c-format - msgid "%s: compiled with %s and linked with modules compiled with %s" - msgstr "%s: compilado con %s y enlazado con módulos compilados con %s" - --#: elf32-frv.c:6810 -+#: elf32-frv.c:6791 - #, c-format - msgid "%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%lx)" - msgstr "%s: usa campos e_flags desconocidos (0x%lx) diferentes a aquéllos de los módulos previos (0x%lx)" - --#: elf32-frv.c:6860 elf32-iq2000.c:845 elf32-m32c.c:855 elf32-mt.c:587 -+#: elf32-frv.c:6841 elf32-iq2000.c:889 elf32-m32c.c:850 elf32-mt.c:583 - #, c-format - msgid "private flags = 0x%lx:" - msgstr "opciones privadas = 0x%lx:" -@@ -1233,55 +1406,79 @@ msgstr "opciones privadas = 0x%lx:" - msgid "%B: Relocations in generic ELF (EM: %d)" - msgstr "%B: Reubicaciones en ELF genérico (EM: %d)" - --#: elf32-hppa.c:844 elf32-hppa.c:3577 -+#: elf32-hppa.c:854 elf32-hppa.c:3600 - msgid "%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections" - msgstr "%B(%A+0x%lx): no se puede alcanzar %s, recompile con -ffuntion-sections" - --#: elf32-hppa.c:1253 -+#: elf32-hppa.c:1263 - msgid "%B: relocation %s can not be used when making a shared object; recompile with -fPIC" - msgstr "%B: no se puede usar la reubicación %s cuando se hace un objeto compartido; recompile con -fPIC" - --#: elf32-hppa.c:1506 -+#: elf32-hppa.c:1518 - #, c-format - msgid "Could not find relocation section for %s" - msgstr "No se puede encontrar la sección de reubicación para %s" - --#: elf32-hppa.c:2795 -+#: elf32-hppa.c:2810 - msgid "%B: duplicate export stub %s" - msgstr "%B: cabo de exportación %s duplicado" - --#: elf32-hppa.c:3413 -+#: elf32-hppa.c:3436 - msgid "%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link" - msgstr "%B(%A+0x%lx): la compostura %s para la insn 0x%x no se admite en un enlazado que no es compartido" - --#: elf32-hppa.c:4267 -+#: elf32-hppa.c:4290 - msgid "%B(%A+0x%lx): cannot handle %s for %s" - msgstr "%B(%A+0x%lx): no se puede manejar %s para %s" - --#: elf32-hppa.c:4574 -+#: elf32-hppa.c:4597 - msgid ".got section not immediately after .plt section" - msgstr "la sección .got no está inmediatamente después de la sección .plt" - --#: elf32-i386.c:364 elf32-ppc.c:1616 elf32-s390.c:379 elf64-ppc.c:2148 --#: elf64-s390.c:403 elf64-x86-64.c:221 -+#: elf32-i386.c:362 elf32-ppc.c:1616 elf32-s390.c:379 elf64-ppc.c:2153 -+#: elf64-s390.c:403 elf64-x86-64.c:222 - msgid "%B: invalid relocation type %d" - msgstr "%B: tipo de reubicación %d inválido" - --#: elf32-i386.c:1085 elf32-s390.c:1185 elf32-sh.c:5063 elf64-s390.c:1149 --#: elfxx-sparc.c:1243 -+#: elf32-i386.c:1183 elf64-x86-64.c:964 -+msgid "%B: TLS transition from %s to %s against `%s' at 0x%lx in section `%A' failed" -+msgstr "%B: falló la transición TLS de %s para %s contra `%s' en 0x%lx en la sección `%A'" -+ -+#: elf32-i386.c:1364 elf32-s390.c:1188 elf32-sh.c:5098 elf32-xtensa.c:1162 -+#: elf64-s390.c:1152 elfxx-sparc.c:1263 - msgid "%B: `%s' accessed both as normal and thread local symbol" - msgstr "%B: se accesó `%s' como un símbolo normal y un símbolo local de hilo" - --#: elf32-i386.c:1200 elf32-s390.c:1294 elf64-ppc.c:4864 elf64-s390.c:1261 --#: elf64-x86-64.c:1051 -+#: elf32-i386.c:1479 elf32-s390.c:1297 elf64-ppc.c:5046 elf64-s390.c:1264 -+#: elf64-x86-64.c:1299 - msgid "%B: bad relocation section name `%s'" - msgstr "%B: nombre de sección de reubicación `%s' erróneo" - --#: elf32-i386.c:2257 -+#: elf32-i386.c:2598 - msgid "%B: unrecognized relocation (0x%x) in section `%A'" - msgstr "%B: no se reconoce la dirección de reubicación (0x%lx) en la sección `%A'" - --#: elf32-i386.c:2479 -+#: elf32-i386.c:2822 elf64-x86-64.c:2660 -+msgid "hidden symbol" -+msgstr "símbolo oculto" -+ -+#: elf32-i386.c:2825 elf64-x86-64.c:2663 -+msgid "internal symbol" -+msgstr "símbolo interno" -+ -+#: elf32-i386.c:2828 elf64-x86-64.c:2666 -+msgid "protected symbol" -+msgstr "símbolos protegido" -+ -+#: elf32-i386.c:2831 elf64-x86-64.c:2669 -+msgid "symbol" -+msgstr "símbolo" -+ -+#: elf32-i386.c:2836 -+msgid "%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object" -+msgstr "%B: no se puede usar la reubicación R_386_GOTOFF contra %s indefinida `%s' cuando se hace un objeto compartido" -+ -+#: elf32-i386.c:2846 - msgid "%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object" - msgstr "%B: no se puede usar la reubicación R_386_GOTOFF contra la función protegida `%s' cuando se hace un objeto compartido" - -@@ -1308,7 +1505,7 @@ msgstr "enlazador ip2k: instrucci - msgid "unsupported relocation between data/insn address spaces" - msgstr "no se admite la reubicación entre espacios de direcciones datos/insn" - --#: elf32-iq2000.c:821 elf32-m32c.c:831 -+#: elf32-iq2000.c:865 elf32-m32c.c:826 - #, c-format - msgid "%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)" - msgstr "%s: usa campos de e_flags diferentes (0x%lx) que los módulos previos (0x%lx)" -@@ -1345,86 +1542,94 @@ msgstr ": instrucciones m32rx" - msgid ": m32r2 instructions" - msgstr ": instrucciones m32r2" - --#: elf32-m68hc1x.c:1045 -+#: elf32-m68hc1x.c:1047 - #, c-format - msgid "Reference to the far symbol `%s' using a wrong relocation may result in incorrect execution" - msgstr "El referenciar al símbolo far `%s' usando una reubicación incorrecta puede resultar en una ejecución incorrecta" - --#: elf32-m68hc1x.c:1068 -+#: elf32-m68hc1x.c:1070 - #, c-format - msgid "banked address [%lx:%04lx] (%lx) is not in the same bank as current banked address [%lx:%04lx] (%lx)" - msgstr "la dirección almacenada [%lx:%04lx] (%lx) no está en el mismo banco que la dirección almacenada actual [%lx:%04lx] (%lx)" - --#: elf32-m68hc1x.c:1087 -+#: elf32-m68hc1x.c:1089 - #, c-format - msgid "reference to a banked address [%lx:%04lx] in the normal address space at %04lx" - msgstr "referencia a una dirección almacenada [%lx:%04lx] en el espacio normal de direcciones en %04lx" - --#: elf32-m68hc1x.c:1220 -+#: elf32-m68hc1x.c:1222 - msgid "%B: linking files compiled for 16-bit integers (-mshort) and others for 32-bit integers" - msgstr "%B: se enlazan ficheros compilados con enteros de 16-bit (-mshort) y otros con enteros de 32-bit" - --#: elf32-m68hc1x.c:1227 -+#: elf32-m68hc1x.c:1229 - msgid "%B: linking files compiled for 32-bit double (-fshort-double) and others for 64-bit double" - msgstr "%B: se enlazan ficheros compilados con dobles de 32-bit (-fshort-double) y otros con dobles de 64-bit" - --#: elf32-m68hc1x.c:1236 -+#: elf32-m68hc1x.c:1238 - msgid "%B: linking files compiled for HCS12 with others compiled for HC12" - msgstr "%B: se enlazan ficheros compilados para HCS12, con otros compilados para HC12" - --#: elf32-m68hc1x.c:1252 elf32-ppc.c:3734 elf64-sparc.c:697 elfxx-mips.c:11292 -+#: elf32-m68hc1x.c:1254 elf32-ppc.c:4046 elf64-sparc.c:697 elfxx-mips.c:12561 - msgid "%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)" - msgstr "%B: usa campos de e_flags diferentes (0x%lx) que los módulos previos (0x%lx)" - --#: elf32-m68hc1x.c:1280 -+#: elf32-m68hc1x.c:1282 - #, c-format - msgid "[abi=32-bit int, " - msgstr "[abi=int de 32-bit, " - --#: elf32-m68hc1x.c:1282 -+#: elf32-m68hc1x.c:1284 - #, c-format - msgid "[abi=16-bit int, " - msgstr "[abi=int de 16-bit, " - --#: elf32-m68hc1x.c:1285 -+#: elf32-m68hc1x.c:1287 - #, c-format - msgid "64-bit double, " - msgstr "doble de 64-bit, " - --#: elf32-m68hc1x.c:1287 -+#: elf32-m68hc1x.c:1289 - #, c-format - msgid "32-bit double, " - msgstr "doble de 32-bit, " - --#: elf32-m68hc1x.c:1290 -+#: elf32-m68hc1x.c:1292 - #, c-format - msgid "cpu=HC11]" - msgstr "cpu=HC11]" - --#: elf32-m68hc1x.c:1292 -+#: elf32-m68hc1x.c:1294 - #, c-format - msgid "cpu=HCS12]" - msgstr "cpu=HCS12]" - --#: elf32-m68hc1x.c:1294 -+#: elf32-m68hc1x.c:1296 - #, c-format - msgid "cpu=HC12]" - msgstr "cpu=HC12]" - --#: elf32-m68hc1x.c:1297 -+#: elf32-m68hc1x.c:1299 - #, c-format - msgid " [memory=bank-model]" - msgstr " [memoria=modelo de bancos]" - --#: elf32-m68hc1x.c:1299 -+#: elf32-m68hc1x.c:1301 - #, c-format - msgid " [memory=flat]" - msgstr " [memoria=plana]" - --#: elf32-m68k.c:635 elf32-m68k.c:636 -+#: elf32-m68k.c:789 elf32-m68k.c:790 - msgid "unknown" - msgstr "desconocido" - -+#: elf32-m68k.c:1216 -+msgid "%B: GOT overflow: Number of R_68K_GOT8O relocations > %d" -+msgstr "%B: desbordamiento de GOT: Número de reubicaciones R_68K_GOT80 > %d" -+ -+#: elf32-m68k.c:1221 -+msgid "%B: GOT overflow: Number of R_68K_GOT8O and R_68K_GOT16O relocations > %d" -+msgstr "%B desbordamiento de GOT: Número de reubicaciones R_68K_GOT80 Y R_68K_GOT160 > %d" -+ - #: elf32-mcore.c:99 elf32-mcore.c:442 - msgid "%B: Relocation %s (%d) is not currently supported.\n" - msgstr "%B: La reubicación %s (%d) actualmente no se admite.\n" -@@ -1433,24 +1638,24 @@ msgstr "%B: La reubicaci - msgid "%B: Unknown relocation type %d\n" - msgstr "%B: Tipo de reubicación %d desconocido\n" - --#: elf32-mep.c:812 -+#: elf32-mep.c:654 - msgid "%B and %B are for different cores" - msgstr "%B y %B son para núcleos diferentes" - --#: elf32-mep.c:829 -+#: elf32-mep.c:671 - msgid "%B and %B are for different configurations" - msgstr "%B y %B son para configuraciones diferentes" - --#: elf32-mep.c:867 -+#: elf32-mep.c:709 - #, c-format - msgid "private flags = 0x%lx" - msgstr "opciones privadas = 0x%lx" - --#: elf32-mips.c:989 elf64-mips.c:1976 elfn32-mips.c:1808 -+#: elf32-mips.c:1045 elf64-mips.c:2056 elfn32-mips.c:1888 - msgid "literal relocation occurs for an external symbol" - msgstr "la reubicación literal sucede para un símbolo externo" - --#: elf32-mips.c:1029 elf32-score.c:484 elf64-mips.c:2019 elfn32-mips.c:1849 -+#: elf32-mips.c:1085 elf32-score.c:484 elf64-mips.c:2099 elfn32-mips.c:1929 - msgid "32bits gp relative relocation occurs for an external symbol" - msgstr "la reubicación gp relativa de 32bits sucede para un símbolo externo" - -@@ -1459,162 +1664,143 @@ msgstr "la reubicaci - msgid "generic linker can't handle %s" - msgstr "el enlazador genérico no puede manejar %s" - --#: elf32-ppc.c:2163 -+#: elf32-ppc.c:2161 - msgid "corrupt or empty %s section in %B" - msgstr "sección %s corrupta o vacía en %B" - --#: elf32-ppc.c:2170 -+#: elf32-ppc.c:2168 - msgid "unable to read in %s section from %B" - msgstr "no se puede leer en la sección %s desde %B" - --#: elf32-ppc.c:2176 -+#: elf32-ppc.c:2174 - msgid "corrupt %s section in %B" - msgstr "sección %s corrupta en %B" - --#: elf32-ppc.c:2219 -+#: elf32-ppc.c:2217 - msgid "warning: unable to set size of %s section in %B" - msgstr "aviso: no se puede establecer el tamaño de la sección %s en %B" - --#: elf32-ppc.c:2267 -+#: elf32-ppc.c:2265 - msgid "failed to allocate space for new APUinfo section." - msgstr "no se puede reservar espacio para la nueva sección APUinfo." - --#: elf32-ppc.c:2286 -+#: elf32-ppc.c:2284 - msgid "failed to compute new APUinfo section." - msgstr "no se puede calcular la nueva sección APUinfo." - --#: elf32-ppc.c:2289 -+#: elf32-ppc.c:2287 - msgid "failed to install new APUinfo section." - msgstr "no se puede instalar la nueva sección APUinfo." - --#: elf32-ppc.c:3022 -+#: elf32-ppc.c:3263 - msgid "%B: relocation %s cannot be used when making a shared object" - msgstr "%B: no se puede usar la reubicación %s cuando se hace un objeto compartido" - - #. It does not make sense to have a procedure linkage - #. table entry for a local symbol. --#: elf32-ppc.c:3292 -+#: elf32-ppc.c:3534 - msgid "%B(%A+0x%lx): %s reloc against local symbol" - msgstr "%B(%A+0x%lx): reubicación %s contra un símbolo local" - --#: elf32-ppc.c:3633 elf32-ppc.c:3637 elfxx-mips.c:11036 elfxx-mips.c:11055 --#: elfxx-mips.c:11070 -+#: elf32-ppc.c:3885 elf32-ppc.c:3900 elfxx-mips.c:12268 elfxx-mips.c:12294 -+#: elfxx-mips.c:12316 elfxx-mips.c:12342 - msgid "Warning: %B uses hard float, %B uses soft float" - msgstr "Aviso: %B usa coma flotante hard, %B usa coma flotante soft" - --#: elf32-ppc.c:3640 elf32-ppc.c:3644 elfxx-mips.c:11017 elfxx-mips.c:11021 -+#: elf32-ppc.c:3888 elf32-ppc.c:3892 -+msgid "Warning: %B uses double-precision hard float, %B uses single-precision hard float" -+msgstr "Aviso: %B usa coma flotante hard de doble precisión, %B usa coma flotante hard de precisión simple" -+ -+#: elf32-ppc.c:3896 -+msgid "Warning: %B uses soft float, %B uses single-precision hard float" -+msgstr "Aviso: %B usa coma flotante soft, %B usa coma flotante hard de precisión simple" -+ -+#: elf32-ppc.c:3903 elf32-ppc.c:3907 elfxx-mips.c:12248 elfxx-mips.c:12252 - msgid "Warning: %B uses unknown floating point ABI %d" - msgstr "Aviso: %B usa la ABI de coma flotante desconocida %d" - --#: elf32-ppc.c:3699 -+#: elf32-ppc.c:3949 elf32-ppc.c:3953 -+msgid "Warning: %B uses unknown vector ABI %d" -+msgstr "Aviso: %B usa la ABI de vector desconocida %d" -+ -+#: elf32-ppc.c:3957 -+msgid "Warning: %B uses vector ABI \"%s\", %B uses \"%s\"" -+msgstr "Aviso: %B usa la ABI de vector \"%s\", %B usa \"%s\"" -+ -+#: elf32-ppc.c:4011 - msgid "%B: compiled with -mrelocatable and linked with modules compiled normally" - msgstr "%B: compilado con -mrelocatable y enlazado con módulos compilados de forma normal" - --#: elf32-ppc.c:3707 -+#: elf32-ppc.c:4019 - msgid "%B: compiled normally and linked with modules compiled with -mrelocatable" - msgstr "%B: compilado de forma normal y enlazado con módulos compilados con -mrelocatable" - --#: elf32-ppc.c:3793 -+#: elf32-ppc.c:4105 - msgid "Using bss-plt due to %B" - msgstr "Se usa bss-plt debido a %B" - --#: elf32-ppc.c:6002 elf64-ppc.c:10490 -+#: elf32-ppc.c:6418 elf64-ppc.c:10881 - msgid "%B: unknown relocation type %d for symbol %s" - msgstr "%B: tipo de reubicación %d desconocido para el símbolo %s" - --#: elf32-ppc.c:6252 -+#: elf32-ppc.c:6668 - msgid "%B(%A+0x%lx): non-zero addend on %s reloc against `%s'" - msgstr "%B(%A+0x%lx): adición que no es cero en la reubicación %s contra `%s'" - --#: elf32-ppc.c:6597 elf32-ppc.c:6623 elf32-ppc.c:6682 -+#: elf32-ppc.c:7024 elf32-ppc.c:7050 elf32-ppc.c:7109 - msgid "%B: the target (%s) of a %s relocation is in the wrong output section (%s)" - msgstr "%B: el objetivo (%s) de una reubicación %s está en la sección de salida errónea (%s)" - --#: elf32-ppc.c:6737 -+#: elf32-ppc.c:7164 - msgid "%B: relocation %s is not yet supported for symbol %s." - msgstr "%B: la reubicación %s aún no se admite para el símbolo %s." - --#: elf32-ppc.c:6845 elf64-ppc.c:11185 -+#: elf32-ppc.c:7272 elf64-ppc.c:11575 - msgid "%B(%A+0x%lx): %s reloc against `%s': error %d" - msgstr "%B(%A+0x%lx): reubicación %s contra `%s': error %d" - --#: elf32-s390.c:2238 elf64-s390.c:2212 -+#: elf32-s390.c:2246 elf64-s390.c:2220 - msgid "%B(%A+0x%lx): invalid instruction for TLS relocation %s" - msgstr "%B(%A+0x%lx): instrucción inválida para la reubicación TLS %s" - --#: elf32-score.c:1418 elfxx-mips.c:2699 -+#: elf32-score.c:1415 elfxx-mips.c:3273 - msgid "not enough GOT space for local GOT entries" - msgstr "no hay suficiente espacio GOT para entradas GOT locales" - --#: elf32-score.c:2550 -+#: elf32-score.c:2545 - #, c-format - msgid "%s: Malformed reloc detected for section %s" - msgstr "%s: Se detectó una reubicación malformada para la sección %s" - --#: elf32-score.c:2601 -+#: elf32-score.c:2596 - msgid "%B: CALL15 reloc at 0x%lx not against global symbol" - msgstr "%B: la reubicación CALL15 en 0x%lx no es contra un símbolo global" - --#: elf32-score.c:3756 -+#: elf32-score.c:3753 - #, c-format - msgid " [pic]" - msgstr " [pic]" - --#: elf32-score.c:3760 -+#: elf32-score.c:3757 - #, c-format - msgid " [fix dep]" - msgstr " [fix dep]" - --#: elf32-score.c:3802 elfxx-mips.c:11201 -+#: elf32-score.c:3799 - msgid "%B: warning: linking PIC files with non-PIC files" - msgstr "%B: aviso: se enlazan ficheros PIC con ficheros que no son PIC" - --#: elf32-sh64.c:222 elf64-sh64.c:2350 --#, c-format --msgid "%s: compiled as 32-bit object and %s is 64-bit" --msgstr "%s: compilado como un objeto de 32-bit y %s es de 64-bit" -- --#: elf32-sh64.c:225 elf64-sh64.c:2353 --#, c-format --msgid "%s: compiled as 64-bit object and %s is 32-bit" --msgstr "%s: compilado como un objeto de 64-bit y %s es de 32-bit" -- --#: elf32-sh64.c:227 elf64-sh64.c:2355 --#, c-format --msgid "%s: object size does not match that of target %s" --msgstr "%s: el tamaño del objeto no coincide con el tamaño del objetivo %s" -- --#: elf32-sh64.c:450 elf64-sh64.c:2894 --#, c-format --msgid "%s: encountered datalabel symbol in input" --msgstr "%s: se encontró un símbolo datalabel en la entrada" -- --#: elf32-sh64.c:527 --msgid "PTB mismatch: a SHmedia address (bit 0 == 1)" --msgstr "No coincide PTB: una dirección SHmedia (bit 0 == 1)" -- --#: elf32-sh64.c:530 --msgid "PTA mismatch: a SHcompact address (bit 0 == 0)" --msgstr "No coincide PTA: una dirección SHcompact (bit 0 == 0)" -- --#: elf32-sh64.c:548 --#, c-format --msgid "%s: GAS error: unexpected PTB insn with R_SH_PT_16" --msgstr "%s: error de GAS: instrucción PTB inesperada con R_SH_PT_16" -- --#: elf32-sh64.c:597 --msgid "%B: error: unaligned relocation type %d at %08x reloc %p\n" --msgstr "%B: error: tipo de reubicación %d sin alinear en %08x reubicación %p\n" -+#: elf32-sh-symbian.c:130 -+msgid "%B: IMPORT AS directive for %s conceals previous IMPORT AS" -+msgstr "%B: la directiva IMPORT AS para %s oculta un IMPORT AS previo" - --#: elf32-sh64.c:673 --#, c-format --msgid "%s: could not write out added .cranges entries" --msgstr "%s: no se pueden escribir las entradas .cranges agregadas" -+#: elf32-sh-symbian.c:383 -+msgid "%B: Unrecognised .directive command: %s" -+msgstr "%B: Orden .directive no reconocida: %s" - --#: elf32-sh64.c:733 --#, c-format --msgid "%s: could not write out sorted .cranges entries" --msgstr "%s: no se pueden escribir las entradas .cranges ordenadas" -+#: elf32-sh-symbian.c:504 -+msgid "%B: Failed to add renamed symbol %s" -+msgstr "%B: Falló al agregar el símbolo renombrado %s" - - #: elf32-sh.c:533 - msgid "%B: 0x%lx: warning: bad R_SH_USES offset" -@@ -1648,41 +1834,76 @@ msgstr "%B: 0x%lx: aviso: cuenta err - msgid "%B: 0x%lx: fatal: reloc overflow while relaxing" - msgstr "%B: 0x%lx: fatal: desbordamiento de reubicación durante la relajación" - --#: elf32-sh.c:3249 elf64-sh64.c:1526 -+#: elf32-sh.c:3279 elf64-sh64.c:1526 - msgid "Unexpected STO_SH5_ISA32 on local symbol is not handled" - msgstr "No se maneja un STO_SH5_ISA32 inesperado en un símbolo local" - --#: elf32-sh.c:3486 -+#: elf32-sh.c:3516 - msgid "%B: 0x%lx: fatal: unaligned branch target for relax-support relocation" - msgstr "%B: 0x%lx: fatal: objetivo de ramificación sin alineación para la reubicación de soporte de relajamiento" - --#: elf32-sh.c:3519 elf32-sh.c:3534 -+#: elf32-sh.c:3549 elf32-sh.c:3564 - msgid "%B: 0x%lx: fatal: unaligned %s relocation 0x%lx" - msgstr "%B: 0x%lx: fatal: reubicación %s sin alineación 0x%lx" - --#: elf32-sh.c:3548 -+#: elf32-sh.c:3578 - msgid "%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32" - msgstr "%B: 0x%lx: fatal: la reubicación R_SH_PSHA %d no está en el rango -32..32" - --#: elf32-sh.c:3562 -+#: elf32-sh.c:3592 - msgid "%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32" - msgstr "%B: 0x%lx: fatal: la reubicación R_SH_PSHL %d no está en el rango -32..32" - --#: elf32-sh.c:5275 elf64-alpha.c:4533 -+#: elf32-sh.c:5310 elf64-alpha.c:4552 - msgid "%B: TLS local exec code cannot be linked into shared objects" - msgstr "%B: el código de ejecución local TLS no se puede enlazar en objetos compartidos" - --#: elf32-sh-symbian.c:130 --msgid "%B: IMPORT AS directive for %s conceals previous IMPORT AS" --msgstr "%B: la directiva IMPORT AS para %s oculta un IMPORT AS previo" -+#: elf32-sh64.c:222 elf64-sh64.c:2345 -+#, c-format -+msgid "%s: compiled as 32-bit object and %s is 64-bit" -+msgstr "%s: compilado como un objeto de 32-bit y %s es de 64-bit" - --#: elf32-sh-symbian.c:383 --msgid "%B: Unrecognised .directive command: %s" --msgstr "%B: Orden .directive no reconocida: %s" -+#: elf32-sh64.c:225 elf64-sh64.c:2348 -+#, c-format -+msgid "%s: compiled as 64-bit object and %s is 32-bit" -+msgstr "%s: compilado como un objeto de 64-bit y %s es de 32-bit" - --#: elf32-sh-symbian.c:504 --msgid "%B: Failed to add renamed symbol %s" --msgstr "%B: Falló al agregar el símbolo renombrado %s" -+#: elf32-sh64.c:227 elf64-sh64.c:2350 -+#, c-format -+msgid "%s: object size does not match that of target %s" -+msgstr "%s: el tamaño del objeto no coincide con el tamaño del objetivo %s" -+ -+#: elf32-sh64.c:450 elf64-sh64.c:2888 -+#, c-format -+msgid "%s: encountered datalabel symbol in input" -+msgstr "%s: se encontró un símbolo datalabel en la entrada" -+ -+#: elf32-sh64.c:527 -+msgid "PTB mismatch: a SHmedia address (bit 0 == 1)" -+msgstr "No coincide PTB: una dirección SHmedia (bit 0 == 1)" -+ -+#: elf32-sh64.c:530 -+msgid "PTA mismatch: a SHcompact address (bit 0 == 0)" -+msgstr "No coincide PTA: una dirección SHcompact (bit 0 == 0)" -+ -+#: elf32-sh64.c:548 -+#, c-format -+msgid "%s: GAS error: unexpected PTB insn with R_SH_PT_16" -+msgstr "%s: error de GAS: instrucción PTB inesperada con R_SH_PT_16" -+ -+#: elf32-sh64.c:597 -+msgid "%B: error: unaligned relocation type %d at %08x reloc %p\n" -+msgstr "%B: error: tipo de reubicación %d sin alinear en %08x reubicación %p\n" -+ -+#: elf32-sh64.c:673 -+#, c-format -+msgid "%s: could not write out added .cranges entries" -+msgstr "%s: no se pueden escribir las entradas .cranges agregadas" -+ -+#: elf32-sh64.c:733 -+#, c-format -+msgid "%s: could not write out sorted .cranges entries" -+msgstr "%s: no se pueden escribir las entradas .cranges ordenadas" - - #: elf32-sparc.c:89 - msgid "%B: compiled for a 64 bit system and target is 32 bit" -@@ -1692,69 +1913,103 @@ msgstr "%B: compilado para un sistema de 64 bit y el objetivo es de 32 bit" - msgid "%B: linking little endian files with big endian files" - msgstr "%B: se enlazan ficheros little endian con ficheros big endian" - --#: elf32-spu.c:995 -+#: elf32-spu.c:607 -+msgid "%X%P: overlay sections %A and %A do not start at the same address.\n" -+msgstr "%X%P: las secciones de sobreescritura %A y %A no inician en la misma dirección.\n" -+ -+#: elf32-spu.c:805 - msgid "warning: call to non-function symbol %s defined in %B" - msgstr "aviso: se llama al símbolo %s que no es función, definido en %B" - --#: elf32-spu.c:1315 -+#: elf32-spu.c:1406 - msgid "%B is not allowed to define %s" - msgstr "%B no se permite para definir %s" - --#: elf32-spu.c:1352 -+#: elf32-spu.c:1453 - #, c-format - msgid "%s in overlay section" - msgstr "%s en la sección de sobreescritura" - --#: elf32-spu.c:1363 -+#: elf32-spu.c:1469 - msgid "overlay stub relocation overflow" - msgstr "desbordamiento del segmento de reubicación de sobreescritura" - --#: elf32-spu.c:1820 -+#: elf32-spu.c:1478 elf64-ppc.c:10078 -+msgid "stubs don't match calculated size" -+msgstr "los cabos no coinciden con el tamaño calculado" -+ -+#: elf32-spu.c:1976 - #, c-format - msgid "warning: %s overlaps %s\n" - msgstr "aviso: %s sobreescribe %s\n" - --#: elf32-spu.c:1836 -+#: elf32-spu.c:1992 - #, c-format - msgid "warning: %s exceeds section size\n" - msgstr "aviso: %s excede el tamaño de la sección\n" - --#: elf32-spu.c:1867 -+#: elf32-spu.c:2023 - msgid "%A:0x%v not found in function table\n" - msgstr "%A:0x%v no se encuentra en la tabla de función\n" - --#: elf32-spu.c:1958 --msgid "%B(%A+0x%v): call to non-code section %B(%A), stack analysis incomplete\n" --msgstr "%B(%A+0x%v): se llama a la sección %B(%A) que no es de código, análisis de pila incompleto\n" -+#: elf32-spu.c:2165 -+msgid "%B(%A+0x%v): call to non-code section %B(%A), analysis incomplete\n" -+msgstr "%B(%A+0x%v): se llama a la sección %B(%A) que no es de código, análisis incompleto\n" - --#: elf32-spu.c:2079 -+#: elf32-spu.c:2339 - #, c-format - msgid "%A link_order not found\n" - msgstr "no se encontró link_order %A\n" - --#: elf32-spu.c:2358 -+#: elf32-spu.c:2706 - #, c-format - msgid "Stack analysis will ignore the call from %s to %s\n" - msgstr "El análisis de pila descartará la llamada de %s a %s\n" - --#: elf32-spu.c:2513 -+#: elf32-spu.c:3348 -+msgid " %s: 0x%v\n" -+msgstr " %s: 0x%v\n" -+ -+#: elf32-spu.c:3349 - msgid "%s: 0x%v 0x%v\n" - msgstr "%s: 0x%v 0x%v\n" - --#: elf32-spu.c:2517 -+#: elf32-spu.c:3354 - msgid " calls:\n" - msgstr " llama:\n" - --#: elf32-spu.c:2524 -+#: elf32-spu.c:3362 - #, c-format - msgid " %s%s %s\n" - msgstr " %s%s %s\n" - --#: elf32-spu.c:2585 -+#: elf32-spu.c:3564 -+#, c-format -+msgid "%s duplicated in %s\n" -+msgstr "%s duplicado en %s\n" -+ -+#: elf32-spu.c:3568 -+#, c-format -+msgid "%s duplicated\n" -+msgstr "%s duplicado\n" -+ -+#: elf32-spu.c:3575 -+msgid "sorry, no support for duplicate object files in auto-overlay script\n" -+msgstr "perdón, no se admiten ficheros objeto duplicados en el guión de sobreescritura automática\n" -+ -+#: elf32-spu.c:3605 -+msgid "non-overlay size of 0x%v plus maximum overlay size of 0x%v exceeds local store\n" -+msgstr "eltamaño 0x%v que no es de sobreescritura mas el tamaño de sobreescritura máximo de 0x%v excede el almacenamiento local\n" -+ -+#: elf32-spu.c:3741 -+msgid "%B:%A%s exceeds overlay size\n" -+msgstr "%B:%A%s excede el tamaño de sobreescritura\n" -+ -+#: elf32-spu.c:3862 - msgid "Stack size for call graph root nodes.\n" - msgstr "Tamaño de la pila para los nodos raíz del grafo de llamadas.\n" - --#: elf32-spu.c:2586 -+#: elf32-spu.c:3863 - msgid "" - "\n" - "Stack size for functions. Annotations: '*' max stack, 't' tail call\n" -@@ -1762,80 +2017,76 @@ msgstr "" - "\n" - "Tamaño de la pila para funciones. Anotaciones: '*' max de pila, 't' llamada cola\n" - --#: elf32-spu.c:2615 --msgid " %s: 0x%v\n" --msgstr " %s: 0x%v\n" -- --#: elf32-spu.c:2625 -+#: elf32-spu.c:3871 - msgid "Maximum stack required is 0x%v\n" - msgstr "La pila máxima requerida es 0x%v\n" - --#: elf32-spu.c:2751 -+#: elf32-spu.c:4067 - msgid "%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'" - msgstr "%B(%s+0x%lx): reubicación %s sin resolución contra el símbolo `%s'" - --#: elf32-v850.c:163 -+#: elf32-v850.c:165 - #, c-format - msgid "Variable `%s' cannot occupy in multiple small data regions" - msgstr "La variable `%s' no puede ocupar múltiples regiones de datos small" - --#: elf32-v850.c:166 -+#: elf32-v850.c:168 - #, c-format - msgid "Variable `%s' can only be in one of the small, zero, and tiny data regions" - msgstr "La variable `%s' solamente puede estar en una de las regiones de datos small, cero, y tiny" - --#: elf32-v850.c:169 -+#: elf32-v850.c:171 - #, c-format - msgid "Variable `%s' cannot be in both small and zero data regions simultaneously" - msgstr "La variable `%s' no puede estar simultáneamente en las regiones de datos small y cero" - --#: elf32-v850.c:172 -+#: elf32-v850.c:174 - #, c-format - msgid "Variable `%s' cannot be in both small and tiny data regions simultaneously" - msgstr "La variable `%s' no puede estar simultáneamente en las regiones de datos small y tiny" - --#: elf32-v850.c:175 -+#: elf32-v850.c:177 - #, c-format - msgid "Variable `%s' cannot be in both zero and tiny data regions simultaneously" - msgstr "La variable `%s' no puede estar simultáneamente en las regiones de datos cero y tiny" - --#: elf32-v850.c:478 -+#: elf32-v850.c:480 - #, c-format - msgid "FAILED to find previous HI16 reloc\n" - msgstr "FALLO para encontrar la reubicación HI16 previa\n" - --#: elf32-v850.c:1713 -+#: elf32-v850.c:1715 - msgid "could not locate special linker symbol __gp" - msgstr "no se puede localizar el símbolo especial del enlazador __gp" - --#: elf32-v850.c:1717 -+#: elf32-v850.c:1719 - msgid "could not locate special linker symbol __ep" - msgstr "no se puede localizar el símbolo especial del enlazador __ep" - --#: elf32-v850.c:1721 -+#: elf32-v850.c:1723 - msgid "could not locate special linker symbol __ctbp" - msgstr "no se puede localizar el símbolo especial del enlazador __ctbp" - --#: elf32-v850.c:1871 -+#: elf32-v850.c:1873 - msgid "%B: Architecture mismatch with previous modules" - msgstr "%B: No coincide la arquitectura con los módulos previos" - --#: elf32-v850.c:1890 -+#: elf32-v850.c:1892 - #, c-format - msgid "private flags = %lx: " - msgstr "opciones privadas = %lx: " - --#: elf32-v850.c:1895 -+#: elf32-v850.c:1897 - #, c-format - msgid "v850 architecture" - msgstr "arquitectura v850" - --#: elf32-v850.c:1896 -+#: elf32-v850.c:1898 - #, c-format - msgid "v850e architecture" - msgstr "arquitectura v850e" - --#: elf32-v850.c:1897 -+#: elf32-v850.c:1899 - #, c-format - msgid "v850e1 architecture" - msgstr "arquitectura v850e1" -@@ -1860,114 +2111,118 @@ msgstr " [flotante-g]" - msgid "%s: warning: GOT addend of %ld to `%s' does not match previous GOT addend of %ld" - msgstr "%s: aviso: la adición GOT de %ld a `%s' no coincide con la adición previa GOT de %ld" - --#: elf32-vax.c:1584 -+#: elf32-vax.c:1589 - #, c-format - msgid "%s: warning: PLT addend of %d to `%s' from %s section ignored" - msgstr "%s: aviso: se descarta la adición PLT de %d a `%s' de la sección %s" - --#: elf32-vax.c:1721 -+#: elf32-vax.c:1726 - #, c-format - msgid "%s: warning: %s relocation against symbol `%s' from %s section" - msgstr "%s: aviso: reubicación %s contra el símbolo `%s' de la sección %s" - --#: elf32-vax.c:1727 -+#: elf32-vax.c:1732 - #, c-format - msgid "%s: warning: %s relocation to 0x%x from %s section" - msgstr "%s: aviso: reubicación %s a 0x%x de la sección %s" - --#: elf32-xstormy16.c:451 elf32-ia64.c:2962 elf64-ia64.c:2962 -+#: elf32-xstormy16.c:451 elf32-ia64.c:2794 elf64-ia64.c:2794 - msgid "non-zero addend in @fptr reloc" - msgstr "adición que no es cero en la reubicación @fptr" - --#: elf32-xtensa.c:733 -+#: elf32-xtensa.c:911 - msgid "%B(%A): invalid property table" - msgstr "%B(%A): tabla de propiedades inválida" - --#: elf32-xtensa.c:2177 -+#: elf32-xtensa.c:2734 - msgid "%B(%A+0x%lx): relocation offset out of range (size=0x%x)" - msgstr "%B(%A+0x%lx): desplazamiento de reubicación fuera de rango (tamaño=0x%x)" - --#: elf32-xtensa.c:2234 -+#: elf32-xtensa.c:2813 elf32-xtensa.c:2934 - msgid "dynamic relocation in read-only section" - msgstr "reubicación dinámica en la sección de sólo lectura" - --#: elf32-xtensa.c:2407 -+#: elf32-xtensa.c:2910 -+msgid "TLS relocation invalid without dynamic sections" -+msgstr "reubicación TLS inválida sin secciones dinámicas" -+ -+#: elf32-xtensa.c:3127 - msgid "internal inconsistency in size of .got.loc section" - msgstr "inconsistencia interna en el tamaño de la sección .got.loc" - --#: elf32-xtensa.c:2714 -+#: elf32-xtensa.c:3437 - msgid "%B: incompatible machine type. Output is 0x%x. Input is 0x%x" - msgstr "%B: tipo de máquina incompatible. La salida es 0x%x. La entrada es 0x%x" - --#: elf32-xtensa.c:3920 elf32-xtensa.c:3928 -+#: elf32-xtensa.c:4666 elf32-xtensa.c:4674 - msgid "Attempt to convert L32R/CALLX to CALL failed" - msgstr "Falló el intento de convertir L32R/CALLX a CALL" - --#: elf32-xtensa.c:5522 elf32-xtensa.c:5598 elf32-xtensa.c:6714 -+#: elf32-xtensa.c:6276 elf32-xtensa.c:6352 elf32-xtensa.c:7468 - msgid "%B(%A+0x%lx): could not decode instruction; possible configuration mismatch" - msgstr "%B(%A+0x%lx): no se puede decodificar la instrucción; posible falta de coincidencia de la configuración" - --#: elf32-xtensa.c:6454 -+#: elf32-xtensa.c:7208 - msgid "%B(%A+0x%lx): could not decode instruction for XTENSA_ASM_SIMPLIFY relocation; possible configuration mismatch" - msgstr "%B(%A+0x%lx): no se puede decodificar la instrucción para la reubicación XTENSA_ASM_SIMPLIFY; posible falta de coincidencia de la configuración" - --#: elf32-xtensa.c:8166 -+#: elf32-xtensa.c:8969 - msgid "invalid relocation address" - msgstr "dirección de reubicación inválida" - --#: elf32-xtensa.c:8215 -+#: elf32-xtensa.c:9018 - msgid "overflow after relaxation" - msgstr "desbordamiento después de la relajación" - --#: elf32-xtensa.c:9341 -+#: elf32-xtensa.c:10154 - msgid "%B(%A+0x%lx): unexpected fix for %s relocation" - msgstr "%B(%A+0x%lx): compostura inesperada para la reubicación %s" - --#: elf64-alpha.c:453 -+#: elf64-alpha.c:452 - msgid "GPDISP relocation did not find ldah and lda instructions" - msgstr "la reubicación GPDISP no encontró las instrucciones ldah y lda" - --#: elf64-alpha.c:2404 -+#: elf64-alpha.c:2416 - msgid "%B: .got subsegment exceeds 64K (size %d)" - msgstr "%B: el subsegmento .got excede los 64K (tamaño %d)" - --#: elf64-alpha.c:4277 elf64-alpha.c:4289 -+#: elf64-alpha.c:4296 elf64-alpha.c:4308 - msgid "%B: gp-relative relocation against dynamic symbol %s" - msgstr "%B: reubicación gp relativa contra el símbolo dinámico %s" - --#: elf64-alpha.c:4315 elf64-alpha.c:4450 -+#: elf64-alpha.c:4334 elf64-alpha.c:4469 - msgid "%B: pc-relative relocation against dynamic symbol %s" - msgstr "%B: reubicación relativa al pc contra el símbolo dinámico %s" - --#: elf64-alpha.c:4343 -+#: elf64-alpha.c:4362 - msgid "%B: change in gp: BRSGP %s" - msgstr "%B: cambio en gp: BRSGP %s" - --#: elf64-alpha.c:4368 -+#: elf64-alpha.c:4387 - msgid "" - msgstr "" - --#: elf64-alpha.c:4373 -+#: elf64-alpha.c:4392 - msgid "%B: !samegp reloc against symbol without .prologue: %s" - msgstr "%B: reubicación !samegp contra un símbolo sin .prologue: %s" - --#: elf64-alpha.c:4425 -+#: elf64-alpha.c:4444 - msgid "%B: unhandled dynamic relocation against %s" - msgstr "%B: reubicación dinámica sin manejar contra %s" - --#: elf64-alpha.c:4457 -+#: elf64-alpha.c:4476 - msgid "%B: pc-relative relocation against undefined weak symbol %s" - msgstr "%B: reubicación relativa al pc contra el símbolo débil sin definir %s" - --#: elf64-alpha.c:4517 -+#: elf64-alpha.c:4536 - msgid "%B: dtp-relative relocation against dynamic symbol %s" - msgstr "%B: reubicación relativa a dtp contra el símbolo dinámico %s" - --#: elf64-alpha.c:4540 -+#: elf64-alpha.c:4559 - msgid "%B: tp-relative relocation against dynamic symbol %s" - msgstr "%B: reubicación relativa a tp contra el símbolo dinámico %s" - --#: elf64-hppa.c:2040 -+#: elf64-hppa.c:2071 - #, c-format - msgid "stub entry for %s cannot load .plt, dp offset = %ld" - msgstr "la entrada de cabo para %s no puede cargar .plt, desplazamiento dp = %ld" -@@ -2011,16 +2266,16 @@ msgstr "%s: la directiva LOCAL s - msgid "%s: LOCAL directive: Register $%ld is not a local register. First global register is $%ld." - msgstr "%s: directiva LOCAL: El registro $%ld no es un registro local. El primer registro global es $%ld." - --#: elf64-mmix.c:2202 -+#: elf64-mmix.c:2201 - #, c-format - msgid "%s: Error: multiple definition of `%s'; start of %s is set in a earlier linked file\n" - msgstr "%s: Error: definición múltiple de `%s'; el inicio de %s está definido en un fichero enlazado con anterioridad\n" - --#: elf64-mmix.c:2260 -+#: elf64-mmix.c:2259 - msgid "Register section has contents\n" - msgstr "La sección de registros no tiene contenido\n" - --#: elf64-mmix.c:2452 -+#: elf64-mmix.c:2451 - #, c-format - msgid "" - "Internal inconsistency: remaining %u != max %u.\n" -@@ -2029,69 +2284,65 @@ msgstr "" - "Inconsistencia interna: %u restante != %u máximo.\n" - " Por favor reporte este bicho." - --#: elf64-ppc.c:2569 libbfd.c:950 -+#: elf64-ppc.c:2561 libbfd.c:978 - msgid "%B: compiled for a big endian system and target is little endian" - msgstr "%B: compilado para un sistema big endian y el objetivo es little endian" - --#: elf64-ppc.c:2572 libbfd.c:952 -+#: elf64-ppc.c:2564 libbfd.c:980 - msgid "%B: compiled for a little endian system and target is big endian" - msgstr "%B: compilado para un sistema little endian y el objetivo es big endian" - --#: elf64-ppc.c:5888 -+#: elf64-ppc.c:6065 - #, c-format - msgid "copy reloc against `%s' requires lazy plt linking; avoid setting LD_BIND_NOW=1 or upgrade gcc" - msgstr "la reubicación de copia contra `%s' requiere de enlazado plt suelto; evite establecer LD_BIND_NOW=1 o actualice gcc" - --#: elf64-ppc.c:6316 -+#: elf64-ppc.c:6486 - msgid "dynreloc miscount for %B, section %A" - msgstr "cuenta errónea de la reubicación dinámica de %B, sección %A" - --#: elf64-ppc.c:6420 -+#: elf64-ppc.c:6570 - msgid "%B: .opd is not a regular array of opd entries" - msgstr "%B: .opd no es una matriz regular de entradas opd" - --#: elf64-ppc.c:6429 -+#: elf64-ppc.c:6579 - msgid "%B: unexpected reloc type %u in .opd section" - msgstr "%B: tipo de reubicación %u inesperado en la sección .opd" - --#: elf64-ppc.c:6450 -+#: elf64-ppc.c:6600 - msgid "%B: undefined sym `%s' in .opd section" - msgstr "%B: símbolo `%s' indefinido en la sección .opd" - --#: elf64-ppc.c:7157 elf64-ppc.c:7537 -+#: elf64-ppc.c:7377 elf64-ppc.c:7754 - #, c-format - msgid "%s defined in removed toc entry" - msgstr "se definió %s en la entrada toc eliminada" - --#: elf64-ppc.c:8272 -+#: elf64-ppc.c:8581 - #, c-format - msgid "long branch stub `%s' offset overflow" - msgstr "desbordamiento del desplazamiento de stub de ramificación long `%s'" - --#: elf64-ppc.c:8347 -+#: elf64-ppc.c:8640 - #, c-format - msgid "can't find branch stub `%s'" - msgstr "no se puede encontrar la ramificación de cabo `%s'" - --#: elf64-ppc.c:8413 elf64-ppc.c:8489 -+#: elf64-ppc.c:8702 elf64-ppc.c:8822 - #, c-format - msgid "linkage table error against `%s'" - msgstr "error de la tabla de enlazado contra `%s'" - --#: elf64-ppc.c:8618 -+#: elf64-ppc.c:8978 - #, c-format - msgid "can't build branch stub `%s'" - msgstr "no se puede construir la ramificación de cabos `%s'" - --#: elf64-ppc.c:9070 -+#: elf64-ppc.c:9451 - msgid "%B section %A exceeds stub group size" - msgstr "%B sección %A excede el tamaño de grupo de stub" - --#: elf64-ppc.c:9682 --msgid "stubs don't match calculated size" --msgstr "los cabos no coinciden con el tamaño calculado" -- --#: elf64-ppc.c:9694 -+#: elf64-ppc.c:10090 - #, c-format - msgid "" - "linker stubs in %u group%s\n" -@@ -2108,19 +2359,19 @@ msgstr "" - " ajuste toc long %lu\n" - " llamada plt %lu" - --#: elf64-ppc.c:10378 -+#: elf64-ppc.c:10769 - msgid "%B(%A+0x%lx): automatic multiple TOCs not supported using your crt files; recompile with -mminimal-toc or upgrade gcc" - msgstr "%B(%A+0x%lx): no se admiten los TOCs múltiples automáticos, utilizando sus ficheros crt; recompile con -mminimal-toc o actualice gcc" - --#: elf64-ppc.c:10386 -+#: elf64-ppc.c:10777 - msgid "%B(%A+0x%lx): sibling call optimization to `%s' does not allow automatic multiple TOCs; recompile with -mminimal-toc or -fno-optimize-sibling-calls, or make `%s' extern" - msgstr "%B(%A+0x%lx): la optimización de llamada hermana a `%s' no permite TOCs múltiples automáticos; recompile con -mminimal-toc ó -fno-optimize-sibling-calls, o vuelva `%s' externa" - --#: elf64-ppc.c:11037 -+#: elf64-ppc.c:11427 - msgid "%B: relocation %s is not supported for symbol %s." - msgstr "%B: no se admite la reubicación %s para el símbolo %s." - --#: elf64-ppc.c:11119 -+#: elf64-ppc.c:11509 - msgid "%B: error: relocation %s not a multiple of %d" - msgstr "%B: error: la reubicación %s no es un múltiplo de %d" - -@@ -2149,194 +2400,48 @@ msgstr "El s - msgid "%B: linking UltraSPARC specific with HAL specific code" - msgstr "%B: se enlaza código específico de UltraSPARC con código específico de HAL" - --#: elf64-x86-64.c:799 elf64-x86-64.c:959 elf64-x86-64.c:2360 -+#: elf64-x86-64.c:1047 elf64-x86-64.c:1207 elfxx-mips.c:7834 - msgid "%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC" - msgstr "%B: no se puede usar la reubicación %s contra `%s' cuando se hace un objeto compartido; recompile con -fPIC" - --#: elf64-x86-64.c:890 --msgid "%B: %s' accessed both as normal and thread local symbol" --msgstr "%B: se accesó `%s' como un símbolo normal y como un símbolo local de hilo" -+#: elf64-x86-64.c:1138 -+msgid "%B: '%s' accessed both as normal and thread local symbol" -+msgstr "%B: se accedió a '%s' como un símbolo normal y como un símbolo local de hilo" - --#: elf64-x86-64.c:2272 -+#: elf64-x86-64.c:2559 - msgid "%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object" - msgstr "%B: no se puede usar la reubicación R_X86_64_GOTOFF contra la función protegida `%s' cuando se hace un objeto compartido" - --#: elf64-x86-64.c:2356 --msgid "%B: relocation R_X86_64_PC32 against protected function `%s' can not be used when making a shared object" --msgstr "%B: no se puede usar la reubicación R_X86_64_PC32 contra la función protegida `%' cuando se hace un objeto compartido" -+#: elf64-x86-64.c:2670 -+msgid "; recompile with -fPIC" -+msgstr "; recompile con -fPIC" - --#: elf-attrs.c:582 --msgid "ERROR: %B: Must be processed by '%s' toolchain" --msgstr "ERROR: %B: Se debe procesar por la cadena de compilación '%s'" -- --#: elf-attrs.c:602 elf-attrs.c:621 --msgid "ERROR: %B: Incompatible object tag '%s':%d" --msgstr "ERROR: %B: Etiqueta de objeto '%s' incompatible:%d" -- --#: elf.c:312 --msgid "%B: invalid string offset %u >= %lu for section `%s'" --msgstr "%B: desplazamiento de cadena inválido %u >= %lu para la sección `%s'" -- --#: elf.c:414 --msgid "%B symbol number %lu references nonexistent SHT_SYMTAB_SHNDX section" --msgstr "%B el número de símbolo %lu hace referencia a la sección inexistente SHT_SYMTAB_SHNDX" -- --#: elf.c:567 --msgid "%B: Corrupt size field in group section header: 0x%lx" --msgstr "%B: Tamaño de campo corrupto en el encabezado de la sección de grupo: 0x%lx" -+#: elf64-x86-64.c:2675 -+msgid "%B: relocation %s against %s `%s' can not be used when making a shared object%s" -+msgstr "%B: no se puede usar la reubicación %s contra %s `%s' cuando se hace un objeto compartido%s" - --#: elf.c:603 --msgid "%B: invalid SHT_GROUP entry" --msgstr "%B: entrada SHT_GROUP inválida" -- --#: elf.c:673 --msgid "%B: no group info for section %A" --msgstr "%B: no hay información de grupo para la sección %A" -+#: elf64-x86-64.c:2677 -+msgid "%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s" -+msgstr "%B: no se puede usar la reubicación %s contra %s sin definir `%s' cuando se hace un objeto compartido%s" - --#: elf.c:703 elf.c:2886 elflink.c:9858 --msgid "%B: warning: sh_link not set for section `%A'" --msgstr "%B: aviso: no se estableción sh_link para la sección `%A'" -- --#: elf.c:719 --msgid "%B: sh_link [%d] in section `%A' is incorrect" --msgstr "%B: sh_link [%d] en la sección `%A', es incorrecto" -- --#: elf.c:754 --msgid "%B: unknown [%d] section `%s' in group [%s]" --msgstr "%B: sección [%d] desconocida `%s' en el grupo [%s]" -- --#: elf.c:1108 --#, c-format --msgid "" --"\n" --"Program Header:\n" --msgstr "" --"\n" --"Encabezado del Programa:\n" -- --#: elf.c:1150 --#, c-format --msgid "" --"\n" --"Dynamic Section:\n" --msgstr "" --"\n" --"Sección Dinámica:\n" -- --#: elf.c:1276 --#, c-format --msgid "" --"\n" --"Version definitions:\n" --msgstr "" --"\n" --"Definiciones de versión:\n" -- --#: elf.c:1301 --#, c-format --msgid "" --"\n" --"Version References:\n" --msgstr "" --"\n" --"Referencias de Versión:\n" -- --#: elf.c:1306 --#, c-format --msgid " required from %s:\n" --msgstr " requerido desde %s:\n" -- --#: elf.c:1690 --msgid "%B: invalid link %lu for reloc section %s (index %u)" --msgstr "%B: enlace %lu inválido para la sección de reubicación %s (índice %u)" -- --#: elf.c:1858 --msgid "%B: don't know how to handle allocated, application specific section `%s' [0x%8x]" --msgstr "%B: no se sabe cómo manejar lo reservado, aplicación específica de la sección `%s' [0x%8x]" -- --#: elf.c:1870 --msgid "%B: don't know how to handle processor specific section `%s' [0x%8x]" --msgstr "%B: no se sabe cómo manejar la sección específica de procesador `%s' [0x%8x]" -- --#: elf.c:1881 --msgid "%B: don't know how to handle OS specific section `%s' [0x%8x]" --msgstr "%B: no se sabe cómo manejar la sección específica de SO `%s' [0x%8x]" -- --#: elf.c:1891 --msgid "%B: don't know how to handle section `%s' [0x%8x]" --msgstr "%B: no se sabe cómo manejar la sección `%s' [0x%8x]" -- --#: elf.c:2843 --msgid "%B: sh_link of section `%A' points to discarded section `%A' of `%B'" --msgstr "%B: sh_link de la sección `%A' apunta a la sección descartada `%A' de `%B'" -- --#: elf.c:2866 --msgid "%B: sh_link of section `%A' points to removed section `%A' of `%B'" --msgstr "%B: sh_link de la sección `%A' apunta a la sección descartada `%A' de `%B'" -- --#: elf.c:4142 --msgid "%B: The first section in the PT_DYNAMIC segment is not the .dynamic section" --msgstr "%B: La primera sección en el segmento PT_DYNAMIC no es la sección .dynamic" -- --#: elf.c:4165 --msgid "%B: Not enough room for program headers, try linking with -N" --msgstr "%B: No hay suficiente espacio para los encabezados del programa, pruebe enlazar con -N" -- --#: elf.c:4243 --msgid "%B: section %A lma 0x%lx overlaps previous sections" --msgstr "%B: la sección %A lma 0x%lx traslapa las secciones anteriores" -- --#: elf.c:4341 --msgid "%B: section `%A' can't be allocated in segment %d" --msgstr "%B: la sección `%A' no se puede asignar en el segmento %d" -- --#: elf.c:4390 --msgid "%B: warning: allocated section `%s' not in segment" --msgstr "%B: aviso: la sección asignada `%s' no está en el segmento" -- --#: elf.c:4886 --msgid "%B: symbol `%s' required but not present" --msgstr "%B: se requiere el símbolo `%s' pero no está presente" -- --#: elf.c:5199 --msgid "%B: warning: Empty loadable segment detected, is this intentional ?\n" --msgstr "%B: aviso: Se detectó un segmento cargable vacío, ¿ esto es intencional ?\n" -- --#: elf.c:6105 --#, c-format --msgid "Unable to find equivalent output section for symbol '%s' from section '%s'" --msgstr "No se puede encontrar la sección de salida equivalente para el símbolo '%s' de la sección '%s'" -- --#: elf.c:7079 --msgid "%B: unsupported relocation type %s" --msgstr "%B: no se admite el tipo de reubicación %s" -- --#: elfcode.h:813 -+#: elfcode.h:795 - #, c-format - msgid "warning: %s has a corrupt string table index - ignoring" - msgstr "aviso: %s tiene un índice de tablas de cadenas corrupto - se descarta" - --#: elfcode.h:1226 -+#: elfcode.h:1201 - #, c-format - msgid "%s: version count (%ld) does not match symbol count (%ld)" - msgstr "%s: la cuenta de versión (%ld) no coincide con la cuenta de símbolos (%ld)" - --#: elfcode.h:1459 -+#: elfcode.h:1435 - #, c-format - msgid "%s(%s): relocation %d has invalid symbol index %ld" - msgstr "%s(%s): la reubicación %d tiene un índice de símbolo %ld inválido" - --#: elf-eh-frame.c:823 --msgid "%P: fde encoding in %B(%A) prevents .eh_frame_hdr table being created.\n" --msgstr "%P: la codificación fde en %B(%A) previene la creación de la tabla .eh_frame_hdr.\n" -- --#: elf-eh-frame.c:974 --msgid "%P: error in %B(%A); no .eh_frame_hdr table will be created.\n" --msgstr "%P: error en %B(%A); no se creará la tabla .eh_frame_hdr.\n" -- --#: elf-hppa.h:2219 elf-hppa.h:2233 --msgid "%B(%A): warning: unresolvable relocation against symbol `%s'" --msgstr "%B(%A): aviso: reubicación sin resolución contra el símbolo `%s'" -+#: elfcore.h:251 -+msgid "Warning: %B is truncated: expected core file size >= %lu, found: %lu." -+msgstr "Aviso: se truncó %B: se esperaba el tamaño de fichero core >= %lu, se encontró: %lu." - - #: elflink.c:1028 - msgid "%s: TLS definition in %B section %A mismatches non-TLS definition in %B section %A" -@@ -2358,282 +2463,295 @@ msgstr "%s: la referencia TLS en %B no coincide con la definici - msgid "%B: unexpected redefinition of indirect versioned symbol `%s'" - msgstr "%B: redefinición inesperada del símbolo con versión indirecta `%s'" - --#: elflink.c:1974 -+#: elflink.c:1982 - msgid "%B: version node not found for symbol %s" - msgstr "%B: no se encuentra la versión del nodo para el símbolo %s" - --#: elflink.c:2122 -+#: elflink.c:2130 - msgid "%B: bad reloc symbol index (0x%lx >= 0x%lx) for offset 0x%lx in section `%A'" - msgstr "%B: índice de símbolos de reubicación inválido (0x%lx >= 0x%lx) erróneo para el desplazamiento 0x%lx en la sección `%A'" - --#: elflink.c:2314 -+#: elflink.c:2327 - msgid "%B: relocation size mismatch in %B section %A" - msgstr "%B: el tamaño de reubicación no coincide en %B sección %A" - --#: elflink.c:2616 -+#: elflink.c:2629 - #, c-format - msgid "warning: type and size of dynamic symbol `%s' are not defined" - msgstr "aviso: el tipo y tamaño del símbolo dinámico `%s' no están definidos" - --#: elflink.c:3910 -+#: elflink.c:3953 - msgid "%B: %s: invalid version %u (max %d)" - msgstr "%B: %s: versión %u inválida (máximo %d)" - --#: elflink.c:3946 -+#: elflink.c:3989 - msgid "%B: %s: invalid needed version %d" - msgstr "%B: %s: versión requerida %d inválida" - --#: elflink.c:4129 -+#: elflink.c:4172 - msgid "Warning: alignment %u of common symbol `%s' in %B is greater than the alignment (%u) of its section %A" - msgstr "Aviso: la alineación %u del símbolo común `%s' en %B es más grande que la alineación (%u) de su sección %A" - --#: elflink.c:4135 -+#: elflink.c:4178 - msgid "Warning: alignment %u of symbol `%s' in %B is smaller than %u in %B" - msgstr "Aviso: la alineación %u del símbolo `%s' en %B es más pequeña que %u en %B" - --#: elflink.c:4150 -+#: elflink.c:4193 - msgid "Warning: size of symbol `%s' changed from %lu in %B to %lu in %B" - msgstr "Aviso: el tamaño del símbolo `%s' cambió de %lu en %B a %lu en %B" - --#: elflink.c:4326 -+#: elflink.c:4371 - #, c-format - msgid "%s: invalid DSO for symbol `%s' definition" - msgstr "%s: DSO inválido para la definición del símbolo `%s'" - --#: elflink.c:5552 -+#: elflink.c:5621 - #, c-format - msgid "%s: undefined version: %s" - msgstr "%s: versión sin definir: %s" - --#: elflink.c:5620 -+#: elflink.c:5689 - msgid "%B: .preinit_array section is not allowed in DSO" - msgstr "%B: no se permite la sección .preinit_array en DSO" - --#: elflink.c:7359 -+#: elflink.c:7414 - #, c-format - msgid "undefined %s reference in complex symbol: %s" - msgstr "referencia %s indefinida en el símbolo complejo: %s" - --#: elflink.c:7514 -+#: elflink.c:7568 - #, c-format - msgid "unknown operator '%c' in complex symbol" - msgstr "operador desconocido '%c' en el símbolo complejo" - --#: elflink.c:8053 elflink.c:8070 elflink.c:8107 elflink.c:8124 -+#: elflink.c:7904 elflink.c:7921 elflink.c:7958 elflink.c:7975 - msgid "%B: Unable to sort relocs - they are in more than one size" - msgstr "%B: No se pueden ordenar las reubicaciones - son de tamaños diferentes" - --#: elflink.c:8084 elflink.c:8138 -+#: elflink.c:7935 elflink.c:7989 - msgid "%B: Unable to sort relocs - they are of an unknown size" - msgstr "%B: No se pueden ordenar las reubicaciones - son de tamaño desconocido" - --#: elflink.c:8187 -+#: elflink.c:8038 - msgid "Not enough memory to sort relocations" - msgstr "No hay suficiente memoria para ordenar las reubicaciones" - --#: elflink.c:8374 -+#: elflink.c:8227 - msgid "%B: Too many sections: %d (>= %d)" - msgstr "%B: Demasiadas secciones: %d (>= %d)" - --#: elflink.c:8608 -+#: elflink.c:8461 - msgid "%B: %s symbol `%s' in %B is referenced by DSO" - msgstr "%B: el símbolo %s `%s' en %B está referenciado por DSO" - --#: elflink.c:8691 -+#: elflink.c:8544 - msgid "%B: could not find output section %A for input section %A" - msgstr "%B: no se puede encontrar la sección de salida %A para la sección de entrada %A" - --#: elflink.c:8788 -+#: elflink.c:8655 - msgid "%B: %s symbol `%s' isn't defined" - msgstr "%B: el símbolo %s `%s' no está definido" - --#: elflink.c:9284 -+#: elflink.c:9141 - msgid "error: %B contains a reloc (0x%s) for section %A that references a non-existent global symbol" - msgstr "error: %B contiene una reubicación (0x%s) para la sección %A que refiere a un símbolo global que no existe" - --#: elflink.c:9318 -+#: elflink.c:9205 - msgid "%X`%s' referenced in section `%A' of %B: defined in discarded section `%A' of %B\n" - msgstr "%X`%s' referido en la sección `%A' de %B: se definió en la sección descartada `%A' de %B\n" - --#: elflink.c:9936 -+#: elflink.c:9825 - msgid "%A has both ordered [`%A' in %B] and unordered [`%A' in %B] sections" - msgstr "%A tiene tanto secciones ordenadas [`%A' en %B] como desordenadas [`%A' en %B]" - --#: elflink.c:9941 -+#: elflink.c:9830 - #, c-format - msgid "%A has both ordered and unordered sections" - msgstr "%A tiene tanto secciones ordenadas como desordenadas" - --#: elflink.c:10828 elflink.c:10872 -+#: elflink.c:10715 elflink.c:10759 - msgid "%B: could not find output section %s" - msgstr "%B: no se puede encontrar la sección de salida %s" - --#: elflink.c:10833 -+#: elflink.c:10720 - #, c-format - msgid "warning: %s section has zero size" - msgstr "aviso: la sección %s es de tamaño cero" - --#: elflink.c:10937 -+#: elflink.c:10824 - msgid "%P: warning: creating a DT_TEXTREL in a shared object.\n" - msgstr "%P: aviso: se crea un DT_TEXTREL en un objeto compartido.\n" - --#: elflink.c:11305 -+#: elflink.c:11006 -+msgid "%P%X: can not read symbols: %E\n" -+msgstr "%P%X: no se pueden leer símbolos: %E\n" -+ -+#: elflink.c:11313 - msgid "Removing unused section '%s' in file '%B'" - msgstr "Se elimina la sección sin uso '%s' en el fichero '%B'" - --#: elflink.c:11496 -+#: elflink.c:11525 - msgid "Warning: gc-sections option ignored" - msgstr "Aviso: se descarta la opción gc-sections" - --#: elflink.c:11987 --msgid "%P%X: can not read symbols: %E\n" --msgstr "%P%X: no se pueden leer símbolos: %E\n" -- --#: elflink.c:12129 -+#: elflink.c:12056 - msgid "%B: ignoring duplicate section `%A'" - msgstr "%B: se descarta la sección duplicada `%A'" - --#: elflink.c:12136 elflink.c:12143 -+#: elflink.c:12063 elflink.c:12070 - msgid "%B: duplicate section `%A' has different size" - msgstr "%B: la sección duplicada `%A' tiene tamaño diferente" - --#: elflink.c:12151 elflink.c:12156 -+#: elflink.c:12078 elflink.c:12083 - msgid "%B: warning: could not read contents of section `%A'" - msgstr "%B: aviso: no se puede leer el contenido de la sección `%A'" - --#: elflink.c:12160 -+#: elflink.c:12087 - msgid "%B: warning: duplicate section `%A' has different contents" - msgstr "%B: aviso: la sección duplicada `%A' tiene contenido diferente" - --#: elflink.c:12239 linker.c:3081 -+#: elflink.c:12166 linker.c:3080 - msgid "%F%P: already_linked_table: %E" - msgstr "%F%P: already_linked_table: %E" - --#: elf-m10300.c:1532 --msgid "error: inappropriate relocation type for shared library (did you forget -fpic?)" --msgstr "error: tipo de reubicación inapropiada para la biblioteca compartida (¿olvidó -fpic?)" -- --#: elf-m10300.c:1535 --msgid "internal error: suspicious relocation type used in shared library" --msgstr "error interno: se usó un tipo de reubicación sospechosa en una biblioteca compartida" -- --#: elfxx-mips.c:990 -+#: elfxx-mips.c:1197 - msgid "static procedure (no name)" - msgstr "procedimiento estático (sin nombre)" - --#: elfxx-mips.c:4663 -+#: elfxx-mips.c:5562 - msgid "%B: %A+0x%lx: jump to stub routine which is not jal" - msgstr "%B: %A+0x%lx: salto a una rutina cabo la cual no es jal" - --#: elfxx-mips.c:5326 elfxx-mips.c:5546 -+#: elfxx-mips.c:6206 elfxx-mips.c:6427 - msgid "%B: Warning: bad `%s' option size %u smaller than its header" - msgstr "%B: Aviso: el tamaño de opción `%s' %u erróneo es más pequeño que su encabezado" - --#: elfxx-mips.c:6405 -+#: elfxx-mips.c:7174 elfxx-mips.c:7299 -+msgid "%B: Warning: cannot determine the target function for stub section `%s'" -+msgstr "%B: Aviso: no se puede determinar la función objetivo para la sección de cabo `%s'" -+ -+#: elfxx-mips.c:7428 - msgid "%B: Malformed reloc detected for section %s" - msgstr "%B: Se detectó una reubicación malformada para la sección %s" - --#: elfxx-mips.c:6447 -+#: elfxx-mips.c:7468 - msgid "%B: GOT reloc at 0x%lx not expected in executables" - msgstr "%B: no se esperaba la reubicación GOT en 0x%lx en ejecutables" - --#: elfxx-mips.c:6517 -+#: elfxx-mips.c:7566 - msgid "%B: CALL16 reloc at 0x%lx not against global symbol" - msgstr "%B: la reubicación CALL16 en 0x%lx no es contra un símbolo global" - --#: elfxx-mips.c:7880 -+#: elfxx-mips.c:8244 -+#, c-format -+msgid "non-dynamic relocations refer to dynamic symbol %s" -+msgstr "reubicaciones que no son dinámicas se refieren al símbolo dinámico %s" -+ -+#: elfxx-mips.c:8947 - msgid "%B: Can't find matching LO16 reloc against `%s' for %s at 0x%lx in section `%A'" - msgstr "%B: No se puede encontrar una reubicación LO16 coincidente contra `%s' para %s en 0x%lx en la sección `%A'" - --#: elfxx-mips.c:8046 -+#: elfxx-mips.c:9086 - msgid "small-data section exceeds 64KB; lower small-data size limit (see option -G)" - msgstr "la sección small-data excede los 64KB; disminuya el límite de tamaño de small-data (vea la opción -G)" - --#: elfxx-mips.c:10661 -+#: elfxx-mips.c:11887 - #, c-format - msgid "%s: illegal section name `%s'" - msgstr "%s: nombre de sección `%s' ilegal" - --#: elfxx-mips.c:11031 elfxx-mips.c:11050 -+#: elfxx-mips.c:12262 elfxx-mips.c:12288 - msgid "Warning: %B uses -msingle-float, %B uses -mdouble-float" - msgstr "Aviso: %B usa -msingle-float, %B usa -mdouble-float" - --#: elfxx-mips.c:11106 -+#: elfxx-mips.c:12274 elfxx-mips.c:12330 -+msgid "Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64" -+msgstr "Aviso: %B usa -msingle-float, %B usa -mips32r2 -mfp64" -+ -+#: elfxx-mips.c:12300 elfxx-mips.c:12336 -+msgid "Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64" -+msgstr "Aviso: %B usa -mdouble-float, %B usa -mips32r2 -mfp64" -+ -+#: elfxx-mips.c:12378 - msgid "%B: endianness incompatible with that of the selected emulation" - msgstr "%B: la endianez es incompatible con aquella de la emulación seleccionada" - --#: elfxx-mips.c:11118 -+#: elfxx-mips.c:12389 - msgid "%B: ABI is incompatible with that of the selected emulation" - msgstr "%B: la ABI es incompatible con aquella de la emulación seleccionada" - --#: elfxx-mips.c:11218 -+#: elfxx-mips.c:12470 -+msgid "%B: warning: linking abicalls files with non-abicalls files" -+msgstr "%B: aviso: se enlazan ficheros de llamadas abi con ficheros que no son de llamadas abi" -+ -+#: elfxx-mips.c:12487 - msgid "%B: linking 32-bit code with 64-bit code" - msgstr "%B: se enlaza código de 32-bit con código de 64-bit" - --#: elfxx-mips.c:11246 -+#: elfxx-mips.c:12515 - msgid "%B: linking %s module with previous %s modules" - msgstr "%B: se enlaza el módulo %s con módulos %s previos" - --#: elfxx-mips.c:11269 -+#: elfxx-mips.c:12538 - msgid "%B: ABI mismatch: linking %s module with previous %s modules" - msgstr "%B: no coincide el ABI: se enlaza el módulo %s con módulos %s previos" - --#: elfxx-mips.c:11334 -+#: elfxx-mips.c:12702 - #, c-format - msgid " [abi=O32]" - msgstr " [abi=O32]" - --#: elfxx-mips.c:11336 -+#: elfxx-mips.c:12704 - #, c-format - msgid " [abi=O64]" - msgstr " [abi=O64]" - --#: elfxx-mips.c:11338 -+#: elfxx-mips.c:12706 - #, c-format - msgid " [abi=EABI32]" - msgstr " [abi=EABI32]" - --#: elfxx-mips.c:11340 -+#: elfxx-mips.c:12708 - #, c-format - msgid " [abi=EABI64]" - msgstr " [abi=EABI64]" - --#: elfxx-mips.c:11342 -+#: elfxx-mips.c:12710 - #, c-format - msgid " [abi unknown]" - msgstr " [abi desconocido]" - --#: elfxx-mips.c:11344 -+#: elfxx-mips.c:12712 - #, c-format - msgid " [abi=N32]" - msgstr " [abi=N32]" - --#: elfxx-mips.c:11346 -+#: elfxx-mips.c:12714 - #, c-format - msgid " [abi=64]" - msgstr " [abi=64]" - --#: elfxx-mips.c:11348 -+#: elfxx-mips.c:12716 - #, c-format - msgid " [no abi set]" - msgstr " [no hay conjunto abi]" - --#: elfxx-mips.c:11369 -+#: elfxx-mips.c:12737 - #, c-format - msgid " [unknown ISA]" - msgstr " [ISA desconocido]" - --#: elfxx-mips.c:11380 -+#: elfxx-mips.c:12748 - #, c-format - msgid " [not 32bitmode]" - msgstr " [no es modo 32bit]" - --#: elfxx-sparc.c:430 -+#: elfxx-sparc.c:440 - #, c-format - msgid "invalid relocation type %d" - msgstr "tipo de reubicación %d inválido" - --#: elfxx-sparc.c:2901 -+#: elfxx-sparc.c:2976 - msgid "%B: probably compiled without -fPIC?" - msgstr "%B: ¿Compilado probablemente sin -fPIC?" - -@@ -2720,34 +2838,34 @@ msgstr "%B: longitud de secci - msgid "%s: address 0x%s out of range for Intel Hex file" - msgstr "%s: la dirección 0x%s está fuera de rango en el fichero Hexadecimal de Intel" - --#: libbfd.c:980 -+#: libbfd.c:1008 - #, c-format - msgid "Deprecated %s called at %s line %d in %s\n" - msgstr "Se llamó a %s que es obsoleto en %s línea %d en %s\n" - --#: libbfd.c:983 -+#: libbfd.c:1011 - #, c-format - msgid "Deprecated %s called\n" - msgstr "Se llamó a %s que es obsoleto\n" - --#: linker.c:1875 -+#: linker.c:1874 - msgid "%B: indirect symbol `%s' to `%s' is a loop" - msgstr "%B: el símbolo indirecto `%s' para `%s' es un ciclo" - --#: linker.c:2741 -+#: linker.c:2740 - #, c-format - msgid "Attempt to do relocatable link with %s input and %s output" - msgstr "Se intentó hacer un enlace reubicable con entrada %s y salida %s" - --#: linker.c:3048 -+#: linker.c:3047 - msgid "%B: warning: ignoring duplicate section `%A'\n" - msgstr "%B: aviso: se descarta la sección duplicada `%A'\n" - --#: linker.c:3062 -+#: linker.c:3061 - msgid "%B: warning: duplicate section `%A' has different size\n" - msgstr "%B: aviso: la sección duplicada `%A' es de tamaño diferente\n" - --#: merge.c:820 -+#: merge.c:828 - #, c-format - msgid "%s: access beyond end of merged section (%ld)" - msgstr "%s: acceso más allá del final de la sección mezclada (%ld)" -@@ -2887,6 +3005,26 @@ msgstr "%s: no se puede representar la secci - msgid "Unhandled OSF/1 core file section type %d\n" - msgstr "Tipo de sección de fichero núcleo OSF/1 %d sin manejar\n" - -+#: pe-mips.c:607 -+msgid "%B: `ld -r' not supported with PE MIPS objects\n" -+msgstr "%B: `ld -r' no se admite con objetos PE MIPS\n" -+ -+#. OK, at this point the following variables are set up: -+#. src = VMA of the memory we're fixing up -+#. mem = pointer to memory we're fixing up -+#. val = VMA of what we need to refer to. -+#: pe-mips.c:723 -+msgid "%B: unimplemented %s\n" -+msgstr "%B: %s sin implementar\n" -+ -+#: pe-mips.c:749 -+msgid "%B: jump too far away\n" -+msgstr "%B: salto demasiado lejos\n" -+ -+#: pe-mips.c:775 -+msgid "%B: bad pair/reflo after refhi\n" -+msgstr "%B: pair/reflo erróneo después de refhi\n" -+ - #. XXX code yet to be written. - #: peicode.h:759 - msgid "%B: Unhandled import type; %x" -@@ -2916,26 +3054,6 @@ msgstr "%B: el tama - msgid "%B: string not null terminated in ILF object file." - msgstr "%B: cadena no terminada en null en el fichero objeto ILF." - --#: pe-mips.c:606 --msgid "%B: `ld -r' not supported with PE MIPS objects\n" --msgstr "%B: `ld -r' no se admite con objetos PE MIPS\n" -- --#. OK, at this point the following variables are set up: --#. src = VMA of the memory we're fixing up --#. mem = pointer to memory we're fixing up --#. val = VMA of what we need to refer to. --#: pe-mips.c:722 --msgid "%B: unimplemented %s\n" --msgstr "%B: %s sin implementar\n" -- --#: pe-mips.c:748 --msgid "%B: jump too far away\n" --msgstr "%B: salto demasiado lejos\n" -- --#: pe-mips.c:774 --msgid "%B: bad pair/reflo after refhi\n" --msgstr "%B: pair/reflo erróneo después de refhi\n" -- - #: ppcboot.c:414 - #, c-format - msgid "" -@@ -2950,22 +3068,22 @@ msgstr "" - msgid "Entry offset = 0x%.8lx (%ld)\n" - msgstr "Desplazamiento de entrada = 0x%.8lx (%ld)\n" - --#: ppcboot.c:416 -+#: ppcboot.c:417 - #, c-format - msgid "Length = 0x%.8lx (%ld)\n" - msgstr "Longitud = 0x%.8lx (%ld)\n" - --#: ppcboot.c:419 -+#: ppcboot.c:421 - #, c-format - msgid "Flag field = 0x%.2x\n" - msgstr "Campo de opciones = 0x%.2x\n" - --#: ppcboot.c:425 -+#: ppcboot.c:427 - #, c-format - msgid "Partition name = \"%s\"\n" - msgstr "Nombre de la partición = \"%s\"\n" - --#: ppcboot.c:444 -+#: ppcboot.c:446 - #, c-format - msgid "" - "\n" -@@ -2974,22 +3092,22 @@ msgstr "" - "\n" - "Partición[%d] inicio = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n" - --#: ppcboot.c:450 -+#: ppcboot.c:452 - #, c-format - msgid "Partition[%d] end = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n" - msgstr "Partición[%d] fin = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n" - --#: ppcboot.c:456 -+#: ppcboot.c:458 - #, c-format - msgid "Partition[%d] sector = 0x%.8lx (%ld)\n" - msgstr "Partición[%d] sector = 0x%.8lx (%ld)\n" - --#: ppcboot.c:457 -+#: ppcboot.c:460 - #, c-format - msgid "Partition[%d] length = 0x%.8lx (%ld)\n" - msgstr "Partición[%d] longitud = 0x%.8lx (%ld)\n" - --#: som.c:5088 -+#: som.c:5137 - #, c-format - msgid "" - "\n" -@@ -2998,7 +3116,7 @@ msgstr "" - "\n" - "Encabezado Auxiliar de Ejecución\n" - --#: som.c:5349 -+#: som.c:5440 - msgid "som_sizeof_headers unimplemented" - msgstr "som_sizeof_headers sin implementar" - -@@ -3006,11 +3124,15 @@ msgstr "som_sizeof_headers sin implementar" - msgid "%B:%d: Unexpected character `%s' in S-record file\n" - msgstr "%B:%d: Caractér `%s' inesperado en el fichero S-record\n" - -+#: srec.c:567 srec.c:600 -+msgid "%B:%d: Bad checksum in S-record file\n" -+msgstr "%B:%d: Suma de comprobación errónea en el fichero S-record\n" -+ - #: stabs.c:279 - msgid "%B(%A+0x%lx): Stabs entry has invalid string index." - msgstr "%B(%A+0x%lx): La entrada de cabos tiene una cadena índice inválida." - --#: syms.c:1057 -+#: syms.c:1067 - msgid "Unsupported .stab relocation" - msgstr "No se admite la reubicación .stab" - -@@ -3047,20 +3169,20 @@ msgstr "Desbordamiento de la pila (%d) en _bfd_vms_push" - msgid "Stack underflow in _bfd_vms_pop" - msgstr "Desbordamiento por debajo de la pila en _bfd_vms_pop" - --#: vms-misc.c:803 -+#: vms-misc.c:808 - msgid "_bfd_vms_output_counted called with zero bytes" - msgstr "se llamó _bfd_vms_output_counted con cero bytes" - --#: vms-misc.c:808 -+#: vms-misc.c:813 - msgid "_bfd_vms_output_counted called with too many bytes" - msgstr "se llamó _bfd_vms_output_counted con demasiados bytes" - --#: vms-misc.c:926 -+#: vms-misc.c:931 - #, c-format - msgid "Symbol %s replaced by %s\n" - msgstr "El símbolo %s fue reemplazado por %s\n" - --#: vms-misc.c:985 -+#: vms-misc.c:990 - #, c-format - msgid "failed to enter %s" - msgstr "falló la introducción de %s" -@@ -3256,73 +3378,77 @@ msgstr "%s: reubicaci - msgid "%s: `%s' in loader reloc but not loader sym" - msgstr "%s: `%s' en la reubicación del cargador pero no es un símbolo del cargador" - --#: elf32-ia64.c:1169 elf64-ia64.c:1169 -+#: elf32-ia64.c:1037 elf64-ia64.c:1037 - msgid "%B: Can't relax br at 0x%lx in section `%A'. Please use brl or indirect branch." - msgstr "%B: No se puede relajar br en 0x%lx en la sección `%A'. Por favor use brl o ramificación indirecta." - --#: elf32-ia64.c:2910 elf64-ia64.c:2910 -+#: elf32-ia64.c:2742 elf64-ia64.c:2742 - msgid "@pltoff reloc against local symbol" - msgstr "reubicación @pltoff contra un símbolo local" - --#: elf32-ia64.c:4523 elf64-ia64.c:4523 -+#: elf32-ia64.c:4317 elf64-ia64.c:4317 - #, c-format - msgid "%s: short data segment overflowed (0x%lx >= 0x400000)" - msgstr "%s: segmento de datos short desbordado (0x%lx >= 0x400000)" - --#: elf32-ia64.c:4534 elf64-ia64.c:4534 -+#: elf32-ia64.c:4328 elf64-ia64.c:4328 - #, c-format - msgid "%s: __gp does not cover short data segment" - msgstr "%s: __gp no cubre el segmento de datos short" - --#: elf32-ia64.c:4808 elf64-ia64.c:4808 -+#: elf32-ia64.c:4598 elf64-ia64.c:4598 - msgid "%B: non-pic code with imm relocation against dynamic symbol `%s'" - msgstr "%B: código que no es pic con reubicación imm contra el símbolo dinámico %s" - --#: elf32-ia64.c:4875 elf64-ia64.c:4875 -+#: elf32-ia64.c:4665 elf64-ia64.c:4665 - msgid "%B: @gprel relocation against dynamic symbol %s" - msgstr "%B: reubicación @gprel contra el símbolo dinámico %s" - --#: elf32-ia64.c:4938 elf64-ia64.c:4938 -+#: elf32-ia64.c:4728 elf64-ia64.c:4728 - msgid "%B: linking non-pic code in a position independent executable" - msgstr "%B: se enlaza código que no es pic en un ejecutable independiente de posición" - --#: elf32-ia64.c:5075 elf64-ia64.c:5075 -+#: elf32-ia64.c:4865 elf64-ia64.c:4865 - msgid "%B: @internal branch to dynamic symbol %s" - msgstr "%B: ramificación @internal al símbolo dinámico %s" - --#: elf32-ia64.c:5077 elf64-ia64.c:5077 -+#: elf32-ia64.c:4867 elf64-ia64.c:4867 - msgid "%B: speculation fixup to dynamic symbol %s" - msgstr "%B: compostura de especulación al símbolo dinámico %s" - --#: elf32-ia64.c:5079 elf64-ia64.c:5079 -+#: elf32-ia64.c:4869 elf64-ia64.c:4869 - msgid "%B: @pcrel relocation against dynamic symbol %s" - msgstr "%B: reubicación @pcrel contra el símbolo dinámico %s" - --#: elf32-ia64.c:5279 elf64-ia64.c:5279 -+#: elf32-ia64.c:5066 elf64-ia64.c:5066 - msgid "unsupported reloc" - msgstr "no se admite la reubicación" - --#: elf32-ia64.c:5312 elf64-ia64.c:5312 -+#: elf32-ia64.c:5104 elf64-ia64.c:5104 -+msgid "%B: missing TLS section for relocation %s against `%s' at 0x%lx in section `%A'." -+msgstr "%B: falta la sección TLS para la reubicación %s contra `%s' en 0x%lx en la sección `%A'." -+ -+#: elf32-ia64.c:5119 elf64-ia64.c:5119 - msgid "%B: Can't relax br (%s) to `%s' at 0x%lx in section `%A' with size 0x%lx (> 0x1000000)." - msgstr "%B: No se puede relajar br (%s) a `%s' en 0x%lx en la sección `%A' con tamaño 0x%lx (> 0x1000000)." - --#: elf32-ia64.c:5573 elf64-ia64.c:5573 -+#: elf32-ia64.c:5375 elf64-ia64.c:5375 - msgid "%B: linking trap-on-NULL-dereference with non-trapping files" - msgstr "%B: se enlaza deferencias-captura-en-NULL con ficheros que no son de captura" - --#: elf32-ia64.c:5582 elf64-ia64.c:5582 -+#: elf32-ia64.c:5384 elf64-ia64.c:5384 - msgid "%B: linking big-endian files with little-endian files" - msgstr "%B: se enlazan ficheros big-endian con ficheros little-endian" - --#: elf32-ia64.c:5591 elf64-ia64.c:5591 -+#: elf32-ia64.c:5393 elf64-ia64.c:5393 - msgid "%B: linking 64-bit files with 32-bit files" - msgstr "%B: se enlazan ficheros de 64-bit con ficheros de 32-bit" - --#: elf32-ia64.c:5600 elf64-ia64.c:5600 -+#: elf32-ia64.c:5402 elf64-ia64.c:5402 - msgid "%B: linking constant-gp files with non-constant-gp files" - msgstr "%B: se enlazan ficheros de gp constante con ficheros con gp no constante" - --#: elf32-ia64.c:5610 elf64-ia64.c:5610 -+#: elf32-ia64.c:5412 elf64-ia64.c:5412 - msgid "%B: linking auto-pic files with non-auto-pic files" - msgstr "%B: se enlazan ficheros de pic automático con ficheros sin pic automático" - -@@ -3602,12 +3728,14 @@ msgstr "" - "\n" - "Tabla [Puntero a Ordinal/Nombre]\n" - --#: peigen.c:1610 pepigen.c:1610 pex64igen.c:1610 -+#: peigen.c:1617 peigen.c:1796 pepigen.c:1617 pepigen.c:1796 pex64igen.c:1617 -+#: pex64igen.c:1796 - #, c-format - msgid "Warning, .pdata section size (%ld) is not a multiple of %d\n" - msgstr "Aviso, el tamaño de la sección .pdata (%ld) no es un múltiplo de %d\n" - --#: peigen.c:1614 pepigen.c:1614 pex64igen.c:1614 -+#: peigen.c:1621 peigen.c:1800 pepigen.c:1621 pepigen.c:1800 pex64igen.c:1621 -+#: pex64igen.c:1800 - #, c-format - msgid "" - "\n" -@@ -3616,12 +3744,12 @@ msgstr "" - "\n" - "La Tabla de Funciones (se interpretaron los contenidos de la sección .pdata)\n" - --#: peigen.c:1617 pepigen.c:1617 pex64igen.c:1617 -+#: peigen.c:1624 pepigen.c:1624 pex64igen.c:1624 - #, c-format - msgid " vma:\t\t\tBegin Address End Address Unwind Info\n" - msgstr " vma:\t\t\tDirección Inicio Dirección Fin Información Desenvuelta\n" - --#: peigen.c:1619 pepigen.c:1619 pex64igen.c:1619 -+#: peigen.c:1626 pepigen.c:1626 pex64igen.c:1626 - #, c-format - msgid "" - " vma:\t\tBegin End EH EH PrologEnd Exception\n" -@@ -3630,22 +3758,31 @@ msgstr "" - " vma:\t\tInicio Fin EH EH FinPrólogo Excepción\n" - " \t\tDirecc Direcc Asa Datos Dirección Máscara\n" - --#: peigen.c:1689 pepigen.c:1689 pex64igen.c:1689 -+#: peigen.c:1696 pepigen.c:1696 pex64igen.c:1696 - #, c-format - msgid " Register save millicode" - msgstr " Registro para guardar milicódigo" - --#: peigen.c:1692 pepigen.c:1692 pex64igen.c:1692 -+#: peigen.c:1699 pepigen.c:1699 pex64igen.c:1699 - #, c-format - msgid " Register restore millicode" - msgstr " Registro para restaurar milicódigo" - --#: peigen.c:1695 pepigen.c:1695 pex64igen.c:1695 -+#: peigen.c:1702 pepigen.c:1702 pex64igen.c:1702 - #, c-format - msgid " Glue code sequence" - msgstr " Secuencia de código pegamento" - --#: peigen.c:1745 pepigen.c:1745 pex64igen.c:1745 -+#: peigen.c:1802 pepigen.c:1802 pex64igen.c:1802 -+#, c-format -+msgid "" -+" vma:\t\tBegin Prolog Function Flags Exception EH\n" -+" \t\tAddress Length Length 32b exc Handler Data\n" -+msgstr "" -+" vma:\t\tInicio Prólogo Función Opciones Excepción EH\n" -+" \t\tDirecc Longitud Longitud 32b exc Manejador Datos\n" -+ -+#: peigen.c:1933 pepigen.c:1933 pex64igen.c:1933 - #, c-format - msgid "" - "\n" -@@ -3656,7 +3793,7 @@ msgstr "" - "\n" - "Reubicaciones de Fichero Base PE (se interpretaron los contenidos de la sección .reloc)\n" - --#: peigen.c:1775 pepigen.c:1775 pex64igen.c:1775 -+#: peigen.c:1963 pepigen.c:1963 pex64igen.c:1963 - #, c-format - msgid "" - "\n" -@@ -3665,7 +3802,7 @@ msgstr "" - "\n" - "Dirección Virtual: %08lx Tamaño del trozo %ld (0x%lx) Número de composturas %ld\n" - --#: peigen.c:1788 pepigen.c:1788 pex64igen.c:1788 -+#: peigen.c:1976 pepigen.c:1976 pex64igen.c:1976 - #, c-format - msgid "\treloc %4d offset %4x [%4lx] %s" - msgstr "\treubicación %4d desplazamiento %4x [%4lx] %s" -@@ -3673,7 +3810,7 @@ msgstr "\treubicaci - #. The MS dumpbin program reportedly ands with 0xff0f before - #. printing the characteristics field. Not sure why. No reason to - #. emulate it here. --#: peigen.c:1827 pepigen.c:1827 pex64igen.c:1827 -+#: peigen.c:2015 pepigen.c:2015 pex64igen.c:2015 - #, c-format - msgid "" - "\n" -@@ -3682,26 +3819,47 @@ msgstr "" - "\n" - "Características 0x%x\n" - --#: peigen.c:2088 pepigen.c:2088 pex64igen.c:2088 -+#: peigen.c:2289 pepigen.c:2289 pex64igen.c:2289 - msgid "%B: unable to fill in DataDictionary[1] because .idata$2 is missing" - msgstr "%B: no se puede llenar DataDictionary[1] porque falta .idata$2" - --#: peigen.c:2106 pepigen.c:2106 pex64igen.c:2106 -+#: peigen.c:2307 pepigen.c:2307 pex64igen.c:2307 - msgid "%B: unable to fill in DataDictionary[1] because .idata$4 is missing" - msgstr "%B: no se puede llenar DataDictionary[1] porque falta .idata$4" - --#: peigen.c:2125 pepigen.c:2125 pex64igen.c:2125 -+#: peigen.c:2326 pepigen.c:2326 pex64igen.c:2326 - msgid "%B: unable to fill in DataDictionary[12] because .idata$5 is missing" - msgstr "%B: no se puede llenar DataDictionary[12] porque falta .idata$5" - --#: peigen.c:2143 pepigen.c:2143 pex64igen.c:2143 -+#: peigen.c:2344 pepigen.c:2344 pex64igen.c:2344 - msgid "%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing" - msgstr "%B: no se puede llenar DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] porque falta .idata$6" - --#: peigen.c:2163 pepigen.c:2163 pex64igen.c:2163 -+#: peigen.c:2364 pepigen.c:2364 pex64igen.c:2364 - msgid "%B: unable to fill in DataDictionary[9] because __tls_used is missing" - msgstr "%B: no se puede llenar DataDictionary[9] porque falta __tls_used" - -+#~ msgid "Dwarf Error: DW_FORM_strp offset (%lu) greater than or equal to .debug_str size (%lu)." -+#~ msgstr "Error de Dwarf: El desplazamiento DW_FROM_strp (%lu) es más grande o igual que el tamaño de .debug_str (%lu)." -+ -+#~ msgid "Dwarf Error: Can't find .debug_abbrev section." -+#~ msgstr "Error de Dwarf: No se puede encontrar la sección .debug_abbrev." -+ -+#~ msgid "Dwarf Error: Abbrev offset (%lu) greater than or equal to .debug_abbrev size (%lu)." -+#~ msgstr "Error de Dwarf: El desplazamiento de abreviatura (%lu) es más grande o igual que el tamaño de .debug_abbrev (%lu)." -+ -+#~ msgid "Dwarf Error: Can't find .debug_line section." -+#~ msgstr "Error de Dwarf: No se puede encontrar lan sección .debug_line." -+ -+#~ msgid "Dwarf Error: Can't find .debug_ranges section." -+#~ msgstr "Error de Dwarf: No se puede encontrar lan sección .debug_ranges." -+ -+#~ msgid "ERROR: %B: Conflicting definitions of wchar_t" -+#~ msgstr "ERROR: %B: Definiciones en conflicto de wchar_t" -+ -+#~ msgid "%B: relocation R_X86_64_PC32 against protected function `%s' can not be used when making a shared object" -+#~ msgstr "%B: no se puede usar la reubicación R_X86_64_PC32 contra la función protegida `%' cuando se hace un objeto compartido" -+ - #~ msgid "ERROR: %B: Conflicting enum sizes" - #~ msgstr "ERROR: %B: Tamaños de enum en conflicto" - -@@ -3846,9 +4004,6 @@ msgstr "%B: no se puede llenar DataDictionary[9] porque falta __tls_used" - #~ msgid "local symbols in discarded section %s" - #~ msgstr "símbolos locales en la sección descartada %s" - --#~ msgid "%s: linking abicalls files with non-abicalls files" --#~ msgstr "%s: se enlazan ficheros de llamadas abi con ficheros que no son de llamadas abi" -- - #~ msgid "%s: ISA mismatch (-mips%d) with previous modules (-mips%d)" - #~ msgstr "%s: no coincide el ISA (-mips%d) con módulos previos (-mips%d)" - diff --git a/gdb/Makefile.in b/gdb/Makefile.in -index 74aa72e..c84a4ac 100644 +index ccc4db8..496c9f2 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in -@@ -167,11 +167,20 @@ INTL_CFLAGS = @INCINTL@ - - # Where is the ICONV library? This can be empty if libc has iconv. - LIBICONV = @LIBICONV@ -+LIBICONV_INCLUDE = @LIBICONV_INCLUDE@ -+LIBICONV_LIBDIR = @LIBICONV_LIBDIR@ - - # Did the user give us a --with-sysroot option? +@@ -166,6 +166,13 @@ INTL_CFLAGS = @INCINTL@ TARGET_SYSTEM_ROOT = @TARGET_SYSTEM_ROOT@ TARGET_SYSTEM_ROOT_DEFINE = @TARGET_SYSTEM_ROOT_DEFINE@ @@ -3734,22 +34,24 @@ index 74aa72e..c84a4ac 100644 # Helper code from gnulib. LIBGNU = gnulib/libgnu.a INCGNU = -I$(srcdir)/gnulib -Ignulib -@@ -270,12 +279,34 @@ SUBDIR_TUI_CFLAGS= \ +@@ -264,21 +271,37 @@ SUBDIR_TUI_CFLAGS= \ # SUBDIR_PYTHON_OBS = \ python.o \ + python-block.o \ + python-breakpoint.o \ python-cmd.o \ -+ python-frame.o \ -+ python-function.o \ + python-frame.o \ + python-function.o \ + python-hooks.o \ -+ python-membuf.o \ -+ python-objfile.o \ ++ python-inferior.o \ ++ python-infthread.o \ + python-objfile.o \ + python-param.o \ + python-prettyprint.o \ + python-symbol.o \ + python-symtab.o \ -+ python-type.o \ + python-type.o \ python-utils.o \ python-value.o SUBDIR_PYTHON_SRCS = \ @@ -3757,128 +59,38 @@ index 74aa72e..c84a4ac 100644 + python/python-block.c \ + python/python-breakpoint.c \ python/python-cmd.c \ -+ python/python-frame.c \ -+ python/python-function.c \ + python/python-frame.c \ + python/python-function.c \ + python/python-hooks.c \ -+ python/python-membuf.c \ -+ python/python-objfile.c \ ++ python/python-inferior.c \ ++ python/python-infthread.c \ + python/python-objfile.c \ + python/python-param.c \ + python/python-prettyprint.c \ + python/python-symbol.c \ + python/python-symtab.c \ -+ python/python-type.c \ + python/python-type.c \ python/python-utils.c \ python/python-value.c - SUBDIR_PYTHON_DEPS = -@@ -390,7 +421,8 @@ INTERNAL_CFLAGS_BASE = \ - $(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \ - $(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) \ - $(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \ -- $(INTL_CFLAGS) $(INCGNU) $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) -+ $(INTL_CFLAGS) $(INCGNU) $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) \ -+ $(LIBICONV_INCLUDE) - INTERNAL_WARN_CFLAGS = $(INTERNAL_CFLAGS_BASE) $(GDB_WARN_CFLAGS) - INTERNAL_CFLAGS = $(INTERNAL_WARN_CFLAGS) $(GDB_WERROR_CFLAGS) - -@@ -402,7 +434,7 @@ LDFLAGS = @LDFLAGS@ - # I think it's perfectly reasonable for a user to set -pg in CFLAGS - # and have it work; that's why CFLAGS is here. - # PROFILE_CFLAGS is _not_ included, however, because we use monstartup. --INTERNAL_LDFLAGS = $(CFLAGS) $(GLOBAL_CFLAGS) $(MH_LDFLAGS) $(LDFLAGS) $(CONFIG_LDFLAGS) -+INTERNAL_LDFLAGS = $(CFLAGS) $(GLOBAL_CFLAGS) $(MH_LDFLAGS) $(LDFLAGS) $(CONFIG_LDFLAGS) $(LIBICONV_LIBDIR) - - # If your system is missing alloca(), or, more likely, it's there but - # it doesn't work, then refer to libiberty. -@@ -663,6 +695,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \ - valarith.c valops.c valprint.c value.c varobj.c vec.c \ - wrapper.c \ - xml-tdesc.c xml-support.c \ -+ xml-syscall.c \ - inferior.c - - LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c -@@ -733,7 +766,8 @@ config/sparc/nm-sol2.h config/nm-linux.h config/mips/nm-irix5.h \ - config/rs6000/nm-rs6000.h top.h bsd-kvm.h gdb-stabs.h reggroups.h \ +@@ -746,7 +769,7 @@ config/rs6000/nm-rs6000.h top.h bsd-kvm.h gdb-stabs.h reggroups.h \ annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h \ remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \ --sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h -+sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h xml-syscall.h \ -+python/python.h python/python-internal.h + sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h \ +-gdb_usleep.h ++gdb_usleep.h python/python.h python/python-internal.h # Header files that already have srcdir in them, or which are in objdir. -@@ -812,10 +846,16 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ - trad-frame.o \ - tramp-frame.o \ - solib.o solib-null.o \ -- prologue-value.o memory-map.o xml-support.o \ -+ prologue-value.o memory-map.o xml-support.o xml-syscall.o \ - target-descriptions.o target-memory.o xml-tdesc.o xml-builtin.o \ - inferior.o osdata.o - -+# Definitions for the syscall's XML files and dir -+XML_SYSCALLS_DIR = syscalls/ -+XML_SYSCALLS_FILES = gdb-syscalls.dtd \ -+ ppc-linux.xml ppc64-linux.xml \ -+ i386-linux.xml amd64-linux.xml -+ - TSOBS = inflow.o - - SUBDIRS = @subdirs@ -@@ -849,11 +889,38 @@ generated_files = config.h observer.h observer.inc ada-lex.c \ +@@ -863,7 +886,7 @@ generated_files = config.h observer.h observer.inc ada-lex.c \ $(COMPILE) $< $(POSTCOMPILE) -all: gdb$(EXEEXT) $(CONFIG_ALL) -+all: gdb$(EXEEXT) $(CONFIG_ALL) .gdbinit xml-syscall-copy ++all: gdb$(EXEEXT) $(CONFIG_ALL) .gdbinit @$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do .PHONY: all-tui all-tui: $(TUI)$(EXEEXT) - -+xml-syscall-copy: -+ if [ "`cd $(srcdir) && pwd`" != "`pwd`" ] ; then \ -+ mkdir -p ./$(XML_SYSCALLS_DIR) ; \ -+ list='$(XML_SYSCALLS_FILES)' ; \ -+ for file in $$list ; do \ -+ f=$(srcdir)/$(XML_SYSCALLS_DIR)/$$file ; \ -+ if test -f $$f ; then \ -+ $(INSTALL_DATA) $$f \ -+ ./$(XML_SYSCALLS_DIR) ; \ -+ fi ; \ -+ done ; \ -+ fi ; -+ -+# This target is responsible for properly installing the syscalls' -+# XML files in the system. -+xml-syscall-install: -+ $(SHELL) $(srcdir)/../mkinstalldirs \ -+ $(DESTDIR)$(GDB_DATADIR_PATH)/$(XML_SYSCALLS_DIR) ; \ -+ list='$(XML_SYSCALLS_FILES)' ; \ -+ for file in $$list ; do \ -+ f=$(srcdir)/$(XML_SYSCALLS_DIR)/$$file ; \ -+ if test -f $$f ; then \ -+ $(INSTALL_DATA) $$f \ -+ $(DESTDIR)$(GDB_DATADIR_PATH)/$(XML_SYSCALLS_DIR) ; \ -+ fi ; \ -+ done ; -+ - installcheck: - - # The check target can not use subdir_do, because subdir_do does not -@@ -907,8 +974,11 @@ gdb.z:gdb.1 - # source file and doesn't care about rebuilding or just wants to save the - # time it takes for make to check that all is up to date. - # install-only is intended to address that need. --install: all install-only --install-only: $(CONFIG_INSTALL) -+install: all install-only -+ -+# The "install-only" target also installs the syscalls' XML files in -+# the system. -+install-only: $(CONFIG_INSTALL) xml-syscall-install - transformed_name=`t='$(program_transform_name)'; \ - echo gdb | sed -e "$$t"` ; \ - if test "x$$transformed_name" = x; then \ -@@ -1202,6 +1272,12 @@ stamp-h: config.in config.status +@@ -1219,6 +1242,12 @@ stamp-h: $(srcdir)/config.in config.status CONFIG_LINKS= \ $(SHELL) config.status @@ -3888,10 +100,10 @@ index 74aa72e..c84a4ac 100644 + CONFIG_HEADERS= \ + $(SHELL) config.status + - config.status: configure configure.tgt configure.host + config.status: $(srcdir)/configure configure.tgt configure.host $(SHELL) config.status --recheck -@@ -1845,10 +1921,54 @@ python.o: $(srcdir)/python/python.c +@@ -1918,6 +1947,14 @@ python.o: $(srcdir)/python/python.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python.c $(POSTCOMPILE) @@ -3906,31 +118,34 @@ index 74aa72e..c84a4ac 100644 python-cmd.o: $(srcdir)/python/python-cmd.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-cmd.c $(POSTCOMPILE) +@@ -1930,14 +1967,38 @@ python-function.o: $(srcdir)/python/python-function.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-function.c + $(POSTCOMPILE) -+python-frame.o: $(srcdir)/python/python-frame.c -+ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-frame.c -+ $(POSTCOMPILE) -+ -+python-function.o: $(srcdir)/python/python-function.c -+ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-function.c -+ $(POSTCOMPILE) -+ +python-hooks.o: $(srcdir)/python/python-hooks.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-hooks.c + $(POSTCOMPILE) + -+python-membuf.o: $(srcdir)/python/python-membuf.c -+ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-membuf.c ++python-inferior.o: $(srcdir)/python/python-inferior.c ++ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-inferior.c + $(POSTCOMPILE) + -+python-objfile.o: $(srcdir)/python/python-objfile.c -+ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-objfile.c ++python-infthread.o: $(srcdir)/python/python-infthread.c ++ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-infthread.c + $(POSTCOMPILE) + + python-objfile.o: $(srcdir)/python/python-objfile.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-objfile.c + $(POSTCOMPILE) + +python-param.o: $(srcdir)/python/python-param.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-param.c + $(POSTCOMPILE) + + python-prettyprint.o: $(srcdir)/python/python-prettyprint.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-prettyprint.c + $(POSTCOMPILE) + +python-symbol.o: $(srcdir)/python/python-symbol.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-symbol.c + $(POSTCOMPILE) @@ -3939,27 +154,21 @@ index 74aa72e..c84a4ac 100644 + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-symtab.c + $(POSTCOMPILE) + -+python-type.o: $(srcdir)/python/python-type.c -+ $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-type.c -+ $(POSTCOMPILE) -+ - python-utils.o: $(srcdir)/python/python-utils.c - $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-utils.c + python-type.o: $(srcdir)/python/python-type.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-type.c $(POSTCOMPILE) -@@ -1857,6 +1977,38 @@ python-value.o: $(srcdir)/python/python-value.c +@@ -1950,6 +2011,36 @@ python-value.o: $(srcdir)/python/python-value.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-value.c $(POSTCOMPILE) +# All python library files, with the "python/lib" stripped off. +# Note that we should only install files in the "gdb" module. -+PY_FILES = gdb/FrameIterator.py gdb/command/alias.py \ ++PY_FILES = gdb/FrameIterator.py gdb/FrameWrapper.py gdb/command/alias.py \ + gdb/command/backtrace.py gdb/command/require.py \ -+ gdb/command/pahole.py gdb/command/__init__.py \ ++ gdb/command/pahole.py gdb/command/upto.py gdb/command/__init__.py \ + gdb/command/ignore_errors.py gdb/command/save_breakpoints.py \ -+ gdb/libstdcxx/v6/printers.py gdb/libstdcxx/v6/__init__.py \ -+ gdb/libstdcxx/__init__.py gdb/function/caller_is.py \ -+ gdb/function/in_scope.py gdb/function/__init__.py gdb/backtrace.py \ -+ gdb/__init__.py ++ gdb/function/caller_is.py gdb/function/in_scope.py \ ++ gdb/function/__init__.py gdb/backtrace.py gdb/__init__.py + +# Install the Python library. Python library files go under +# $(pythondir). @@ -3986,651 +195,163 @@ index 74aa72e..c84a4ac 100644 # Dependency tracking. Most of this is conditional on GNU Make being # found by configure; if GNU Make is not found, we fall back to a diff --git a/gdb/NEWS b/gdb/NEWS -index 9078412..3f084e7 100644 +index 970f4df..e8de474 100644 --- a/gdb/NEWS +++ b/gdb/NEWS -@@ -3,6 +3,13 @@ +@@ -425,6 +425,13 @@ x86/x86_64 Darwin i[34567]86-*-darwin* - *** Changes since GDB 6.8 + x86_64 MinGW x86_64-*-mingw* -+* GDB now has support for multi-byte and wide character sets on the -+target. Strings whose character type is wchar_t, char16_t, or -+char32_t are now correctly printed. GDB supports wide- and unicode- -+literals in C, that is, L'x', L"string", u'x', u"string", U'x', and -+U"string" syntax. And, GDB allows the "%ls" and "%lc" formats in -+`printf'. ++* New native configurations + - * GDB now supports automatic retrieval of shared library files from - remote targets. To use this feature, specify a system root that begins - with the `remote:' prefix, either via the `set sysroot' command or via -@@ -182,6 +189,11 @@ set target-async - with GDB while the target is running. "show target-async" displays the - current state of asynchronous execution of the target. - -+set target-wide-charset -+show target-wide-charset -+ The target-wide-charset is the name of the character set that GDB -+ uses when printing characters whose type is wchar_t. ++x86/x86_64 Darwin i[34567]86-*-darwin* + - set tcp auto-retry (on|off) - show tcp auto-retry - set tcp connect-timeout -diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 -index 81b5d47..c2bd043 100644 ---- a/gdb/acinclude.m4 -+++ b/gdb/acinclude.m4 -@@ -29,6 +29,9 @@ sinclude([../config/depstand.m4]) - dnl For AM_LC_MESSAGES - sinclude([../config/lcmessage.m4]) - -+dnl For AM_LANGINFO_CODESET. -+sinclude([../config/codeset.m4]) ++info os processes ++ Show operating system information about processes. + - # - # Sometimes the native compiler is a bogus stub for gcc or /usr/ucb/cc. This - # makes configure think it's cross compiling. If --target wasn't used, then -@@ -174,8 +177,8 @@ AC_DEFUN([AM_ICONV], - AC_ARG_WITH([libiconv-prefix], - [ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [ - for dir in `echo "$withval" | tr : ' '`; do -- if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi -- if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi -+ if test -d $dir/include; then LIBICONV_INCLUDE="-I$dir/include"; CPPFLAGS="$CPPFLAGS -I$dir/include"; fi -+ if test -d $dir/lib; then LIBICONV_LIBDIR="-L$dir/lib"; LDFLAGS="$LDFLAGS -L$dir/lib"; fi - done - ]) + * New targets -@@ -230,6 +233,8 @@ size_t iconv(); - LIBICONV="-liconv" - fi - AC_SUBST(LIBICONV) -+ AC_SUBST(LIBICONV_INCLUDE) -+ AC_SUBST(LIBICONV_LIBDIR) - ]) - - dnl written by Guido Draheim , original by Alexandre Oliva + Lattice Mico32 lm32-* diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c -index 671cb35..edcee3f 100644 +index 9b5d2c6..61676a9 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c -@@ -486,7 +486,7 @@ coerce_unspec_val_to_type (struct value *val, struct type *type) - set_value_component_location (result, val); - set_value_bitsize (result, value_bitsize (val)); - set_value_bitpos (result, value_bitpos (val)); -- VALUE_ADDRESS (result) += value_offset (val); -+ set_value_address (result, value_address (val)); - if (value_lazy (val) - || TYPE_LENGTH (type) > TYPE_LENGTH (value_type (val))) - set_value_lazy (result, 1); -@@ -1328,7 +1328,7 @@ thin_data_pntr (struct value *val) - value_copy (val)); - else - return value_from_longest (desc_data_type (thin_descriptor_type (type)), -- VALUE_ADDRESS (val) + value_offset (val)); -+ value_address (val)); - } - - /* True iff TYPE indicates a "thick" array pointer type. */ -@@ -1393,7 +1393,7 @@ desc_bounds (struct value *arr) - if (TYPE_CODE (type) == TYPE_CODE_PTR) - addr = value_as_long (arr); - else -- addr = VALUE_ADDRESS (arr) + value_offset (arr); -+ addr = value_address (arr); - - return - value_from_longest (lookup_pointer_type (bounds_type), -@@ -1666,8 +1666,8 @@ ada_type_of_array (struct value *arr, int bounds) +@@ -1621,7 +1621,7 @@ ada_type_of_array (struct value *arr, int bounds) return NULL; while (arity > 0) { -- struct type *range_type = alloc_type (objf); -- struct type *array_type = alloc_type (objf); -+ struct type *range_type = alloc_type (objf, NULL); -+ struct type *array_type = alloc_type (objf, NULL); +- struct type *range_type = alloc_type_copy (value_type (arr)); ++ struct type *range_type = alloc_type_copy (value_type (arr)); + struct type *array_type = alloc_type_copy (value_type (arr)); struct value *low = desc_one_bound (descriptor, arity, 0); struct value *high = desc_one_bound (descriptor, arity, 1); - arity -= 1; -@@ -1774,9 +1774,9 @@ packed_array_type (struct type *type, long *elt_bits) - if (TYPE_CODE (type) != TYPE_CODE_ARRAY) - return type; +@@ -4727,14 +4727,10 @@ ada_lookup_symbol (const char *name, const struct block *block0, -- new_type = alloc_type (TYPE_OBJFILE (type)); - new_elt_type = packed_array_type (ada_check_typedef (TYPE_TARGET_TYPE (type)), - elt_bits); -+ new_type = alloc_type (TYPE_OBJFILE (type), new_elt_type); - create_array_type (new_type, new_elt_type, TYPE_INDEX_TYPE (type)); - TYPE_FIELD_BITSIZE (new_type, 0) = *elt_bits; - TYPE_NAME (new_type) = ada_type_name (type); -@@ -1831,6 +1831,7 @@ decode_packed_array_type (struct type *type) - return NULL; - } - shadow_type = SYMBOL_TYPE (sym); -+ CHECK_TYPEDEF (shadow_type); + static struct symbol * + ada_lookup_symbol_nonlocal (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain) + { +- if (linkage_name == NULL) +- linkage_name = name; +- return ada_lookup_symbol (linkage_name, block_static_block (block), domain, +- NULL); ++ return ada_lookup_symbol (name, block_static_block (block), domain, NULL); + } - if (TYPE_CODE (shadow_type) != TYPE_CODE_ARRAY) - { -@@ -2005,10 +2006,9 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, - } - else if (VALUE_LVAL (obj) == lval_memory && value_lazy (obj)) - { -- v = value_at (type, -- VALUE_ADDRESS (obj) + value_offset (obj) + offset); -+ v = value_at (type, value_address (obj) + offset); - bytes = (unsigned char *) alloca (len); -- read_memory (VALUE_ADDRESS (v), bytes, len); -+ read_memory (value_address (v), bytes, len); - } - else - { -@@ -2018,15 +2018,18 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, - if (obj != NULL) - { -+ CORE_ADDR new_addr; +@@ -10839,6 +10835,40 @@ ada_operator_length (struct expression *exp, int pc, int *oplenp, int *argsp) + } + } + ++/* Implementation of the exp_descriptor method operator_check. */ + - set_value_component_location (v, obj); -- VALUE_ADDRESS (v) += value_offset (obj) + offset; -+ new_addr = value_address (obj) + offset; - set_value_bitpos (v, bit_offset + value_bitpos (obj)); - set_value_bitsize (v, bit_size); - if (value_bitpos (v) >= HOST_CHAR_BIT) - { -- VALUE_ADDRESS (v) += 1; -+ new_addr++; - set_value_bitpos (v, value_bitpos (v) - HOST_CHAR_BIT); - } -+ set_value_address (v, new_addr); - } - else - set_value_bitsize (v, bit_size); -@@ -2218,7 +2221,7 @@ ada_value_assign (struct value *toval, struct value *fromval) - int from_size; - char *buffer = (char *) alloca (len); - struct value *val; -- CORE_ADDR to_addr = VALUE_ADDRESS (toval) + value_offset (toval); -+ CORE_ADDR to_addr = value_address (toval); - - if (TYPE_CODE (type) == TYPE_CODE_FLT) - fromval = value_cast (type, fromval); -@@ -2259,8 +2262,7 @@ value_assign_to_component (struct value *container, struct value *component, - struct value *val) - { - LONGEST offset_in_container = -- (LONGEST) (VALUE_ADDRESS (component) + value_offset (component) -- - VALUE_ADDRESS (container) - value_offset (container)); -+ (LONGEST) (value_address (component) - value_address (container)); - int bit_offset_in_container = - value_bitpos (component) - value_bitpos (container); - int bits; -@@ -3788,7 +3790,7 @@ parse_old_style_renaming (struct type *type, - /* Return an lvalue containing the value VAL. This is the identity on - lvalues, and otherwise has the side-effect of pushing a copy of VAL - on the stack, using and updating *SP as the stack pointer, and -- returning an lvalue whose VALUE_ADDRESS points to the copy. */ -+ returning an lvalue whose value_address points to the copy. */ - - static struct value * - ensure_lval (struct value *val, CORE_ADDR *sp) -@@ -3802,12 +3804,12 @@ ensure_lval (struct value *val, CORE_ADDR *sp) - indicated. */ - if (gdbarch_inner_than (current_gdbarch, 1, 2)) - { -- /* Stack grows downward. Align SP and VALUE_ADDRESS (val) after -+ /* Stack grows downward. Align SP and value_address (val) after - reserving sufficient space. */ - *sp -= len; - if (gdbarch_frame_align_p (current_gdbarch)) - *sp = gdbarch_frame_align (current_gdbarch, *sp); -- VALUE_ADDRESS (val) = *sp; -+ set_value_address (val, *sp); - } - else - { -@@ -3815,14 +3817,14 @@ ensure_lval (struct value *val, CORE_ADDR *sp) - then again, re-align the frame. */ - if (gdbarch_frame_align_p (current_gdbarch)) - *sp = gdbarch_frame_align (current_gdbarch, *sp); -- VALUE_ADDRESS (val) = *sp; -+ set_value_address (val, *sp); - *sp += len; - if (gdbarch_frame_align_p (current_gdbarch)) - *sp = gdbarch_frame_align (current_gdbarch, *sp); - } - VALUE_LVAL (val) = lval_memory; - -- write_memory (VALUE_ADDRESS (val), value_contents_raw (val), len); -+ write_memory (value_address (val), value_contents_raw (val), len); - } - - return val; -@@ -3911,12 +3913,12 @@ make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp) - bounds = ensure_lval (bounds, sp); - - modify_general_field (value_contents_writeable (descriptor), -- VALUE_ADDRESS (ensure_lval (arr, sp)), -+ value_address (ensure_lval (arr, sp)), - fat_pntr_data_bitpos (desc_type), - fat_pntr_data_bitsize (desc_type)); - - modify_general_field (value_contents_writeable (descriptor), -- VALUE_ADDRESS (bounds), -+ value_address (bounds), - fat_pntr_bounds_bitpos (desc_type), - fat_pntr_bounds_bitsize (desc_type)); - -@@ -6790,7 +6792,7 @@ variant_field_index (struct type *type) - static struct type * - empty_record (struct objfile *objfile) - { -- struct type *type = alloc_type (objfile); -+ struct type *type = alloc_type (objfile, NULL); - TYPE_CODE (type) = TYPE_CODE_STRUCT; - TYPE_NFIELDS (type) = 0; - TYPE_FIELDS (type) = NULL; -@@ -6847,7 +6849,7 @@ ada_template_to_fixed_record_type_1 (struct type *type, - nfields++; - } - -- rtype = alloc_type (TYPE_OBJFILE (type)); -+ rtype = alloc_type (TYPE_OBJFILE (type), NULL); - TYPE_CODE (rtype) = TYPE_CODE_STRUCT; - INIT_CPLUS_SPECIFIC (rtype); - TYPE_NFIELDS (rtype) = nfields; -@@ -7034,7 +7036,8 @@ template_to_static_fixed_type (struct type *type0) - new_type = static_unwrap_type (field_type); - if (type == type0 && new_type != field_type) - { -- TYPE_TARGET_TYPE (type0) = type = alloc_type (TYPE_OBJFILE (type0)); -+ TYPE_TARGET_TYPE (type0) = type = alloc_type (TYPE_OBJFILE (type0), -+ NULL); - TYPE_CODE (type) = TYPE_CODE (type0); - INIT_CPLUS_SPECIFIC (type); - TYPE_NFIELDS (type) = nfields; -@@ -7079,7 +7082,7 @@ to_record_with_fixed_variant_part (struct type *type, const gdb_byte *valaddr, - else - dval = dval0; - -- rtype = alloc_type (TYPE_OBJFILE (type)); -+ rtype = alloc_type (TYPE_OBJFILE (type), NULL); - TYPE_CODE (rtype) = TYPE_CODE_STRUCT; - INIT_CPLUS_SPECIFIC (rtype); - TYPE_NFIELDS (rtype) = nfields; -@@ -7251,7 +7254,7 @@ to_fixed_array_type (struct type *type0, struct value *dval, - if (elt_type0 == elt_type) - result = type0; - else -- result = create_array_type (alloc_type (TYPE_OBJFILE (type0)), -+ result = create_array_type (alloc_type (TYPE_OBJFILE (type0), NULL), - elt_type, TYPE_INDEX_TYPE (type0)); - } - else -@@ -7281,7 +7284,7 @@ to_fixed_array_type (struct type *type0, struct value *dval, - struct type *range_type = - to_fixed_range_type (TYPE_FIELD_NAME (index_type_desc, i), - dval, TYPE_OBJFILE (type0)); -- result = create_array_type (alloc_type (TYPE_OBJFILE (type0)), -+ result = create_array_type (alloc_type (TYPE_OBJFILE (type0), NULL), - result, range_type); - } - if (!ignore_too_big && TYPE_LENGTH (result) > varsize_limit) -@@ -7523,7 +7526,7 @@ static struct value * - ada_to_fixed_value (struct value *val) - { - return ada_to_fixed_value_create (value_type (val), -- VALUE_ADDRESS (val) + value_offset (val), -+ value_address (val), - val); - } - -@@ -7869,7 +7872,7 @@ unwrap_value (struct value *val) - return - coerce_unspec_val_to_type - (val, ada_to_fixed_type (raw_real_type, 0, -- VALUE_ADDRESS (val) + value_offset (val), -+ value_address (val), - NULL, 1)); - } - } -@@ -9546,7 +9549,7 @@ to_fixed_range_type (char *name, struct value *dval, struct objfile *objfile) - if (L < INT_MIN || U > INT_MAX) - return raw_type; - else -- return create_range_type (alloc_type (objfile), raw_type, -+ return create_range_type (alloc_type (objfile, NULL), raw_type, - discrete_type_low_bound (raw_type), - discrete_type_high_bound (raw_type)); - } -@@ -9611,7 +9614,7 @@ to_fixed_range_type (char *name, struct value *dval, struct objfile *objfile) - - if (objfile == NULL) - objfile = TYPE_OBJFILE (base_type); -- type = create_range_type (alloc_type (objfile), base_type, L, U); -+ type = create_range_type (alloc_type (objfile, NULL), base_type, L, U); - TYPE_NAME (type) = name; - return type; - } -@@ -11009,9 +11012,9 @@ ada_language_arch_info (struct gdbarch *gdbarch, - /* Not really used, but needed in the ada_language_defn. */ - - static void --emit_char (int c, struct ui_file *stream, int quoter) -+emit_char (int c, struct type *type, struct ui_file *stream, int quoter) - { -- ada_emit_char (c, stream, quoter, 1); -+ ada_emit_char (c, type, stream, quoter, 1); - } - - static int -diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h -index c7cc62a..fac027b 100644 ---- a/gdb/ada-lang.h -+++ b/gdb/ada-lang.h -@@ -257,12 +257,12 @@ extern int ada_value_print (struct value *, struct ui_file *, - - /* Defined in ada-lang.c */ - --extern void ada_emit_char (int, struct ui_file *, int, int); -+extern void ada_emit_char (int, struct type *, struct ui_file *, int, int); - --extern void ada_printchar (int, struct ui_file *); -+extern void ada_printchar (int, struct type *, struct ui_file *); - --extern void ada_printstr (struct ui_file *, const gdb_byte *, -- unsigned int, int, int, -+extern void ada_printstr (struct ui_file *, struct type *, const gdb_byte *, -+ unsigned int, int, - const struct value_print_options *); - - struct value *ada_convert_actual (struct value *actual, -diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c -index 61ed06e..8b1639e 100644 ---- a/gdb/ada-tasks.c -+++ b/gdb/ada-tasks.c -@@ -293,7 +293,7 @@ read_fat_string_value (char *dest, struct value *val, int max_len) - - /* Extract LEN characters from the fat string. */ - array_val = value_ind (value_field (val, array_fieldno)); -- read_memory (VALUE_ADDRESS (array_val), dest, len); -+ read_memory (value_address (array_val), dest, len); - - /* Add the NUL character to close the string. */ - dest[len] = '\0'; -diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c -index f00824a..ef665c4 100644 ---- a/gdb/ada-typeprint.c -+++ b/gdb/ada-typeprint.c -@@ -357,16 +357,17 @@ print_array_type (struct type *type, struct ui_file *stream, int show, - bitsize = 0; - fprintf_filtered (stream, "array ("); - -+ if (type == NULL) ++static int ++ada_operator_check (struct expression *exp, int pos, ++ int (*type_func) (struct type *type, void *data), ++ int (*objfile_func) (struct objfile *objfile, void *data), ++ void *data) ++{ ++ const union exp_element *const elts = exp->elts; ++ struct type *type = NULL; ++ ++ switch (elts[pos].opcode) + { -+ fprintf_filtered (stream, _("")); -+ return; ++ case UNOP_IN_RANGE: ++ case UNOP_QUAL: ++ type = elts[pos + 1].type; ++ break; ++ ++ default: ++ return operator_check_standard (exp, pos, type_func, objfile_func, ++ data); + } + - n_indices = -1; - if (show < 0) - fprintf_filtered (stream, "..."); - else - { -- if (type == NULL) -- { -- fprintf_filtered (stream, _("")); -- return; -- } - if (ada_is_simple_array_type (type)) - { - struct type *range_desc_type = -diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c -index 9647971..cfa94a2 100644 ---- a/gdb/ada-valprint.c -+++ b/gdb/ada-valprint.c -@@ -269,7 +269,8 @@ printable_val_type (struct type *type, const gdb_byte *valaddr) - (1 or 2) of the character. */ - - void --ada_emit_char (int c, struct ui_file *stream, int quoter, int type_len) -+ada_emit_char (int c, struct type *type, struct ui_file *stream, -+ int quoter, int type_len) ++ /* Invoke callbacks for TYPE and OBJFILE if they were set as non-NULL. */ ++ ++ if (type && type_func && (*type_func) (type, data)) ++ return 1; ++ if (type && TYPE_OBJFILE (type) && objfile_func ++ && (*objfile_func) (TYPE_OBJFILE (type), data)) ++ return 1; ++ ++ return 0; ++} ++ + static char * + ada_op_name (enum exp_opcode opcode) { - if (type_len != 2) - type_len = 1; -@@ -366,10 +367,10 @@ ada_print_floating (const gdb_byte *valaddr, struct type *type, - } - - void --ada_printchar (int c, struct ui_file *stream) -+ada_printchar (int c, struct type *type, struct ui_file *stream) - { - fputs_filtered ("'", stream); -- ada_emit_char (c, stream, '\'', 1); -+ ada_emit_char (c, type, stream, '\'', 1); - fputs_filtered ("'", stream); - } - -@@ -411,7 +412,7 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream) - break; - - case TYPE_CODE_CHAR: -- LA_PRINT_CHAR ((unsigned char) val, stream); -+ LA_PRINT_CHAR ((unsigned char) val, type, stream); - break; - - case TYPE_CODE_BOOL: -@@ -454,7 +455,7 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream) - */ - - static void --printstr (struct ui_file *stream, const gdb_byte *string, -+printstr (struct ui_file *stream, struct type *elttype, const gdb_byte *string, - unsigned int length, int force_ellipses, int type_len, - const struct value_print_options *options) - { -@@ -506,7 +507,7 @@ printstr (struct ui_file *stream, const gdb_byte *string, - in_quotes = 0; - } - fputs_filtered ("'", stream); -- ada_emit_char (char_at (string, i, type_len), stream, '\'', -+ ada_emit_char (char_at (string, i, type_len), elttype, stream, '\'', - type_len); - fputs_filtered ("'", stream); - fprintf_filtered (stream, _(" "), reps); -@@ -524,7 +525,7 @@ printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("\"", stream); - in_quotes = 1; - } -- ada_emit_char (char_at (string, i, type_len), stream, '"', -+ ada_emit_char (char_at (string, i, type_len), elttype, stream, '"', - type_len); - things_printed += 1; - } -@@ -544,11 +545,12 @@ printstr (struct ui_file *stream, const gdb_byte *string, - } - - void --ada_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+ada_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, -+ unsigned int length, int force_ellipses, - const struct value_print_options *options) - { -- printstr (stream, string, length, force_ellipses, width, options); -+ printstr (stream, type, string, length, force_ellipses, TYPE_LENGTH (type), -+ options); - } - - -@@ -637,7 +639,7 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr, - len = temp_len; - } - -- printstr (stream, valaddr, len, 0, eltlen, options); -+ printstr (stream, elttype, valaddr, len, 0, eltlen, options); - result = len; - } - else -@@ -688,7 +690,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0, - } - else - retn = ada_val_print_1 (value_type (val), value_contents (val), 0, -- VALUE_ADDRESS (val), stream, recurse, options); -+ value_address (val), stream, recurse, options); - value_free_to_mark (mark); - return retn; - } -@@ -817,7 +819,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0, - { - fputs_filtered (" ", stream); - ada_printchar ((unsigned char) unpack_long (type, valaddr), -- stream); -+ type, stream); - } - } - return 0; -@@ -904,7 +906,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0, - deref_val_int)); - val_print (value_type (deref_val), - value_contents (deref_val), 0, -- VALUE_ADDRESS (deref_val), stream, recurse + 1, -+ value_address (deref_val), stream, recurse + 1, - options, current_language); - } - else -@@ -944,7 +946,7 @@ ada_value_print (struct value *val0, struct ui_file *stream, - const struct value_print_options *options) - { - const gdb_byte *valaddr = value_contents (val0); -- CORE_ADDR address = VALUE_ADDRESS (val0) + value_offset (val0); -+ CORE_ADDR address = value_address (val0); - struct type *type = - ada_to_fixed_type (value_type (val0), valaddr, address, NULL, 1); - struct value *val = -diff --git a/gdb/auxv.c b/gdb/auxv.c -index 5007cd0..3a51ec5 100644 ---- a/gdb/auxv.c -+++ b/gdb/auxv.c -@@ -205,6 +205,7 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops) - TAG (AT_UCACHEBSIZE, _("Unified cache block size"), dec); - TAG (AT_IGNOREPPC, _("Entry should be ignored"), dec); - TAG (AT_BASE_PLATFORM, _("String identifying base platform"), str); -+ TAG (AT_RANDOM, _("Address of 16 random bytes"), hex); - TAG (AT_EXECFN, _("File name of executable"), str); - TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), dec); - TAG (AT_SYSINFO, _("Special system info/entry points"), hex); -@@ -247,7 +248,8 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops) - get_user_print_options (&opts); - if (opts.addressprint) - fprintf_filtered (file, "0x%s", paddr_nz (val)); -- val_print_string (val, -1, 1, file, &opts); -+ val_print_string (builtin_type (target_gdbarch)->builtin_char, -+ val, -1, file, &opts); - fprintf_filtered (file, "\n"); - } - break; +@@ -11227,6 +11257,7 @@ parse (void) + static const struct exp_descriptor ada_exp_descriptor = { + ada_print_subexp, + ada_operator_length, ++ ada_operator_check, + ada_op_name, + ada_dump_subexp_body, + ada_evaluate_subexp diff --git a/gdb/block.c b/gdb/block.c -index 8f0140c..511c1a4 100644 +index 1889ecd..498e710 100644 --- a/gdb/block.c +++ b/gdb/block.c -@@ -207,24 +207,16 @@ block_set_scope (struct block *block, const char *scope, +@@ -223,8 +223,9 @@ block_set_scope (struct block *block, const char *scope, + BLOCK_NAMESPACE (block)->scope = scope; } - /* This returns the first using directives associated to BLOCK, if +-/* This returns the using directives list associated with BLOCK, if - any. */ -- --/* FIXME: carlton/2003-04-23: This uses the fact that we currently -- only have using directives in static blocks, because we only -- generate using directives from anonymous namespaces. Eventually, -- when we support using directives everywhere, we'll want to replace -- this by some iterator functions. */ ++/* This returns the first using directives associated with BLOCK, if + any. Each BLOCK_NAMESPACE()->USING already contains all the namespaces + imported at that code point - even those from its parent blocks. */ struct using_direct * block_using (const struct block *block) - { -- const struct block *static_block = block_static_block (block); -- -- if (static_block == NULL -- || BLOCK_NAMESPACE (static_block) == NULL) -+ if (block == NULL || BLOCK_NAMESPACE (block) == NULL) - return NULL; - else -- return BLOCK_NAMESPACE (static_block)->using; -+ return BLOCK_NAMESPACE (block)->using; - } - - /* Set BLOCK's using member to USING; if needed, allocate memory via -@@ -306,6 +298,7 @@ allocate_block (struct obstack *obstack) - BLOCK_SUPERBLOCK (bl) = NULL; - BLOCK_DICT (bl) = NULL; - BLOCK_NAMESPACE (bl) = NULL; -+ BLOCK_FORTRAN_USE (bl) = NULL; +@@ -317,3 +318,21 @@ allocate_block (struct obstack *obstack) return bl; } ++ ++/* Return OBJFILE in which BLOCK is located or NULL if we cannot find it for ++ whatever reason. */ ++ ++struct objfile * ++block_objfile (const struct block *block) ++{ ++ struct symbol *func; ++ ++ if (block == NULL) ++ return NULL; ++ ++ func = block_linkage_function (block); ++ if (func == NULL) ++ return NULL; ++ ++ return SYMBOL_SYMTAB (func)->objfile; ++} diff --git a/gdb/block.h b/gdb/block.h -index 9b43144..20d32ae 100644 +index 53e7371..8290adc 100644 --- a/gdb/block.h +++ b/gdb/block.h -@@ -96,6 +96,15 @@ struct block - cplus_specific; - } - language_specific; -+ -+ /* FIXME: It should be in the LANGUAGE_SPECIFIC region but the -+ BLOCK_NAMESPACE accessor is not protected by the C language check. */ -+ -+ struct -+ { -+ struct fortran_using *use; -+ } -+ fortran_specific; - }; +@@ -166,4 +166,6 @@ extern const struct block *block_global_block (const struct block *block); - #define BLOCK_START(bl) (bl)->startaddr -@@ -104,6 +113,7 @@ struct block - #define BLOCK_SUPERBLOCK(bl) (bl)->superblock - #define BLOCK_DICT(bl) (bl)->dict - #define BLOCK_NAMESPACE(bl) (bl)->language_specific.cplus_specific.namespace -+#define BLOCK_FORTRAN_USE(bl) (bl)->fortran_specific.use + extern struct block *allocate_block (struct obstack *obstack); - /* Macro to loop through all symbols in a block BL, in no particular - order. ITER helps keep track of the iteration, and should be a ++extern struct objfile *block_objfile (const struct block *block); ++ + #endif /* BLOCK_H */ diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c -index b23b294..567f574 100644 +index 2e598e4..38fdf8a 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c -@@ -191,6 +191,8 @@ static int is_hardware_watchpoint (struct breakpoint *bpt); +@@ -59,6 +59,7 @@ + #include "top.h" + #include "wrapper.h" + #include "valprint.h" ++#include "parser-defs.h" - static void insert_breakpoint_locations (void); - -+static int syscall_catchpoint_p (struct breakpoint *b); -+ - static const char * - bpdisp_text (enum bpdisp disp) - { -@@ -341,6 +343,18 @@ set_breakpoint_count (int num) - value_from_longest (builtin_type_int32, (LONGEST) num)); - } - -+/* Used in run_command to reset syscall catchpoints fields. */ -+ -+void -+clear_syscall_catchpoints_info (void) -+{ -+ struct breakpoint *b; -+ -+ ALL_BREAKPOINTS (b) -+ if (syscall_catchpoint_p (b)) -+ b->syscall_number = UNKNOWN_SYSCALL; -+} -+ - /* Used in run_command to zero the hit count when a new run starts. */ - - void -@@ -523,6 +537,53 @@ get_number_or_range (char **pp) + /* readline include files */ + #include "readline/readline.h" +@@ -564,6 +565,53 @@ get_number_or_range (char **pp) @@ -4665,7 +386,7 @@ index b23b294..567f574 100644 + + /* I don't know if it matters whether this is the string the user + typed in or the decompiled expression. */ -+ b->cond_string = savestring (arg, strlen (arg)); ++ b->cond_string = xstrdup (arg); + b->condition_not_parsed = 0; + for (loc = b->loc; loc; loc = loc->next) + { @@ -4684,7 +405,7 @@ index b23b294..567f574 100644 /* condition N EXP -- set break condition of breakpoint N to EXP. */ static void -@@ -543,42 +604,7 @@ condition_command (char *arg, int from_tty) +@@ -584,42 +632,7 @@ condition_command (char *arg, int from_tty) ALL_BREAKPOINTS (b) if (b->number == bnum) { @@ -4711,7 +432,7 @@ index b23b294..567f574 100644 - arg = p; - /* I don't know if it matters whether this is the string the user - typed in or the decompiled expression. */ -- b->cond_string = savestring (arg, strlen (arg)); +- b->cond_string = xstrdup (arg); - b->condition_not_parsed = 0; - for (loc = b->loc; loc; loc = loc->next) - { @@ -4728,886 +449,54 @@ index b23b294..567f574 100644 return; } -@@ -961,7 +987,7 @@ update_watchpoint (struct breakpoint *b, int reparse) - int len, type; - struct bp_location *loc, **tmp; - -- addr = VALUE_ADDRESS (v) + value_offset (v); -+ addr = value_address (v); - len = TYPE_LENGTH (value_type (v)); - type = hw_write; - if (b->type == bp_read_watchpoint) -@@ -3948,8 +3974,8 @@ check_duplicates_for (CORE_ADDR address, struct obj_section *section) - } - - /* If we found a permanent breakpoint at this address, go over the -- list again and declare all the other breakpoints there to be the -- duplicates. */ -+ list again and declare all the other breakpoints there (except -+ other permanent breakpoints) to be the duplicates. */ - if (perm_bp) - { - perm_bp->duplicate = 0; -@@ -3963,7 +3989,8 @@ check_duplicates_for (CORE_ADDR address, struct obj_section *section) - ALL_BP_LOCATIONS (b) - if (b != perm_bp) - { -- if (b->owner->enable_state != bp_disabled -+ if (b->owner->enable_state != bp_permanent -+ && b->owner->enable_state != bp_disabled - && b->owner->enable_state != bp_call_disabled - && b->enabled && !b->shlib_disabled - && b->address == address /* address / overlay match */ -@@ -4134,6 +4161,8 @@ set_raw_breakpoint_without_location (enum bptype bptype) - b->frame_id = null_frame_id; - b->forked_inferior_pid = null_ptid; - b->exec_pathname = NULL; -+ b->syscalls_to_be_caught = NULL; -+ b->syscall_number = UNKNOWN_SYSCALL; - b->ops = NULL; - b->condition_not_parsed = 0; - -@@ -4660,7 +4689,241 @@ static struct breakpoint_ops catch_vfork_breakpoint_ops = - print_mention_catch_vfork - }; - --/* Create a new breakpoint of the bp_catchpoint kind and return it. -+/* We keep a count of the number of times the user has requested a -+ particular syscall to be tracked, and pass this information to the -+ target. This lets capable targets implement filtering directly. */ -+ -+/* Number of times that "any" syscall is requested. */ -+static int any_syscall_count; -+ -+/* Count of each system call. */ -+static int *syscalls_counts; -+ -+/* Number of system entries in SYSCALLS_COUNTS. */ -+static int syscalls_size; -+ -+/* This counts all syscall catch requests, so we can readily determine -+ if any catching is necessary. */ -+static int total_syscalls_count; -+ -+/* Implement the "insert" breakpoint_ops method for syscall -+ catchpoints. */ -+ -+static void -+insert_catch_syscall (struct breakpoint *b) -+{ -+ ++total_syscalls_count; -+ if (!b->syscalls_to_be_caught) -+ ++any_syscall_count; -+ else -+ { -+ struct syscall_filter *iter; -+ for (iter = b->syscalls_to_be_caught; iter; iter = iter->next) -+ { -+ if (iter->syscall >= syscalls_size) -+ { -+ syscalls_counts = xrealloc (syscalls_counts, -+ (iter->syscall + 1) * sizeof (int)); -+ memset (&syscalls_counts[syscalls_size], 0, -+ (iter->syscall + 1 - syscalls_size) * sizeof (int)); -+ } -+ ++syscalls_counts[iter->syscall]; -+ } -+ } -+ -+ target_set_syscall_catchpoint (PIDGET (inferior_ptid), -+ total_syscalls_count != 0, -+ any_syscall_count, -+ syscalls_size, -+ syscalls_counts); -+} -+ -+/* Implement the "remove" breakpoint_ops method for syscall -+ catchpoints. */ -+ -+static int -+remove_catch_syscall (struct breakpoint *b) -+{ -+ --total_syscalls_count; -+ if (!b->syscalls_to_be_caught) -+ --any_syscall_count; -+ else -+ { -+ struct syscall_filter *iter; -+ for (iter = b->syscalls_to_be_caught; iter; iter = iter->next) -+ { -+ if (iter->syscall >= syscalls_size) -+ { -+ /* Shouldn't happen. */ -+ continue; -+ } -+ --syscalls_counts[iter->syscall]; -+ } -+ } -+ -+ return target_set_syscall_catchpoint (PIDGET (inferior_ptid), -+ total_syscalls_count != 0, -+ any_syscall_count, -+ syscalls_size, -+ syscalls_counts); -+} -+ -+/* Implement the "breakpoint_hit" breakpoint_ops method for syscall -+ catchpoints. */ -+ -+static int -+breakpoint_hit_catch_syscall (struct breakpoint *b) -+{ -+ /* We must check if we are catching specific syscalls in this breakpoint. -+ If we are, then we must guarantee that the called syscall is the same -+ syscall we are catching. */ -+ int syscall_number = 0; -+ -+ if (!inferior_has_called_syscall (inferior_ptid, &syscall_number)) -+ return 0; -+ -+ /* Now, checking if the syscall is the same. */ -+ if (b->syscalls_to_be_caught) -+ { -+ struct syscall_filter *iter; -+ for (iter = b->syscalls_to_be_caught; iter; iter = iter->next) -+ if (syscall_number == iter->syscall) -+ break; -+ /* Not the same. */ -+ if (!iter) -+ return 0; -+ } -+ -+ /* It's the same syscall. We can update the breakpoint struct -+ with the correct information. */ -+ b->syscall_number = syscall_number; -+ -+ return 1; -+} -+ -+/* Implement the "print_it" breakpoint_ops method for syscall -+ catchpoints. */ -+ -+static enum print_stop_action -+print_it_catch_syscall (struct breakpoint *b) -+{ -+ /* These are needed because we want to know in which state a -+ syscall is. It can be in the TARGET_WAITKIND_SYSCALL_ENTRY -+ or TARGET_WAITKIND_SYSCALL_RETURN, and depending on it we -+ must print "called syscall" or "returned from syscall". */ -+ ptid_t ptid; -+ struct target_waitstatus last; -+ struct syscall s; -+ struct cleanup *old_chain; -+ char *syscall_id; -+ -+ gdbarch_get_syscall_by_number (current_gdbarch, b->syscall_number, &s); -+ -+ get_last_target_status (&ptid, &last); -+ -+ annotate_catchpoint (b->number); -+ -+ if (s.name == NULL) -+ syscall_id = xstrprintf ("%d", b->syscall_number); -+ else -+ syscall_id = xstrprintf ("'%s'", s.name); -+ -+ old_chain = make_cleanup (xfree, syscall_id); -+ -+ if (last.kind == TARGET_WAITKIND_SYSCALL_ENTRY) -+ printf_filtered (_("\nCatchpoint %d (call to syscall %s), "), -+ b->number, syscall_id); -+ else -+ printf_filtered (_("\nCatchpoint %d (returned from syscall %s), "), -+ b->number, syscall_id); -+ -+ do_cleanups (old_chain); -+ -+ return PRINT_SRC_AND_LOC; -+} -+ -+/* Implement the "print_one" breakpoint_ops method for syscall -+ catchpoints. */ -+ -+static void -+print_one_catch_syscall (struct breakpoint *b, CORE_ADDR *last_addr) -+{ -+ struct value_print_options opts; -+ struct syscall s; -+ -+ gdbarch_get_syscall_by_number (current_gdbarch, b->syscall_number, &s); -+ -+ get_user_print_options (&opts); -+ /* Field 4, the address, is omitted (which makes the columns -+ not line up too nicely with the headers, but the effect -+ is relatively readable). */ -+ if (opts.addressprint) -+ ui_out_field_skip (uiout, "addr"); -+ annotate_field (5); -+ ui_out_text (uiout, "syscall \""); -+ if (b->syscall_number != UNKNOWN_SYSCALL) -+ { -+ if (s.name) -+ ui_out_field_string (uiout, "what", s.name); -+ else -+ ui_out_field_int (uiout, "what", b->syscall_number); -+ } -+ else -+ ui_out_field_string (uiout, "what", ""); -+ ui_out_text (uiout, "\" "); -+} -+ -+/* Implement the "print_mention" breakpoint_ops method for syscall -+ catchpoints. */ -+ -+static void -+print_mention_catch_syscall (struct breakpoint *b) -+{ -+ if (b->syscalls_to_be_caught) -+ { -+ struct syscall_filter *iter; -+ printf_filtered (_("Catchpoint %d (syscall(s)"), b->number); -+ for (iter = b->syscalls_to_be_caught; iter; iter = iter->next) -+ { -+ struct syscall s; -+ gdbarch_get_syscall_by_number (current_gdbarch, iter->syscall, &s); -+ -+ if (s.name) -+ printf_filtered (" '%s'", s.name); -+ else -+ printf_filtered (" %d", iter->syscall); -+ } -+ printf_filtered (")"); -+ } -+ else -+ printf_filtered (_("Catchpoint %d (any syscall)"), -+ b->number); -+} -+ -+/* The breakpoint_ops structure to be used in syscall catchpoints. */ -+ -+static struct breakpoint_ops catch_syscall_breakpoint_ops = -+{ -+ insert_catch_syscall, -+ remove_catch_syscall, -+ breakpoint_hit_catch_syscall, -+ print_it_catch_syscall, -+ print_one_catch_syscall, -+ print_mention_catch_syscall -+}; -+ -+/* Returns non-zero if 'b' is a syscall catchpoint. */ -+ -+static int -+syscall_catchpoint_p (struct breakpoint *b) -+{ -+ return (b->ops == &catch_syscall_breakpoint_ops); -+} -+ -+/* Create a new breakpoint of the bp_catchpoint kind and return it, -+ but does NOT mention it nor update the global location list. -+ This is useful if you need to fill more fields in the -+ struct breakpoint before calling mention. - - If TEMPFLAG is non-zero, then make the breakpoint temporary. - If COND_STRING is not NULL, then store it in the breakpoint. -@@ -4668,16 +4931,13 @@ static struct breakpoint_ops catch_vfork_breakpoint_ops = - to the catchpoint. */ - - static struct breakpoint * --create_catchpoint (int tempflag, char *cond_string, -- struct breakpoint_ops *ops) -+create_catchpoint_without_mention (int tempflag, char *cond_string, -+ struct breakpoint_ops *ops) - { - struct symtab_and_line sal; - struct breakpoint *b; - - init_sal (&sal); -- sal.pc = 0; -- sal.symtab = NULL; -- sal.line = 0; - - b = set_raw_breakpoint (sal, bp_catchpoint); - set_breakpoint_count (breakpoint_count + 1); -@@ -4691,6 +4951,23 @@ create_catchpoint (int tempflag, char *cond_string, - b->disposition = tempflag ? disp_del : disp_donttouch; - b->ops = ops; - -+ return b; -+} -+ -+/* Create a new breakpoint of the bp_catchpoint kind and return it. -+ -+ If TEMPFLAG is non-zero, then make the breakpoint temporary. -+ If COND_STRING is not NULL, then store it in the breakpoint. -+ OPS, if not NULL, is the breakpoint_ops structure associated -+ to the catchpoint. */ -+ -+static struct breakpoint * -+create_catchpoint (int tempflag, char *cond_string, -+ struct breakpoint_ops *ops) -+{ -+ struct breakpoint *b = -+ create_catchpoint_without_mention (tempflag, cond_string, ops); -+ - mention (b); - update_global_location_list (1); - -@@ -4775,6 +5052,23 @@ static struct breakpoint_ops catch_exec_breakpoint_ops = - print_mention_catch_exec - }; - -+static void -+create_syscall_event_catchpoint (int tempflag, struct syscall_filter *filter, -+ struct breakpoint_ops *ops) -+{ -+ struct breakpoint *b = -+ create_catchpoint_without_mention (tempflag, NULL, ops); -+ -+ b->syscalls_to_be_caught = filter; -+ /* We still don't know the syscall that will be caught :-). */ -+ b->syscall_number = UNKNOWN_SYSCALL; -+ -+ /* Now, we have to mention the breakpoint and update the global -+ location list. */ -+ mention (b); -+ update_global_location_list (1); -+} -+ - static int - hw_breakpoint_used_count (void) - { -@@ -5188,7 +5482,6 @@ expand_line_sal_maybe (struct symtab_and_line sal) - struct symtabs_and_lines expanded; - CORE_ADDR original_pc = sal.pc; - char *original_function = NULL; -- int found; - int i; - - /* If we have explicit pc, don't expand. -@@ -5264,14 +5557,42 @@ expand_line_sal_maybe (struct symtab_and_line sal) - - if (original_pc) - { -- found = 0; -+ /* Find all the other PCs for a line of code with multiple instances -+ (locations). If the instruction is in the middle of an instruction -+ block for source line GDB cannot safely find the same instruction in -+ the other compiled instances of the same source line because the other -+ instances may have been compiled completely differently. -+ -+ The testcase gdb.cp/expand-sals.exp shows that breaking at the return -+ address in a caller of the current frame works for the current -+ instance but the breakpoint cannot catch the point (instruction) where -+ the callee returns in the other compiled instances of this source line. -+ -+ The current implementation will place the breakpoint at the expected -+ returning address of the current instance of the caller. But the -+ other instances will get the breakpoint at the first instruction of -+ the source line - therefore before the call would be made. Another -+ possibility would be to place the breakpoint in the other instances at -+ the start of the next source line. -+ -+ A possible heuristics would compare the instructions length of each of -+ the instances of the current source line and if it matches it would -+ place the breakpoint at the same offset. Unfortunately a mistaken -+ guess would possibly crash the inferior. */ -+ -+ CORE_ADDR best = -1; -+ -+ /* Find the nearest preceding PC and set it to ORIGINAL_PC. */ - for (i = 0; i < expanded.nelts; ++i) -- if (expanded.sals[i].pc == original_pc) -- { -- found = 1; -- break; -- } -- gdb_assert (found); -+ if (expanded.sals[i].pc <= original_pc -+ && (best == -1 || expanded.sals[best].pc < expanded.sals[i].pc)) -+ best = i; -+ -+ if (best == -1) -+ error (_("Cannot find the best address for %s out of the %d locations"), -+ paddr (original_pc), expanded.nelts); -+ -+ expanded.sals[best].pc = original_pc; - } - - return expanded; -@@ -5310,8 +5631,6 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string, - cond_string, type, disposition, - thread, ignore_count, ops, from_tty, enabled); - } -- -- update_global_location_list (1); +@@ -8821,6 +8834,22 @@ all_tracepoints () + return tp_vec; } - /* Parse ARG which is assumed to be a SAL specification possibly -@@ -5637,7 +5956,6 @@ break_command_really (char *arg, char *cond_string, int thread, - b->ops = ops; - b->enable_state = enabled ? bp_enabled : bp_disabled; - -- update_global_location_list (1); - mention (b); - } - -@@ -5649,6 +5967,11 @@ break_command_really (char *arg, char *cond_string, int thread, - discard_cleanups (breakpoint_chain); - /* But cleanup everything else. */ - do_cleanups (old_chain); -+ -+ /* Have already BREAKPOINT_CHAIN discarded as we may get an exception while -+ inserting the breakpoints which would double-free the resources both by -+ BREAKPOINT_CHAIN now and during DELETE_BREAKPOINT in the future. */ -+ update_global_location_list (1); - } - - /* Set a breakpoint. -@@ -5727,7 +6050,12 @@ resolve_sal_pc (struct symtab_and_line *sal) - /* If this SAL corresponds to a breakpoint inserted using - a line number, then skip the function prologue if necessary. */ - if (sal->explicit_line) -- skip_prologue_sal (sal); -+ { -+ /* Preserve the original line number. */ -+ int saved_line = sal->line; -+ skip_prologue_sal (sal); -+ sal->line = saved_line; -+ } - } - - if (sal->section == 0 && sal->symtab != NULL) -@@ -6131,7 +6459,7 @@ can_use_hardware_watchpoint (struct value *v) - || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT - && TYPE_CODE (vtype) != TYPE_CODE_ARRAY)) - { -- CORE_ADDR vaddr = VALUE_ADDRESS (v) + value_offset (v); -+ CORE_ADDR vaddr = value_address (v); - int len = TYPE_LENGTH (value_type (v)); - - if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len)) -@@ -6668,6 +6996,122 @@ catch_ada_exception_command (char *arg, int from_tty, - from_tty); - } - -+/* Cleanup function for a syscall filter list. */ -+static void -+clean_up_filters (void *arg) -+{ -+ struct syscall_filter *iter = *(struct syscall_filter **) arg; -+ while (iter) -+ { -+ struct syscall_filter *next = iter->next; -+ xfree (iter); -+ iter = next; -+ } -+} -+ -+/* Splits the argument using space as delimiter. Returns an xmalloc'd -+ filter list, or NULL if no filtering is required. */ -+static struct syscall_filter * -+catch_syscall_split_args (char *arg) -+{ -+ struct syscall_filter *result = NULL; -+ struct cleanup *cleanup = make_cleanup (clean_up_filters, &result); -+ -+ while (*arg != '\0') -+ { -+ int i, syscall_number; -+ char *endptr; -+ char cur_name[128]; -+ struct syscall_filter *new_filter; -+ struct syscall s; -+ -+ /* Skip whitespace. */ -+ while (isspace (*arg)) -+ arg++; -+ -+ for (i = 0; arg[i] && !isspace (arg[i]); ++i) -+ cur_name[i] = arg[i]; -+ cur_name[i] = '\0'; -+ arg += i; -+ -+ /* Check if the user provided a syscall name or a number. */ -+ syscall_number = (int) strtol (cur_name, &endptr, 10); -+ if (*endptr == '\0') -+ { -+ gdbarch_get_syscall_by_number (current_gdbarch, -+ syscall_number, &s); -+ -+ if (s.name == NULL) -+ /* We can issue just a warning, but still create the catchpoint. -+ This is because, even not knowing the syscall name that -+ this number represents, we can still try to catch the syscall -+ number. */ -+ warning (_("The number '%d' does not represent a known syscall."), -+ syscall_number); -+ } -+ else -+ { -+ /* We have a name. Let's check if it's valid and convert it -+ to a number. */ -+ gdbarch_get_syscall_by_name (current_gdbarch, cur_name, &s); -+ -+ if (s.number == UNKNOWN_SYSCALL) -+ /* Here we have to issue an error instead of a warning, because -+ GDB cannot do anything useful if there's no syscall number to -+ be caught. */ -+ error (_("Unknown syscall name '%s'."), cur_name); -+ } -+ -+ /* Ok, it's valid. */ -+ new_filter = XNEW (struct syscall_filter); -+ new_filter->syscall = s.number; -+ new_filter->next = result; -+ result = new_filter; -+ } -+ -+ discard_cleanups (cleanup); -+ return result; -+} -+ -+/* Implement the "catch syscall" command. */ ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ + +static void -+catch_syscall_command_1 (char *arg, int from_tty, struct cmd_list_element *command) ++breakpoint_types_mark_used (void) +{ -+ int tempflag; -+ struct syscall_filter *filter; -+ struct syscall s; ++ struct breakpoint *b; + -+ /* Checking if the feature if supported. */ -+ if (gdbarch_get_syscall_number_p (current_gdbarch) == 0) -+ error (_("The feature 'catch syscall' is not supported on \ -+this architeture yet.")); -+ -+ tempflag = get_cmd_context (command) == CATCH_TEMPORARY; -+ -+ ep_skip_leading_whitespace (&arg); -+ -+ /* We need to do this first "dummy" translation in order -+ to get the syscall XML file loaded or, most important, -+ to display a warning to the user if there's no XML file -+ for his/her architecture. */ -+ gdbarch_get_syscall_by_number (current_gdbarch, 0, &s); -+ -+ /* The allowed syntax is: -+ catch syscall -+ catch syscall [ ... ] -+ -+ Let's check if there's a syscall name. */ -+ -+ if (arg != NULL) -+ filter = catch_syscall_split_args (arg); -+ else -+ filter = NULL; -+ -+ create_syscall_event_catchpoint (tempflag, filter, -+ &catch_syscall_breakpoint_ops); -+} -+ - /* Implement the "catch assert" command. */ - - static void -@@ -7134,6 +7578,7 @@ delete_breakpoint (struct breakpoint *bpt) - xfree (bpt->source_file); - if (bpt->exec_pathname != NULL) - xfree (bpt->exec_pathname); -+ clean_up_filters (&bpt->syscalls_to_be_caught); - - /* Be sure no bpstat's are pointing at it after it's been freed. */ - /* FIXME, how can we find all bpstat's? -@@ -8041,6 +8486,56 @@ single_step_breakpoint_inserted_here_p (CORE_ADDR pc) - return 0; - } - -+/* Returns 0 if 'bp' is NOT a syscall catchpoint, -+ non-zero otherwise. */ -+static int -+is_syscall_catchpoint_enabled (struct breakpoint *bp) -+{ -+ if (syscall_catchpoint_p (bp) -+ && bp->enable_state != bp_disabled -+ && bp->enable_state != bp_call_disabled) -+ return 1; -+ else -+ return 0; -+} -+ -+int -+catch_syscall_enabled (void) -+{ -+ return total_syscalls_count != 0; -+} -+ -+int -+catching_syscall_number (int syscall_number) -+{ -+ struct breakpoint *bp; -+ -+ ALL_BREAKPOINTS (bp) -+ if (is_syscall_catchpoint_enabled (bp)) -+ { -+ if (bp->syscalls_to_be_caught) -+ { -+ struct syscall_filter *iter; -+ for (iter = bp->syscalls_to_be_caught; iter; iter = iter->next) -+ if (syscall_number == iter->syscall) -+ return 1; -+ } -+ else -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/* Complete syscall names. Used by "catch syscall". */ -+static char ** -+catch_syscall_completer (struct cmd_list_element *self, char *text, char *word) -+{ -+ const char **list = -+ gdbarch_get_syscall_names (current_gdbarch); -+ return (list == NULL) ? NULL : complete_on_enum (list, text, word); ++ ALL_BREAKPOINTS (b) ++ { ++ if (b->exp) ++ exp_types_mark_used (b->exp); ++ if (b->val) ++ type_mark_used (value_type (b->val)); ++ } +} + /* This help string is used for the break, hbreak, tbreak and thbreak commands. It is defined as a macro to prevent duplication. -@@ -8073,6 +8568,8 @@ static void - add_catch_command (char *name, char *docstring, - void (*sfunc) (char *args, int from_tty, - struct cmd_list_element *command), -+ char **(*completion_function) (struct cmd_list_element *self, -+ char *text, char *word), - void *user_data_catch, - void *user_data_tcatch) - { -@@ -8082,11 +8579,13 @@ add_catch_command (char *name, char *docstring, - &catch_cmdlist); - set_cmd_sfunc (command, sfunc); - set_cmd_context (command, user_data_catch); -+ set_cmd_completer (command, completion_function); +@@ -9323,4 +9352,5 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."), + automatic_hardware_breakpoints = 1; - command = add_cmd (name, class_breakpoint, NULL, docstring, - &tcatch_cmdlist); - set_cmd_sfunc (command, sfunc); - set_cmd_context (command, user_data_tcatch); -+ set_cmd_completer (command, completion_function); + observer_attach_about_to_proceed (breakpoint_about_to_proceed); ++ observer_attach_mark_used (breakpoint_types_mark_used); } - - void -@@ -8361,36 +8860,50 @@ Set temporary catchpoints to catch events."), - Catch an exception, when caught.\n\ - With an argument, catch only exceptions with the given name."), - catch_catch_command, -+ NULL, - CATCH_PERMANENT, - CATCH_TEMPORARY); - add_catch_command ("throw", _("\ - Catch an exception, when thrown.\n\ - With an argument, catch only exceptions with the given name."), - catch_throw_command, -+ NULL, - CATCH_PERMANENT, - CATCH_TEMPORARY); - add_catch_command ("fork", _("Catch calls to fork."), - catch_fork_command_1, -+ NULL, - (void *) (uintptr_t) catch_fork_permanent, - (void *) (uintptr_t) catch_fork_temporary); - add_catch_command ("vfork", _("Catch calls to vfork."), - catch_fork_command_1, -+ NULL, - (void *) (uintptr_t) catch_vfork_permanent, - (void *) (uintptr_t) catch_vfork_temporary); - add_catch_command ("exec", _("Catch calls to exec."), - catch_exec_command_1, -+ NULL, - CATCH_PERMANENT, - CATCH_TEMPORARY); -+ add_catch_command ("syscall", _("\ -+Catch system calls.\n\ -+With an argument, catch only that syscall."), -+ catch_syscall_command_1, -+ catch_syscall_completer, -+ CATCH_PERMANENT, -+ CATCH_TEMPORARY); - add_catch_command ("exception", _("\ - Catch Ada exceptions, when raised.\n\ - With an argument, catch only exceptions with the given name."), - catch_ada_exception_command, -+ NULL, - CATCH_PERMANENT, - CATCH_TEMPORARY); - add_catch_command ("assert", _("\ - Catch failed Ada assertions, when raised.\n\ - With an argument, catch only exceptions with the given name."), - catch_assert_command, -+ NULL, - CATCH_PERMANENT, - CATCH_TEMPORARY); - diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h -index 94287de..8552e1b 100644 +index d8fe047..3a929b5 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h -@@ -33,7 +33,8 @@ struct block; - - #define BREAKPOINT_MAX 16 - --/* Type of breakpoint. */ -+ -+/* Type of breakpoint. */ - /* FIXME In the future, we should fold all other breakpoint-like things into - here. This includes: - -@@ -337,6 +338,17 @@ enum watchpoint_triggered - watch_triggered_yes - }; - -+/* A syscall filter is represented as a linked list of syscall -+ numbers. */ -+struct syscall_filter -+{ -+ /* The system call to accept. */ -+ int syscall; -+ -+ /* The next filter. */ -+ struct syscall_filter *next; -+}; -+ - typedef struct bp_location *bp_location_p; - DEF_VEC_P(bp_location_p); - -@@ -442,6 +454,20 @@ struct breakpoint - triggered. */ - char *exec_pathname; - -+ /* Syscall number used for the 'catch syscall' feature. -+ If no syscall has been called, its value is UNKNOWN_SYSCALL. -+ Otherwise, it holds the system call number in the target. -+ -+ This field is only valid immediately after this catchpoint has -+ triggered. */ -+ int syscall_number; -+ -+ /* Syscall numbers used for the 'catch syscall' feature. -+ If no syscall has been specified for filtering, its value is NULL. -+ Otherwise, it holds a list of all syscalls to be caught. -+ The list elements are allocated with xmalloc. */ -+ struct syscall_filter *syscalls_to_be_caught; -+ - /* Methods associated with this breakpoint. */ - struct breakpoint_ops *ops; - -@@ -783,6 +809,8 @@ extern void enable_watchpoints_after_interactive_call_stop (void); - extern enum command_control_type commands_from_control_command - (char *arg, struct command_line *cmd); - -+extern void clear_syscall_catchpoints_info (void); -+ - extern void clear_breakpoint_hit_counts (void); - - extern int get_number (char **); -@@ -857,7 +885,19 @@ extern int breakpoints_always_inserted_mode (void); - in our opinion won't ever trigger. */ - extern void breakpoint_retire_moribund (void); - -+/* Checks if we are catching syscalls or not. -+ Returns 0 if not, greater than 0 if we are. */ -+extern int catch_syscall_enabled (void); -+ -+/* Checks if we are catching syscalls with the specific -+ syscall_number. Used for "filtering" the catchpoints. -+ Returns 0 if not, greater than 0 if we are. */ -+extern int catching_syscall_number (int syscall_number); -+ +@@ -913,6 +913,9 @@ extern void breakpoint_retire_moribund (void); /* Tell a breakpoint to be quiet. */ extern void make_breakpoint_silent (struct breakpoint *); +/* Set break condition of breakpoint B to EXP. */ +extern void set_breakpoint_condition (struct breakpoint *b, char *exp, int from_tty); + - #endif /* !defined (BREAKPOINT_H) */ -diff --git a/gdb/buildsym.c b/gdb/buildsym.c -index 55ace15..2722daa 100644 ---- a/gdb/buildsym.c -+++ b/gdb/buildsym.c -@@ -384,6 +384,8 @@ finish_block (struct symbol *symbol, struct pending **listhead, - opblock = pblock; - } + /* Return a tracepoint with the given number if found. */ + extern struct breakpoint *get_tracepoint (int num); -+ block_set_using (block, using_directives, &objfile->objfile_obstack); -+ - record_pending_block (objfile, block, opblock); - - return block; -@@ -815,10 +817,6 @@ start_symtab (char *name, char *dirname, CORE_ADDR start_addr) - /* We shouldn't have any address map at this point. */ - gdb_assert (! pending_addrmap); - -- /* Set up support for C++ namespace support, in case we need it. */ -- -- cp_initialize_namespace (); -- - /* Initialize the list of sub source files with one entry for this - file (the top-level source file). */ - -@@ -1015,8 +1013,6 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section) - finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr, - objfile); - blockvector = make_blockvector (objfile); -- cp_finalize_namespace (BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK), -- &objfile->objfile_obstack); - } - - /* Read the line table if it has to be read separately. */ -@@ -1202,10 +1198,12 @@ push_context (int desc, CORE_ADDR valu) - new->params = param_symbols; - new->old_blocks = pending_blocks; - new->start_addr = valu; -+ new->using_directives = using_directives; - new->name = NULL; - - local_symbols = NULL; - param_symbols = NULL; -+ using_directives = NULL; - - return new; - } -diff --git a/gdb/buildsym.h b/gdb/buildsym.h -index bf23ecc..f542aca 100644 ---- a/gdb/buildsym.h -+++ b/gdb/buildsym.h -@@ -125,6 +125,10 @@ EXTERN struct pending *local_symbols; - - EXTERN struct pending *param_symbols; - -+/* using directives local to lexical context */ -+ -+EXTERN struct using_direct *using_directives; -+ - /* Stack representing unclosed lexical contexts (that will become - blocks, eventually). */ - -@@ -138,6 +142,10 @@ struct context_stack - - struct pending *params; - -+ /* Pending using directives at the time we entered */ -+ -+ struct using_direct *using_directives; -+ - /* Pointer into blocklist as of entry */ - - struct pending_block *old_blocks; diff --git a/gdb/c-exp.y b/gdb/c-exp.y -index d4bbbcc..107452a 100644 +index aacc112..e206983 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y -@@ -119,6 +119,8 @@ static int yylex (void); +@@ -117,6 +117,8 @@ static int yylex (void); void yyerror (char *); @@ -5616,46 +505,60 @@ index d4bbbcc..107452a 100644 %} /* Although the yacc "value" of an expression is not used, -@@ -143,6 +145,7 @@ void yyerror (char *); - struct symbol *sym; - struct type *tval; - struct stoken sval; -+ struct typed_stoken tsval; - struct ttype tsym; - struct symtoken ssym; - int voidval; -@@ -150,6 +153,7 @@ void yyerror (char *); - enum exp_opcode opcode; - struct internalvar *ivar; +@@ -157,6 +159,7 @@ void yyerror (char *); + %{ + /* YYSTYPE gets defined by %union */ + static int parse_number (char *, int, int, YYSTYPE *); ++static struct stoken operator_stoken (const char *); + %} -+ struct stoken_vector svec; - struct type **tvec; - int *ivec; - } -@@ -182,11 +186,13 @@ static int parse_number (char *, int, int, YYSTYPE *); - Contexts where this distinction is not important can use the - nonterminal "name", which matches either NAME or TYPENAME. */ + %type exp exp1 type_exp start variable qualified_name lcurly +@@ -199,9 +202,12 @@ static int parse_number (char *, int, int, YYSTYPE *); --%token STRING -+%token STRING -+%token CHAR - %token NAME /* BLOCKNAME defined below to give it higher precedence. */ - %token COMPLETE - %token TYPENAME --%type name string_exp -+%type name -+%type string_exp - %type name_not_typename - %type typename + %token NAME_OR_INT -@@ -399,6 +405,38 @@ arglist : arglist ',' exp %prec ABOVE_COMMA ++%token OPERATOR + %token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON + %token TEMPLATE + %token ERROR ++%token NEW DELETE ++%type operator + + /* Special type cases, put in to allow the parser to distinguish different + legal basetypes. */ +@@ -232,7 +238,7 @@ static int parse_number (char *, int, int, YYSTYPE *); + %left '+' '-' + %left '*' '/' '%' + %right UNARY INCREMENT DECREMENT +-%right ARROW '.' '[' '(' ++%right ARROW ARROW_STAR '.' DOT_STAR '[' '(' + %token BLOCKNAME + %token FILENAME + %type block +@@ -333,7 +339,7 @@ exp : exp ARROW qualified_name + write_exp_elt_opcode (STRUCTOP_MPTR); } + ; + +-exp : exp ARROW '*' exp ++exp : exp ARROW_STAR exp + { write_exp_elt_opcode (STRUCTOP_MPTR); } + ; + +@@ -368,7 +374,7 @@ exp : exp '.' qualified_name + write_exp_elt_opcode (STRUCTOP_MEMBER); } + ; + +-exp : exp '.' '*' exp ++exp : exp DOT_STAR exp + { write_exp_elt_opcode (STRUCTOP_MEMBER); } + ; + +@@ -401,6 +407,36 @@ arglist : arglist ',' exp %prec ABOVE_COMMA { arglist_len++; } ; -+exp : exp '(' nonempty_typelist ')' ++exp : exp '(' nonempty_typelist ')' const_or_volatile + { int i; -+ /* What to do about freeing memory if -+ there is an error during parsing? */ + write_exp_elt_opcode (TYPE_INSTANCE); + write_exp_elt_longcst ((LONGEST) $3[0]); + for (i = 0; i < $3[0]; ++i) @@ -5687,118 +590,23 @@ index d4bbbcc..107452a 100644 rcurly : '}' { $$ = end_arglist () - 1; } ; -@@ -524,6 +562,15 @@ exp : INT - write_exp_elt_opcode (OP_LONG); } - ; - -+exp : CHAR -+ { -+ struct stoken_vector vec; -+ vec.len = 1; -+ vec.tokens = &$1; -+ write_exp_string_vector ($1.type, &vec); -+ } -+ ; -+ - exp : NAME_OR_INT - { YYSTYPE val; - parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val); -@@ -572,48 +619,64 @@ string_exp: - string. Note that we follow the - NUL-termination convention of the - lexer. */ -- $$.length = $1.length; -- $$.ptr = malloc ($1.length + 1); -- memcpy ($$.ptr, $1.ptr, $1.length + 1); -+ struct typed_stoken *vec = XNEW (struct typed_stoken); -+ $$.len = 1; -+ $$.tokens = vec; -+ -+ vec->type = $1.type; -+ vec->length = $1.length; -+ vec->ptr = malloc ($1.length + 1); -+ memcpy (vec->ptr, $1.ptr, $1.length + 1); - } - - | string_exp STRING +@@ -703,6 +739,7 @@ variable: block COLONCOLON name + qualified_name: typebase COLONCOLON name { - /* Note that we NUL-terminate here, but just - for convenience. */ -- struct stoken t; -- t.length = $1.length + $2.length; -- t.ptr = malloc (t.length + 1); -- memcpy (t.ptr, $1.ptr, $1.length); -- memcpy (t.ptr + $1.length, $2.ptr, $2.length + 1); -- free ($1.ptr); -- $$ = t; -+ char *p; -+ ++$$.len; -+ $$.tokens = realloc ($$.tokens, -+ $$.len * sizeof (struct typed_stoken)); -+ -+ p = malloc ($2.length + 1); -+ memcpy (p, $2.ptr, $2.length + 1); -+ -+ $$.tokens[$$.len - 1].type = $2.type; -+ $$.tokens[$$.len - 1].length = $2.length; -+ $$.tokens[$$.len - 1].ptr = p; - } - ; - - exp : string_exp -- { /* C strings are converted into array constants with -- an explicit null byte added at the end. Thus -- the array upper bound is the string length. -- There is no such thing in C as a completely empty -- string. */ -- char *sp = $1.ptr; int count = $1.length; -- while (count-- > 0) -+ { -+ int i; -+ enum c_string_type type = C_STRING; -+ -+ for (i = 0; i < $1.len; ++i) - { -- write_exp_elt_opcode (OP_LONG); -- write_exp_elt_type (parse_type->builtin_char); -- write_exp_elt_longcst ((LONGEST)(*sp++)); -- write_exp_elt_opcode (OP_LONG); -+ switch ($1.tokens[i].type) -+ { -+ case C_STRING: -+ break; -+ case C_WIDE_STRING: -+ case C_STRING_16: -+ case C_STRING_32: -+ if (type != C_STRING -+ && type != $1.tokens[i].type) -+ error ("Undefined string concatenation."); -+ type = $1.tokens[i].type; -+ break; -+ default: -+ /* internal error */ -+ internal_error (__FILE__, __LINE__, -+ "unrecognized type in string concatenation"); -+ } - } -- write_exp_elt_opcode (OP_LONG); -- write_exp_elt_type (parse_type->builtin_char); -- write_exp_elt_longcst ((LONGEST)'\0'); -- write_exp_elt_opcode (OP_LONG); -- write_exp_elt_opcode (OP_ARRAY); -- write_exp_elt_longcst ((LONGEST) 0); -- write_exp_elt_longcst ((LONGEST) ($1.length)); -- write_exp_elt_opcode (OP_ARRAY); -- free ($1.ptr); -+ -+ write_exp_string_vector (type, &$1); -+ for (i = 0; i < $1.len; ++i) -+ free ($1.tokens[i].ptr); -+ free ($1.tokens); - } - ; - -@@ -713,12 +776,13 @@ qualified_name: typebase COLONCOLON name + struct type *type = $1; ++ CHECK_TYPEDEF (type); + if (TYPE_CODE (type) != TYPE_CODE_STRUCT + && TYPE_CODE (type) != TYPE_CODE_UNION + && TYPE_CODE (type) != TYPE_CODE_NAMESPACE) +@@ -718,6 +755,7 @@ qualified_name: typebase COLONCOLON name + { + struct type *type = $1; + struct stoken tmp_token; ++ CHECK_TYPEDEF (type); + if (TYPE_CODE (type) != TYPE_CODE_STRUCT + && TYPE_CODE (type) != TYPE_CODE_UNION + && TYPE_CODE (type) != TYPE_CODE_NAMESPACE) +@@ -740,12 +778,13 @@ qualified_name: typebase COLONCOLON name ; variable: qualified_name @@ -5813,7 +621,7 @@ index d4bbbcc..107452a 100644 sym = lookup_symbol (name, (const struct block *) NULL, VAR_DOMAIN, (int *) NULL); -@@ -856,7 +920,7 @@ array_mod: '[' ']' +@@ -883,7 +922,7 @@ array_mod: '[' ']' func_mod: '(' ')' { $$ = 0; } | '(' nonempty_typelist ')' @@ -5822,7 +630,7 @@ index d4bbbcc..107452a 100644 ; /* We used to try to recognize pointer to member types here, but -@@ -1057,12 +1121,15 @@ typename: TYPENAME +@@ -1088,12 +1127,15 @@ typename: TYPENAME nonempty_typelist : type { $$ = (struct type **) malloc (sizeof (struct type *) * 2); @@ -5838,292 +646,208 @@ index d4bbbcc..107452a 100644 $$[$$[0]] = $3; } ; -@@ -1361,6 +1428,263 @@ parse_number (p, len, parsed_float, putithere) - return INT; - } +@@ -1117,10 +1159,135 @@ const_or_volatile_noopt: const_and_volatile + { push_type (tp_volatile); } + ; -+/* Temporary obstack used for holding strings. */ -+static struct obstack tempbuf; -+static int tempbuf_init; ++operator: OPERATOR NEW ++ { $$ = operator_stoken (" new"); } ++ | OPERATOR DELETE ++ { $$ = operator_stoken (" delete"); } ++ | OPERATOR NEW '[' ']' ++ { $$ = operator_stoken (" new[]"); } ++ | OPERATOR DELETE '[' ']' ++ { $$ = operator_stoken (" delete[]"); } ++ | OPERATOR '+' ++ { $$ = operator_stoken ("+"); } ++ | OPERATOR '-' ++ { $$ = operator_stoken ("-"); } ++ | OPERATOR '*' ++ { $$ = operator_stoken ("*"); } ++ | OPERATOR '/' ++ { $$ = operator_stoken ("/"); } ++ | OPERATOR '%' ++ { $$ = operator_stoken ("%"); } ++ | OPERATOR '^' ++ { $$ = operator_stoken ("^"); } ++ | OPERATOR '&' ++ { $$ = operator_stoken ("&"); } ++ | OPERATOR '|' ++ { $$ = operator_stoken ("|"); } ++ | OPERATOR '~' ++ { $$ = operator_stoken ("~"); } ++ | OPERATOR '!' ++ { $$ = operator_stoken ("!"); } ++ | OPERATOR '=' ++ { $$ = operator_stoken ("="); } ++ | OPERATOR '<' ++ { $$ = operator_stoken ("<"); } ++ | OPERATOR '>' ++ { $$ = operator_stoken (">"); } ++ | OPERATOR ASSIGN_MODIFY ++ { const char *op = "unknown"; ++ switch ($2) ++ { ++ case BINOP_RSH: ++ op = ">>="; ++ break; ++ case BINOP_LSH: ++ op = "<<="; ++ break; ++ case BINOP_ADD: ++ op = "+="; ++ break; ++ case BINOP_SUB: ++ op = "-="; ++ break; ++ case BINOP_MUL: ++ op = "*="; ++ break; ++ case BINOP_DIV: ++ op = "/="; ++ break; ++ case BINOP_REM: ++ op = "%="; ++ break; ++ case BINOP_BITWISE_IOR: ++ op = "|="; ++ break; ++ case BINOP_BITWISE_AND: ++ op = "&="; ++ break; ++ case BINOP_BITWISE_XOR: ++ op = "^="; ++ break; ++ default: ++ break; ++ } + -+/* Parse a C escape sequence. The initial backslash of the sequence -+ is at (*PTR)[-1]. *PTR will be updated to point to just after the -+ last character of the sequence. If OUTPUT is not NULL, the -+ translated form of the escape sequence will be written there. If -+ OUTPUT is NULL, no output is written and the call will only affect -+ *PTR. If an escape sequence is expressed in target bytes, then the -+ entire sequence will simply be copied to OUTPUT. Return 1 if any -+ character was emitted, 0 otherwise. */ ++ $$ = operator_stoken (op); ++ } ++ | OPERATOR LSH ++ { $$ = operator_stoken ("<<"); } ++ | OPERATOR RSH ++ { $$ = operator_stoken (">>"); } ++ | OPERATOR EQUAL ++ { $$ = operator_stoken ("=="); } ++ | OPERATOR NOTEQUAL ++ { $$ = operator_stoken ("!="); } ++ | OPERATOR LEQ ++ { $$ = operator_stoken ("<="); } ++ | OPERATOR GEQ ++ { $$ = operator_stoken (">="); } ++ | OPERATOR ANDAND ++ { $$ = operator_stoken ("&&"); } ++ | OPERATOR OROR ++ { $$ = operator_stoken ("||"); } ++ | OPERATOR INCREMENT ++ { $$ = operator_stoken ("++"); } ++ | OPERATOR DECREMENT ++ { $$ = operator_stoken ("--"); } ++ | OPERATOR ',' ++ { $$ = operator_stoken (","); } ++ | OPERATOR ARROW_STAR ++ { $$ = operator_stoken ("->*"); } ++ | OPERATOR ARROW ++ { $$ = operator_stoken ("->"); } ++ | OPERATOR '(' ')' ++ { $$ = operator_stoken ("()"); } ++ | OPERATOR '[' ']' ++ { $$ = operator_stoken ("[]"); } ++ | OPERATOR ptype ++ { char *name, *canon; ++ long length; ++ struct ui_file *buf = mem_fileopen (); + -+int -+c_parse_escape (char **ptr, struct obstack *output) ++ c_print_type ($2, NULL, buf, -1, 0); ++ name = ui_file_xstrdup (buf, &length); ++ canon = cp_canonicalize_string (name); ++ if (canon != NULL) ++ { ++ xfree (name); ++ name = canon; ++ } ++ ui_file_delete (buf); ++ $$ = operator_stoken (name); ++ } ++ ; ++ ++ ++ + name : NAME { $$ = $1.stoken; } + | BLOCKNAME { $$ = $1.stoken; } + | TYPENAME { $$ = $1.stoken; } + | NAME_OR_INT { $$ = $1.stoken; } ++ | operator { $$ = $1; } + ; + + name_not_typename : NAME +@@ -1136,6 +1303,20 @@ name_not_typename : NAME + + %% + ++/* Returns a stoken of the operator name given by OP (which does not ++ include the string "operator"). The result is xmalloc'd. */ ++static struct stoken ++operator_stoken (const char *op) +{ -+ char *tokptr = *ptr; -+ int result = 1; ++ static const char *operator_string = "operator"; ++ struct stoken st = { NULL, 0 }; ++ st.length = strlen (operator_string) + strlen (op); ++ st.ptr = xmalloc (st.length + 1); ++ strcpy (st.ptr, operator_string); ++ strcat (st.ptr, op); ++ return st; ++}; + -+ /* Some escape sequences undergo character set conversion. Those we -+ translate here. */ -+ switch (*tokptr) -+ { -+ /* Hex escapes do not undergo character set conversion, so keep -+ the escape sequence for later. */ -+ case 'x': -+ if (output) -+ obstack_grow_str (output, "\\x"); -+ ++tokptr; -+ if (!isxdigit (*tokptr)) -+ error (_("\\x escape without a following hex digit")); -+ while (isxdigit (*tokptr)) -+ { -+ if (output) -+ obstack_1grow (output, *tokptr); -+ ++tokptr; -+ } -+ break; -+ -+ /* Octal escapes do not undergo character set conversion, so -+ keep the escape sequence for later. */ -+ case '0': -+ case '1': -+ case '2': -+ case '3': -+ case '4': -+ case '5': -+ case '6': -+ case '7': -+ if (output) -+ obstack_grow_str (output, "\\"); -+ while (isdigit (*tokptr) && *tokptr != '8' && *tokptr != '9') -+ { -+ if (output) -+ obstack_1grow (output, *tokptr); -+ ++tokptr; -+ } -+ break; -+ -+ /* We handle UCNs later. We could handle them here, but that -+ would mean a spurious error in the case where the UCN could -+ be converted to the target charset but not the host -+ charset. */ -+ case 'u': -+ case 'U': -+ { -+ char c = *tokptr; -+ int i, len = c == 'U' ? 8 : 4; -+ if (output) -+ { -+ obstack_1grow (output, '\\'); -+ obstack_1grow (output, *tokptr); -+ } -+ ++tokptr; -+ if (!isxdigit (*tokptr)) -+ error (_("\\%c escape without a following hex digit"), c); -+ for (i = 0; i < len && isxdigit (*tokptr); ++i) -+ { -+ if (output) -+ obstack_1grow (output, *tokptr); -+ ++tokptr; -+ } -+ } -+ break; -+ -+ /* We must pass backslash through so that it does not -+ cause quoting during the second expansion. */ -+ case '\\': -+ if (output) -+ obstack_grow_str (output, "\\\\"); -+ ++tokptr; -+ break; -+ -+ /* Escapes which undergo conversion. */ -+ case 'a': -+ if (output) -+ obstack_1grow (output, '\a'); -+ ++tokptr; -+ break; -+ case 'b': -+ if (output) -+ obstack_1grow (output, '\b'); -+ ++tokptr; -+ break; -+ case 'f': -+ if (output) -+ obstack_1grow (output, '\f'); -+ ++tokptr; -+ break; -+ case 'n': -+ if (output) -+ obstack_1grow (output, '\n'); -+ ++tokptr; -+ break; -+ case 'r': -+ if (output) -+ obstack_1grow (output, '\r'); -+ ++tokptr; -+ break; -+ case 't': -+ if (output) -+ obstack_1grow (output, '\t'); -+ ++tokptr; -+ break; -+ case 'v': -+ if (output) -+ obstack_1grow (output, '\v'); -+ ++tokptr; -+ break; -+ -+ /* GCC extension. */ -+ case 'e': -+ if (output) -+ obstack_1grow (output, HOST_ESCAPE_CHAR); -+ ++tokptr; -+ break; -+ -+ /* Backslash-newline expands to nothing at all. */ -+ case '\n': -+ ++tokptr; -+ result = 0; -+ break; -+ -+ /* A few escapes just expand to the character itself. */ -+ case '\'': -+ case '\"': -+ case '?': -+ /* GCC extensions. */ -+ case '(': -+ case '{': -+ case '[': -+ case '%': -+ /* Unrecognized escapes turn into the character itself. */ -+ default: -+ if (output) -+ obstack_1grow (output, *tokptr); -+ ++tokptr; -+ break; -+ } -+ *ptr = tokptr; -+ return result; -+} -+ -+/* Parse a string or character literal from TOKPTR. The string or -+ character may be wide or unicode. *OUTPTR is set to just after the -+ end of the literal in the input string. The resulting token is -+ stored in VALUE. This returns a token value, either STRING or -+ CHAR, depending on what was parsed. *HOST_CHARS is set to the -+ number of host characters in the literal. */ -+static int -+parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value, -+ int *host_chars) -+{ -+ int quote, i; -+ enum c_string_type type; -+ -+ /* Build the gdb internal form of the input string in tempbuf. Note -+ that the buffer is null byte terminated *only* for the -+ convenience of debugging gdb itself and printing the buffer -+ contents when the buffer contains no embedded nulls. Gdb does -+ not depend upon the buffer being null byte terminated, it uses -+ the length string instead. This allows gdb to handle C strings -+ (as well as strings in other languages) with embedded null -+ bytes */ -+ -+ if (!tempbuf_init) -+ tempbuf_init = 1; -+ else -+ obstack_free (&tempbuf, NULL); -+ obstack_init (&tempbuf); -+ -+ /* Record the string type. */ -+ if (*tokptr == 'L') -+ { -+ type = C_WIDE_STRING; -+ ++tokptr; -+ } -+ else if (*tokptr == 'u') -+ { -+ type = C_STRING_16; -+ ++tokptr; -+ } -+ else if (*tokptr == 'U') -+ { -+ type = C_STRING_32; -+ ++tokptr; -+ } -+ else -+ type = C_STRING; -+ -+ /* Skip the quote. */ -+ quote = *tokptr; -+ if (quote == '\'') -+ type |= C_CHAR; -+ ++tokptr; -+ -+ *host_chars = 0; -+ -+ while (*tokptr) -+ { -+ char c = *tokptr; -+ if (c == '\\') -+ { -+ ++tokptr; -+ *host_chars += c_parse_escape (&tokptr, &tempbuf); -+ } -+ else if (c == quote) -+ break; -+ else -+ { -+ obstack_1grow (&tempbuf, c); -+ ++tokptr; -+ /* FIXME: this does the wrong thing with multi-byte host -+ characters. We could use mbrlen here, but that would -+ make "set host-charset" a bit less useful. */ -+ ++*host_chars; -+ } -+ } -+ -+ if (*tokptr != quote) -+ { -+ if (quote == '"') -+ error ("Unterminated string in expression."); -+ else -+ error ("Unmatched single quote."); -+ } -+ ++tokptr; -+ -+ value->type = type; -+ value->ptr = obstack_base (&tempbuf); -+ value->length = obstack_object_size (&tempbuf); -+ -+ *outptr = tokptr; -+ -+ return quote == '"' ? STRING : CHAR; -+} -+ - struct token - { - char *operator; -@@ -1526,23 +1850,33 @@ static int last_was_structop; + /* Take care of parsing a number (anything that starts with a digit). + Set yylval and return the token type; update lexptr. + LEN is the number of characters in it. */ +@@ -1664,7 +1845,8 @@ struct token + static const struct token tokentab3[] = + { + {">>=", ASSIGN_MODIFY, BINOP_RSH, 0}, +- {"<<=", ASSIGN_MODIFY, BINOP_LSH, 0} ++ {"<<=", ASSIGN_MODIFY, BINOP_LSH, 0}, ++ {"->*", ARROW_STAR, BINOP_END, 1} + }; + + static const struct token tokentab2[] = +@@ -1688,7 +1870,8 @@ static const struct token tokentab2[] = + {"==", EQUAL, BINOP_END, 0}, + {"!=", NOTEQUAL, BINOP_END, 0}, + {"<=", LEQ, BINOP_END, 0}, +- {">=", GEQ, BINOP_END, 0} ++ {">=", GEQ, BINOP_END, 0}, ++ {".*", DOT_STAR, BINOP_END, 0} + }; + + /* Identifier-like tokens. */ +@@ -1710,6 +1893,9 @@ static const struct token ident_tokens[] = + {"long", LONG, OP_NULL, 0}, + {"true", TRUEKEYWORD, OP_NULL, 1}, + {"int", INT_KEYWORD, OP_NULL, 0}, ++ {"new", NEW, OP_NULL, 1}, ++ {"delete", DELETE, OP_NULL, 1}, ++ {"operator", OPERATOR, OP_NULL, 1}, + + {"and", ANDAND, BINOP_END, 1}, + {"and_eq", ASSIGN_MODIFY, BINOP_BITWISE_AND, 1}, +@@ -1818,6 +2004,13 @@ static int last_was_structop; static int - yylex () + yylex (void) { + /* name_prefix stores the full qualification of a variable that is + specified in the expression. It is used to eleminate confusion + during lookup.*/ -+ static char* name_prefix = NULL; ++ static char *name_prefix = NULL; + static int name_prefix_len = 0; + static int terminate_prefix = 0; + int c; int namelen; unsigned int i; - char *tokstart; -- char *tokptr; -- int tempbufindex; -- static char *tempbuf; -- static int tempbufsize; -- char * token_string = NULL; -- int class_prefix = 0; - int saw_structop = last_was_structop; +@@ -1826,9 +2019,19 @@ yylex (void) char *copy; last_was_structop = 0; @@ -6132,30 +856,31 @@ index d4bbbcc..107452a 100644 retry: - + -+ if(terminate_prefix || -+ lexptr != name_prefix + name_prefix_len // Some token was skiped so clear name_prefix -+ ){ -+ name_prefix = NULL; -+ name_prefix_len = 0; -+ } ++ if (terminate_prefix ++ || lexptr != name_prefix + name_prefix_len) ++ { ++ /* Some token was skipped, so clear name_prefix. */ ++ name_prefix = NULL; ++ name_prefix_len = 0; ++ } + + terminate_prefix = 1; + /* Check if this is a macro invocation that we need to expand. */ if (! scanning_macro_expansion ()) { -@@ -1570,10 +1904,19 @@ yylex () +@@ -1856,10 +2059,19 @@ yylex (void) for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++) if (strncmp (tokstart, tokentab2[i].operator, 2) == 0) { -+ -+ if(tokentab2[i].token == COLONCOLON){ -+ name_prefix_len += 2; -+ terminate_prefix = 0; -+ if(name_prefix == NULL){ -+ name_prefix = lexptr; -+ } -+ } ++ if (tokentab2[i].token == COLONCOLON) ++ { ++ name_prefix_len += 2; ++ terminate_prefix = 0; ++ if (name_prefix == NULL) ++ name_prefix = lexptr; ++ } ++ lexptr += 2; yylval.opcode = tokentab2[i].opcode; if (in_parse_field && tokentab2[i].token == ARROW) @@ -6164,7 +889,7 @@ index d4bbbcc..107452a 100644 return tokentab2[i].token; } -@@ -1602,51 +1945,13 @@ yylex () +@@ -1888,6 +2100,8 @@ yylex (void) return 0; case ' ': @@ -6173,145 +898,7 @@ index d4bbbcc..107452a 100644 case '\t': case '\n': lexptr++; - goto retry; - -- case '\'': -- /* We either have a character constant ('0' or '\177' for example) -- or we have a quoted symbol reference ('foo(int,int)' in C++ -- for example). */ -- lexptr++; -- c = *lexptr++; -- if (c == '\\') -- c = parse_escape (&lexptr); -- else if (c == '\'') -- error ("Empty character constant."); -- else if (! host_char_to_target (c, &c)) -- { -- int toklen = lexptr - tokstart + 1; -- char *tok = alloca (toklen + 1); -- memcpy (tok, tokstart, toklen); -- tok[toklen] = '\0'; -- error ("There is no character corresponding to %s in the target " -- "character set `%s'.", tok, target_charset ()); -- } -- -- yylval.typed_val_int.val = c; -- yylval.typed_val_int.type = parse_type->builtin_char; -- -- c = *lexptr++; -- if (c != '\'') -- { -- namelen = skip_quoted (tokstart) - tokstart; -- if (namelen > 2) -- { -- lexptr = tokstart + namelen; -- if (lexptr[-1] != '\'') -- error ("Unmatched single quote."); -- namelen -= 2; -- tokstart++; -- goto tryname; -- } -- error ("Invalid character constant."); -- } -- return INT; -- - case '(': - paren_depth++; - lexptr++; -@@ -1764,70 +2069,33 @@ yylex () - lexptr++; - return c; - -+ case 'L': -+ case 'u': -+ case 'U': -+ if (tokstart[1] != '"' && tokstart[1] != '\'') -+ break; -+ /* Fall through. */ -+ case '\'': - case '"': -- -- /* Build the gdb internal form of the input string in tempbuf, -- translating any standard C escape forms seen. Note that the -- buffer is null byte terminated *only* for the convenience of -- debugging gdb itself and printing the buffer contents when -- the buffer contains no embedded nulls. Gdb does not depend -- upon the buffer being null byte terminated, it uses the length -- string instead. This allows gdb to handle C strings (as well -- as strings in other languages) with embedded null bytes */ -- -- tokptr = ++tokstart; -- tempbufindex = 0; -- -- do { -- char *char_start_pos = tokptr; -- -- /* Grow the static temp buffer if necessary, including allocating -- the first one on demand. */ -- if (tempbufindex + 1 >= tempbufsize) -- { -- tempbuf = (char *) realloc (tempbuf, tempbufsize += 64); -- } -- switch (*tokptr) -+ { -+ int host_len; -+ int result = parse_string_or_char (tokstart, &lexptr, &yylval.tsval, -+ &host_len); -+ if (result == CHAR) - { -- case '\0': -- case '"': -- /* Do nothing, loop will terminate. */ -- break; -- case '\\': -- tokptr++; -- c = parse_escape (&tokptr); -- if (c == -1) -+ if (host_len == 0) -+ error ("Empty character constant."); -+ else if (host_len > 2 && c == '\'') - { -- continue; -+ ++tokstart; -+ namelen = lexptr - tokstart - 1; -+ goto tryname; - } -- tempbuf[tempbufindex++] = c; -- break; -- default: -- c = *tokptr++; -- if (! host_char_to_target (c, &c)) -- { -- int len = tokptr - char_start_pos; -- char *copy = alloca (len + 1); -- memcpy (copy, char_start_pos, len); -- copy[len] = '\0'; -- -- error ("There is no character corresponding to `%s' " -- "in the target character set `%s'.", -- copy, target_charset ()); -- } -- tempbuf[tempbufindex++] = c; -- break; -+ else if (host_len > 1) -+ error ("Invalid character constant."); - } -- } while ((*tokptr != '"') && (*tokptr != '\0')); -- if (*tokptr++ != '"') -- { -- error ("Unterminated string in expression."); -- } -- tempbuf[tempbufindex] = '\0'; /* See note above */ -- yylval.sval.ptr = tempbuf; -- yylval.sval.length = tempbufindex; -- lexptr = tokptr; -- return (STRING); -+ return result; -+ } - } - - if (!(c == '_' || c == '$' -@@ -1836,11 +2104,13 @@ yylex () +@@ -2045,11 +2259,13 @@ yylex (void) error ("Invalid character '%c' in expression.", c); /* It's a name. See how long it is. */ @@ -6325,7 +912,7 @@ index d4bbbcc..107452a 100644 /* Template parameter lists are part of the name. FIXME: This mishandles `print $a<4&&$a>3'. */ -@@ -1904,14 +2174,29 @@ yylex () +@@ -2113,14 +2329,29 @@ yylex (void) currently as names of types; NAME for other symbols. The caller is not constrained to care about the distinction. */ { @@ -6335,28 +922,28 @@ index d4bbbcc..107452a 100644 int hextype; - sym = lookup_symbol (copy, expression_context_block, -+ if(name_prefix != NULL){ ++ if (name_prefix != NULL) + tmp = savestring (name_prefix, name_prefix_len+namelen); -+ } + + sym = lookup_symbol (tmp, expression_context_block, VAR_DOMAIN, parse_language->la_language == language_cplus ? &is_a_field_of_this : (int *) NULL); + -+ /* keep this name as prefix for the next name */ -+ if(sym){ -+ if(name_prefix == NULL){ -+ name_prefix = tokstart; ++ /* Keep this name as the prefix for the next name. */ ++ if (sym) ++ { ++ if (name_prefix == NULL) ++ name_prefix = tokstart; ++ ++ name_prefix_len += namelen; ++ terminate_prefix = 0; + } -+ name_prefix_len += namelen; -+ terminate_prefix = 0; -+ } + /* Call lookup_symtab, not lookup_partial_symtab, in case there are no psymtabs (coff, xcoff, or some future change to blow away the psymtabs once once symbols are read). */ -@@ -1970,6 +2255,7 @@ yylex () +@@ -2179,6 +2410,7 @@ yylex (void) yylval.ssym.is_a_field_of_this = is_a_field_of_this; if (in_parse_field && *lexptr == '\0') saw_name_at_eof = 1; @@ -6365,1020 +952,49 @@ index d4bbbcc..107452a 100644 } } diff --git a/gdb/c-lang.c b/gdb/c-lang.c -index 8b5410f..188755b 100644 +index 4ba81ba..053f685 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c -@@ -33,48 +33,304 @@ - #include "demangle.h" - #include "cp-abi.h" - #include "cp-support.h" -+#include "gdb_obstack.h" -+#include -+#include -+#include +@@ -715,7 +715,7 @@ c_get_string (struct value *value, gdb_byte **buffer, int *length, + If length returned from read_string was > 0, return the number of + characters read by dividing the number of bytes by width. */ + if (*length != 0) +- *length = *length / width; ++ *length = *length / width; - extern void _initialize_c_language (void); --static void c_emit_char (int c, struct ui_file * stream, int quoter); -+ -+/* Given a C string type, STR_TYPE, return the corresponding target -+ character set name. */ -+ -+static const char * -+charset_for_string_type (enum c_string_type str_type) -+{ -+ switch (str_type & ~C_CHAR) -+ { -+ case C_STRING: -+ return target_charset (); -+ case C_WIDE_STRING: -+ return target_wide_charset (); -+ case C_STRING_16: -+ /* FIXME: UCS-2 is not always correct. */ -+ if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) -+ return "UCS-2BE"; -+ else -+ return "UCS-2LE"; -+ case C_STRING_32: -+ /* FIXME: UCS-4 is not always correct. */ -+ if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) -+ return "UCS-4BE"; -+ else -+ return "UCS-4LE"; -+ } -+ internal_error (__FILE__, __LINE__, "unhandled c_string_type"); -+} -+ -+/* Classify ELTTYPE according to what kind of character it is. Return -+ the enum constant representing the character type. Also set -+ *ENCODING to the name of the character set to use when converting -+ characters of this type to the host character set. */ -+ -+static enum c_string_type -+classify_type (struct type *elttype, const char **encoding) -+{ -+ struct type *saved_type; -+ enum c_string_type result; -+ -+ /* We do one or two passes -- one on ELTTYPE, and then maybe a -+ second one on a typedef target. */ -+ do -+ { -+ char *name = TYPE_NAME (elttype); -+ -+ if (TYPE_CODE (elttype) == TYPE_CODE_CHAR || !name) -+ { -+ result = C_CHAR; -+ goto done; -+ } -+ -+ if (!strcmp (name, "wchar_t")) -+ { -+ result = C_WIDE_CHAR; -+ goto done; -+ } -+ -+ if (!strcmp (name, "char16_t")) -+ { -+ result = C_CHAR_16; -+ goto done; -+ } -+ -+ if (!strcmp (name, "char32_t")) -+ { -+ result = C_CHAR_32; -+ goto done; -+ } -+ -+ saved_type = elttype; -+ CHECK_TYPEDEF (elttype); -+ } -+ while (elttype != saved_type); -+ -+ /* Punt. */ -+ result = C_CHAR; -+ -+ done: -+ *encoding = charset_for_string_type (result); -+ return result; -+} -+ -+/* Return true if print_wchar can display W without resorting to a -+ numeric escape, false otherwise. */ -+ -+static int -+wchar_printable (wchar_t w) -+{ -+ return (iswprint (w) -+ || w == L'\a' || w == L'\b' || w == L'\f' || w == L'\n' -+ || w == L'\r' || w == L'\t' || w == L'\v'); -+} -+ -+/* A helper function that converts the contents of STRING to wide -+ characters and then appends them to OUTPUT. */ -+ -+static void -+append_string_as_wide (const char *string, struct obstack *output) -+{ -+ for (; *string; ++string) -+ { -+ wchar_t w = btowc (*string); -+ obstack_grow (output, &w, sizeof (wchar_t)); -+ } -+} -+ -+/* Print a wide character W to OUTPUT. ORIG is a pointer to the -+ original (target) bytes representing the character, ORIG_LEN is the -+ number of valid bytes. WIDTH is the number of bytes in a base -+ characters of the type. OUTPUT is an obstack to which wide -+ characters are emitted. QUOTER is a (narrow) character indicating -+ the style of quotes surrounding the character to be printed. -+ NEED_ESCAPE is an in/out flag which is used to track numeric -+ escapes across calls. */ -+ -+static void -+print_wchar (wint_t w, const gdb_byte *orig, int orig_len, -+ int width, struct obstack *output, int quoter, -+ int *need_escapep) -+{ -+ int need_escape = *need_escapep; -+ *need_escapep = 0; -+ if (iswprint (w) && (!need_escape || (!iswdigit (w) -+ && w != L'8' -+ && w != L'9'))) -+ { -+ if (w == btowc (quoter) || w == L'\\') -+ obstack_grow_wstr (output, L"\\"); -+ obstack_grow (output, &w, sizeof (wchar_t)); -+ } -+ else -+ { -+ switch (w) -+ { -+ case L'\a': -+ obstack_grow_wstr (output, L"\\a"); -+ break; -+ case L'\b': -+ obstack_grow_wstr (output, L"\\b"); -+ break; -+ case L'\f': -+ obstack_grow_wstr (output, L"\\f"); -+ break; -+ case L'\n': -+ obstack_grow_wstr (output, L"\\n"); -+ break; -+ case L'\r': -+ obstack_grow_wstr (output, L"\\r"); -+ break; -+ case L'\t': -+ obstack_grow_wstr (output, L"\\t"); -+ break; -+ case L'\v': -+ obstack_grow_wstr (output, L"\\v"); -+ break; -+ default: -+ { -+ int i; -+ -+ for (i = 0; i + width <= orig_len; i += width) -+ { -+ char octal[30]; -+ ULONGEST value = extract_unsigned_integer (&orig[i], width); -+ sprintf (octal, "\\%lo", (long) value); -+ append_string_as_wide (octal, output); -+ } -+ /* If we somehow have extra bytes, print them now. */ -+ while (i < orig_len) -+ { -+ char octal[5]; -+ sprintf (octal, "\\%.3o", orig[i] & 0xff); -+ append_string_as_wide (octal, output); -+ ++i; -+ } -+ -+ *need_escapep = 1; -+ } -+ break; -+ } -+ } -+} + *charset = target_charset (); - /* Print the character C on STREAM as part of the contents of a literal - string whose delimiter is QUOTER. Note that that format for printing - characters and strings is language specific. */ - - static void --c_emit_char (int c, struct ui_file *stream, int quoter) -+c_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) - { -- const char *escape; -- int host_char; -+ struct obstack wchar_buf, output; -+ struct cleanup *cleanups; -+ const char *encoding; -+ gdb_byte *buf; -+ struct wchar_iterator *iter; -+ int need_escape = 0; - -- c &= 0xFF; /* Avoid sign bit follies */ -+ classify_type (type, &encoding); - -- escape = c_target_char_has_backslash_escape (c); -- if (escape) -- { -- if (quoter == '"' && strcmp (escape, "0") == 0) -- /* Print nulls embedded in double quoted strings as \000 to -- prevent ambiguity. */ -- fprintf_filtered (stream, "\\000"); -- else -- fprintf_filtered (stream, "\\%s", escape); -- } -- else if (target_char_to_host (c, &host_char) -- && host_char_print_literally (host_char)) -+ buf = alloca (TYPE_LENGTH (type)); -+ pack_long (buf, type, c); -+ -+ iter = make_wchar_iterator (buf, TYPE_LENGTH (type), encoding, -+ TYPE_LENGTH (type)); -+ cleanups = make_cleanup_wchar_iterator (iter); -+ -+ /* This holds the printable form of the wchar_t data. */ -+ obstack_init (&wchar_buf); -+ make_cleanup_obstack_free (&wchar_buf); -+ -+ while (1) - { -- if (host_char == '\\' || host_char == quoter) -- fputs_filtered ("\\", stream); -- fprintf_filtered (stream, "%c", host_char); -+ int num_chars; -+ wchar_t *chars; -+ const gdb_byte *buf; -+ size_t buflen; -+ int print_escape = 1; -+ enum wchar_iterate_result result; -+ -+ num_chars = wchar_iterate (iter, &result, &chars, &buf, &buflen); -+ if (num_chars < 0) -+ break; -+ if (num_chars > 0) -+ { -+ /* If all characters are printable, print them. Otherwise, -+ we're going to have to print an escape sequence. We -+ check all characters because we want to print the target -+ bytes in the escape sequence, and we don't know character -+ boundaries there. */ -+ int i; -+ -+ print_escape = 0; -+ for (i = 0; i < num_chars; ++i) -+ if (!wchar_printable (chars[i])) -+ { -+ print_escape = 1; -+ break; -+ } -+ -+ if (!print_escape) -+ { -+ for (i = 0; i < num_chars; ++i) -+ print_wchar (chars[i], buf, buflen, TYPE_LENGTH (type), -+ &wchar_buf, quoter, &need_escape); -+ } -+ } -+ -+ /* This handles the NUM_CHARS == 0 case as well. */ -+ if (print_escape) -+ print_wchar (WEOF, buf, buflen, TYPE_LENGTH (type), &wchar_buf, quoter, -+ &need_escape); - } -- else -- fprintf_filtered (stream, "\\%.3o", (unsigned int) c); -+ -+ /* The output in the host encoding. */ -+ obstack_init (&output); -+ make_cleanup_obstack_free (&output); -+ -+ convert_between_encodings ("wchar_t", host_charset (), -+ obstack_base (&wchar_buf), -+ obstack_object_size (&wchar_buf), -+ 1, &output, translit_char); -+ obstack_1grow (&output, '\0'); -+ -+ fputs_filtered (obstack_base (&output), stream); -+ -+ do_cleanups (cleanups); +@@ -1038,6 +1038,9 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, + return evaluate_subexp_standard (expect_type, exp, pos, noside); } - void --c_printchar (int c, struct ui_file *stream) -+c_printchar (int c, struct type *type, struct ui_file *stream) - { -+ enum c_string_type str_type; -+ const char *encoding; ++ ++/* Preprocessing and parsing C and C++ expressions. */ + -+ str_type = classify_type (type, &encoding); -+ switch (str_type) -+ { -+ case C_CHAR: -+ break; -+ case C_WIDE_CHAR: -+ fputc_filtered ('L', stream); -+ break; -+ case C_CHAR_16: -+ fputc_filtered ('u', stream); -+ break; -+ case C_CHAR_32: -+ fputc_filtered ('U', stream); -+ break; -+ } -+ - fputc_filtered ('\'', stream); -- LA_EMIT_CHAR (c, stream, '\''); -+ LA_EMIT_CHAR (c, type, stream, '\''); - fputc_filtered ('\'', stream); - } - -@@ -85,87 +341,206 @@ c_printchar (int c, struct ui_file *stream) - printing LENGTH characters, or if FORCE_ELLIPSES. */ - - void --c_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+c_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, -+ unsigned int length, int force_ellipses, - const struct value_print_options *options) - { - unsigned int i; - unsigned int things_printed = 0; - int in_quotes = 0; - int need_comma = 0; -+ int width = TYPE_LENGTH (type); -+ struct obstack wchar_buf, output; -+ struct cleanup *cleanup; -+ enum c_string_type str_type; -+ const char *encoding; -+ struct wchar_iterator *iter; -+ int finished = 0; -+ int need_escape = 0; - - /* If the string was not truncated due to `set print elements', and - the last byte of it is a null, we don't print that, in traditional C - style. */ - if (!force_ellipses - && length > 0 -- && (extract_unsigned_integer (string + (length - 1) * width, width) -- == '\0')) -+ && (extract_unsigned_integer (string + (length - 1) * width, width) == 0)) - length--; - -+ str_type = classify_type (type, &encoding) & ~C_CHAR; -+ switch (str_type) -+ { -+ case C_STRING: -+ break; -+ case C_WIDE_STRING: -+ fputs_filtered ("L", stream); -+ break; -+ case C_STRING_16: -+ fputs_filtered ("u", stream); -+ break; -+ case C_STRING_32: -+ fputs_filtered ("U", stream); -+ break; -+ } -+ - if (length == 0) - { - fputs_filtered ("\"\"", stream); - return; - } - -- for (i = 0; i < length && things_printed < options->print_max; ++i) -+ if (length == -1) -+ { -+ unsigned long current_char = 1; -+ for (i = 0; current_char; ++i) -+ { -+ QUIT; -+ current_char = extract_unsigned_integer (string + i * width, width); -+ } -+ length = i; -+ } -+ -+ /* Arrange to iterate over the characters, in wchar_t form. */ -+ iter = make_wchar_iterator (string, length * width, encoding, width); -+ cleanup = make_cleanup_wchar_iterator (iter); -+ -+ /* WCHAR_BUF is the obstack we use to represent the string in -+ wchar_t form. */ -+ obstack_init (&wchar_buf); -+ make_cleanup_obstack_free (&wchar_buf); -+ -+ while (!finished && things_printed < options->print_max) - { -- /* Position of the character we are examining -- to see whether it is repeated. */ -- unsigned int rep1; -- /* Number of repetitions we have detected so far. */ -- unsigned int reps; -- unsigned long current_char; -+ int num_chars; -+ enum wchar_iterate_result result; -+ wchar_t *chars; -+ const gdb_byte *buf; -+ size_t buflen; - - QUIT; - - if (need_comma) - { -- fputs_filtered (", ", stream); -+ obstack_grow_wstr (&wchar_buf, L", "); - need_comma = 0; - } - -- current_char = extract_unsigned_integer (string + i * width, width); -+ num_chars = wchar_iterate (iter, &result, &chars, &buf, &buflen); -+ /* We only look at repetitions when we were able to convert a -+ single character in isolation. This makes the code simpler -+ and probably does the sensible thing in the majority of -+ cases. */ -+ while (num_chars == 1) -+ { -+ /* Count the number of repetitions. */ -+ unsigned int reps = 0; -+ wchar_t current_char = chars[0]; -+ const gdb_byte *orig_buf = buf; -+ int orig_len = buflen; - -- rep1 = i + 1; -- reps = 1; -- while (rep1 < length -- && extract_unsigned_integer (string + rep1 * width, width) -- == current_char) -+ if (need_comma) -+ { -+ obstack_grow_wstr (&wchar_buf, L", "); -+ need_comma = 0; -+ } -+ -+ while (num_chars == 1 && current_char == chars[0]) -+ { -+ num_chars = wchar_iterate (iter, &result, &chars, &buf, &buflen); -+ ++reps; -+ } -+ -+ /* Emit CURRENT_CHAR according to the repetition count and -+ options. */ -+ if (reps > options->repeat_count_threshold) -+ { -+ if (in_quotes) -+ { -+ if (options->inspect_it) -+ obstack_grow_wstr (&wchar_buf, L"\\\", "); -+ else -+ obstack_grow_wstr (&wchar_buf, L"\", "); -+ in_quotes = 0; -+ } -+ obstack_grow_wstr (&wchar_buf, L"'"); -+ need_escape = 0; -+ print_wchar (current_char, orig_buf, orig_len, width, -+ &wchar_buf, '\'', &need_escape); -+ obstack_grow_wstr (&wchar_buf, L"'"); -+ { -+ /* Painful gyrations. */ -+ int j; -+ char *s = xstrprintf (_(" "), reps); -+ for (j = 0; s[j]; ++j) -+ { -+ wchar_t w = btowc (s[j]); -+ obstack_grow (&wchar_buf, &w, sizeof (wchar_t)); -+ } -+ xfree (s); -+ } -+ things_printed += options->repeat_count_threshold; -+ need_comma = 1; -+ } -+ else -+ { -+ /* Saw the character one or more times, but fewer than -+ the repetition threshold. */ -+ if (!in_quotes) -+ { -+ if (options->inspect_it) -+ obstack_grow_wstr (&wchar_buf, L"\\\""); -+ else -+ obstack_grow_wstr (&wchar_buf, L"\""); -+ in_quotes = 1; -+ need_escape = 0; -+ } -+ -+ while (reps-- > 0) -+ { -+ print_wchar (current_char, orig_buf, orig_len, width, -+ &wchar_buf, '"', &need_escape); -+ ++things_printed; -+ } -+ } -+ } -+ -+ /* NUM_CHARS and the other outputs from wchar_iterate are valid -+ here regardless of which branch was taken above. */ -+ if (num_chars < 0) - { -- ++rep1; -- ++reps; -+ /* Hit EOF. */ -+ finished = 1; -+ break; - } - -- if (reps > options->repeat_count_threshold) -+ switch (result) - { -- if (in_quotes) -+ case wchar_iterate_invalid: -+ if (!in_quotes) - { - if (options->inspect_it) -- fputs_filtered ("\\\", ", stream); -+ obstack_grow_wstr (&wchar_buf, L"\\\""); - else -- fputs_filtered ("\", ", stream); -- in_quotes = 0; -+ obstack_grow_wstr (&wchar_buf, L"\""); -+ in_quotes = 1; - } -- LA_PRINT_CHAR (current_char, stream); -- fprintf_filtered (stream, _(" "), reps); -- i = rep1 - 1; -- things_printed += options->repeat_count_threshold; -- need_comma = 1; -- } -- else -- { -- if (!in_quotes) -+ need_escape = 0; -+ print_wchar (WEOF, buf, buflen, width, &wchar_buf, '"', &need_escape); -+ break; -+ -+ case wchar_iterate_incomplete: -+ if (in_quotes) - { - if (options->inspect_it) -- fputs_filtered ("\\\"", stream); -+ obstack_grow_wstr (&wchar_buf, L"\\\","); - else -- fputs_filtered ("\"", stream); -- in_quotes = 1; -+ obstack_grow_wstr (&wchar_buf, L"\","); -+ in_quotes = 0; - } -- LA_EMIT_CHAR (current_char, stream, '"'); -- ++things_printed; -+ obstack_grow_wstr (&wchar_buf, L" "); -+ finished = 1; -+ break; - } - } - -@@ -173,13 +548,27 @@ c_printstr (struct ui_file *stream, const gdb_byte *string, - if (in_quotes) - { - if (options->inspect_it) -- fputs_filtered ("\\\"", stream); -+ obstack_grow_wstr (&wchar_buf, L"\\\""); - else -- fputs_filtered ("\"", stream); -+ obstack_grow_wstr (&wchar_buf, L"\""); - } - -- if (force_ellipses || i < length) -- fputs_filtered ("...", stream); -+ if (force_ellipses || !finished) -+ obstack_grow_wstr (&wchar_buf, L"..."); -+ -+ /* OUTPUT is where we collect `char's for printing. */ -+ obstack_init (&output); -+ make_cleanup_obstack_free (&output); -+ -+ convert_between_encodings ("wchar_t", host_charset (), -+ obstack_base (&wchar_buf), -+ obstack_object_size (&wchar_buf), -+ 1, &output, translit_char); -+ obstack_1grow (&output, '\0'); -+ -+ fputs_filtered (obstack_base (&output), stream); -+ -+ do_cleanups (cleanup); - } - - /* Obtain a C string from the inferior storing it in a newly allocated -@@ -298,7 +687,285 @@ c_get_string (struct value *value, gdb_byte **buffer, int *length, - } --/* Preprocessing and parsing C and C++ expressions. */ -+/* Evaluating C and C++ expressions. */ -+ -+/* Convert a UCN. The digits of the UCN start at P and extend no -+ farther than LIMIT. DEST_CHARSET is the name of the character set -+ into which the UCN should be converted. The results are written to -+ OUTPUT. LENGTH is the maximum length of the UCN, either 4 or 8. -+ Returns a pointer to just after the final digit of the UCN. */ -+ -+static char * -+convert_ucn (char *p, char *limit, const char *dest_charset, -+ struct obstack *output, int length) -+{ -+ unsigned long result = 0; -+ gdb_byte data[4]; -+ int i; -+ -+ for (i = 0; i < length && p < limit && isxdigit (*p); ++i, ++p) -+ result = (result << 4) + host_hex_value (*p); -+ -+ for (i = 3; i >= 0; --i) -+ { -+ data[i] = result & 0xff; -+ result >>= 8; -+ } -+ -+ convert_between_encodings ("UCS-4BE", dest_charset, data, 4, 4, output, -+ translit_none); -+ -+ return p; -+} -+ -+/* Emit a character, VALUE, which was specified numerically, to -+ OUTPUT. TYPE is the target character type. */ -+ -+static void -+emit_numeric_character (struct type *type, unsigned long value, -+ struct obstack *output) -+{ -+ gdb_byte *buffer; -+ -+ buffer = alloca (TYPE_LENGTH (type)); -+ pack_long (buffer, type, value); -+ obstack_grow (output, buffer, TYPE_LENGTH (type)); -+} -+ -+/* Convert an octal escape sequence. TYPE is the target character -+ type. The digits of the escape sequence begin at P and extend no -+ farther than LIMIT. The result is written to OUTPUT. Returns a -+ pointer to just after the final digit of the escape sequence. */ -+ -+static char * -+convert_octal (struct type *type, char *p, char *limit, struct obstack *output) -+{ -+ unsigned long value = 0; -+ -+ while (p < limit && isdigit (*p) && *p != '8' && *p != '9') -+ { -+ value = 8 * value + host_hex_value (*p); -+ ++p; -+ } -+ -+ emit_numeric_character (type, value, output); -+ -+ return p; -+} -+ -+/* Convert a hex escape sequence. TYPE is the target character type. -+ The digits of the escape sequence begin at P and extend no farther -+ than LIMIT. The result is written to OUTPUT. Returns a pointer to -+ just after the final digit of the escape sequence. */ -+ -+static char * -+convert_hex (struct type *type, char *p, char *limit, struct obstack *output) -+{ -+ unsigned long value = 0; -+ -+ while (p < limit && isxdigit (*p)) -+ { -+ value = 16 * value + host_hex_value (*p); -+ ++p; -+ } -+ -+ emit_numeric_character (type, value, output); -+ -+ return p; -+} -+ -+#define ADVANCE \ -+ do { \ -+ ++p; \ -+ if (p == limit) \ -+ error (_("Malformed escape sequence")); \ -+ } while (0) -+ -+/* Convert an escape sequence to a target format. TYPE is the target -+ character type to use, and DEST_CHARSET is the name of the target -+ character set. The backslash of the escape sequence is at *P, and -+ the escape sequence will not extend past LIMIT. The results are -+ written to OUTPUT. Returns a pointer to just past the final -+ character of the escape sequence. */ -+ -+static char * -+convert_escape (struct type *type, const char *dest_charset, -+ char *p, char *limit, struct obstack *output) -+{ -+ /* Skip the backslash. */ -+ ADVANCE; -+ -+ switch (*p) -+ { -+ case '\\': -+ obstack_1grow (output, '\\'); -+ ++p; -+ break; -+ -+ case 'x': -+ ADVANCE; -+ if (!isxdigit (*p)) -+ error (_("\\x used with no following hex digits.")); -+ p = convert_hex (type, p, limit, output); -+ break; -+ -+ case '0': -+ case '1': -+ case '2': -+ case '3': -+ case '4': -+ case '5': -+ case '6': -+ case '7': -+ p = convert_octal (type, p, limit, output); -+ break; -+ -+ case 'u': -+ case 'U': -+ { -+ int length = *p == 'u' ? 4 : 8; -+ ADVANCE; -+ if (!isxdigit (*p)) -+ error (_("\\u used with no following hex digits")); -+ p = convert_ucn (p, limit, dest_charset, output, length); -+ } -+ } -+ -+ return p; -+} -+ -+/* Given a single string from a (C-specific) OP_STRING list, convert -+ it to a target string, handling escape sequences specially. The -+ output is written to OUTPUT. DATA is the input string, which has -+ length LEN. DEST_CHARSET is the name of the target character set, -+ and TYPE is the type of target character to use. */ -+ -+static void -+parse_one_string (struct obstack *output, char *data, int len, -+ const char *dest_charset, struct type *type) -+{ -+ char *limit; -+ -+ limit = data + len; -+ -+ while (data < limit) -+ { -+ char *p = data; -+ /* Look for next escape, or the end of the input. */ -+ while (p < limit && *p != '\\') -+ ++p; -+ /* If we saw a run of characters, convert them all. */ -+ if (p > data) -+ convert_between_encodings (host_charset (), dest_charset, -+ data, p - data, 1, output, translit_none); -+ /* If we saw an escape, convert it. */ -+ if (p < limit) -+ p = convert_escape (type, dest_charset, p, limit, output); -+ data = p; -+ } -+} -+ -+/* Expression evaluator for the C language family. Most operations -+ are delegated to evaluate_subexp_standard; see that function for a -+ description of the arguments. */ -+ -+static struct value * -+evaluate_subexp_c (struct type *expect_type, struct expression *exp, -+ int *pos, enum noside noside) -+{ -+ enum exp_opcode op = exp->elts[*pos].opcode; -+ -+ switch (op) -+ { -+ case OP_STRING: -+ { -+ int oplen, limit; -+ struct type *type; -+ struct obstack output; -+ struct cleanup *cleanup; -+ struct value *result; -+ enum c_string_type dest_type; -+ const char *dest_charset; -+ -+ obstack_init (&output); -+ cleanup = make_cleanup_obstack_free (&output); -+ -+ ++*pos; -+ oplen = longest_to_int (exp->elts[*pos].longconst); -+ -+ ++*pos; -+ limit = *pos + BYTES_TO_EXP_ELEM (oplen + 1); -+ dest_type -+ = (enum c_string_type) longest_to_int (exp->elts[*pos].longconst); -+ switch (dest_type & ~C_CHAR) -+ { -+ case C_STRING: -+ type = language_string_char_type (current_language, -+ current_gdbarch); -+ break; -+ case C_WIDE_STRING: -+ type = lookup_typename ("wchar_t", NULL, 0); -+ break; -+ case C_STRING_16: -+ type = lookup_typename ("char16_t", NULL, 0); -+ break; -+ case C_STRING_32: -+ type = lookup_typename ("char32_t", NULL, 0); -+ break; -+ default: -+ internal_error (__FILE__, __LINE__, "unhandled c_string_type"); -+ } -+ dest_charset = charset_for_string_type (dest_type); -+ -+ ++*pos; -+ while (*pos < limit) -+ { -+ int len; -+ -+ len = longest_to_int (exp->elts[*pos].longconst); -+ -+ ++*pos; -+ if (noside != EVAL_SKIP) -+ parse_one_string (&output, &exp->elts[*pos].string, len, -+ dest_charset, type); -+ *pos += BYTES_TO_EXP_ELEM (len); -+ } -+ -+ /* Skip the trailing length and opcode. */ -+ *pos += 2; -+ -+ if (noside == EVAL_SKIP) -+ return NULL; -+ -+ if ((dest_type & C_CHAR) != 0) -+ { -+ LONGEST value; -+ -+ if (obstack_object_size (&output) != TYPE_LENGTH (type)) -+ error (_("Could not convert character constant to target character set")); -+ value = unpack_long (type, obstack_base (&output)); -+ result = value_from_longest (type, value); -+ } -+ else -+ { -+ int i; -+ /* Write the terminating character. */ -+ for (i = 0; i < TYPE_LENGTH (type); ++i) -+ obstack_1grow (&output, 0); -+ result = value_typed_string (obstack_base (&output), -+ obstack_object_size (&output), -+ type); -+ } -+ do_cleanups (cleanup); -+ return result; -+ } -+ break; -+ -+ default: -+ break; -+ } -+ return evaluate_subexp_standard (expect_type, exp, pos, noside); -+} - - - -@@ -396,6 +1063,15 @@ c_language_arch_info (struct gdbarch *gdbarch, - lai->bool_type_default = builtin->builtin_int; - } - -+static const struct exp_descriptor exp_descriptor_c = -+{ -+ print_subexp_standard, -+ operator_length_standard, -+ op_name_standard, -+ dump_subexp_body_standard, -+ evaluate_subexp_c -+}; -+ - const struct language_defn c_language_defn = + /* Table mapping opcodes into strings for printing operators +@@ -1138,6 +1141,7 @@ static const struct exp_descriptor exp_descriptor_c = { - "c", /* Language name */ -@@ -405,7 +1081,7 @@ const struct language_defn c_language_defn = - case_sensitive_on, - array_row_major, - macro_expansion_c, -- &exp_descriptor_standard, -+ &exp_descriptor_c, - c_parse, - c_error, - null_post_parser, -@@ -524,7 +1200,7 @@ const struct language_defn cplus_language_defn = - case_sensitive_on, - array_row_major, - macro_expansion_c, -- &exp_descriptor_standard, -+ &exp_descriptor_c, - c_parse, - c_error, - null_post_parser, -@@ -562,7 +1238,7 @@ const struct language_defn asm_language_defn = - case_sensitive_on, - array_row_major, - macro_expansion_c, -- &exp_descriptor_standard, -+ &exp_descriptor_c, - c_parse, - c_error, - null_post_parser, -@@ -605,7 +1281,7 @@ const struct language_defn minimal_language_defn = - case_sensitive_on, - array_row_major, - macro_expansion_c, -- &exp_descriptor_standard, -+ &exp_descriptor_c, - c_parse, - c_error, - null_post_parser, -diff --git a/gdb/c-lang.h b/gdb/c-lang.h -index 06c5767..ba9d996 100644 ---- a/gdb/c-lang.h -+++ b/gdb/c-lang.h -@@ -29,9 +29,38 @@ struct language_arch_info; - #include "macroexp.h" - - --extern int c_parse (void); /* Defined in c-exp.y */ -- --extern void c_error (char *); /* Defined in c-exp.y */ -+/* The various kinds of C string and character. Note that these -+ values are chosen so that they may be or'd together in certain -+ ways. */ -+enum c_string_type -+ { -+ /* An ordinary string: "value". */ -+ C_STRING = 0, -+ /* A wide string: L"value". */ -+ C_WIDE_STRING = 1, -+ /* A 16-bit Unicode string: u"value". */ -+ C_STRING_16 = 2, -+ /* A 32-bit Unicode string: U"value". */ -+ C_STRING_32 = 3, -+ /* An ordinary char: 'v'. This can also be or'd with one of the -+ above to form the corresponding CHAR value from a STRING -+ value. */ -+ C_CHAR = 4, -+ /* A wide char: L'v'. */ -+ C_WIDE_CHAR = 5, -+ /* A 16-bit Unicode char: u'v'. */ -+ C_CHAR_16 = 6, -+ /* A 32-bit Unicode char: U'v'. */ -+ C_CHAR_32 = 7 -+ }; -+ -+/* Defined in c-exp.y. */ -+ -+extern int c_parse (void); -+ -+extern void c_error (char *); -+ -+extern int c_parse_escape (char **, struct obstack *); - - /* Defined in c-typeprint.c */ - extern void c_print_type (struct type *, char *, struct ui_file *, int, -@@ -48,10 +77,10 @@ extern int c_value_print (struct value *, struct ui_file *, - - /* These are in c-lang.c: */ - --extern void c_printchar (int, struct ui_file *); -+extern void c_printchar (int, struct type *, struct ui_file *); - --extern void c_printstr (struct ui_file * stream, const gdb_byte *string, -- unsigned int length, int width, -+extern void c_printstr (struct ui_file * stream, struct type *elttype, -+ const gdb_byte *string, unsigned int length, - int force_ellipses, - const struct value_print_options *options); - + print_subexp_standard, + operator_length_standard, ++ operator_check_standard, + op_name_standard, + dump_subexp_body_standard, + evaluate_subexp_c diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c -index 0929516..c005fe4 100644 +index b193080..04cf3bc 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c -@@ -40,8 +40,6 @@ static void cp_type_print_method_args (struct type *mtype, char *prefix, +@@ -32,6 +32,7 @@ + #include "c-lang.h" + #include "typeprint.h" + #include "cp-abi.h" ++#include "jv-lang.h" + + #include "gdb_string.h" + #include +@@ -40,8 +41,6 @@ static void cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, int staticp, struct ui_file *stream); @@ -7387,7 +1003,7 @@ index 0929516..c005fe4 100644 static void cp_type_print_derivation_info (struct ui_file *, struct type *); static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int, -@@ -199,6 +197,23 @@ cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, +@@ -199,6 +198,23 @@ cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, fprintf_filtered (stream, "void"); fprintf_filtered (stream, ")"); @@ -7411,23 +1027,25 @@ index 0929516..c005fe4 100644 } -@@ -354,10 +369,12 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, +@@ -355,10 +371,14 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, /* Print out the arguments of TYPE, which should have TYPE_CODE_METHOD or TYPE_CODE_FUNC, to STREAM. Artificial arguments, such as "this" - in non-static methods, are displayed. */ + in non-static methods, are displayed if SHOW_ARTIFICIAL is -+ non-zero. */ ++ non-zero. LANGUAGE is the language in which TYPE was defined. This is ++ a necessary evil since this code is used by the C, C++, and Java ++ backends. */ -static void -c_type_print_args (struct type *type, struct ui_file *stream) +void +c_type_print_args (struct type *type, struct ui_file *stream, -+ int show_artificial) ++ int show_artificial, enum language language) { int i, len; struct field *args; -@@ -369,6 +386,9 @@ c_type_print_args (struct type *type, struct ui_file *stream) +@@ -370,13 +390,19 @@ c_type_print_args (struct type *type, struct ui_file *stream) for (i = 0; i < TYPE_NFIELDS (type); i++) { @@ -7437,7 +1055,18 @@ index 0929516..c005fe4 100644 if (printed_any) { fprintf_filtered (stream, ", "); -@@ -559,7 +579,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, + wrap_here (" "); + } + +- c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0); ++ if (language == language_java) ++ java_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0); ++ else ++ c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0); + printed_any = 1; + } + +@@ -560,7 +586,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, fprintf_filtered (stream, ")"); fprintf_filtered (stream, "["); @@ -7451,3316 +1080,20 @@ index 0929516..c005fe4 100644 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) fprintf_filtered (stream, "%d", (TYPE_LENGTH (type) -@@ -592,7 +617,7 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, +@@ -593,7 +624,7 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, if (passed_a_ptr) fprintf_filtered (stream, ")"); if (!demangled_args) - c_type_print_args (type, stream); -+ c_type_print_args (type, stream, 1); ++ c_type_print_args (type, stream, 1, language_c); c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, passed_a_ptr, 0); break; -diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c -index 0b616f7..3433da2 100644 ---- a/gdb/c-valprint.c -+++ b/gdb/c-valprint.c -@@ -55,6 +55,18 @@ print_function_pointer_address (CORE_ADDR address, struct ui_file *stream, - } - - -+/* A helper for textual_element_type. This checks the name of the -+ typedef. This is bogus but it isn't apparent that the compiler -+ provides us the help we may need. */ -+ -+static int -+textual_name (const char *name) -+{ -+ return (!strcmp (name, "wchar_t") -+ || !strcmp (name, "char16_t") -+ || !strcmp (name, "char32_t")); -+} -+ - /* Apply a heuristic to decide whether an array of TYPE or a pointer - to TYPE should be printed as a textual string. Return non-zero if - it should, or zero if it should be treated as an array of integers -@@ -77,6 +89,15 @@ textual_element_type (struct type *type, char format) - /* TYPE_CODE_CHAR is always textual. */ - if (TYPE_CODE (true_type) == TYPE_CODE_CHAR) - return 1; -+ /* Any other character-like types must be integral. */ -+ if (TYPE_CODE (true_type) != TYPE_CODE_INT) -+ return 0; -+ -+ /* Check the names of the type and the typedef. */ -+ if (TYPE_NAME (type) && textual_name (TYPE_NAME (type))) -+ return 1; -+ if (TYPE_NAME (true_type) && textual_name (TYPE_NAME (true_type))) -+ return 1; - - if (format == 's') - { -@@ -115,7 +136,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - { - unsigned int i = 0; /* Number of characters printed */ - unsigned len; -- struct type *elttype; -+ struct type *elttype, *unresolved_elttype; -+ struct type *unresolved_type = type; - unsigned eltlen; - LONGEST val; - CORE_ADDR addr; -@@ -124,8 +146,9 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - switch (TYPE_CODE (type)) - { - case TYPE_CODE_ARRAY: -- elttype = check_typedef (TYPE_TARGET_TYPE (type)); -- if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0) -+ unresolved_elttype = TYPE_TARGET_TYPE (type); -+ elttype = check_typedef (unresolved_elttype); -+ if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (unresolved_elttype) > 0) - { - eltlen = TYPE_LENGTH (elttype); - len = TYPE_LENGTH (type) / eltlen; -@@ -135,7 +158,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - } - - /* Print arrays of textual chars with a string syntax. */ -- if (textual_element_type (elttype, options->format)) -+ if (textual_element_type (unresolved_elttype, options->format)) - { - /* If requested, look for the first null char and only print - elements up to it. */ -@@ -143,15 +166,19 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - { - unsigned int temp_len; - -- /* Look for a NULL char. */ - for (temp_len = 0; -- (valaddr + embedded_offset)[temp_len] -- && temp_len < len && temp_len < options->print_max; -- temp_len++); -+ (temp_len < len -+ && temp_len < options->print_max -+ && extract_unsigned_integer (valaddr + embedded_offset -+ + temp_len * eltlen, -+ eltlen) == 0); -+ ++temp_len) -+ ; - len = temp_len; - } - -- LA_PRINT_STRING (stream, valaddr + embedded_offset, len, eltlen, 0, options); -+ LA_PRINT_STRING (stream, unresolved_elttype, -+ valaddr + embedded_offset, len, 0, options); - i = len; - } - else -@@ -209,7 +236,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - print_function_pointer_address (addr, stream, options->addressprint); - break; - } -- elttype = check_typedef (TYPE_TARGET_TYPE (type)); -+ unresolved_elttype = TYPE_TARGET_TYPE (type); -+ elttype = check_typedef (unresolved_elttype); - { - addr = unpack_pointer (type, valaddr + embedded_offset); - print_unpacked_pointer: -@@ -228,12 +256,11 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - - /* For a pointer to a textual type, also print the string - pointed to, unless pointer is null. */ -- /* FIXME: need to handle wchar_t here... */ - -- if (textual_element_type (elttype, options->format) -+ if (textual_element_type (unresolved_elttype, options->format) - && addr != 0) - { -- i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream, -+ i = val_print_string (unresolved_elttype, addr, -1, stream, - options); - } - else if (cp_is_vtbl_member (type)) -@@ -268,7 +295,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - } - else - { -- wtype = TYPE_TARGET_TYPE (type); -+ wtype = unresolved_elttype; - } - vt_val = value_at (wtype, vt_address); - common_val_print (vt_val, stream, recurse + 1, options, -@@ -442,11 +469,11 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - Since we don't know whether the value is really intended to - be used as an integer or a character, print the character - equivalent as well. */ -- if (textual_element_type (type, options->format)) -+ if (textual_element_type (unresolved_type, options->format)) - { - fputs_filtered (" ", stream); - LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr + embedded_offset), -- stream); -+ unresolved_type, stream); - } - } - break; -@@ -468,7 +495,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - else - fprintf_filtered (stream, "%d", (int) val); - fputs_filtered (" ", stream); -- LA_PRINT_CHAR ((unsigned char) val, stream); -+ LA_PRINT_CHAR ((unsigned char) val, unresolved_type, stream); - } - break; - -@@ -540,7 +567,7 @@ int - c_value_print (struct value *val, struct ui_file *stream, - const struct value_print_options *options) - { -- struct type *type, *real_type; -+ struct type *type, *real_type, *val_type; - int full, top, using_enc; - struct value_print_options opts = *options; - -@@ -553,7 +580,11 @@ c_value_print (struct value *val, struct ui_file *stream, - C++: if it is a member pointer, we will take care - of that when we print it. */ - -- type = check_typedef (value_type (val)); -+ /* Preserve the original type before stripping typedefs. We prefer -+ to pass down the original type when possible, but for local -+ checks it is better to look past the typedefs. */ -+ val_type = value_type (val); -+ type = check_typedef (val_type); - - if (TYPE_CODE (type) == TYPE_CODE_PTR - || TYPE_CODE (type) == TYPE_CODE_REF) -@@ -561,11 +592,12 @@ c_value_print (struct value *val, struct ui_file *stream, - /* Hack: remove (char *) for char strings. Their - type is indicated by the quoted string anyway. - (Don't use textual_element_type here; quoted strings -- are always exactly (char *). */ -- if (TYPE_CODE (type) == TYPE_CODE_PTR -- && TYPE_NAME (type) == NULL -- && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL -- && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0) -+ are always exactly (char *), (wchar_t *), or the like. */ -+ if (TYPE_CODE (val_type) == TYPE_CODE_PTR -+ && TYPE_NAME (val_type) == NULL -+ && TYPE_NAME (TYPE_TARGET_TYPE (val_type)) != NULL -+ && (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (val_type)), "char") == 0 -+ || textual_name (TYPE_NAME (TYPE_TARGET_TYPE (val_type))))) - { - /* Print nothing */ - } -@@ -608,6 +640,7 @@ c_value_print (struct value *val, struct ui_file *stream, - } - type_print (type, "", stream, -1); - fprintf_filtered (stream, ") "); -+ val_type = type; - } - else - { -@@ -635,7 +668,7 @@ c_value_print (struct value *val, struct ui_file *stream, - /* Print out object: enclosing type is same as real_type if full */ - return val_print (value_enclosing_type (val), - value_contents_all (val), 0, -- VALUE_ADDRESS (val), stream, 0, -+ value_address (val), stream, 0, - &opts, current_language); - /* Note: When we look up RTTI entries, we don't get any information on - const or volatile attributes */ -@@ -647,14 +680,14 @@ c_value_print (struct value *val, struct ui_file *stream, - TYPE_NAME (value_enclosing_type (val))); - return val_print (value_enclosing_type (val), - value_contents_all (val), 0, -- VALUE_ADDRESS (val), stream, 0, -+ value_address (val), stream, 0, - &opts, current_language); - } - /* Otherwise, we end up at the return outside this "if" */ - } - -- return val_print (type, value_contents_all (val), -+ return val_print (val_type, value_contents_all (val), - value_embedded_offset (val), -- VALUE_ADDRESS (val) + value_offset (val), -+ value_address (val), - stream, 0, &opts, current_language); - } -diff --git a/gdb/charset-list.h b/gdb/charset-list.h -new file mode 100644 -index 0000000..59c64c5 ---- /dev/null -+++ b/gdb/charset-list.h -@@ -0,0 +1,1190 @@ -+/* List of character set names for GDB. -+ -+ Copyright (C) 2009 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* Note that the first entry must always be "auto". -+ The remaining entries were created by running this script: -+ -+ iconv -l | sed -e '/[/]...*$/d' -e 's@^\(.*\)//$@"\1", \\@' -+ -+ .. and then removing the final backslash. It would be nice to -+ separate narrow and wide character sets, but there is no good way -+ to do that. */ -+#define DEFAULT_CHARSET_NAMES \ -+"auto", \ -+"437", \ -+"500", \ -+"500V1", \ -+"850", \ -+"851", \ -+"852", \ -+"855", \ -+"856", \ -+"857", \ -+"860", \ -+"861", \ -+"862", \ -+"863", \ -+"864", \ -+"865", \ -+"866", \ -+"866NAV", \ -+"869", \ -+"874", \ -+"904", \ -+"1026", \ -+"1046", \ -+"1047", \ -+"8859_1", \ -+"8859_2", \ -+"8859_3", \ -+"8859_4", \ -+"8859_5", \ -+"8859_6", \ -+"8859_7", \ -+"8859_8", \ -+"8859_9", \ -+"10646-1:1993", \ -+"ANSI_X3.4-1968", \ -+"ANSI_X3.4-1986", \ -+"ANSI_X3.4", \ -+"ANSI_X3.110-1983", \ -+"ANSI_X3.110", \ -+"ARABIC", \ -+"ARABIC7", \ -+"ARMSCII-8", \ -+"ASCII", \ -+"ASMO-708", \ -+"ASMO_449", \ -+"BALTIC", \ -+"BIG-5", \ -+"BIG-FIVE", \ -+"BIG5-HKSCS", \ -+"BIG5", \ -+"BIG5HKSCS", \ -+"BIGFIVE", \ -+"BRF", \ -+"BS_4730", \ -+"CA", \ -+"CN-BIG5", \ -+"CN-GB", \ -+"CN", \ -+"CP-AR", \ -+"CP-GR", \ -+"CP-HU", \ -+"CP037", \ -+"CP038", \ -+"CP273", \ -+"CP274", \ -+"CP275", \ -+"CP278", \ -+"CP280", \ -+"CP281", \ -+"CP282", \ -+"CP284", \ -+"CP285", \ -+"CP290", \ -+"CP297", \ -+"CP367", \ -+"CP420", \ -+"CP423", \ -+"CP424", \ -+"CP437", \ -+"CP500", \ -+"CP737", \ -+"CP775", \ -+"CP803", \ -+"CP813", \ -+"CP819", \ -+"CP850", \ -+"CP851", \ -+"CP852", \ -+"CP855", \ -+"CP856", \ -+"CP857", \ -+"CP860", \ -+"CP861", \ -+"CP862", \ -+"CP863", \ -+"CP864", \ -+"CP865", \ -+"CP866", \ -+"CP866NAV", \ -+"CP868", \ -+"CP869", \ -+"CP870", \ -+"CP871", \ -+"CP874", \ -+"CP875", \ -+"CP880", \ -+"CP891", \ -+"CP901", \ -+"CP902", \ -+"CP903", \ -+"CP904", \ -+"CP905", \ -+"CP912", \ -+"CP915", \ -+"CP916", \ -+"CP918", \ -+"CP920", \ -+"CP921", \ -+"CP922", \ -+"CP930", \ -+"CP932", \ -+"CP933", \ -+"CP935", \ -+"CP936", \ -+"CP937", \ -+"CP939", \ -+"CP949", \ -+"CP950", \ -+"CP1004", \ -+"CP1008", \ -+"CP1025", \ -+"CP1026", \ -+"CP1046", \ -+"CP1047", \ -+"CP1070", \ -+"CP1079", \ -+"CP1081", \ -+"CP1084", \ -+"CP1089", \ -+"CP1097", \ -+"CP1112", \ -+"CP1122", \ -+"CP1123", \ -+"CP1124", \ -+"CP1125", \ -+"CP1129", \ -+"CP1130", \ -+"CP1132", \ -+"CP1133", \ -+"CP1137", \ -+"CP1140", \ -+"CP1141", \ -+"CP1142", \ -+"CP1143", \ -+"CP1144", \ -+"CP1145", \ -+"CP1146", \ -+"CP1147", \ -+"CP1148", \ -+"CP1149", \ -+"CP1153", \ -+"CP1154", \ -+"CP1155", \ -+"CP1156", \ -+"CP1157", \ -+"CP1158", \ -+"CP1160", \ -+"CP1161", \ -+"CP1162", \ -+"CP1163", \ -+"CP1164", \ -+"CP1166", \ -+"CP1167", \ -+"CP1250", \ -+"CP1251", \ -+"CP1252", \ -+"CP1253", \ -+"CP1254", \ -+"CP1255", \ -+"CP1256", \ -+"CP1257", \ -+"CP1258", \ -+"CP1282", \ -+"CP1361", \ -+"CP1364", \ -+"CP1371", \ -+"CP1388", \ -+"CP1390", \ -+"CP1399", \ -+"CP4517", \ -+"CP4899", \ -+"CP4909", \ -+"CP4971", \ -+"CP5347", \ -+"CP9030", \ -+"CP9066", \ -+"CP9448", \ -+"CP10007", \ -+"CP12712", \ -+"CP16804", \ -+"CPIBM861", \ -+"CSA7-1", \ -+"CSA7-2", \ -+"CSASCII", \ -+"CSA_T500-1983", \ -+"CSA_T500", \ -+"CSA_Z243.4-1985-1", \ -+"CSA_Z243.4-1985-2", \ -+"CSA_Z243.419851", \ -+"CSA_Z243.419852", \ -+"CSDECMCS", \ -+"CSEBCDICATDE", \ -+"CSEBCDICATDEA", \ -+"CSEBCDICCAFR", \ -+"CSEBCDICDKNO", \ -+"CSEBCDICDKNOA", \ -+"CSEBCDICES", \ -+"CSEBCDICESA", \ -+"CSEBCDICESS", \ -+"CSEBCDICFISE", \ -+"CSEBCDICFISEA", \ -+"CSEBCDICFR", \ -+"CSEBCDICIT", \ -+"CSEBCDICPT", \ -+"CSEBCDICUK", \ -+"CSEBCDICUS", \ -+"CSEUCKR", \ -+"CSEUCPKDFMTJAPANESE", \ -+"CSGB2312", \ -+"CSHPROMAN8", \ -+"CSIBM037", \ -+"CSIBM038", \ -+"CSIBM273", \ -+"CSIBM274", \ -+"CSIBM275", \ -+"CSIBM277", \ -+"CSIBM278", \ -+"CSIBM280", \ -+"CSIBM281", \ -+"CSIBM284", \ -+"CSIBM285", \ -+"CSIBM290", \ -+"CSIBM297", \ -+"CSIBM420", \ -+"CSIBM423", \ -+"CSIBM424", \ -+"CSIBM500", \ -+"CSIBM803", \ -+"CSIBM851", \ -+"CSIBM855", \ -+"CSIBM856", \ -+"CSIBM857", \ -+"CSIBM860", \ -+"CSIBM863", \ -+"CSIBM864", \ -+"CSIBM865", \ -+"CSIBM866", \ -+"CSIBM868", \ -+"CSIBM869", \ -+"CSIBM870", \ -+"CSIBM871", \ -+"CSIBM880", \ -+"CSIBM891", \ -+"CSIBM901", \ -+"CSIBM902", \ -+"CSIBM903", \ -+"CSIBM904", \ -+"CSIBM905", \ -+"CSIBM918", \ -+"CSIBM921", \ -+"CSIBM922", \ -+"CSIBM930", \ -+"CSIBM932", \ -+"CSIBM933", \ -+"CSIBM935", \ -+"CSIBM937", \ -+"CSIBM939", \ -+"CSIBM943", \ -+"CSIBM1008", \ -+"CSIBM1025", \ -+"CSIBM1026", \ -+"CSIBM1097", \ -+"CSIBM1112", \ -+"CSIBM1122", \ -+"CSIBM1123", \ -+"CSIBM1124", \ -+"CSIBM1129", \ -+"CSIBM1130", \ -+"CSIBM1132", \ -+"CSIBM1133", \ -+"CSIBM1137", \ -+"CSIBM1140", \ -+"CSIBM1141", \ -+"CSIBM1142", \ -+"CSIBM1143", \ -+"CSIBM1144", \ -+"CSIBM1145", \ -+"CSIBM1146", \ -+"CSIBM1147", \ -+"CSIBM1148", \ -+"CSIBM1149", \ -+"CSIBM1153", \ -+"CSIBM1154", \ -+"CSIBM1155", \ -+"CSIBM1156", \ -+"CSIBM1157", \ -+"CSIBM1158", \ -+"CSIBM1160", \ -+"CSIBM1161", \ -+"CSIBM1163", \ -+"CSIBM1164", \ -+"CSIBM1166", \ -+"CSIBM1167", \ -+"CSIBM1364", \ -+"CSIBM1371", \ -+"CSIBM1388", \ -+"CSIBM1390", \ -+"CSIBM1399", \ -+"CSIBM4517", \ -+"CSIBM4899", \ -+"CSIBM4909", \ -+"CSIBM4971", \ -+"CSIBM5347", \ -+"CSIBM9030", \ -+"CSIBM9066", \ -+"CSIBM9448", \ -+"CSIBM12712", \ -+"CSIBM16804", \ -+"CSIBM11621162", \ -+"CSISO4UNITEDKINGDOM", \ -+"CSISO10SWEDISH", \ -+"CSISO11SWEDISHFORNAMES", \ -+"CSISO14JISC6220RO", \ -+"CSISO15ITALIAN", \ -+"CSISO16PORTUGESE", \ -+"CSISO17SPANISH", \ -+"CSISO18GREEK7OLD", \ -+"CSISO19LATINGREEK", \ -+"CSISO21GERMAN", \ -+"CSISO25FRENCH", \ -+"CSISO27LATINGREEK1", \ -+"CSISO49INIS", \ -+"CSISO50INIS8", \ -+"CSISO51INISCYRILLIC", \ -+"CSISO58GB1988", \ -+"CSISO60DANISHNORWEGIAN", \ -+"CSISO60NORWEGIAN1", \ -+"CSISO61NORWEGIAN2", \ -+"CSISO69FRENCH", \ -+"CSISO84PORTUGUESE2", \ -+"CSISO85SPANISH2", \ -+"CSISO86HUNGARIAN", \ -+"CSISO88GREEK7", \ -+"CSISO89ASMO449", \ -+"CSISO90", \ -+"CSISO92JISC62991984B", \ -+"CSISO99NAPLPS", \ -+"CSISO103T618BIT", \ -+"CSISO111ECMACYRILLIC", \ -+"CSISO121CANADIAN1", \ -+"CSISO122CANADIAN2", \ -+"CSISO139CSN369103", \ -+"CSISO141JUSIB1002", \ -+"CSISO143IECP271", \ -+"CSISO150", \ -+"CSISO150GREEKCCITT", \ -+"CSISO151CUBA", \ -+"CSISO153GOST1976874", \ -+"CSISO646DANISH", \ -+"CSISO2022CN", \ -+"CSISO2022JP", \ -+"CSISO2022JP2", \ -+"CSISO2022KR", \ -+"CSISO2033", \ -+"CSISO5427CYRILLIC", \ -+"CSISO5427CYRILLIC1981", \ -+"CSISO5428GREEK", \ -+"CSISO10367BOX", \ -+"CSISOLATIN1", \ -+"CSISOLATIN2", \ -+"CSISOLATIN3", \ -+"CSISOLATIN4", \ -+"CSISOLATIN5", \ -+"CSISOLATIN6", \ -+"CSISOLATINARABIC", \ -+"CSISOLATINCYRILLIC", \ -+"CSISOLATINGREEK", \ -+"CSISOLATINHEBREW", \ -+"CSKOI8R", \ -+"CSKSC5636", \ -+"CSMACINTOSH", \ -+"CSNATSDANO", \ -+"CSNATSSEFI", \ -+"CSN_369103", \ -+"CSPC8CODEPAGE437", \ -+"CSPC775BALTIC", \ -+"CSPC850MULTILINGUAL", \ -+"CSPC862LATINHEBREW", \ -+"CSPCP852", \ -+"CSSHIFTJIS", \ -+"CSUCS4", \ -+"CSUNICODE", \ -+"CSWINDOWS31J", \ -+"CUBA", \ -+"CWI-2", \ -+"CWI", \ -+"CYRILLIC", \ -+"DE", \ -+"DEC-MCS", \ -+"DEC", \ -+"DECMCS", \ -+"DIN_66003", \ -+"DK", \ -+"DS2089", \ -+"DS_2089", \ -+"E13B", \ -+"EBCDIC-AT-DE-A", \ -+"EBCDIC-AT-DE", \ -+"EBCDIC-BE", \ -+"EBCDIC-BR", \ -+"EBCDIC-CA-FR", \ -+"EBCDIC-CP-AR1", \ -+"EBCDIC-CP-AR2", \ -+"EBCDIC-CP-BE", \ -+"EBCDIC-CP-CA", \ -+"EBCDIC-CP-CH", \ -+"EBCDIC-CP-DK", \ -+"EBCDIC-CP-ES", \ -+"EBCDIC-CP-FI", \ -+"EBCDIC-CP-FR", \ -+"EBCDIC-CP-GB", \ -+"EBCDIC-CP-GR", \ -+"EBCDIC-CP-HE", \ -+"EBCDIC-CP-IS", \ -+"EBCDIC-CP-IT", \ -+"EBCDIC-CP-NL", \ -+"EBCDIC-CP-NO", \ -+"EBCDIC-CP-ROECE", \ -+"EBCDIC-CP-SE", \ -+"EBCDIC-CP-TR", \ -+"EBCDIC-CP-US", \ -+"EBCDIC-CP-WT", \ -+"EBCDIC-CP-YU", \ -+"EBCDIC-CYRILLIC", \ -+"EBCDIC-DK-NO-A", \ -+"EBCDIC-DK-NO", \ -+"EBCDIC-ES-A", \ -+"EBCDIC-ES-S", \ -+"EBCDIC-ES", \ -+"EBCDIC-FI-SE-A", \ -+"EBCDIC-FI-SE", \ -+"EBCDIC-FR", \ -+"EBCDIC-GREEK", \ -+"EBCDIC-INT", \ -+"EBCDIC-INT1", \ -+"EBCDIC-IS-FRISS", \ -+"EBCDIC-IT", \ -+"EBCDIC-JP-E", \ -+"EBCDIC-JP-KANA", \ -+"EBCDIC-PT", \ -+"EBCDIC-UK", \ -+"EBCDIC-US", \ -+"EBCDICATDE", \ -+"EBCDICATDEA", \ -+"EBCDICCAFR", \ -+"EBCDICDKNO", \ -+"EBCDICDKNOA", \ -+"EBCDICES", \ -+"EBCDICESA", \ -+"EBCDICESS", \ -+"EBCDICFISE", \ -+"EBCDICFISEA", \ -+"EBCDICFR", \ -+"EBCDICISFRISS", \ -+"EBCDICIT", \ -+"EBCDICPT", \ -+"EBCDICUK", \ -+"EBCDICUS", \ -+"ECMA-114", \ -+"ECMA-118", \ -+"ECMA-128", \ -+"ECMA-CYRILLIC", \ -+"ECMACYRILLIC", \ -+"ELOT_928", \ -+"ES", \ -+"ES2", \ -+"EUC-CN", \ -+"EUC-JISX0213", \ -+"EUC-JP-MS", \ -+"EUC-JP", \ -+"EUC-KR", \ -+"EUC-TW", \ -+"EUCCN", \ -+"EUCJP-MS", \ -+"EUCJP-OPEN", \ -+"EUCJP-WIN", \ -+"EUCJP", \ -+"EUCKR", \ -+"EUCTW", \ -+"FI", \ -+"FR", \ -+"GB", \ -+"GB2312", \ -+"GB13000", \ -+"GB18030", \ -+"GBK", \ -+"GB_1988-80", \ -+"GB_198880", \ -+"GEORGIAN-ACADEMY", \ -+"GEORGIAN-PS", \ -+"GOST_19768-74", \ -+"GOST_19768", \ -+"GOST_1976874", \ -+"GREEK-CCITT", \ -+"GREEK", \ -+"GREEK7-OLD", \ -+"GREEK7", \ -+"GREEK7OLD", \ -+"GREEK8", \ -+"GREEKCCITT", \ -+"HEBREW", \ -+"HP-GREEK8", \ -+"HP-ROMAN8", \ -+"HP-ROMAN9", \ -+"HP-THAI8", \ -+"HP-TURKISH8", \ -+"HPGREEK8", \ -+"HPROMAN8", \ -+"HPROMAN9", \ -+"HPTHAI8", \ -+"HPTURKISH8", \ -+"HU", \ -+"IBM-803", \ -+"IBM-856", \ -+"IBM-901", \ -+"IBM-902", \ -+"IBM-921", \ -+"IBM-922", \ -+"IBM-930", \ -+"IBM-932", \ -+"IBM-933", \ -+"IBM-935", \ -+"IBM-937", \ -+"IBM-939", \ -+"IBM-943", \ -+"IBM-1008", \ -+"IBM-1025", \ -+"IBM-1046", \ -+"IBM-1047", \ -+"IBM-1097", \ -+"IBM-1112", \ -+"IBM-1122", \ -+"IBM-1123", \ -+"IBM-1124", \ -+"IBM-1129", \ -+"IBM-1130", \ -+"IBM-1132", \ -+"IBM-1133", \ -+"IBM-1137", \ -+"IBM-1140", \ -+"IBM-1141", \ -+"IBM-1142", \ -+"IBM-1143", \ -+"IBM-1144", \ -+"IBM-1145", \ -+"IBM-1146", \ -+"IBM-1147", \ -+"IBM-1148", \ -+"IBM-1149", \ -+"IBM-1153", \ -+"IBM-1154", \ -+"IBM-1155", \ -+"IBM-1156", \ -+"IBM-1157", \ -+"IBM-1158", \ -+"IBM-1160", \ -+"IBM-1161", \ -+"IBM-1162", \ -+"IBM-1163", \ -+"IBM-1164", \ -+"IBM-1166", \ -+"IBM-1167", \ -+"IBM-1364", \ -+"IBM-1371", \ -+"IBM-1388", \ -+"IBM-1390", \ -+"IBM-1399", \ -+"IBM-4517", \ -+"IBM-4899", \ -+"IBM-4909", \ -+"IBM-4971", \ -+"IBM-5347", \ -+"IBM-9030", \ -+"IBM-9066", \ -+"IBM-9448", \ -+"IBM-12712", \ -+"IBM-16804", \ -+"IBM037", \ -+"IBM038", \ -+"IBM256", \ -+"IBM273", \ -+"IBM274", \ -+"IBM275", \ -+"IBM277", \ -+"IBM278", \ -+"IBM280", \ -+"IBM281", \ -+"IBM284", \ -+"IBM285", \ -+"IBM290", \ -+"IBM297", \ -+"IBM367", \ -+"IBM420", \ -+"IBM423", \ -+"IBM424", \ -+"IBM437", \ -+"IBM500", \ -+"IBM775", \ -+"IBM803", \ -+"IBM813", \ -+"IBM819", \ -+"IBM848", \ -+"IBM850", \ -+"IBM851", \ -+"IBM852", \ -+"IBM855", \ -+"IBM856", \ -+"IBM857", \ -+"IBM860", \ -+"IBM861", \ -+"IBM862", \ -+"IBM863", \ -+"IBM864", \ -+"IBM865", \ -+"IBM866", \ -+"IBM866NAV", \ -+"IBM868", \ -+"IBM869", \ -+"IBM870", \ -+"IBM871", \ -+"IBM874", \ -+"IBM875", \ -+"IBM880", \ -+"IBM891", \ -+"IBM901", \ -+"IBM902", \ -+"IBM903", \ -+"IBM904", \ -+"IBM905", \ -+"IBM912", \ -+"IBM915", \ -+"IBM916", \ -+"IBM918", \ -+"IBM920", \ -+"IBM921", \ -+"IBM922", \ -+"IBM930", \ -+"IBM932", \ -+"IBM933", \ -+"IBM935", \ -+"IBM937", \ -+"IBM939", \ -+"IBM943", \ -+"IBM1004", \ -+"IBM1008", \ -+"IBM1025", \ -+"IBM1026", \ -+"IBM1046", \ -+"IBM1047", \ -+"IBM1089", \ -+"IBM1097", \ -+"IBM1112", \ -+"IBM1122", \ -+"IBM1123", \ -+"IBM1124", \ -+"IBM1129", \ -+"IBM1130", \ -+"IBM1132", \ -+"IBM1133", \ -+"IBM1137", \ -+"IBM1140", \ -+"IBM1141", \ -+"IBM1142", \ -+"IBM1143", \ -+"IBM1144", \ -+"IBM1145", \ -+"IBM1146", \ -+"IBM1147", \ -+"IBM1148", \ -+"IBM1149", \ -+"IBM1153", \ -+"IBM1154", \ -+"IBM1155", \ -+"IBM1156", \ -+"IBM1157", \ -+"IBM1158", \ -+"IBM1160", \ -+"IBM1161", \ -+"IBM1162", \ -+"IBM1163", \ -+"IBM1164", \ -+"IBM1166", \ -+"IBM1167", \ -+"IBM1364", \ -+"IBM1371", \ -+"IBM1388", \ -+"IBM1390", \ -+"IBM1399", \ -+"IBM4517", \ -+"IBM4899", \ -+"IBM4909", \ -+"IBM4971", \ -+"IBM5347", \ -+"IBM9030", \ -+"IBM9066", \ -+"IBM9448", \ -+"IBM12712", \ -+"IBM16804", \ -+"IEC_P27-1", \ -+"IEC_P271", \ -+"INIS-8", \ -+"INIS-CYRILLIC", \ -+"INIS", \ -+"INIS8", \ -+"INISCYRILLIC", \ -+"ISIRI-3342", \ -+"ISIRI3342", \ -+"ISO-2022-CN-EXT", \ -+"ISO-2022-CN", \ -+"ISO-2022-JP-2", \ -+"ISO-2022-JP-3", \ -+"ISO-2022-JP", \ -+"ISO-2022-KR", \ -+"ISO-8859-1", \ -+"ISO-8859-2", \ -+"ISO-8859-3", \ -+"ISO-8859-4", \ -+"ISO-8859-5", \ -+"ISO-8859-6", \ -+"ISO-8859-7", \ -+"ISO-8859-8", \ -+"ISO-8859-9", \ -+"ISO-8859-9E", \ -+"ISO-8859-10", \ -+"ISO-8859-11", \ -+"ISO-8859-13", \ -+"ISO-8859-14", \ -+"ISO-8859-15", \ -+"ISO-8859-16", \ -+"ISO-10646", \ -+"ISO-CELTIC", \ -+"ISO-IR-4", \ -+"ISO-IR-6", \ -+"ISO-IR-8-1", \ -+"ISO-IR-9-1", \ -+"ISO-IR-10", \ -+"ISO-IR-11", \ -+"ISO-IR-14", \ -+"ISO-IR-15", \ -+"ISO-IR-16", \ -+"ISO-IR-17", \ -+"ISO-IR-18", \ -+"ISO-IR-19", \ -+"ISO-IR-21", \ -+"ISO-IR-25", \ -+"ISO-IR-27", \ -+"ISO-IR-37", \ -+"ISO-IR-49", \ -+"ISO-IR-50", \ -+"ISO-IR-51", \ -+"ISO-IR-54", \ -+"ISO-IR-55", \ -+"ISO-IR-57", \ -+"ISO-IR-60", \ -+"ISO-IR-61", \ -+"ISO-IR-69", \ -+"ISO-IR-84", \ -+"ISO-IR-85", \ -+"ISO-IR-86", \ -+"ISO-IR-88", \ -+"ISO-IR-89", \ -+"ISO-IR-90", \ -+"ISO-IR-92", \ -+"ISO-IR-98", \ -+"ISO-IR-99", \ -+"ISO-IR-100", \ -+"ISO-IR-101", \ -+"ISO-IR-103", \ -+"ISO-IR-109", \ -+"ISO-IR-110", \ -+"ISO-IR-111", \ -+"ISO-IR-121", \ -+"ISO-IR-122", \ -+"ISO-IR-126", \ -+"ISO-IR-127", \ -+"ISO-IR-138", \ -+"ISO-IR-139", \ -+"ISO-IR-141", \ -+"ISO-IR-143", \ -+"ISO-IR-144", \ -+"ISO-IR-148", \ -+"ISO-IR-150", \ -+"ISO-IR-151", \ -+"ISO-IR-153", \ -+"ISO-IR-155", \ -+"ISO-IR-156", \ -+"ISO-IR-157", \ -+"ISO-IR-166", \ -+"ISO-IR-179", \ -+"ISO-IR-193", \ -+"ISO-IR-197", \ -+"ISO-IR-199", \ -+"ISO-IR-203", \ -+"ISO-IR-209", \ -+"ISO-IR-226", \ -+"ISO646-CA", \ -+"ISO646-CA2", \ -+"ISO646-CN", \ -+"ISO646-CU", \ -+"ISO646-DE", \ -+"ISO646-DK", \ -+"ISO646-ES", \ -+"ISO646-ES2", \ -+"ISO646-FI", \ -+"ISO646-FR", \ -+"ISO646-FR1", \ -+"ISO646-GB", \ -+"ISO646-HU", \ -+"ISO646-IT", \ -+"ISO646-JP-OCR-B", \ -+"ISO646-JP", \ -+"ISO646-KR", \ -+"ISO646-NO", \ -+"ISO646-NO2", \ -+"ISO646-PT", \ -+"ISO646-PT2", \ -+"ISO646-SE", \ -+"ISO646-SE2", \ -+"ISO646-US", \ -+"ISO646-YU", \ -+"ISO2022CN", \ -+"ISO2022CNEXT", \ -+"ISO2022JP", \ -+"ISO2022JP2", \ -+"ISO2022KR", \ -+"ISO6937", \ -+"ISO8859-1", \ -+"ISO8859-2", \ -+"ISO8859-3", \ -+"ISO8859-4", \ -+"ISO8859-5", \ -+"ISO8859-6", \ -+"ISO8859-7", \ -+"ISO8859-8", \ -+"ISO8859-9", \ -+"ISO8859-9E", \ -+"ISO8859-10", \ -+"ISO8859-11", \ -+"ISO8859-13", \ -+"ISO8859-14", \ -+"ISO8859-15", \ -+"ISO8859-16", \ -+"ISO11548-1", \ -+"ISO88591", \ -+"ISO88592", \ -+"ISO88593", \ -+"ISO88594", \ -+"ISO88595", \ -+"ISO88596", \ -+"ISO88597", \ -+"ISO88598", \ -+"ISO88599", \ -+"ISO88599E", \ -+"ISO885910", \ -+"ISO885911", \ -+"ISO885913", \ -+"ISO885914", \ -+"ISO885915", \ -+"ISO885916", \ -+"ISO_646.IRV:1991", \ -+"ISO_2033-1983", \ -+"ISO_2033", \ -+"ISO_5427-EXT", \ -+"ISO_5427", \ -+"ISO_5427:1981", \ -+"ISO_5427EXT", \ -+"ISO_5428", \ -+"ISO_5428:1980", \ -+"ISO_6937-2", \ -+"ISO_6937-2:1983", \ -+"ISO_6937", \ -+"ISO_6937:1992", \ -+"ISO_8859-1", \ -+"ISO_8859-1:1987", \ -+"ISO_8859-2", \ -+"ISO_8859-2:1987", \ -+"ISO_8859-3", \ -+"ISO_8859-3:1988", \ -+"ISO_8859-4", \ -+"ISO_8859-4:1988", \ -+"ISO_8859-5", \ -+"ISO_8859-5:1988", \ -+"ISO_8859-6", \ -+"ISO_8859-6:1987", \ -+"ISO_8859-7", \ -+"ISO_8859-7:1987", \ -+"ISO_8859-7:2003", \ -+"ISO_8859-8", \ -+"ISO_8859-8:1988", \ -+"ISO_8859-9", \ -+"ISO_8859-9:1989", \ -+"ISO_8859-9E", \ -+"ISO_8859-10", \ -+"ISO_8859-10:1992", \ -+"ISO_8859-14", \ -+"ISO_8859-14:1998", \ -+"ISO_8859-15", \ -+"ISO_8859-15:1998", \ -+"ISO_8859-16", \ -+"ISO_8859-16:2001", \ -+"ISO_9036", \ -+"ISO_10367-BOX", \ -+"ISO_10367BOX", \ -+"ISO_11548-1", \ -+"ISO_69372", \ -+"IT", \ -+"JIS_C6220-1969-RO", \ -+"JIS_C6229-1984-B", \ -+"JIS_C62201969RO", \ -+"JIS_C62291984B", \ -+"JOHAB", \ -+"JP-OCR-B", \ -+"JP", \ -+"JS", \ -+"JUS_I.B1.002", \ -+"KOI-7", \ -+"KOI-8", \ -+"KOI8-R", \ -+"KOI8-RU", \ -+"KOI8-T", \ -+"KOI8-U", \ -+"KOI8", \ -+"KOI8R", \ -+"KOI8U", \ -+"KSC5636", \ -+"L1", \ -+"L2", \ -+"L3", \ -+"L4", \ -+"L5", \ -+"L6", \ -+"L7", \ -+"L8", \ -+"L10", \ -+"LATIN-9", \ -+"LATIN-GREEK-1", \ -+"LATIN-GREEK", \ -+"LATIN1", \ -+"LATIN2", \ -+"LATIN3", \ -+"LATIN4", \ -+"LATIN5", \ -+"LATIN6", \ -+"LATIN7", \ -+"LATIN8", \ -+"LATIN10", \ -+"LATINGREEK", \ -+"LATINGREEK1", \ -+"MAC-CENTRALEUROPE", \ -+"MAC-CYRILLIC", \ -+"MAC-IS", \ -+"MAC-SAMI", \ -+"MAC-UK", \ -+"MAC", \ -+"MACCYRILLIC", \ -+"MACINTOSH", \ -+"MACIS", \ -+"MACUK", \ -+"MACUKRAINIAN", \ -+"MIK", \ -+"MS-ANSI", \ -+"MS-ARAB", \ -+"MS-CYRL", \ -+"MS-EE", \ -+"MS-GREEK", \ -+"MS-HEBR", \ -+"MS-MAC-CYRILLIC", \ -+"MS-TURK", \ -+"MS932", \ -+"MS936", \ -+"MSCP949", \ -+"MSCP1361", \ -+"MSMACCYRILLIC", \ -+"MSZ_7795.3", \ -+"MS_KANJI", \ -+"NAPLPS", \ -+"NATS-DANO", \ -+"NATS-SEFI", \ -+"NATSDANO", \ -+"NATSSEFI", \ -+"NC_NC0010", \ -+"NC_NC00-10", \ -+"NC_NC00-10:81", \ -+"NF_Z_62-010", \ -+"NF_Z_62-010_(1973)", \ -+"NF_Z_62-010_1973", \ -+"NF_Z_62010", \ -+"NF_Z_62010_1973", \ -+"NO", \ -+"NO2", \ -+"NS_4551-1", \ -+"NS_4551-2", \ -+"NS_45511", \ -+"NS_45512", \ -+"OS2LATIN1", \ -+"OSF00010001", \ -+"OSF00010002", \ -+"OSF00010003", \ -+"OSF00010004", \ -+"OSF00010005", \ -+"OSF00010006", \ -+"OSF00010007", \ -+"OSF00010008", \ -+"OSF00010009", \ -+"OSF0001000A", \ -+"OSF00010020", \ -+"OSF00010100", \ -+"OSF00010101", \ -+"OSF00010102", \ -+"OSF00010104", \ -+"OSF00010105", \ -+"OSF00010106", \ -+"OSF00030010", \ -+"OSF0004000A", \ -+"OSF0005000A", \ -+"OSF05010001", \ -+"OSF100201A4", \ -+"OSF100201A8", \ -+"OSF100201B5", \ -+"OSF100201F4", \ -+"OSF100203B5", \ -+"OSF1002011C", \ -+"OSF1002011D", \ -+"OSF1002035D", \ -+"OSF1002035E", \ -+"OSF1002035F", \ -+"OSF1002036B", \ -+"OSF1002037B", \ -+"OSF10010001", \ -+"OSF10010004", \ -+"OSF10010006", \ -+"OSF10020025", \ -+"OSF10020111", \ -+"OSF10020115", \ -+"OSF10020116", \ -+"OSF10020118", \ -+"OSF10020122", \ -+"OSF10020129", \ -+"OSF10020352", \ -+"OSF10020354", \ -+"OSF10020357", \ -+"OSF10020359", \ -+"OSF10020360", \ -+"OSF10020364", \ -+"OSF10020365", \ -+"OSF10020366", \ -+"OSF10020367", \ -+"OSF10020370", \ -+"OSF10020387", \ -+"OSF10020388", \ -+"OSF10020396", \ -+"OSF10020402", \ -+"OSF10020417", \ -+"PT", \ -+"PT2", \ -+"PT154", \ -+"R8", \ -+"R9", \ -+"RK1048", \ -+"ROMAN8", \ -+"ROMAN9", \ -+"RUSCII", \ -+"SE", \ -+"SE2", \ -+"SEN_850200_B", \ -+"SEN_850200_C", \ -+"SHIFT-JIS", \ -+"SHIFT_JIS", \ -+"SHIFT_JISX0213", \ -+"SJIS-OPEN", \ -+"SJIS-WIN", \ -+"SJIS", \ -+"SS636127", \ -+"STRK1048-2002", \ -+"ST_SEV_358-88", \ -+"T.61-8BIT", \ -+"T.61", \ -+"T.618BIT", \ -+"TCVN-5712", \ -+"TCVN", \ -+"TCVN5712-1", \ -+"TCVN5712-1:1993", \ -+"THAI8", \ -+"TIS-620", \ -+"TIS620-0", \ -+"TIS620.2529-1", \ -+"TIS620.2533-0", \ -+"TIS620", \ -+"TS-5881", \ -+"TSCII", \ -+"TURKISH8", \ -+"UCS-2", \ -+"UCS-2BE", \ -+"UCS-2LE", \ -+"UCS-4", \ -+"UCS-4BE", \ -+"UCS-4LE", \ -+"UCS2", \ -+"UCS4", \ -+"UHC", \ -+"UJIS", \ -+"UK", \ -+"UNICODE", \ -+"UNICODEBIG", \ -+"UNICODELITTLE", \ -+"US-ASCII", \ -+"US", \ -+"UTF-7", \ -+"UTF-8", \ -+"UTF-16", \ -+"UTF-16BE", \ -+"UTF-16LE", \ -+"UTF-32", \ -+"UTF-32BE", \ -+"UTF-32LE", \ -+"UTF7", \ -+"UTF8", \ -+"UTF16", \ -+"UTF16BE", \ -+"UTF16LE", \ -+"UTF32", \ -+"UTF32BE", \ -+"UTF32LE", \ -+"VISCII", \ -+"WCHAR_T", \ -+"WIN-SAMI-2", \ -+"WINBALTRIM", \ -+"WINDOWS-31J", \ -+"WINDOWS-874", \ -+"WINDOWS-936", \ -+"WINDOWS-1250", \ -+"WINDOWS-1251", \ -+"WINDOWS-1252", \ -+"WINDOWS-1253", \ -+"WINDOWS-1254", \ -+"WINDOWS-1255", \ -+"WINDOWS-1256", \ -+"WINDOWS-1257", \ -+"WINDOWS-1258", \ -+"WINSAMI2", \ -+"WS2", \ -+"YU", -diff --git a/gdb/charset.c b/gdb/charset.c -index 32eb9c3..4850fbf 100644 ---- a/gdb/charset.c -+++ b/gdb/charset.c -@@ -21,6 +21,9 @@ - #include "charset.h" - #include "gdbcmd.h" - #include "gdb_assert.h" -+#include "gdb_obstack.h" -+#include "charset-list.h" -+#include "vec.h" - - #include - #include "gdb_string.h" -@@ -33,15 +36,20 @@ - - /* How GDB's character set support works - -- GDB has two global settings: -+ GDB has three global settings: - - - The `current host character set' is the character set GDB should - use in talking to the user, and which (hopefully) the user's -- terminal knows how to display properly. -+ terminal knows how to display properly. Most users should not -+ change this. - - - The `current target character set' is the character set the - program being debugged uses. - -+ - The `current target wide character set' is the wide character set -+ the program being debugged uses, that is, the encoding used for -+ wchar_t. -+ - There are commands to set each of these, and mechanisms for - choosing reasonable default values. GDB has a global list of - character sets that it can use as its host or target character -@@ -57,118 +65,37 @@ - characters the user enters in expressions (mostly host->target - conversions), - -- and so on. -- -- Now, many of these operations are specific to a particular -- host/target character set pair. If GDB supports N character sets, -- there are N^2 possible pairs. This means that, the larger GDB's -- repertoire of character sets gets, the more expensive it gets to add -- new character sets. -- -- To make sure that GDB can do the right thing for every possible -- pairing of host and target character set, while still allowing -- GDB's repertoire to scale, we use a two-tiered approach: -- -- - We maintain a global table of "translations" --- groups of -- functions specific to a particular pair of character sets. -- -- - However, a translation can be incomplete: some functions can be -- omitted. Where there is not a translation to specify exactly -- what function to use, we provide reasonable defaults. The -- default behaviors try to use the "iconv" library functions, which -- support a wide range of character sets. However, even if iconv -- is not available, there are fallbacks to support trivial -- translations: when the host and target character sets are the -- same. */ -- -- --/* The character set and translation structures. */ -- -- --/* A character set GDB knows about. GDB only supports character sets -- with stateless encodings, in which every character is one byte -- long. */ --struct charset { -- -- /* A singly-linked list of all known charsets. */ -- struct charset *next; -- -- /* The name of the character set. Comparisons on character set -- names are case-sensitive. */ -- const char *name; -- -- /* Non-zero iff this character set can be used as a host character -- set. At present, GDB basically assumes that the host character -- set is a superset of ASCII. */ -- int valid_host_charset; -- -- /* Pointers to charset-specific functions that depend only on a -- single character set, and data pointers to pass to them. */ -- int (*host_char_print_literally) (void *baton, -- int host_char); -- void *host_char_print_literally_baton; -- -- int (*target_char_to_control_char) (void *baton, -- int target_char, -- int *target_ctrl_char); -- void *target_char_to_control_char_baton; --}; -- -- --/* A translation from one character set to another. */ --struct translation { -- -- /* A singly-linked list of all known translations. */ -- struct translation *next; -- -- /* This structure describes functions going from the FROM character -- set to the TO character set. Comparisons on character set names -- are case-sensitive. */ -- const char *from, *to; -- -- /* Pointers to translation-specific functions, and data pointers to -- pass to them. These pointers can be zero, indicating that GDB -- should fall back on the default behavior. We hope the default -- behavior will be correct for many from/to pairs, reducing the -- number of translations that need to be registered explicitly. */ -- -- /* TARGET_CHAR is in the `from' charset. -- Returns a string in the `to' charset. */ -- const char *(*c_target_char_has_backslash_escape) (void *baton, -- int target_char); -- void *c_target_char_has_backslash_escape_baton; -- -- /* HOST_CHAR is in the `from' charset. -- TARGET_CHAR points to a char in the `to' charset. */ -- int (*c_parse_backslash) (void *baton, int host_char, int *target_char); -- void *c_parse_backslash_baton; -- -- /* This is used for the host_char_to_target and target_char_to_host -- functions. */ -- int (*convert_char) (void *baton, int from, int *to); -- void *convert_char_baton; --}; -- -+ and so on. -+ -+ To avoid excessive code duplication and maintenance efforts, -+ GDB simply requires a capable iconv function. Users on platforms -+ without a suitable iconv can use the GNU iconv library. */ - - - /* The global lists of character sets and translations. */ - - --#ifndef GDB_DEFAULT_HOST_CHARSET --#define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1" --#endif -- - #ifndef GDB_DEFAULT_TARGET_CHARSET - #define GDB_DEFAULT_TARGET_CHARSET "ISO-8859-1" - #endif - --static const char *host_charset_name = GDB_DEFAULT_HOST_CHARSET; -+#ifndef GDB_DEFAULT_TARGET_WIDE_CHARSET -+#define GDB_DEFAULT_TARGET_WIDE_CHARSET "UCS-4" -+#endif -+ -+static const char *auto_host_charset_name = GDB_DEFAULT_HOST_CHARSET; -+static const char *host_charset_name = "auto"; - static void - show_host_charset_name (struct ui_file *file, int from_tty, - struct cmd_list_element *c, - const char *value) - { -- fprintf_filtered (file, _("The host character set is \"%s\".\n"), value); -+ if (!strcmp (value, "auto")) -+ fprintf_filtered (file, -+ _("The host character set is \"auto; currently %s\".\n"), -+ auto_host_charset_name); -+ else -+ fprintf_filtered (file, _("The host character set is \"%s\".\n"), value); - } - - static const char *target_charset_name = GDB_DEFAULT_TARGET_CHARSET; -@@ -180,1060 +107,534 @@ show_target_charset_name (struct ui_file *file, int from_tty, - value); - } - -- --static const char *host_charset_enum[] = -+static const char *target_wide_charset_name = GDB_DEFAULT_TARGET_WIDE_CHARSET; -+static void -+show_target_wide_charset_name (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) - { -- "ASCII", -- "ISO-8859-1", -- 0 --}; -+ fprintf_filtered (file, _("The target wide character set is \"%s\".\n"), -+ value); -+} - --static const char *target_charset_enum[] = -+static const char *default_charset_names[] = - { -- "ASCII", -- "ISO-8859-1", -- "EBCDIC-US", -- "IBM1047", -+ DEFAULT_CHARSET_NAMES - 0 - }; - --/* The global list of all the charsets GDB knows about. */ --static struct charset *all_charsets; -+static const char **charset_enum; - -+ -+/* If the target wide character set has big- or little-endian -+ variants, these are the corresponding names. */ -+static const char *target_wide_charset_be_name; -+static const char *target_wide_charset_le_name; - --static void --register_charset (struct charset *cs) --{ -- struct charset **ptr; -- -- /* Put the new charset on the end, so that the list ends up in the -- same order as the registrations in the _initialize function. */ -- for (ptr = &all_charsets; *ptr; ptr = &(*ptr)->next) -- ; -- -- cs->next = 0; -- *ptr = cs; --} -- -+/* A helper function for validate which sets the target wide big- and -+ little-endian character set names, if possible. */ - --static struct charset * --lookup_charset (const char *name) -+static void -+set_be_le_names (void) - { -- struct charset *cs; -+ int i, len; - -- for (cs = all_charsets; cs; cs = cs->next) -- if (! strcmp (name, cs->name)) -- return cs; -+ target_wide_charset_le_name = NULL; -+ target_wide_charset_be_name = NULL; - -- return NULL; -+ len = strlen (target_wide_charset_name); -+ for (i = 0; charset_enum[i]; ++i) -+ { -+ if (strncmp (target_wide_charset_name, charset_enum[i], len)) -+ continue; -+ if ((charset_enum[i][len] == 'B' -+ || charset_enum[i][len] == 'L') -+ && charset_enum[i][len + 1] == 'E' -+ && charset_enum[i][len + 2] == '\0') -+ { -+ if (charset_enum[i][len] == 'B') -+ target_wide_charset_be_name = charset_enum[i]; -+ else -+ target_wide_charset_le_name = charset_enum[i]; -+ } -+ } - } - -- --/* The global list of translations. */ --static struct translation *all_translations; -- -+/* 'Set charset', 'set host-charset', 'set target-charset', 'set -+ target-wide-charset', 'set charset' sfunc's. */ - - static void --register_translation (struct translation *t) -+validate (void) - { -- t->next = all_translations; -- all_translations = t; --} -- -- --static struct translation * --lookup_translation (const char *from, const char *to) --{ -- struct translation *t; -- -- for (t = all_translations; t; t = t->next) -- if (! strcmp (from, t->from) -- && ! strcmp (to, t->to)) -- return t; -+ iconv_t desc; -+ const char *host_cset = host_charset (); - -- return 0; --} -- -- -- --/* Constructing charsets. */ -- --/* Allocate, initialize and return a straightforward charset. -- Use this function, rather than creating the structures yourself, -- so that we can add new fields to the structure in the future without -- having to tweak all the old charset descriptions. */ --static struct charset * --simple_charset (const char *name, -- int valid_host_charset, -- int (*host_char_print_literally) (void *baton, int host_char), -- void *host_char_print_literally_baton, -- int (*target_char_to_control_char) (void *baton, -- int target_char, -- int *target_ctrl_char), -- void *target_char_to_control_char_baton) --{ -- struct charset *cs = xmalloc (sizeof (*cs)); -+ desc = iconv_open (target_wide_charset_name, host_cset); -+ if (desc == (iconv_t) -1) -+ error ("Cannot convert between character sets `%s' and `%s'", -+ target_wide_charset_name, host_cset); -+ iconv_close (desc); - -- memset (cs, 0, sizeof (*cs)); -- cs->name = name; -- cs->valid_host_charset = valid_host_charset; -- cs->host_char_print_literally = host_char_print_literally; -- cs->host_char_print_literally_baton = host_char_print_literally_baton; -- cs->target_char_to_control_char = target_char_to_control_char; -- cs->target_char_to_control_char_baton = target_char_to_control_char_baton; -+ desc = iconv_open (target_charset_name, host_cset); -+ if (desc == (iconv_t) -1) -+ error ("Cannot convert between character sets `%s' and `%s'", -+ target_charset_name, host_cset); -+ iconv_close (desc); - -- return cs; -+ set_be_le_names (); - } - -- -- --/* ASCII functions. */ -- --static int --ascii_print_literally (void *baton, int c) -+/* This is the sfunc for the 'set charset' command. */ -+static void -+set_charset_sfunc (char *charset, int from_tty, struct cmd_list_element *c) - { -- c &= 0xff; -- -- return (0x20 <= c && c <= 0x7e); -+ /* CAREFUL: set the target charset here as well. */ -+ target_charset_name = host_charset_name; -+ validate (); - } - -- --static int --ascii_to_control (void *baton, int c, int *ctrl_char) -+/* 'set host-charset' command sfunc. We need a wrapper here because -+ the function needs to have a specific signature. */ -+static void -+set_host_charset_sfunc (char *charset, int from_tty, -+ struct cmd_list_element *c) - { -- *ctrl_char = (c & 037); -- return 1; -+ validate (); - } - -- --/* ISO-8859 family functions. */ -- -- --static int --iso_8859_print_literally (void *baton, int c) -+/* Wrapper for the 'set target-charset' command. */ -+static void -+set_target_charset_sfunc (char *charset, int from_tty, -+ struct cmd_list_element *c) - { -- c &= 0xff; -- -- return ((0x20 <= c && c <= 0x7e) /* ascii printables */ -- || (! sevenbit_strings && 0xA0 <= c)); /* iso 8859 printables */ -+ validate (); - } - -- --static int --iso_8859_to_control (void *baton, int c, int *ctrl_char) -+/* Wrapper for the 'set target-wide-charset' command. */ -+static void -+set_target_wide_charset_sfunc (char *charset, int from_tty, -+ struct cmd_list_element *c) - { -- *ctrl_char = (c & 0200) | (c & 037); -- return 1; -+ validate (); - } - -- --/* Construct an ISO-8859-like character set. */ --static struct charset * --iso_8859_family_charset (const char *name) -+/* sfunc for the 'show charset' command. */ -+static void -+show_charset (struct ui_file *file, int from_tty, struct cmd_list_element *c, -+ const char *name) - { -- return simple_charset (name, 1, -- iso_8859_print_literally, 0, -- iso_8859_to_control, 0); -+ show_host_charset_name (file, from_tty, c, host_charset_name); -+ show_target_charset_name (file, from_tty, c, target_charset_name); -+ show_target_wide_charset_name (file, from_tty, c, target_wide_charset_name); - } - -- - --/* EBCDIC family functions. */ -- -- --static int --ebcdic_print_literally (void *baton, int c) --{ -- c &= 0xff; -- -- return (64 <= c && c <= 254); --} -- -+/* Accessor functions. */ - --static int --ebcdic_to_control (void *baton, int c, int *ctrl_char) -+const char * -+host_charset (void) - { -- /* There are no control character equivalents in EBCDIC. Use -- numeric escapes. */ -- return 0; -+ if (!strcmp (host_charset_name, "auto")) -+ return auto_host_charset_name; -+ return host_charset_name; - } - -- --/* Construct an EBCDIC-like character set. */ --static struct charset * --ebcdic_family_charset (const char *name) -+const char * -+target_charset (void) - { -- return simple_charset (name, 0, -- ebcdic_print_literally, 0, -- ebcdic_to_control, 0); -+ return target_charset_name; - } -- -- -- -- -- --/* Fallback functions using iconv. */ -- --#if defined(HAVE_ICONV) - --struct cached_iconv { -- struct charset *from, *to; -- iconv_t i; --}; -- -- --/* Make sure the iconv cache *CI contains an iconv descriptor -- translating from FROM to TO. If it already does, fine; otherwise, -- close any existing descriptor, and open up a new one. On success, -- return zero; on failure, return -1 and set errno. */ --static int --check_iconv_cache (struct cached_iconv *ci, -- struct charset *from, -- struct charset *to) -+const char * -+target_wide_charset (void) - { -- iconv_t i; -- -- /* Does the cached iconv descriptor match the conversion we're trying -- to do now? */ -- if (ci->from == from -- && ci->to == to -- && ci->i != (iconv_t) 0) -- return 0; -- -- /* It doesn't. If we actually had any iconv descriptor open at -- all, close it now. */ -- if (ci->i != (iconv_t) 0) -+ if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) - { -- i = ci->i; -- ci->i = (iconv_t) 0; -- -- if (iconv_close (i) == -1) -- error (_("Error closing `iconv' descriptor for " -- "`%s'-to-`%s' character conversion: %s"), -- ci->from->name, ci->to->name, safe_strerror (errno)); -+ if (target_wide_charset_be_name) -+ return target_wide_charset_be_name; - } -- -- /* Open a new iconv descriptor for the required conversion. */ -- i = iconv_open (to->name, from->name); -- if (i == (iconv_t) -1) -- return -1; -- -- ci->i = i; -- ci->from = from; -- ci->to = to; -- -- return 0; --} -- -- --/* Convert FROM_CHAR using the cached iconv conversion *CI. Return -- non-zero if the conversion was successful, zero otherwise. */ --static int --cached_iconv_convert (struct cached_iconv *ci, int from_char, int *to_char) --{ -- char from; -- ICONV_CONST char *from_ptr = &from; -- char to, *to_ptr = &to; -- size_t from_left = sizeof (from), to_left = sizeof (to); -- -- gdb_assert (ci->i != (iconv_t) 0); -- -- from = from_char; -- if (iconv (ci->i, &from_ptr, &from_left, &to_ptr, &to_left) -- == (size_t) -1) -+ else - { -- /* These all suggest that the input or output character sets -- have multi-byte encodings of some characters, which means -- it's unsuitable for use as a GDB character set. We should -- never have selected it. */ -- gdb_assert (errno != E2BIG && errno != EINVAL); -- -- /* This suggests a bug in the code managing *CI. */ -- gdb_assert (errno != EBADF); -- -- /* This seems to mean that there is no equivalent character in -- the `to' character set. */ -- if (errno == EILSEQ) -- return 0; -- -- /* Anything else is mysterious. */ -- internal_error (__FILE__, __LINE__, -- _("Error converting character `%d' from `%s' to `%s' " -- "character set: %s"), -- from_char, ci->from->name, ci->to->name, -- safe_strerror (errno)); -+ if (target_wide_charset_le_name) -+ return target_wide_charset_le_name; - } - -- /* If the pointers weren't advanced across the input, that also -- suggests something was wrong. */ -- gdb_assert (from_left == 0 && to_left == 0); -- -- *to_char = (unsigned char) to; -- return 1; -+ return target_wide_charset_name; - } - -- --static void --register_iconv_charsets (void) --{ -- /* Here we should check whether various character sets were -- recognized by the local iconv implementation. -- -- The first implementation registered a bunch of character sets -- recognized by iconv, but then we discovered that iconv on Solaris -- and iconv on GNU/Linux had no character sets in common. So we -- replaced them with the hard-coded tables that appear later in the -- file. */ --} -- --#endif /* defined (HAVE_ICONV) */ -- - --/* Fallback routines for systems without iconv. */ -+/* Host character set management. For the time being, we assume that -+ the host character set is some superset of ASCII. */ - --#if ! defined (HAVE_ICONV) --struct cached_iconv { char nothing; }; -- --static int --check_iconv_cache (struct cached_iconv *ci, -- struct charset *from, -- struct charset *to) -+char -+host_letter_to_control_character (char c) - { -- errno = EINVAL; -- return -1; -+ if (c == '?') -+ return 0177; -+ return c & 0237; - } - --static int --cached_iconv_convert (struct cached_iconv *ci, int from_char, int *to_char) --{ -- /* This function should never be called. */ -- gdb_assert (0); --} -+/* Convert a host character, C, to its hex value. C must already have -+ been validated using isxdigit. */ - --static void --register_iconv_charsets (void) --{ --} -- --#endif /* ! defined(HAVE_ICONV) */ -- -- --/* Default trivial conversion functions. */ -- --static int --identity_either_char_to_other (void *baton, int either_char, int *other_char) -+int -+host_hex_value (char c) - { -- *other_char = either_char; -- return 1; -+ if (isdigit (c)) -+ return c - '0'; -+ if (c >= 'a' && c <= 'f') -+ return 10 + c - 'a'; -+ gdb_assert (c >= 'A' && c <= 'F'); -+ return 10 + c - 'A'; - } - -- - --/* Default non-trivial conversion functions. */ -- -- --static char backslashable[] = "abfnrtv"; --static char *backslashed[] = {"a", "b", "f", "n", "r", "t", "v", "0"}; --static char represented[] = "\a\b\f\n\r\t\v"; -- -- --/* Translate TARGET_CHAR into the host character set, and see if it -- matches any of our standard escape sequences. */ --static const char * --default_c_target_char_has_backslash_escape (void *baton, int target_char) --{ -- int host_char; -- const char *ix; -- -- /* If target_char has no equivalent in the host character set, -- assume it doesn't have a backslashed form. */ -- if (! target_char_to_host (target_char, &host_char)) -- return NULL; -- -- ix = strchr (represented, host_char); -- if (ix) -- return backslashed[ix - represented]; -- else -- return NULL; --} -- -- --/* Translate the backslash the way we would in the host character set, -- and then try to translate that into the target character set. */ --static int --default_c_parse_backslash (void *baton, int host_char, int *target_char) --{ -- const char *ix; -- -- ix = strchr (backslashable, host_char); -- -- if (! ix) -- return 0; -- else -- return host_char_to_target (represented[ix - backslashable], -- target_char); --} -+/* Public character management functions. */ - -+/* A cleanup function which is run to close an iconv descriptor. */ - --/* Convert using a cached iconv descriptor. */ --static int --iconv_convert (void *baton, int from_char, int *to_char) -+static void -+cleanup_iconv (void *p) - { -- struct cached_iconv *ci = baton; -- return cached_iconv_convert (ci, from_char, to_char); -+ iconv_t *descp = p; -+ iconv_close (*descp); - } - -+void -+convert_between_encodings (const char *from, const char *to, -+ const gdb_byte *bytes, unsigned int num_bytes, -+ int width, struct obstack *output, -+ enum transliterations translit) -+{ -+ iconv_t desc; -+ struct cleanup *cleanups; -+ size_t inleft; -+ char *inp; -+ unsigned int space_request; -+ -+ /* Often, the host and target charsets will be the same. */ -+ if (!strcmp (from, to)) -+ { -+ obstack_grow (output, bytes, num_bytes); -+ return; -+ } - -- --/* Conversion tables. */ -- -- --/* I'd much rather fall back on iconv whenever possible. But the -- character set names you use with iconv aren't standardized at all, -- a lot of platforms have really meager character set coverage, etc. -- I wanted to have at least something we could use to exercise the -- test suite on all platforms. -- -- In the long run, we should have a configure-time process explore -- somehow which character sets the host platform supports, and some -- arrangement that allows GDB users to use platform-indepedent names -- for character sets. */ -- -- --/* We generated these tables using iconv on a GNU/Linux machine. */ -- -- --static int ascii_to_iso_8859_1_table[] = { -- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */ -- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */ -- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 80 */ -- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 96 */ -- 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 112 */ -- 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 128 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int ascii_to_ebcdic_us_table[] = { -- 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */ -- 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */ -- 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */ -- 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */ -- 215,216,217,226,227,228,229,230,231,232,233, -1,224, -1, -1,109, /* 96 */ -- 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */ -- 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161, 7, /* 128 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int ascii_to_ibm1047_table[] = { -- 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */ -- 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */ -- 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */ -- 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */ -- 215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109, /* 96 */ -- 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */ -- 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161, 7, /* 128 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int iso_8859_1_to_ascii_table[] = { -- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */ -- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */ -- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 80 */ -- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 96 */ -- 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 112 */ -- 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 128 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int iso_8859_1_to_ebcdic_us_table[] = { -- 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */ -- 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */ -- 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */ -- 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */ -- 215,216,217,226,227,228,229,230,231,232,233, -1,224, -1, -1,109, /* 96 */ -- 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */ -- 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161, 7, /* 128 */ -- 32, 33, 34, 35, 36, 21, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27, /* 144 */ -- 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62,255, /* 160 */ -- -1, -1, 74, -1, -1, -1,106, -1, -1, -1, -1, -1, 95, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 208 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 224 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 240 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int iso_8859_1_to_ibm1047_table[] = { -- 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 37, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31, /* 32 */ -- 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97, /* 48 */ -- 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111, /* 64 */ -- 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214, /* 80 */ -- 215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109, /* 96 */ -- 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150, /* 112 */ -- 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161, 7, /* 128 */ -- 32, 33, 34, 35, 36, 21, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27, /* 144 */ -- 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62,255, /* 160 */ -- 65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188, /* 176 */ -- 144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171, /* 192 */ -- 100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119, /* 208 */ -- 172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89, /* 224 */ -- 68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87, /* 240 */ -- 140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223 /* 256 */ --}; -- -- --static int ebcdic_us_to_ascii_table[] = { -- 0, 1, 2, 3, -1, 9, -1,127, -1, -1, -1, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, -1, -1, 8, -1, 24, 25, -1, -1, 28, 29, 30, 31, /* 32 */ -- -1, -1, -1, -1, -1, 10, 23, 27, -1, -1, -1, -1, -1, 5, 6, 7, /* 48 */ -- -1, -1, 22, -1, -1, -1, -1, 4, -1, -1, -1, -1, 20, 21, -1, 26, /* 64 */ -- 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, 60, 40, 43,124, /* 80 */ -- 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 36, 42, 41, 59, -1, /* 96 */ -- 45, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 37, 95, 62, 63, /* 112 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, 58, 35, 64, 39, 61, 34, /* 128 */ -- -1, 97, 98, 99,100,101,102,103,104,105, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1,106,107,108,109,110,111,112,113,114, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1,126,115,116,117,118,119,120,121,122, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- 123, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, -1, /* 208 */ -- 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, /* 224 */ -- 92, -1, 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, -1, /* 240 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int ebcdic_us_to_iso_8859_1_table[] = { -- 0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19,157,133, 8,135, 24, 25,146,143, 28, 29, 30, 31, /* 32 */ -- 128,129,130,131,132, 10, 23, 27,136,137,138,139,140, 5, 6, 7, /* 48 */ -- 144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26, /* 64 */ -- 32, -1, -1, -1, -1, -1, -1, -1, -1, -1,162, 46, 60, 40, 43,124, /* 80 */ -- 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 36, 42, 41, 59,172, /* 96 */ -- 45, 47, -1, -1, -1, -1, -1, -1, -1, -1,166, 44, 37, 95, 62, 63, /* 112 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, 58, 35, 64, 39, 61, 34, /* 128 */ -- -1, 97, 98, 99,100,101,102,103,104,105, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1,106,107,108,109,110,111,112,113,114, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1,126,115,116,117,118,119,120,121,122, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- 123, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, -1, /* 208 */ -- 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, /* 224 */ -- 92, -1, 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, -1, /* 240 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1,159 /* 256 */ --}; -- -- --static int ebcdic_us_to_ibm1047_table[] = { -- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */ -- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */ -- 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 75, 76, 77, 78, 79, /* 80 */ -- 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, 94,176, /* 96 */ -- 96, 97, -1, -1, -1, -1, -1, -1, -1, -1,106,107,108,109,110,111, /* 112 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1,121,122,123,124,125,126,127, /* 128 */ -- -1,129,130,131,132,133,134,135,136,137, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1,145,146,147,148,149,150,151,152,153, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1,161,162,163,164,165,166,167,168,169, -1, -1, -1, -1, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- 192,193,194,195,196,197,198,199,200,201, -1, -1, -1, -1, -1, -1, /* 208 */ -- 208,209,210,211,212,213,214,215,216,217, -1, -1, -1, -1, -1, -1, /* 224 */ -- 224, -1,226,227,228,229,230,231,232,233, -1, -1, -1, -1, -1, -1, /* 240 */ -- 240,241,242,243,244,245,246,247,248,249, -1, -1, -1, -1, -1,255 /* 256 */ --}; -- -- --static int ibm1047_to_ascii_table[] = { -- 0, 1, 2, 3, -1, 9, -1,127, -1, -1, -1, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, -1, -1, 8, -1, 24, 25, -1, -1, 28, 29, 30, 31, /* 32 */ -- -1, -1, -1, -1, -1, 10, 23, 27, -1, -1, -1, -1, -1, 5, 6, 7, /* 48 */ -- -1, -1, 22, -1, -1, -1, -1, 4, -1, -1, -1, -1, 20, 21, -1, 26, /* 64 */ -- 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, 60, 40, 43,124, /* 80 */ -- 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 36, 42, 41, 59, 94, /* 96 */ -- 45, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 37, 95, 62, 63, /* 112 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, 58, 35, 64, 39, 61, 34, /* 128 */ -- -1, 97, 98, 99,100,101,102,103,104,105, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1,106,107,108,109,110,111,112,113,114, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1,126,115,116,117,118,119,120,121,122, -1, -1, -1, 91, -1, -1, /* 176 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, /* 192 */ -- 123, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, -1, /* 208 */ -- 125, 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, -1, -1, -1, -1, -1, /* 224 */ -- 92, -1, 83, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, -1, /* 240 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1, -1 /* 256 */ --}; -- -- --static int ibm1047_to_iso_8859_1_table[] = { -- 0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19,157,133, 8,135, 24, 25,146,143, 28, 29, 30, 31, /* 32 */ -- 128,129,130,131,132, 10, 23, 27,136,137,138,139,140, 5, 6, 7, /* 48 */ -- 144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26, /* 64 */ -- 32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124, /* 80 */ -- 38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94, /* 96 */ -- 45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63, /* 112 */ -- 248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34, /* 128 */ -- 216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177, /* 144 */ -- 176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164, /* 160 */ -- 181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174, /* 176 */ -- 172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215, /* 192 */ -- 123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245, /* 208 */ -- 125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255, /* 224 */ -- 92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213, /* 240 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159 /* 256 */ --}; -- -- --static int ibm1047_to_ebcdic_us_table[] = { -- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 16 */ -- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 32 */ -- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 48 */ -- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 64 */ -- 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 75, 76, 77, 78, 79, /* 80 */ -- 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, 94, -1, /* 96 */ -- 96, 97, -1, -1, -1, -1, -1, -1, -1, -1,106,107,108,109,110,111, /* 112 */ -- -1, -1, -1, -1, -1, -1, -1, -1, -1,121,122,123,124,125,126,127, /* 128 */ -- -1,129,130,131,132,133,134,135,136,137, -1, -1, -1, -1, -1, -1, /* 144 */ -- -1,145,146,147,148,149,150,151,152,153, -1, -1, -1, -1, -1, -1, /* 160 */ -- -1,161,162,163,164,165,166,167,168,169, -1, -1, -1, -1, -1, -1, /* 176 */ -- 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 192 */ -- 192,193,194,195,196,197,198,199,200,201, -1, -1, -1, -1, -1, -1, /* 208 */ -- 208,209,210,211,212,213,214,215,216,217, -1, -1, -1, -1, -1, -1, /* 224 */ -- 224, -1,226,227,228,229,230,231,232,233, -1, -1, -1, -1, -1, -1, /* 240 */ -- 240,241,242,243,244,245,246,247,248,249, -1, -1, -1, -1, -1,255 /* 256 */ --}; -+ desc = iconv_open (to, from); -+ if (desc == (iconv_t) -1) -+ perror_with_name ("Converting character sets"); -+ cleanups = make_cleanup (cleanup_iconv, &desc); - -+ inleft = num_bytes; -+ inp = (char *) bytes; - --static int --table_convert_char (void *baton, int from, int *to) --{ -- int *table = (int *) baton; -+ space_request = num_bytes; - -- if (0 <= from && from <= 255 -- && table[from] != -1) -+ while (inleft > 0) - { -- *to = table[from]; -- return 1; -+ char *outp; -+ size_t outleft, r; -+ int old_size; -+ -+ old_size = obstack_object_size (output); -+ obstack_blank (output, space_request); -+ -+ outp = obstack_base (output) + old_size; -+ outleft = space_request; -+ -+ r = iconv (desc, &inp, &inleft, &outp, &outleft); -+ -+ /* Now make sure that the object on the obstack only includes -+ bytes we have converted. */ -+ obstack_blank (output, - (int) outleft); -+ -+ if (r == (size_t) -1) -+ { -+ switch (errno) -+ { -+ case EILSEQ: -+ { -+ int i; -+ -+ /* Invalid input sequence. */ -+ if (translit == translit_none) -+ error (_("Could not convert character to `%s' character set"), -+ to); -+ -+ /* We emit escape sequence for the bytes, skip them, -+ and try again. */ -+ for (i = 0; i < width; ++i) -+ { -+ char octal[5]; -+ -+ sprintf (octal, "\\%.3o", *inp & 0xff); -+ obstack_grow_str (output, octal); -+ -+ ++inp; -+ --inleft; -+ } -+ } -+ break; -+ -+ case E2BIG: -+ /* We ran out of space in the output buffer. Make it -+ bigger next time around. */ -+ space_request *= 2; -+ break; -+ -+ case EINVAL: -+ /* Incomplete input sequence. FIXME: ought to report this -+ to the caller somehow. */ -+ inleft = 0; -+ break; -+ -+ default: -+ perror_with_name ("Internal error while converting character sets"); -+ } -+ } - } -- else -- return 0; --} -- - --static struct translation * --table_translation (const char *from, const char *to, int *table, -- const char *(*c_target_char_has_backslash_escape) -- (void *baton, int target_char), -- void *c_target_char_has_backslash_escape_baton, -- int (*c_parse_backslash) (void *baton, -- int host_char, -- int *target_char), -- void *c_parse_backslash_baton) --{ -- struct translation *t = xmalloc (sizeof (*t)); -- -- memset (t, 0, sizeof (*t)); -- t->from = from; -- t->to = to; -- t->c_target_char_has_backslash_escape = c_target_char_has_backslash_escape; -- t->c_target_char_has_backslash_escape_baton -- = c_target_char_has_backslash_escape_baton; -- t->c_parse_backslash = c_parse_backslash; -- t->c_parse_backslash_baton = c_parse_backslash_baton; -- t->convert_char = table_convert_char; -- t->convert_char_baton = (void *) table; -- -- return t; -+ do_cleanups (cleanups); - } - -- --static struct translation * --simple_table_translation (const char *from, const char *to, int *table) --{ -- return table_translation (from, to, table, 0, 0, 0, 0); --} -- -- - --/* Setting and retrieving the host and target charsets. */ -- -- --/* The current host and target character sets. */ --static struct charset *current_host_charset, *current_target_charset; -- --/* The current functions and batons we should use for the functions in -- charset.h. */ -- --static const char *(*c_target_char_has_backslash_escape_func) -- (void *baton, int target_char); --static void *c_target_char_has_backslash_escape_baton; -- --static int (*c_parse_backslash_func) (void *baton, -- int host_char, -- int *target_char); --static void *c_parse_backslash_baton; -- --static int (*host_char_to_target_func) (void *baton, -- int host_char, -- int *target_char); --static void *host_char_to_target_baton; -- --static int (*target_char_to_host_func) (void *baton, -- int target_char, -- int *host_char); --static void *target_char_to_host_baton; - -- --/* Cached iconv conversions, that might be useful to fallback -- routines. */ --static struct cached_iconv cached_iconv_host_to_target; --static struct cached_iconv cached_iconv_target_to_host; -- -- --/* Charset structures manipulation functions. */ -- --static struct charset * --lookup_charset_or_error (const char *name) -+/* An iterator that returns host wchar_t's from a target string. */ -+struct wchar_iterator - { -- struct charset *cs = lookup_charset (name); -+ /* The underlying iconv descriptor. */ -+ iconv_t desc; - -- if (! cs) -- error (_("GDB doesn't know of any character set named `%s'."), name); -+ /* The input string. This is updated as convert characters. */ -+ char *input; -+ /* The number of bytes remaining in the input. */ -+ size_t bytes; - -- return cs; --} -+ /* The width of an input character. */ -+ size_t width; - --static void --check_valid_host_charset (struct charset *cs) --{ -- if (! cs->valid_host_charset) -- error (_("GDB can't use `%s' as its host character set."), cs->name); --} -+ /* The output buffer and its size. */ -+ wchar_t *out; -+ size_t out_size; -+}; - --/* Set the host and target character sets to HOST and TARGET. */ --static void --set_host_and_target_charsets (struct charset *host, struct charset *target) -+/* Create a new iterator. */ -+struct wchar_iterator * -+make_wchar_iterator (const gdb_byte *input, size_t bytes, const char *charset, -+ size_t width) - { -- struct translation *h2t, *t2h; -- -- /* If they're not both initialized yet, then just do nothing for -- now. As soon as we're done running our initialize function, -- everything will be initialized. */ -- if (! host || ! target) -- { -- current_host_charset = host; -- current_target_charset = target; -- return; -- } -- -- h2t = lookup_translation (host->name, target->name); -- t2h = lookup_translation (target->name, host->name); -- -- /* If the translations don't provide conversion functions, make sure -- iconv can back them up. Do this *before* modifying any state. */ -- if (host != target) -- { -- if (! h2t || ! h2t->convert_char) -- { -- if (check_iconv_cache (&cached_iconv_host_to_target, host, target) -- < 0) -- error (_("GDB can't convert from the `%s' character set to `%s'."), -- host->name, target->name); -- } -- if (! t2h || ! t2h->convert_char) -- { -- if (check_iconv_cache (&cached_iconv_target_to_host, target, host) -- < 0) -- error (_("GDB can't convert from the `%s' character set to `%s'."), -- target->name, host->name); -- } -- } -- -- if (t2h && t2h->c_target_char_has_backslash_escape) -- { -- c_target_char_has_backslash_escape_func -- = t2h->c_target_char_has_backslash_escape; -- c_target_char_has_backslash_escape_baton -- = t2h->c_target_char_has_backslash_escape_baton; -- } -- else -- c_target_char_has_backslash_escape_func -- = default_c_target_char_has_backslash_escape; -- -- if (h2t && h2t->c_parse_backslash) -- { -- c_parse_backslash_func = h2t->c_parse_backslash; -- c_parse_backslash_baton = h2t->c_parse_backslash_baton; -- } -- else -- c_parse_backslash_func = default_c_parse_backslash; -- -- if (h2t && h2t->convert_char) -- { -- host_char_to_target_func = h2t->convert_char; -- host_char_to_target_baton = h2t->convert_char_baton; -- } -- else if (host == target) -- host_char_to_target_func = identity_either_char_to_other; -- else -- { -- host_char_to_target_func = iconv_convert; -- host_char_to_target_baton = &cached_iconv_host_to_target; -- } -+ struct wchar_iterator *result; -+ iconv_t desc; - -- if (t2h && t2h->convert_char) -- { -- target_char_to_host_func = t2h->convert_char; -- target_char_to_host_baton = t2h->convert_char_baton; -- } -- else if (host == target) -- target_char_to_host_func = identity_either_char_to_other; -- else -- { -- target_char_to_host_func = iconv_convert; -- target_char_to_host_baton = &cached_iconv_target_to_host; -- } -+ desc = iconv_open ("wchar_t", charset); -+ if (desc == (iconv_t) -1) -+ perror_with_name ("Converting character sets"); - -- current_host_charset = host; -- current_target_charset = target; --} -- --/* Do the real work of setting the host charset. */ --static void --set_host_charset (const char *charset) --{ -- struct charset *cs = lookup_charset_or_error (charset); -- check_valid_host_charset (cs); -- set_host_and_target_charsets (cs, current_target_charset); --} -+ result = XNEW (struct wchar_iterator); -+ result->desc = desc; -+ result->input = (char *) input; -+ result->bytes = bytes; -+ result->width = width; - --/* Do the real work of setting the target charset. */ --static void --set_target_charset (const char *charset) --{ -- struct charset *cs = lookup_charset_or_error (charset); -+ result->out = XNEW (wchar_t); -+ result->out_size = 1; - -- set_host_and_target_charsets (current_host_charset, cs); -+ return result; - } - -- --/* 'Set charset', 'set host-charset', 'set target-charset', 'show -- charset' sfunc's. */ -- --/* This is the sfunc for the 'set charset' command. */ - static void --set_charset_sfunc (char *charset, int from_tty, struct cmd_list_element *c) -+do_cleanup_iterator (void *p) - { -- struct charset *cs = lookup_charset_or_error (host_charset_name); -- check_valid_host_charset (cs); -- /* CAREFUL: set the target charset here as well. */ -- target_charset_name = host_charset_name; -- set_host_and_target_charsets (cs, cs); --} -+ struct wchar_iterator *iter = p; - --/* 'set host-charset' command sfunc. We need a wrapper here because -- the function needs to have a specific signature. */ --static void --set_host_charset_sfunc (char *charset, int from_tty, -- struct cmd_list_element *c) --{ -- set_host_charset (host_charset_name); -+ iconv_close (iter->desc); -+ xfree (iter->out); -+ xfree (iter); - } - --/* Wrapper for the 'set target-charset' command. */ --static void --set_target_charset_sfunc (char *charset, int from_tty, -- struct cmd_list_element *c) -+struct cleanup * -+make_cleanup_wchar_iterator (struct wchar_iterator *iter) - { -- set_target_charset (target_charset_name); -+ return make_cleanup (do_cleanup_iterator, iter); - } - --/* sfunc for the 'show charset' command. */ --static void --show_charset (struct ui_file *file, int from_tty, struct cmd_list_element *c, -- const char *name) --{ -- if (current_host_charset == current_target_charset) -- fprintf_filtered (file, -- _("The current host and target character set is `%s'.\n"), -- host_charset ()); -- else -+int -+wchar_iterate (struct wchar_iterator *iter, -+ enum wchar_iterate_result *out_result, -+ wchar_t **out_chars, -+ const gdb_byte **ptr, -+ size_t *len) -+{ -+ size_t out_request; -+ -+ /* Try to convert some characters. At first we try to convert just -+ a single character. The reason for this is that iconv does not -+ necessarily update its outgoing arguments when it encounters an -+ invalid input sequence -- but we want to reliably report this to -+ our caller so it can emit an escape sequence. */ -+ out_request = 1; -+ while (iter->bytes > 0) - { -- fprintf_filtered (file, _("The current host character set is `%s'.\n"), -- host_charset ()); -- fprintf_filtered (file, _("The current target character set is `%s'.\n"), -- target_charset ()); -+ char *outptr = (char *) &iter->out[0]; -+ char *orig_inptr = iter->input; -+ size_t orig_in = iter->bytes; -+ size_t out_avail = out_request * sizeof (wchar_t); -+ size_t num; -+ wchar_t result; -+ -+ size_t r = iconv (iter->desc, (char **) &iter->input, &iter->bytes, -+ &outptr, &out_avail); -+ if (r == (size_t) -1) -+ { -+ switch (errno) -+ { -+ case EILSEQ: -+ /* Invalid input sequence. Skip it, and let the caller -+ know about it. */ -+ *out_result = wchar_iterate_invalid; -+ *ptr = iter->input; -+ *len = iter->width; -+ iter->input += iter->width; -+ iter->bytes -= iter->width; -+ return 0; -+ -+ case E2BIG: -+ /* We ran out of space. We still might have converted a -+ character; if so, return it. Otherwise, grow the -+ buffer and try again. */ -+ if (out_avail < out_request * sizeof (wchar_t)) -+ break; -+ -+ ++out_request; -+ if (out_request > iter->out_size) -+ { -+ iter->out_size = out_request; -+ iter->out = xrealloc (iter->out, -+ out_request * sizeof (wchar_t)); -+ } -+ continue; -+ -+ case EINVAL: -+ /* Incomplete input sequence. Let the caller know, and -+ arrange for future calls to see EOF. */ -+ *out_result = wchar_iterate_incomplete; -+ *ptr = iter->input; -+ *len = iter->bytes; -+ iter->bytes = 0; -+ return 0; -+ -+ default: -+ perror_with_name ("Internal error while converting character sets"); -+ } -+ } -+ -+ /* We converted something. */ -+ num = out_request - out_avail / sizeof (wchar_t); -+ *out_result = wchar_iterate_ok; -+ *out_chars = iter->out; -+ *ptr = orig_inptr; -+ *len = orig_in - iter->bytes; -+ return num; - } -+ -+ /* Really done. */ -+ *out_result = wchar_iterate_eof; -+ return -1; - } - - --/* Accessor functions. */ -+/* The charset.c module initialization function. */ - --const char * --host_charset (void) --{ -- return current_host_charset->name; --} -+extern initialize_file_ftype _initialize_charset; /* -Wmissing-prototype */ - --const char * --target_charset (void) --{ -- return current_target_charset->name; --} -+typedef char *char_ptr; -+DEF_VEC_P (char_ptr); - -+static VEC (char_ptr) *charsets; - -- --/* Public character management functions. */ -+#ifdef HAVE_ICONVLIST - -+/* A helper function that adds some character sets to the vector of -+ all character sets. This is a callback function for iconvlist. */ - --const char * --c_target_char_has_backslash_escape (int target_char) -+static int -+add_one (unsigned int count, const char *const *names, void *data) - { -- return ((*c_target_char_has_backslash_escape_func) -- (c_target_char_has_backslash_escape_baton, target_char)); --} -+ unsigned int i; - -+ for (i = 0; i < count; ++i) -+ VEC_safe_push (char_ptr, charsets, xstrdup (names[i])); - --int --c_parse_backslash (int host_char, int *target_char) --{ -- return (*c_parse_backslash_func) (c_parse_backslash_baton, -- host_char, target_char); -+ return 0; - } - -- --int --host_char_print_literally (int host_char) -+static void -+find_charset_names (void) - { -- return ((*current_host_charset->host_char_print_literally) -- (current_host_charset->host_char_print_literally_baton, -- host_char)); -+ iconvlist (add_one, NULL); -+ VEC_safe_push (char_ptr, charsets, NULL); - } - -+#else - --int --target_char_to_control_char (int target_char, int *target_ctrl_char) -+static void -+find_charset_names (void) - { -- return ((*current_target_charset->target_char_to_control_char) -- (current_target_charset->target_char_to_control_char_baton, -- target_char, target_ctrl_char)); --} -+ FILE *in; - -+ in = popen ("iconv -l", "r"); -+ /* It is ok to ignore errors; we'll fall back on a default. */ -+ if (!in) -+ return; - --int --host_char_to_target (int host_char, int *target_char) --{ -- return ((*host_char_to_target_func) -- (host_char_to_target_baton, host_char, target_char)); --} -+ /* POSIX says that iconv -l uses an unspecified format. We parse -+ the glibc format; feel free to add others as needed. */ -+ while (!feof (in)) -+ { -+ /* The size of buf is chosen arbitrarily. A character set name -+ longer than this would not be very nice. */ -+ char buf[80]; -+ int len; -+ char *r = fgets (buf, sizeof (buf), in); -+ if (!r) -+ break; -+ len = strlen (r); -+ if (len <= 3) -+ continue; -+ if (buf[len - 2] == '/' && buf[len - 3] == '/') -+ buf[len - 3] = '\0'; -+ VEC_safe_push (char_ptr, charsets, xstrdup (buf)); -+ } - -+ pclose (in); - --int --target_char_to_host (int target_char, int *host_char) --{ -- return ((*target_char_to_host_func) -- (target_char_to_host_baton, target_char, host_char)); -+ VEC_safe_push (char_ptr, charsets, NULL); - } - -- -- --/* The charset.c module initialization function. */ -- --extern initialize_file_ftype _initialize_charset; /* -Wmissing-prototype */ -+#endif /* HAVE_ICONVLIST */ - - void - _initialize_charset (void) - { - struct cmd_list_element *new_cmd; - -- /* Register all the character set GDB knows about. -- -- You should use the same names that iconv does, where possible, to -- take advantage of the iconv-based default behaviors. -- -- CAUTION: if you register a character set, you must also register -- as many translations as are necessary to make that character set -- interoperate correctly with all the other character sets. We do -- provide default behaviors when no translation is available, or -- when a translation's function pointer for a particular operation -- is zero. Hopefully, these defaults will be correct often enough -- that we won't need to provide too many translations. */ -- register_charset (simple_charset ("ASCII", 1, -- ascii_print_literally, 0, -- ascii_to_control, 0)); -- register_charset (iso_8859_family_charset ("ISO-8859-1")); -- register_charset (ebcdic_family_charset ("EBCDIC-US")); -- register_charset (ebcdic_family_charset ("IBM1047")); -- register_iconv_charsets (); -- -- { -- struct { char *from; char *to; int *table; } tlist[] = { -- { "ASCII", "ISO-8859-1", ascii_to_iso_8859_1_table }, -- { "ASCII", "EBCDIC-US", ascii_to_ebcdic_us_table }, -- { "ASCII", "IBM1047", ascii_to_ibm1047_table }, -- { "ISO-8859-1", "ASCII", iso_8859_1_to_ascii_table }, -- { "ISO-8859-1", "EBCDIC-US", iso_8859_1_to_ebcdic_us_table }, -- { "ISO-8859-1", "IBM1047", iso_8859_1_to_ibm1047_table }, -- { "EBCDIC-US", "ASCII", ebcdic_us_to_ascii_table }, -- { "EBCDIC-US", "ISO-8859-1", ebcdic_us_to_iso_8859_1_table }, -- { "EBCDIC-US", "IBM1047", ebcdic_us_to_ibm1047_table }, -- { "IBM1047", "ASCII", ibm1047_to_ascii_table }, -- { "IBM1047", "ISO-8859-1", ibm1047_to_iso_8859_1_table }, -- { "IBM1047", "EBCDIC-US", ibm1047_to_ebcdic_us_table } -- }; -- -- int i; -- -- for (i = 0; i < (sizeof (tlist) / sizeof (tlist[0])); i++) -- register_translation (simple_table_translation (tlist[i].from, -- tlist[i].to, -- tlist[i].table)); -- } -- -- set_host_charset (host_charset_name); -- set_target_charset (target_charset_name); -+ /* The first element is always "auto"; then we skip it for the -+ commands where it is not allowed. */ -+ VEC_safe_push (char_ptr, charsets, "auto"); -+ find_charset_names (); -+ -+ if (VEC_length (char_ptr, charsets) > 1) -+ charset_enum = default_charset_names; -+ else -+ charset_enum = (const char **) VEC_address (char_ptr, charsets); -+ -+#ifdef HAVE_LANGINFO_CODESET -+ auto_host_charset_name = nl_langinfo (CODESET); -+ target_charset_name = auto_host_charset_name; -+ -+ set_be_le_names (); -+#endif - - add_setshow_enum_cmd ("charset", class_support, -- host_charset_enum, &host_charset_name, _("\ -+ &charset_enum[1], &host_charset_name, _("\ - Set the host and target character sets."), _("\ - Show the host and target character sets."), _("\ - The `host character set' is the one used by the system GDB is running on.\n\ -@@ -1249,7 +650,7 @@ To see a list of the character sets GDB supports, type `set charset '."), - &setlist, &showlist); - - add_setshow_enum_cmd ("host-charset", class_support, -- host_charset_enum, &host_charset_name, _("\ -+ charset_enum, &host_charset_name, _("\ - Set the host character set."), _("\ - Show the host character set."), _("\ - The `host character set' is the one used by the system GDB is running on.\n\ -@@ -1261,7 +662,7 @@ To see a list of the character sets GDB supports, type `set host-charset '. - &setlist, &showlist); - - add_setshow_enum_cmd ("target-charset", class_support, -- target_charset_enum, &target_charset_name, _("\ -+ &charset_enum[1], &target_charset_name, _("\ - Set the target character set."), _("\ - Show the target character set."), _("\ - The `target character set' is the one used by the program being debugged.\n\ -@@ -1271,4 +672,19 @@ To see a list of the character sets GDB supports, type `set target-charset' - set_target_charset_sfunc, - show_target_charset_name, - &setlist, &showlist); -+ -+ add_setshow_enum_cmd ("target-wide-charset", class_support, -+ &charset_enum[1], &target_wide_charset_name, -+ _("\ -+Set the target wide character set."), _("\ -+Show the target wide character set."), _("\ -+The `target wide character set' is the one used by the program being debugged.\n\ -+In particular it is the encoding used by `wchar_t'.\n\ -+GDB translates characters and strings between the host and target\n\ -+character sets as needed.\n\ -+To see a list of the character sets GDB supports, type\n\ -+`set target-wide-charset'"), -+ set_target_wide_charset_sfunc, -+ show_target_wide_charset_name, -+ &setlist, &showlist); - } -diff --git a/gdb/charset.h b/gdb/charset.h -index 21780b6..2455355 100644 ---- a/gdb/charset.h -+++ b/gdb/charset.h -@@ -19,6 +19,7 @@ - #ifndef CHARSET_H - #define CHARSET_H - -+#include - - /* If the target program uses a different character set than the host, - GDB has some support for translating between the two; GDB converts -@@ -26,82 +27,123 @@ - them, and converts characters and strings appearing in expressions - entered by the user to the target character set. - -- At the moment, GDB only supports single-byte, stateless character -- sets. This includes the ISO-8859 family (ASCII extended with -- accented characters, and (I think) Cyrillic, for European -- languages), and the EBCDIC family (used on IBM's mainframes). -- Unfortunately, it excludes many Asian scripts, the fixed- and -- variable-width Unicode encodings, and other desireable things. -- Patches are welcome! (For example, it would be nice if the Java -- string support could simply get absorbed into some more general -- multi-byte encoding support.) -- -- Furthermore, GDB's code pretty much assumes that the host character -- set is some superset of ASCII; there are plenty if ('0' + n) -- expressions and the like. -- -- When the `iconv' library routine supports a character set meeting -- the requirements above, it's easy to plug an entry into GDB's table -- that uses iconv to handle the details. */ -+ GDB's code pretty much assumes that the host character set is some -+ superset of ASCII; there are plenty if ('0' + n) expressions and -+ the like. */ - - /* Return the name of the current host/target character set. The - result is owned by the charset module; the caller should not free - it. */ - const char *host_charset (void); - const char *target_charset (void); -- --/* In general, the set of C backslash escapes (\n, \f) is specific to -- the character set. Not all character sets will have form feed -- characters, for example. -- -- The following functions allow GDB to parse and print control -- characters in a character-set-independent way. They are both -- language-specific (to C and C++) and character-set-specific. -- Putting them here is a compromise. */ -- -- --/* If the target character TARGET_CHAR have a backslash escape in the -- C language (i.e., a character like 'n' or 't'), return the host -- character string that should follow the backslash. Otherwise, -- return zero. -- -- When this function returns non-zero, the string it returns is -- statically allocated; the caller is not responsible for freeing it. */ --const char *c_target_char_has_backslash_escape (int target_char); -- -- --/* If the host character HOST_CHAR is a valid backslash escape in the -- C language for the target character set, return non-zero, and set -- *TARGET_CHAR to the target character the backslash escape represents. -- Otherwise, return zero. */ --int c_parse_backslash (int host_char, int *target_char); -- -- --/* Return non-zero if the host character HOST_CHAR can be printed -- literally --- that is, if it can be readably printed as itself in a -- character or string constant. Return zero if it should be printed -- using some kind of numeric escape, like '\031' in C, '^(25)' in -- Chill, or #25 in Pascal. */ --int host_char_print_literally (int host_char); -- -- --/* If the host character HOST_CHAR has an equivalent in the target -- character set, set *TARGET_CHAR to that equivalent, and return -- non-zero. Otherwise, return zero. */ --int host_char_to_target (int host_char, int *target_char); -- -- --/* If the target character TARGET_CHAR has an equivalent in the host -- character set, set *HOST_CHAR to that equivalent, and return -- non-zero. Otherwise, return zero. */ --int target_char_to_host (int target_char, int *host_char); -- -- --/* If the target character TARGET_CHAR has a corresponding control -- character (also in the target character set), set *TARGET_CTRL_CHAR -- to the control character, and return non-zero. Otherwise, return -- zero. */ --int target_char_to_control_char (int target_char, int *target_ctrl_char); -- -+const char *target_wide_charset (void); -+ -+/* These values are used to specify the type of transliteration done -+ by convert_between_encodings. */ -+enum transliterations -+ { -+ /* Error on failure to convert. */ -+ translit_none, -+ /* Transliterate to host char. */ -+ translit_char -+ }; -+ -+/* Convert between two encodings. -+ -+ FROM is the name of the source encoding. -+ TO is the name of the target encoding. -+ BYTES holds the bytes to convert; this is assumed to be characters -+ in the target encoding. -+ NUM_BYTES is the number of bytes. -+ WIDTH is the width of a character from the FROM charset, in bytes. -+ For a variable width encoding, WIDTH should be the size of a "base -+ character". -+ OUTPUT is an obstack where the converted data is written. The -+ caller is responsible for initializing the obstack, and for -+ destroying the obstack should an error occur. -+ TRANSLIT specifies how invalid conversions should be handled. */ -+void convert_between_encodings (const char *from, const char *to, -+ const gdb_byte *bytes, unsigned int num_bytes, -+ int width, struct obstack *output, -+ enum transliterations translit); -+ -+ -+/* These values are used by wchar_iterate to report errors. */ -+enum wchar_iterate_result -+ { -+ /* Ordinary return. */ -+ wchar_iterate_ok, -+ /* Invalid input sequence. */ -+ wchar_iterate_invalid, -+ /* Incomplete input sequence at the end of the input. */ -+ wchar_iterate_incomplete, -+ /* EOF. */ -+ wchar_iterate_eof -+ }; -+ -+/* Declaration of the opaque wchar iterator type. */ -+struct wchar_iterator; -+ -+/* Create a new character iterator which returns wchar_t's. INPUT is -+ the input buffer. BYTES is the number of bytes in the input -+ buffer. CHARSET is the name of the character set in which INPUT is -+ encoded. WIDTH is the number of bytes in a base character of -+ CHARSET. -+ -+ This function either returns a new character set iterator, or calls -+ error. The result can be freed using a cleanup; see -+ make_cleanup_wchar_iterator. */ -+struct wchar_iterator *make_wchar_iterator (const gdb_byte *input, size_t bytes, -+ const char *charset, -+ size_t width); -+ -+/* Return a new cleanup suitable for destroying the wchar iterator -+ ITER. */ -+struct cleanup *make_cleanup_wchar_iterator (struct wchar_iterator *iter); -+ -+/* Perform a single iteration of a wchar_t iterator. -+ -+ Returns the number of characters converted. A negative result -+ means that EOF has been reached. A positive result indicates the -+ number of valid wchar_ts in the result; *OUT_CHARS is updated to -+ point to the first valid character. -+ -+ In all cases aside from EOF, *PTR is set to point to the first -+ converted target byte. *LEN is set to the number of bytes -+ converted. -+ -+ A zero result means one of several unusual results. *OUT_RESULT is -+ set to indicate the type of un-ordinary return. -+ -+ wchar_iterate_invalid means that an invalid input character was -+ seen. The iterator is advanced by WIDTH (the argument to -+ make_wchar_iterator) bytes. -+ -+ wchar_iterate_incomplete means that an incomplete character was -+ seen at the end of the input sequence. -+ -+ wchar_iterate_eof means that all bytes were successfully -+ converted. The other output arguments are not set. */ -+int wchar_iterate (struct wchar_iterator *iter, -+ enum wchar_iterate_result *out_result, -+ wchar_t **out_chars, -+ const gdb_byte **ptr, size_t *len); -+ -+ -+ -+/* GDB needs to know a few details of its execution character set. -+ This knowledge is isolated here and in charset.c. */ -+ -+/* The escape character. */ -+#define HOST_ESCAPE_CHAR 27 -+ -+/* Convert a letter, like 'c', to its corresponding control -+ character. */ -+char host_letter_to_control_character (char c); -+ -+/* Convert a hex digit character to its numeric value. E.g., 'f' is -+ converted to 15. This function assumes that C is a valid hex -+ digit. Both upper- and lower-case letters are recognized. */ -+int host_hex_value (char c); - - #endif /* CHARSET_H */ diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c -index 4d9c4f3..5fbe398 100644 +index ce7c2a6..6380fec 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c -@@ -45,6 +45,8 @@ +@@ -46,6 +46,8 @@ #include "cli/cli-setshow.h" #include "cli/cli-cmds.h" @@ -10769,7 +1102,7 @@ index 4d9c4f3..5fbe398 100644 #ifdef TUI #include "tui/tui.h" /* For tui_active et.al. */ #endif -@@ -178,6 +180,7 @@ struct cmd_list_element *showchecklist; +@@ -183,6 +185,7 @@ struct cmd_list_element *showchecklist; /* Command tracing state. */ @@ -10777,7 +1110,7 @@ index 4d9c4f3..5fbe398 100644 int source_verbose = 0; int trace_commands = 0; -@@ -439,6 +442,7 @@ source_script (char *file, int from_tty) +@@ -444,6 +447,7 @@ source_script (char *file, int from_tty) struct cleanup *old_cleanups; char *full_pathname = NULL; int fd; @@ -10785,7 +1118,7 @@ index 4d9c4f3..5fbe398 100644 if (file == NULL || *file == 0) { -@@ -471,8 +475,16 @@ source_script (char *file, int from_tty) +@@ -476,8 +480,16 @@ source_script (char *file, int from_tty) } } @@ -10803,7 +1136,7 @@ index 4d9c4f3..5fbe398 100644 do_cleanups (old_cleanups); } -@@ -486,15 +498,30 @@ source_verbose_cleanup (void *old_value) +@@ -491,15 +503,30 @@ source_verbose_cleanup (void *old_value) xfree (old_value); } @@ -10838,7 +1171,7 @@ index 4d9c4f3..5fbe398 100644 /* -v causes the source command to run in verbose mode. We still have to be able to handle filenames with spaces in a -@@ -502,23 +529,28 @@ source_command (char *args, int from_tty) +@@ -507,23 +534,28 @@ source_command (char *args, int from_tty) if (args) { @@ -10880,7 +1213,7 @@ index 4d9c4f3..5fbe398 100644 } -@@ -1282,7 +1314,9 @@ Read commands from a file named FILE.\n\ +@@ -1307,7 +1339,9 @@ Read commands from a file named FILE.\n\ Optional -v switch (before the filename) causes each command in\n\ FILE to be echoed as it is executed.\n\ Note that the file \"%s\" is read automatically in this way\n\ @@ -10891,21 +1224,8 @@ index 4d9c4f3..5fbe398 100644 c = add_cmd ("source", class_support, source_command, source_help_text, &cmdlist); set_cmd_completer (c, filename_completer); -diff --git a/gdb/cli/cli-dump.c b/gdb/cli/cli-dump.c -index ee29f2a..96e6111 100644 ---- a/gdb/cli/cli-dump.c -+++ b/gdb/cli/cli-dump.c -@@ -296,7 +296,7 @@ dump_value_to_file (char *cmd, char *mode, char *file_format) - - if (VALUE_LVAL (val)) - { -- vaddr = VALUE_ADDRESS (val); -+ vaddr = value_address (val); - } - else - { diff --git a/gdb/coffread.c b/gdb/coffread.c -index 6059d68..47ee601 100644 +index 888f8b4..65494b8 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -346,7 +346,7 @@ coff_alloc_type (int index) @@ -10917,7 +1237,7 @@ index 6059d68..47ee601 100644 *type_addr = type; } return type; -@@ -2101,6 +2101,7 @@ static struct sym_fns coff_sym_fns = +@@ -2121,6 +2121,7 @@ static struct sym_fns coff_sym_fns = coff_new_init, /* sym_new_init: init anything gbl to entire symtab */ coff_symfile_init, /* sym_init: read initial info, setup for sym_read() */ coff_symfile_read, /* sym_read: read a symbol file into symtab */ @@ -10926,90 +1246,301 @@ index 6059d68..47ee601 100644 default_symfile_offsets, /* sym_offsets: xlate external to internal form */ default_symfile_segments, /* sym_segments: Get segment information from diff --git a/gdb/config.in b/gdb/config.in -index 6aaf77a..0c8ccab 100644 +index f2d56a0..0909c80 100644 --- a/gdb/config.in +++ b/gdb/config.in -@@ -42,6 +42,12 @@ +@@ -43,11 +43,10 @@ language is requested. */ #undef ENABLE_NLS +-/* look for global separate data files in this path [DATADIR/gdb] */ +/* Global directory for GDB data files. */ -+#undef GDB_DATADIR -+ + #undef GDB_DATADIR + +-/* Define if the gdb-datadir directory should be relocated when GDB is moved. +- */ +/* Define if GDB datadir should be relocated when GDB is moved. */ -+#undef GDB_DATADIR_RELOCATABLE -+ + #undef GDB_DATADIR_RELOCATABLE + /* Define to be a string naming the default host character set. */ - #undef GDB_DEFAULT_HOST_CHARSET - -@@ -169,12 +175,18 @@ - /* Define if you have the iconv() function. */ - #undef HAVE_ICONV - -+/* Define to 1 if you have the `iconvlist' function. */ -+#undef HAVE_ICONVLIST -+ - /* Define if your compiler supports the #include_next directive. */ - #undef HAVE_INCLUDE_NEXT - - /* Define to 1 if you have the header file. */ - #undef HAVE_INTTYPES_H - -+/* Define if you have and nl_langinfo(CODESET). */ -+#undef HAVE_LANGINFO_CODESET -+ - /* Define if your file defines LC_MESSAGES. */ - #undef HAVE_LC_MESSAGES - -@@ -618,6 +630,9 @@ +@@ -641,6 +640,9 @@ 'ptrdiff_t'. */ #undef PTRDIFF_T_SUFFIX +/* Define to install path for Python sources */ +#undef PYTHONDIR + - /* Bug reporting address */ - #undef REPORT_BUGS_TO + /* Relocated directory for source files. */ + #undef RELOC_SRCDIR +diff --git a/gdb/config/i386/nm-i386.h b/gdb/config/i386/nm-i386.h +new file mode 100644 +index 0000000..5f237cc +--- /dev/null ++++ b/gdb/config/i386/nm-i386.h +@@ -0,0 +1,125 @@ ++/* Native macro definitions for GDB on an Intel i[3456]86. ++ Copyright 2001, 2004, 2007, 2008, 2009 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#ifndef NM_I386_H ++#define NM_I386_H 1 ++ ++/* Hardware-assisted breakpoints and watchpoints. */ ++ ++/* Targets should define this to use the generic x86 watchpoint support. */ ++#ifdef I386_USE_GENERIC_WATCHPOINTS ++ ++/* Add watchpoint methods to the provided target_ops. Targets which call ++ this should also define I386_WATCHPOINTS_IN_TARGET_VECTOR. */ ++struct target_ops; ++void i386_use_watchpoints (struct target_ops *); ++ ++/* Clear the reference counts and forget everything we knew about DRi. */ ++extern void i386_cleanup_dregs (void); ++ ++/* Insert a watchpoint to watch a memory region which starts at ++ address ADDR and whose length is LEN bytes. Watch memory accesses ++ of the type TYPE. Return 0 on success, -1 on failure. */ ++extern int i386_insert_watchpoint (CORE_ADDR addr, int len, int type); ++ ++/* Remove a watchpoint that watched the memory region which starts at ++ address ADDR, whose length is LEN bytes, and for accesses of the ++ type TYPE. Return 0 on success, -1 on failure. */ ++extern int i386_remove_watchpoint (CORE_ADDR addr, int len, int type); ++ ++/* Return non-zero if we can watch a memory region that starts at ++ address ADDR and whose length is LEN bytes. */ ++extern int i386_region_ok_for_watchpoint (CORE_ADDR addr, int len); ++ ++/* Return non-zero if the inferior has some break/watchpoint that ++ triggered. */ ++extern int i386_stopped_by_hwbp (void); ++ ++/* If the inferior has some break/watchpoint that triggered, set ++ the address associated with that break/watchpoint and return ++ true. Otherwise, return false. */ ++extern int i386_stopped_data_address (struct target_ops *, CORE_ADDR *); ++ ++/* Insert a hardware-assisted breakpoint at BP_TGT->placed_address. ++ Return 0 on success, EBUSY on failure. */ ++struct bp_target_info; ++extern int i386_insert_hw_breakpoint (struct bp_target_info *bp_tgt); ++ ++/* Remove a hardware-assisted breakpoint at BP_TGT->placed_address. ++ Return 0 on success, -1 on failure. */ ++extern int i386_remove_hw_breakpoint (struct bp_target_info *bp_tgt); ++ ++extern int i386_stopped_by_watchpoint (void); ++ ++#ifndef I386_WATCHPOINTS_IN_TARGET_VECTOR ++ ++/* Returns the number of hardware watchpoints of type TYPE that we can ++ set. Value is positive if we can set CNT watchpoints, zero if ++ setting watchpoints of type TYPE is not supported, and negative if ++ CNT is more than the maximum number of watchpoints of type TYPE ++ that we can support. TYPE is one of bp_hardware_watchpoint, ++ bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint. ++ CNT is the number of such watchpoints used so far (including this ++ one). OTHERTYPE is non-zero if other types of watchpoints are ++ currently enabled. ++ ++ We always return 1 here because we don't have enough information ++ about possible overlap of addresses that they want to watch. As an ++ extreme example, consider the case where all the watchpoints watch ++ the same address and the same region length: then we can handle a ++ virtually unlimited number of watchpoints, due to debug register ++ sharing implemented via reference counts in i386-nat.c. */ ++ ++#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1 ++ ++/* Returns non-zero if we can use hardware watchpoints to watch a ++ region whose address is ADDR and whose length is LEN. */ ++ ++#define TARGET_REGION_OK_FOR_HW_WATCHPOINT(addr, len) \ ++ i386_region_ok_for_watchpoint (addr, len) ++ ++/* After a watchpoint trap, the PC points to the instruction after the ++ one that caused the trap. Therefore we don't need to step over it. ++ But we do need to reset the status register to avoid another trap. */ ++ ++#define HAVE_CONTINUABLE_WATCHPOINT 1 ++ ++#define STOPPED_BY_WATCHPOINT(W) (i386_stopped_by_watchpoint () != 0) ++ ++#define target_stopped_data_address(target, x) \ ++ i386_stopped_data_address(target, x) ++ ++/* Use these macros for watchpoint insertion/removal. */ ++ ++#define target_insert_watchpoint(addr, len, type) \ ++ i386_insert_watchpoint (addr, len, type) ++ ++#define target_remove_watchpoint(addr, len, type) \ ++ i386_remove_watchpoint (addr, len, type) ++ ++#define target_insert_hw_breakpoint(bp_tgt) \ ++ i386_insert_hw_breakpoint (bp_tgt) ++ ++#define target_remove_hw_breakpoint(bp_tgt) \ ++ i386_remove_hw_breakpoint (bp_tgt) ++ ++#endif /* I386_WATCHPOINTS_IN_TARGET_VECTOR */ ++ ++#endif /* I386_USE_GENERIC_WATCHPOINTS */ ++ ++#endif /* NM_I386_H */ +diff --git a/gdb/config/i386/nm-linux64.h b/gdb/config/i386/nm-linux64.h +new file mode 100644 +index 0000000..19d710a +--- /dev/null ++++ b/gdb/config/i386/nm-linux64.h +@@ -0,0 +1,54 @@ ++/* Native support for GNU/Linux x86-64. ++ ++ Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 ++ Free Software Foundation, Inc. ++ ++ Contributed by Jiri Smid, SuSE Labs. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#ifndef NM_LINUX64_H ++#define NM_LINUX64_H ++ ++/* GNU/Linux supports the i386 hardware debugging registers. */ ++#define I386_USE_GENERIC_WATCHPOINTS ++#define I386_WATCHPOINTS_IN_TARGET_VECTOR ++ ++#include "i386/nm-i386.h" ++#include "config/nm-linux.h" ++ ++/* Support for 8-byte wide hardware watchpoints. */ ++#define TARGET_HAS_DR_LEN_8 1 ++ ++/* Provide access to the i386 hardware debugging registers. */ ++ ++extern void amd64_linux_dr_set_control (unsigned long control); ++#define I386_DR_LOW_SET_CONTROL(control) \ ++ amd64_linux_dr_set_control (control) ++ ++extern void amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr); ++#define I386_DR_LOW_SET_ADDR(regnum, addr) \ ++ amd64_linux_dr_set_addr (regnum, addr) ++ ++extern void amd64_linux_dr_reset_addr (int regnum); ++#define I386_DR_LOW_RESET_ADDR(regnum) \ ++ amd64_linux_dr_reset_addr (regnum) ++ ++extern unsigned long amd64_linux_dr_get_status (void); ++#define I386_DR_LOW_GET_STATUS() \ ++ amd64_linux_dr_get_status () ++ ++#endif /* nm-linux64.h */ +diff --git a/gdb/config/mips/nm-irix5.h b/gdb/config/mips/nm-irix5.h +new file mode 100644 +index 0000000..49ac420 +--- /dev/null ++++ b/gdb/config/mips/nm-irix5.h +@@ -0,0 +1,44 @@ ++/* Definitions for native support of irix5. ++ ++ Copyright 1993, 1996, 1998, 1999, 2000, 2007, 2008, 2009 ++ Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#define TARGET_HAS_HARDWARE_WATCHPOINTS ++ ++/* TARGET_CAN_USE_HARDWARE_WATCHPOINT is now defined to go through ++ the target vector. For Irix5, procfs_can_use_hw_watchpoint() ++ should be invoked. */ ++ ++/* When a hardware watchpoint fires off the PC will be left at the ++ instruction which caused the watchpoint. It will be necessary for ++ GDB to step over the watchpoint. */ ++ ++#define STOPPED_BY_WATCHPOINT(W) \ ++ procfs_stopped_by_watchpoint(inferior_ptid) ++extern int procfs_stopped_by_watchpoint (ptid_t); ++ ++/* Use these macros for watchpoint insertion/deletion. */ ++/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */ ++#define target_insert_watchpoint(ADDR, LEN, TYPE) \ ++ procfs_set_watchpoint (inferior_ptid, ADDR, LEN, TYPE, 0) ++#define target_remove_watchpoint(ADDR, LEN, TYPE) \ ++ procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0) ++extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int); ++ ++#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1 ++ diff --git a/gdb/configure b/gdb/configure -index 7579c84..3a5b582 100755 +index 93f7f4b..a6580e2 100755 --- a/gdb/configure +++ b/gdb/configure @@ -314,7 +314,7 @@ ac_subdirs_all="$ac_subdirs_all doc testsuite" ac_subdirs_all="$ac_subdirs_all gdbtk" ac_subdirs_all="$ac_subdirs_all multi-ice" ac_subdirs_all="$ac_subdirs_all gdbserver" --ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBICONV LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' -+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE GDB_DATADIR_PATH pythondir subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG LIBICONV LIBICONV_INCLUDE LIBICONV_LIBDIR READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' +-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE DEBUGDIR GDB_DATADIR subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE SYSTEM_GDBINIT WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags GDB_NM_FILE datarootdir docdir htmldir pdfdir LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE DEBUGDIR GDB_DATADIR GDB_DATADIR_PATH pythondir subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE SYSTEM_GDBINIT WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags GDB_NM_FILE datarootdir docdir htmldir pdfdir LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS' ac_subst_files='host_makefile_frag' ac_pwd=`pwd` -@@ -882,9 +882,14 @@ Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-separate-debug-dir=path Look for global separate debug info in this path LIBDIR/debug +@@ -891,6 +891,10 @@ Optional Packages: + [DATADIR/gdb] + --with-relocated-sources=PATH + automatically relocate this path for source files + --with-gdb-datadir look for global separate data files in this path + [DATADIR/gdb] + --with-pythondir install Python data files in this path + [DATADIR/gdb/python] - --with-libunwind Use libunwind frame unwinding support - --with-pkgversion=PKG Use PKG in the version string in place of "GDB" - --with-bugurl=URL Direct users to URL to report a bug -+ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib - --with-system-readline use installed readline library - --with-expat include expat support (auto/yes/no) - --with-gnu-ld assume the C compiler uses GNU ld default=no -@@ -899,7 +904,6 @@ Optional Packages: - --with-tcl directory containing tcl configuration (tclConfig.sh) - --with-tk directory containing tk configuration (tkConfig.sh) - --with-x use the X Window System -- --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib + --with-libunwind use libunwind frame unwinding support + --with-curses use the curses library instead of the termcap + library +@@ -7218,6 +7222,75 @@ _ACEOF - Some influential environment variables: - CC C compiler command -@@ -7130,6 +7134,75 @@ _ACEOF - ;; - esac + fi; +# GDB's datadir relocation + @@ -11083,234 +1614,7 @@ index 7579c84..3a5b582 100755 subdirs="$subdirs doc testsuite" -@@ -9989,6 +10062,226 @@ if test "$ac_cv_search_dlgetmodinfo" != no; then - fi - - -+ -+ -+ -+# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. -+if test "${with_libiconv_prefix+set}" = set; then -+ withval="$with_libiconv_prefix" -+ -+ for dir in `echo "$withval" | tr : ' '`; do -+ if test -d $dir/include; then LIBICONV_INCLUDE="-I$dir/include"; CPPFLAGS="$CPPFLAGS -I$dir/include"; fi -+ if test -d $dir/lib; then LIBICONV_LIBDIR="-L$dir/lib"; LDFLAGS="$LDFLAGS -L$dir/lib"; fi -+ done -+ -+fi; -+ -+ echo "$as_me:$LINENO: checking for iconv" >&5 -+echo $ECHO_N "checking for iconv... $ECHO_C" >&6 -+if test "${am_cv_func_iconv+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ -+ am_cv_func_iconv="no, consider installing GNU libiconv" -+ am_cv_lib_iconv=no -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+int -+main () -+{ -+iconv_t cd = iconv_open("",""); -+ iconv(cd,NULL,NULL,NULL,NULL); -+ iconv_close(cd); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ am_cv_func_iconv=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+ if test "$am_cv_func_iconv" != yes; then -+ am_save_LIBS="$LIBS" -+ LIBS="$LIBS -liconv" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+int -+main () -+{ -+iconv_t cd = iconv_open("",""); -+ iconv(cd,NULL,NULL,NULL,NULL); -+ iconv_close(cd); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ am_cv_lib_iconv=yes -+ am_cv_func_iconv=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+ LIBS="$am_save_LIBS" -+ fi -+ -+fi -+echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 -+echo "${ECHO_T}$am_cv_func_iconv" >&6 -+ if test "$am_cv_func_iconv" = yes; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define HAVE_ICONV 1 -+_ACEOF -+ -+ echo "$as_me:$LINENO: checking for iconv declaration" >&5 -+echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6 -+ if test "${am_cv_proto_iconv+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+#include -+#include -+extern -+#ifdef __cplusplus -+"C" -+#endif -+#if defined(__STDC__) || defined(__cplusplus) -+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); -+#else -+size_t iconv(); -+#endif -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ am_cv_proto_iconv_arg1="" -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+am_cv_proto_iconv_arg1="const" -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" -+fi -+ -+ am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` -+ echo "$as_me:$LINENO: result: ${ac_t:- -+ }$am_cv_proto_iconv" >&5 -+echo "${ECHO_T}${ac_t:- -+ }$am_cv_proto_iconv" >&6 -+ -+cat >>confdefs.h <<_ACEOF -+#define ICONV_CONST $am_cv_proto_iconv_arg1 -+_ACEOF -+ -+ fi -+ LIBICONV= -+ if test "$am_cv_lib_iconv" = yes; then -+ LIBICONV="-liconv" -+ fi -+ -+ -+ -+ -+ - # On alpha-osf, it appears that libtermcap and libcurses are not compatible. - # There is a very specific comment in /usr/include/curses.h explaining that - # termcap routines built into libcurses must not be used. -@@ -11418,6 +11711,8 @@ _ACEOF +@@ -11837,6 +11910,8 @@ _ACEOF CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)" CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)" @@ -11319,364 +1623,22 @@ index 7579c84..3a5b582 100755 ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" # Flags needed to compile Python code (taken from python-config --cflags). -@@ -15445,10 +15740,11 @@ fi - - - -+ - for ac_func in canonicalize_file_name realpath getrusage getuid \ - getgid poll pread64 sbrk setpgid setpgrp setsid \ - sigaction sigprocmask sigsetmask socketpair syscall \ -- ttrace wborder setlocale -+ ttrace wborder setlocale iconvlist - do - as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` - echo "$as_me:$LINENO: checking for $ac_func" >&5 -@@ -15550,6 +15846,70 @@ fi - done - - -+ echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5 -+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 -+if test "${am_cv_langinfo_codeset+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+int -+main () -+{ -+char* cs = nl_langinfo(CODESET); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ am_cv_langinfo_codeset=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+am_cv_langinfo_codeset=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+ -+fi -+echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5 -+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6 -+ if test $am_cv_langinfo_codeset = yes; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define HAVE_LANGINFO_CODESET 1 -+_ACEOF -+ -+ fi -+ -+ - # Check the return and argument types of ptrace. No canned test for - # this, so roll our own. - gdb_ptrace_headers=' -@@ -20776,230 +21136,11 @@ done - - - -- - cat >>confdefs.h <<\_ACEOF --#define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1" -+#define GDB_DEFAULT_HOST_CHARSET "UTF-8" - _ACEOF - - -- -- -- --# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. --if test "${with_libiconv_prefix+set}" = set; then -- withval="$with_libiconv_prefix" -- -- for dir in `echo "$withval" | tr : ' '`; do -- if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi -- if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi -- done -- --fi; -- -- echo "$as_me:$LINENO: checking for iconv" >&5 --echo $ECHO_N "checking for iconv... $ECHO_C" >&6 --if test "${am_cv_func_iconv+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- -- am_cv_func_iconv="no, consider installing GNU libiconv" -- am_cv_lib_iconv=no -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --#include --#include --int --main () --{ --iconv_t cd = iconv_open("",""); -- iconv(cd,NULL,NULL,NULL,NULL); -- iconv_close(cd); -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- am_cv_func_iconv=yes --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --fi --rm -f conftest.err conftest.$ac_objext \ -- conftest$ac_exeext conftest.$ac_ext -- if test "$am_cv_func_iconv" != yes; then -- am_save_LIBS="$LIBS" -- LIBS="$LIBS -liconv" -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --#include --#include --int --main () --{ --iconv_t cd = iconv_open("",""); -- iconv(cd,NULL,NULL,NULL,NULL); -- iconv_close(cd); -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- am_cv_lib_iconv=yes -- am_cv_func_iconv=yes --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --fi --rm -f conftest.err conftest.$ac_objext \ -- conftest$ac_exeext conftest.$ac_ext -- LIBS="$am_save_LIBS" -- fi -- --fi --echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 --echo "${ECHO_T}$am_cv_func_iconv" >&6 -- if test "$am_cv_func_iconv" = yes; then -- --cat >>confdefs.h <<\_ACEOF --#define HAVE_ICONV 1 --_ACEOF -- -- echo "$as_me:$LINENO: checking for iconv declaration" >&5 --echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6 -- if test "${am_cv_proto_iconv+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ -- --#include --#include --extern --#ifdef __cplusplus --"C" --#endif --#if defined(__STDC__) || defined(__cplusplus) --size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); --#else --size_t iconv(); --#endif -- --int --main () --{ -- -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- am_cv_proto_iconv_arg1="" --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --am_cv_proto_iconv_arg1="const" --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -- am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" --fi -- -- am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` -- echo "$as_me:$LINENO: result: ${ac_t:- -- }$am_cv_proto_iconv" >&5 --echo "${ECHO_T}${ac_t:- -- }$am_cv_proto_iconv" >&6 -- --cat >>confdefs.h <<_ACEOF --#define ICONV_CONST $am_cv_proto_iconv_arg1 --_ACEOF -- -- fi -- LIBICONV= -- if test "$am_cv_lib_iconv" = yes; then -- LIBICONV="-liconv" -- fi -- -- -- - ac_config_files="$ac_config_files Makefile .gdbinit:gdbinit.in gnulib/Makefile" - ac_config_commands="$ac_config_commands default" - cat >confcache <<\_ACEOF -@@ -21865,6 +22006,8 @@ s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t - s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t - s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +@@ -22174,6 +22249,8 @@ s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t + s,@DEBUGDIR@,$DEBUGDIR,;t t + s,@GDB_DATADIR@,$GDB_DATADIR,;t t +s,@GDB_DATADIR_PATH@,$GDB_DATADIR_PATH,;t t +s,@pythondir@,$pythondir,;t t s,@subdirs@,$subdirs,;t t s,@TARGET_OBS@,$TARGET_OBS,;t t s,@PKGVERSION@,$PKGVERSION,;t t -@@ -21880,6 +22023,9 @@ s,@WINDRES@,$WINDRES,;t t - s,@ac_ct_WINDRES@,$ac_ct_WINDRES,;t t - s,@MIG@,$MIG,;t t - s,@ac_ct_MIG@,$ac_ct_MIG,;t t -+s,@LIBICONV@,$LIBICONV,;t t -+s,@LIBICONV_INCLUDE@,$LIBICONV_INCLUDE,;t t -+s,@LIBICONV_LIBDIR@,$LIBICONV_LIBDIR,;t t - s,@READLINE@,$READLINE,;t t - s,@READLINE_DEPS@,$READLINE_DEPS,;t t - s,@READLINE_CFLAGS@,$READLINE_CFLAGS,;t t -@@ -21944,7 +22090,6 @@ s,@CONFIG_UNINSTALL@,$CONFIG_UNINSTALL,;t t - s,@target_subdir@,$target_subdir,;t t - s,@frags@,$frags,;t t - s,@nm_h@,$nm_h,;t t --s,@LIBICONV@,$LIBICONV,;t t - s,@LIBOBJS@,$LIBOBJS,;t t - s,@LTLIBOBJS@,$LTLIBOBJS,;t t - s,@gl_LIBOBJS@,$gl_LIBOBJS,;t t diff --git a/gdb/configure.ac b/gdb/configure.ac -index 3f81ff2..ff76053 100644 +index 77f8436..bca368c 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac -@@ -1,6 +1,6 @@ - dnl Autoconf configure script for GDB, the GNU debugger. - dnl Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, --dnl 2005, 2006, 2007, 2008 -+dnl 2005, 2006, 2007, 2008, 2009 - dnl Free Software Foundation, Inc. - dnl - dnl This file is part of GDB. -@@ -118,6 +118,51 @@ case ${debugdir} in - ;; - esac +@@ -109,6 +109,51 @@ AS_HELP_STRING([--with-relocated-sources=PATH], [automatically relocate this pat + [Relocated directory for source files. ]) + ]) +# GDB's datadir relocation + @@ -11726,16 +1688,7 @@ index 3f81ff2..ff76053 100644 AC_CONFIG_SUBDIRS(doc testsuite) # Check whether to support alternative target configurations -@@ -430,6 +475,8 @@ AC_SEARCH_LIBS(zlibVersion, z, [AC_CHECK_HEADERS(zlib.h)]) - # On HP/UX we may need libxpdl for dlgetmodinfo (used by solib-pa64.c). - AC_SEARCH_LIBS(dlgetmodinfo, [dl xpdl]) - -+AM_ICONV -+ - # On alpha-osf, it appears that libtermcap and libcurses are not compatible. - # There is a very specific comment in /usr/include/curses.h explaining that - # termcap routines built into libcurses must not be used. -@@ -649,6 +696,8 @@ if test "${have_libpython}" = yes; then +@@ -660,6 +705,8 @@ if test "${have_libpython}" = yes; then CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)" CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)" @@ -11744,154 +1697,8 @@ index 3f81ff2..ff76053 100644 ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" # Flags needed to compile Python code (taken from python-config --cflags). -@@ -776,7 +825,8 @@ AC_FUNC_VFORK - AC_CHECK_FUNCS([canonicalize_file_name realpath getrusage getuid \ - getgid poll pread64 sbrk setpgid setpgrp setsid \ - sigaction sigprocmask sigsetmask socketpair syscall \ -- ttrace wborder setlocale]) -+ ttrace wborder setlocale iconvlist]) -+AM_LANGINFO_CODESET - - # Check the return and argument types of ptrace. No canned test for - # this, so roll our own. -@@ -1930,17 +1980,10 @@ dnl Check for exe extension set on certain hosts (e.g. Win32) - AC_EXEEXT - - dnl Detect the character set used by this host. -- --dnl At the moment, we just assume it's ISO-8859-1 (which is a --dnl superset of ASCII containing the characters needed for French, --dnl German, Spanish, Italian, and possibly others), but if were --dnl *were* to support any host character sets other than ISO-8859-1, --dnl here's where we'd detect it. --AC_DEFINE(GDB_DEFAULT_HOST_CHARSET, "ISO-8859-1", -+dnl At the moment, we just assume it's UTF-8. -+AC_DEFINE(GDB_DEFAULT_HOST_CHARSET, "UTF-8", - [Define to be a string naming the default host character set.]) - --AM_ICONV -- - AC_OUTPUT(Makefile .gdbinit:gdbinit.in gnulib/Makefile, - [ - dnl Autoconf doesn't provide a mechanism for modifying definitions -diff --git a/gdb/configure.tgt b/gdb/configure.tgt -index 65c3e25..f0cca7d 100644 ---- a/gdb/configure.tgt -+++ b/gdb/configure.tgt -@@ -36,7 +36,7 @@ alpha*-*-osf*) - alpha*-*-linux*) - # Target: Little-endian Alpha running Linux - gdb_target_obs="alpha-tdep.o alpha-mdebug-tdep.o alpha-linux-tdep.o \ -- solib.o solib-svr4.o" -+ solib.o solib-svr4.o linux-tdep.o" - ;; - alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) - # Target: FreeBSD/alpha -@@ -63,7 +63,7 @@ alpha*-*-*) - am33_2.0*-*-linux*) - # Target: Matsushita mn10300 (AM33) running Linux - gdb_target_obs="mn10300-tdep.o mn10300-linux-tdep.o corelow.o \ -- solib.o solib-svr4.o" -+ solib.o solib-svr4.o linux-tdep.o" - ;; - - arm*-wince-pe | arm*-*-mingw32ce*) -@@ -128,7 +128,7 @@ hppa*-*-hpux*) - hppa*-*-linux*) - # Target: HP PA-RISC running Linux - gdb_target_obs="hppa-tdep.o hppa-linux-tdep.o glibc-tdep.o \ -- solib.o solib-svr4.o symfile-mem.o" -+ solib.o solib-svr4.o symfile-mem.o linux-tdep.o" - ;; - hppa*-*-netbsd*) - # Target: NetBSD/hppa -@@ -218,7 +218,7 @@ i[34567]86-*-*) - ia64-*-linux*) - # Target: Intel IA-64 running GNU/Linux - gdb_target_obs="ia64-tdep.o ia64-linux-tdep.o \ -- solib.o solib-svr4.o symfile-mem.o" -+ solib.o solib-svr4.o symfile-mem.o linux-tdep.o" - build_gdbserver=yes - ;; - ia64*-*-*) -@@ -242,7 +242,8 @@ m32c-*-*) - m32r*-*-linux*) - # Target: Renesas M32R running GNU/Linux - gdb_target_obs="m32r-tdep.o m32r-linux-tdep.o remote-m32r-sdi.o \ -- glibc-tdep.o solib.o solib-svr4.o symfile-mem.o" -+ glibc-tdep.o solib.o solib-svr4.o symfile-mem.o \ -+ linux-tdep.o" - gdb_sim=../sim/m32r/libsim.a - build_gdbserver=yes - ;; -@@ -267,7 +268,7 @@ fido-*-elf*) - m68*-*-linux*) - # Target: Motorola m68k with a.out and ELF - gdb_target_obs="m68k-tdep.o m68klinux-tdep.o solib.o solib-svr4.o \ -- glibc-tdep.o symfile-mem.o" -+ glibc-tdep.o symfile-mem.o linux-tdep.o" - build_gdbserver=yes - ;; - m68*-*-netbsd* | m68*-*-knetbsd*-gnu) -@@ -303,7 +304,8 @@ mips*-sgi-irix6*) - mips*-*-linux*) - # Target: Linux/MIPS - gdb_target_obs="mips-tdep.o mips-linux-tdep.o glibc-tdep.o \ -- corelow.o solib.o solib-svr4.o symfile-mem.o" -+ corelow.o solib.o solib-svr4.o symfile-mem.o \ -+ linux-tdep.o" - gdb_sim=../sim/mips/libsim.a - build_gdbserver=yes - ;; -@@ -354,7 +356,8 @@ powerpc-*-aix* | rs6000-*-*) - powerpc-*-linux* | powerpc64-*-linux*) - # Target: PowerPC running Linux - gdb_target_obs="rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o \ -- solib.o solib-svr4.o corelow.o symfile-mem.o" -+ solib.o solib-svr4.o corelow.o symfile-mem.o \ -+ linux-tdep.o" - gdb_sim=../sim/ppc/libsim.a - build_gdbserver=yes - ;; -@@ -381,7 +384,8 @@ score-*-*) - sh*-*-linux*) - # Target: GNU/Linux Super-H - gdb_target_obs="sh-tdep.o sh64-tdep.o sh-linux-tdep.o monitor.o \ -- dsrec.o solib.o solib-svr4.o symfile-mem.o glibc-tdep.o" -+ dsrec.o solib.o solib-svr4.o symfile-mem.o glibc-tdep.o \ -+ linux-tdep.o" - gdb_sim=../sim/sh/libsim.a - build_gdbserver=yes - ;; -@@ -409,13 +413,14 @@ sh*) - sparc-*-linux*) - # Target: GNU/Linux SPARC - gdb_target_obs="sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o \ -- sparc-linux-tdep.o solib.o solib-svr4.o symfile-mem.o" -+ sparc-linux-tdep.o solib.o solib-svr4.o symfile-mem.o \ -+ linux-tdep.o" - ;; - sparc64-*-linux*) - # Target: GNU/Linux UltraSPARC - gdb_target_obs="sparc64-tdep.o sparc64-sol2-tdep.o sol2-tdep.o \ - sparc64-linux-tdep.o sparc-tdep.o sparc-sol2-tdep.o \ -- sparc-linux-tdep.o solib.o solib-svr4.o" -+ sparc-linux-tdep.o solib.o solib-svr4.o linux-tdep.o" - build_gdbserver=yes - ;; - sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu) -@@ -542,7 +547,8 @@ x86_64-*-openbsd*) - xtensa*-*-linux*) gdb_target=linux - # Target: GNU/Linux Xtensa - gdb_target_obs="xtensa-tdep.o xtensa-config.o xtensa-linux-tdep.o \ -- solib.o solib-svr4.o corelow.o symfile-mem.o" -+ solib.o solib-svr4.o corelow.o symfile-mem.o \ -+ linux-tdep.o" - build_gdbserver=yes - ;; - xtensa*) diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y -index 5f5ee3a..a8f8f30 100644 +index 62800b8..97d587b 100644 --- a/gdb/cp-name-parser.y +++ b/gdb/cp-name-parser.y @@ -1,7 +1,6 @@ @@ -11903,34 +1710,20 @@ index 5f5ee3a..a8f8f30 100644 Parts of the lexer are based on c-exp.y from GDB. -@@ -501,7 +500,7 @@ operator : OPERATOR NEW - | OPERATOR ARROW - { $$ = make_operator ("->", 2); } - | OPERATOR '(' ')' -- { $$ = make_operator ("()", 0); } -+ { $$ = make_operator ("()", 2); } - | OPERATOR '[' ']' - { $$ = make_operator ("[]", 2); } - ; +@@ -389,7 +388,7 @@ function + | colon_ext_only function_arglist start_opt + { $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp); + if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); } +- ++ | colon_ext_only + | conversion_op_name start_opt + { $$ = $1.comp; + if ($2) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2); } diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c -index c6c5617..eace9c4 100644 +index d2d8f2e..3166818 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c -@@ -30,26 +30,13 @@ - #include "dictionary.h" - #include "command.h" - #include "frame.h" -+#include "buildsym.h" - - /* List of using directives that are active in the current file. */ - --static struct using_direct *using_list; -- --static struct using_direct *cp_add_using (const char *name, -- unsigned int inner_len, -- unsigned int outer_len, -- struct using_direct *next); -- +@@ -35,15 +35,7 @@ static struct using_direct *cp_copy_usings (struct using_direct *using, struct obstack *obstack); @@ -11942,126 +1735,55 @@ index c6c5617..eace9c4 100644 - int scope_len); - static struct symbol *lookup_symbol_file (const char *name, - const char *linkage_name, +- const char *linkage_name, const struct block *block, -@@ -78,31 +65,6 @@ static struct symbol *lookup_possible_namespace_symbol (const char *name); - - static void maintenance_cplus_namespace (char *args, int from_tty); - --/* Set up support for dealing with C++ namespace info in the current -- symtab. */ -- --void cp_initialize_namespace () --{ -- using_list = NULL; --} -- --/* Add all the using directives we've gathered to the current symtab. -- STATIC_BLOCK should be the symtab's static block; OBSTACK is used -- for allocation. */ -- --void --cp_finalize_namespace (struct block *static_block, -- struct obstack *obstack) --{ -- if (using_list != NULL) -- { -- block_set_using (static_block, -- cp_copy_usings (using_list, obstack), -- obstack); -- using_list = NULL; -- } --} -- - /* Check to see if SYMBOL refers to an object contained within an - anonymous namespace; if so, add an appropriate using directive. */ - -@@ -136,14 +98,17 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) - "(anonymous namespace)", - ANONYMOUS_NAMESPACE_LEN) == 0) - { -+ int outer_len = (previous_component == 0 ? 0 : previous_component - 2); -+ char outer[outer_len+1]; -+ -+ strncpy(outer, name, outer_len); -+ -+ outer[outer_len] = '\0'; - /* We've found a component of the name that's an + const domain_enum domain, + int anonymous_namespace); +@@ -119,7 +111,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) anonymous namespace. So add symbols in it to the namespace given by the previous component if there is one, or to the global namespace if there isn't. */ -- cp_add_using_directive (name, -- previous_component == 0 -- ? 0 : previous_component - 2, -- next_component); -+ cp_add_using_directive (outer, name, "", "", 0); +- cp_add_using_directive (dest, src); ++ cp_add_using_directive (dest, src, "", "", 0); } /* The "+ 2" is for the "::". */ previous_component = next_component + 2; -@@ -154,32 +119,27 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) - } - } - --/* Add a using directive to using_list. NAME is the start of a string -- that should contain the namespaces we want to add as initial -- substrings, OUTER_LENGTH is the end of the outer namespace, and -- INNER_LENGTH is the end of the inner namespace. If the using -- directive in question has already been added, don't add it -- twice. */ -+/* Add a using directive to using_list. If the using directive in question -+ has already been added, don't add it twice. */ +@@ -134,7 +126,8 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) + has already been added, don't add it twice. */ void --cp_add_using_directive (const char *name, unsigned int outer_length, -- unsigned int inner_length) -+cp_add_using_directive (const char *outer, const char *inner, const char* alias, -+ const char *declaration, const int line_number) +-cp_add_using_directive (const char *dest, const char *src) ++cp_add_using_directive (const char *dest, const char *src, const char* alias, ++ const char *declaration, const int line_number) { struct using_direct *current; struct using_direct *new; - - /* Has it already been added? */ - -- for (current = using_list; current != NULL; current = current->next) -+ for (current = using_directives; current != NULL; current = current->next) - { -- if ((strncmp (current->inner, name, inner_length) == 0) -- && (strlen (current->inner) == inner_length) -- && (strlen (current->outer) == outer_length)) -+ if (strcmp (current->inner, inner) == 0 -+ && strcmp (current->outer, outer) == 0) +@@ -148,7 +141,8 @@ cp_add_using_directive (const char *dest, const char *src) return; } -- using_list = cp_add_using (name, inner_length, outer_length, -- using_list); -+ using_directives = cp_add_using (outer, inner, alias, declaration, -+ line_number,using_directives); +- using_directives = cp_add_using (dest, src, using_directives); ++ using_directives = cp_add_using (dest, src, alias, declaration, ++ line_number, using_directives); + } - /* Record the namespace that the function defined by SYMBOL was -@@ -230,26 +190,31 @@ cp_is_anonymous (const char *namespace) - != NULL); +@@ -201,7 +195,10 @@ cp_is_anonymous (const char *namespace) } --/* Create a new struct using direct whose inner namespace is the -- initial substring of NAME of leng INNER_LEN and whose outer -- namespace is the initial substring of NAME of length OUTER_LENGTH. -+/* Create a new struct using direct whose inner namespace is INNER -+ and whose outer namespace is OUTER. ALIAS is the name of the imported -+ namespace in the current scope. If ALIAS is an empty string then the + /* Create a new struct using direct which imports the namespace SRC +- into the scope DEST. ++ into the scope DEST. ALIAS is the name of the imported namespace ++ in the current scope. If ALIAS is an empty string then the + namespace is known by its original name. ++ Set its next member in the linked list to NEXT; allocate all memory using xmalloc. It copies the strings, so NAME can be a temporary string. */ - --static struct using_direct * --cp_add_using (const char *name, -- unsigned int inner_len, -- unsigned int outer_len, -+struct using_direct * -+cp_add_using (const char *outer, -+ const char *inner, +@@ -209,13 +206,19 @@ cp_is_anonymous (const char *namespace) + struct using_direct * + cp_add_using (const char *dest, + const char *src, + const char *alias, + const char *declaration, + const int line_number, @@ -12069,72 +1791,104 @@ index c6c5617..eace9c4 100644 { struct using_direct *retval; -- gdb_assert (outer_len < inner_len); -- retval = xmalloc (sizeof (struct using_direct)); -- retval->inner = savestring (name, inner_len); -- retval->outer = savestring (name, outer_len); -+ retval->inner = savestring (inner, strlen(inner)); -+ retval->outer = savestring (outer, strlen(outer)); -+ retval->alias = savestring (alias, strlen(alias)); -+ retval->declaration = savestring (declaration, strlen(declaration)); +- retval->import_src = savestring (src, strlen(src)); +- retval->import_dest = savestring (dest, strlen(dest)); ++ retval->import_src = savestring (src, strlen (src)); ++ retval->import_dest = savestring (dest, strlen (dest)); ++ retval->alias = savestring (alias, strlen (alias)); ++ retval->declaration = savestring (declaration, strlen (declaration)); + retval->line_number = line_number; -+ retval->next = next; return retval; -@@ -274,11 +239,17 @@ cp_copy_usings (struct using_direct *using, - retval->inner = obsavestring (using->inner, strlen (using->inner), +@@ -241,10 +244,16 @@ cp_copy_usings (struct using_direct *using, + obstack); + retval->import_dest = obsavestring (using->import_dest, strlen (using->import_dest), obstack); - retval->outer = obsavestring (using->outer, strlen (using->outer), -- obstack); -+ obstack); + retval->alias = obsavestring (using->alias, strlen (using->alias), + obstack); + retval->declaration = obsavestring (using->declaration, strlen (using->declaration), + obstack); retval->next = cp_copy_usings (using->next, obstack); - xfree (using->inner); - xfree (using->outer); + xfree (using->import_src); + xfree (using->import_dest); + xfree (using->alias); + xfree (using->declaration); xfree (using); return retval; -@@ -299,8 +270,14 @@ cp_lookup_symbol_nonlocal (const char *name, +@@ -261,12 +270,30 @@ cp_copy_usings (struct using_direct *using, + + struct symbol * + cp_lookup_symbol_nonlocal (const char *name, +- const char *linkage_name, const struct block *block, const domain_enum domain) { - return lookup_namespace_scope (name, linkage_name, block, domain, - block_scope (block), 0); ++ struct symbol* sym = NULL; ++ const struct block *global_block = block_global_block (block); ++ const char* scope = block_scope(block); ++ /* Check if either no block is specified or it's a global block. */ ++ ++ while (block != global_block) ++ while (block != global_block) ++ { ++ sym = lookup_namespace_scope(name, block, domain, scope, 0, 0); ++ ++ if (sym != NULL) ++ return sym; ++ ++ block = BLOCK_SUPERBLOCK (block); ++ } + -+ struct symbol* sym = lookup_namespace_scope(name, linkage_name, block, -+ domain, block_scope(block), 0); + + if (sym != NULL) + return sym; + -+ return lookup_symbol_file(name, linkage_name, block, domain, 0); ++ return lookup_symbol_file(name, block, domain, 0); } /* Lookup NAME at namespace scope (or, in C terms, in static and -@@ -318,7 +295,7 @@ cp_lookup_symbol_nonlocal (const char *name, +@@ -284,13 +311,13 @@ cp_lookup_symbol_nonlocal (const char *name, "A::x", and if that call fails, then the first call looks for "x". */ -static struct symbol * +struct symbol * lookup_namespace_scope (const char *name, - const char *linkage_name, +- const char *linkage_name, const struct block *block, -@@ -354,10 +331,43 @@ lookup_namespace_scope (const char *name, + const domain_enum domain, + const char *scope, +- int scope_len) ++ int scope_len, ++ int declaration_only) + { + char *namespace; + +@@ -308,8 +335,8 @@ lookup_namespace_scope (const char *name, + new_scope_len += 2; + } + new_scope_len += cp_find_first_component (scope + new_scope_len); +- sym = lookup_namespace_scope (name, linkage_name, block, +- domain, scope, new_scope_len); ++ sym = lookup_namespace_scope (name, block, domain, scope, new_scope_len, ++ declaration_only); + if (sym != NULL) + return sym; + } +@@ -320,10 +347,44 @@ lookup_namespace_scope (const char *name, namespace = alloca (scope_len + 1); strncpy (namespace, scope, scope_len); namespace[scope_len] = '\0'; - return cp_lookup_symbol_namespace (namespace, name, linkage_name, -+ return cp_lookup_symbol_namespace_incremental (namespace, name, linkage_name, - block, domain); +- block, domain); ++ return cp_lookup_symbol_namespace (namespace, name, block, domain, ++ declaration_only); } +/* Searches the for the given NAME in the given NAMESPACE, using import @@ -12142,9 +1896,9 @@ index c6c5617..eace9c4 100644 +struct symbol * +cp_lookup_symbol_namespace_incremental (const char *namespace, + const char *name, -+ const char *linkage_name, + const struct block *block, -+ const domain_enum domain) ++ const domain_enum domain, ++ int declaration_only) +{ + struct symbol *sym; + const struct block *global_block = block_global_block (block); @@ -12156,7 +1910,8 @@ index c6c5617..eace9c4 100644 + + while (block != global_block) + { -+ sym = cp_lookup_symbol_namespace (namespace, name, linkage_name, block, domain); ++ sym = cp_lookup_symbol_namespace (namespace, name, block, domain, ++ declaration_only); + + if (sym != NULL) + return sym; @@ -12173,8 +1928,15 @@ index c6c5617..eace9c4 100644 /* Look up NAME in the C++ namespace NAMESPACE, applying the using directives that are active in BLOCK. Other arguments are as in cp_lookup_symbol_nonlocal. */ -@@ -370,7 +380,7 @@ cp_lookup_symbol_namespace (const char *namespace, - const domain_enum domain) +@@ -331,12 +392,12 @@ lookup_namespace_scope (const char *name, + struct symbol * + cp_lookup_symbol_namespace (const char *namespace, + const char *name, +- const char *linkage_name, + const struct block *block, +- const domain_enum domain) ++ const domain_enum domain, ++ int declaration_only) { const struct using_direct *current; - struct symbol *sym; @@ -12182,17 +1944,16 @@ index c6c5617..eace9c4 100644 /* First, go through the using directives. If any of them add new names to the namespace we're searching in, see if we can find a -@@ -380,15 +390,50 @@ cp_lookup_symbol_namespace (const char *namespace, +@@ -346,15 +407,60 @@ cp_lookup_symbol_namespace (const char *namespace, current != NULL; current = current->next) { -- if (strcmp (namespace, current->outer) == 0) -+ +- if (strcmp (namespace, current->import_dest) == 0) + int current_line = find_pc_line (get_frame_pc (get_current_frame ()), 0).line; + -+ if (strcmp (namespace, current->outer) == 0 && current->line_number < current_line) ++ if (strcmp (namespace, current->import_dest) == 0 && current->line_number < current_line) { -- sym = cp_lookup_symbol_namespace (current->inner, +- sym = cp_lookup_symbol_namespace (current->import_src, - name, - linkage_name, - block, @@ -12201,37 +1962,48 @@ index c6c5617..eace9c4 100644 + + /* If there is an import of a single declaration, compare the imported + declaration with the sought out name. If there is a match pass -+ current->inner as NAMESPACE to direct the search towards the ++ current->import_src as NAMESPACE to direct the search towards the + imported namespace. */ + if (strcmp ("", current->declaration) != 0) + { -+ if(strcmp (name, current->declaration) == 0){ -+ sym = cp_lookup_symbol_namespace (current->inner, -+ name, -+ linkage_name, -+ block, -+ domain); ++ if (strcmp (name, current->declaration) == 0) ++ { ++ sym = cp_lookup_symbol_namespace (current->import_src, ++ name, ++ block, ++ domain, ++ declaration_only); ++ } + } + -+ } -+ else if(strcmp (name, current->alias) == 0) ++ if (declaration_only) ++ { ++ if (sym) ++ { ++ return sym; ++ } else { ++ continue; ++ } ++ } ++ ++ if (strcmp (name, current->alias) == 0) + /* If the import is creating an alias and the alias matches the + sought name. Pass current->inner as the NAME to direct the + search towards the aliased namespace */ + { + sym = cp_lookup_symbol_namespace (namespace, -+ current->inner, -+ linkage_name, ++ current->import_src, + block, -+ domain); -+ }else if(strcmp ("", current->alias) == 0){ ++ domain, ++ declaration_only); ++ } else if (strcmp ("", current->alias) == 0){ + /* If this import statement creates no alias, pass current->inner as + NAMESPACE to direct the search towards the imported namespace. */ -+ sym = cp_lookup_symbol_namespace (current->inner, ++ sym = cp_lookup_symbol_namespace (current->import_src, + name, -+ linkage_name, + block, -+ domain); ++ domain, ++ declaration_only); + } + + if (sym != NULL){ @@ -12240,24 +2012,118 @@ index c6c5617..eace9c4 100644 } } -@@ -398,8 +443,10 @@ cp_lookup_symbol_namespace (const char *namespace, +@@ -362,10 +468,11 @@ cp_lookup_symbol_namespace (const char *namespace, + that are still applicable; so let's see if we've got a match + using the current namespace. */ - if (namespace[0] == '\0') +- if (namespace[0] == '\0') ++ if (namespace[0] == '\0' && !declaration_only) { - return lookup_symbol_file (name, linkage_name, block, - domain, 0); -+ sym = lookup_symbol_file (name, linkage_name, -+ block, domain, -+ cp_is_anonymous (namespace)); ++ sym = lookup_symbol_file (name, block, domain, ++ cp_is_anonymous (namespace)); + return sym; } else { +@@ -374,8 +481,7 @@ cp_lookup_symbol_namespace (const char *namespace, + strcpy (concatenated_name, namespace); + strcat (concatenated_name, "::"); + strcat (concatenated_name, name); +- sym = lookup_symbol_file (concatenated_name, linkage_name, +- block, domain, ++ sym = lookup_symbol_file (concatenated_name, block, domain, + cp_is_anonymous (namespace)); + return sym; + } +@@ -388,14 +494,13 @@ cp_lookup_symbol_namespace (const char *namespace, + + static struct symbol * + lookup_symbol_file (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain, + int anonymous_namespace) + { + struct symbol *sym = NULL; + +- sym = lookup_symbol_static (name, linkage_name, block, domain); ++ sym = lookup_symbol_static (name, block, domain); + if (sym != NULL) + return sym; + +@@ -408,12 +513,11 @@ lookup_symbol_file (const char *name, + const struct block *global_block = block_global_block (block); + + if (global_block != NULL) +- sym = lookup_symbol_aux_block (name, linkage_name, global_block, +- domain); ++ sym = lookup_symbol_aux_block (name, global_block, domain); + } + else + { +- sym = lookup_symbol_global (name, linkage_name, block, domain); ++ sym = lookup_symbol_global (name, block, domain); + } + + if (sym != NULL) +@@ -463,9 +567,8 @@ cp_lookup_nested_type (struct type *parent_type, + const char *parent_name = TYPE_TAG_NAME (parent_type); + struct symbol *sym = cp_lookup_symbol_namespace (parent_name, + nested_name, +- NULL, + block, +- VAR_DOMAIN); ++ VAR_DOMAIN,0); + if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF) + return NULL; + else +@@ -709,7 +812,7 @@ check_one_possible_namespace_symbol (const char *name, int len, + + memcpy (name_copy, name, len); + name_copy[len] = '\0'; +- sym = lookup_block_symbol (block, name_copy, NULL, VAR_DOMAIN); ++ sym = lookup_block_symbol (block, name_copy, VAR_DOMAIN); + + if (sym == NULL) + { +@@ -749,7 +852,7 @@ lookup_possible_namespace_symbol (const char *name) + struct symbol *sym; + + sym = lookup_block_symbol (get_possible_namespace_block (objfile), +- name, NULL, VAR_DOMAIN); ++ name, VAR_DOMAIN); + + if (sym != NULL) + return sym; diff --git a/gdb/cp-support.c b/gdb/cp-support.c -index bf42636..9f04c86 100644 +index f12d785..ca10007 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c -@@ -175,7 +175,8 @@ mangled_name_to_comp (const char *mangled_name, int options, +@@ -70,6 +70,21 @@ struct cmd_list_element *maint_cplus_cmd_list = NULL; + static void maint_cplus_command (char *arg, int from_tty); + static void first_component_command (char *arg, int from_tty); + ++/* Operator validation. This is used by cp_validate_opeartor, ++ which is in turn used by both the expression parser (clex) ++ and decode_line (decode_compound, actually). ++ ++ NOTE: Multi-byte operators (usually the assignment variety operator) ++ must appear before the single byte version, i.e., "+=" before "+". */ ++static const char *operator_tokens[] = ++ { ++ "++", "+=", "+", "->*", "->", "--", "-=", "-", "*=", "*", "/=", "/", ++ "%=", "%", "!=", "==", "!", "&&", "<<=", "<<", ">>=", ">>", ++ "<=", "<", ">=", ">", "~", "&=", "&", "|=", "||", "|", "^=", "^", ++ "=", "()", "[]", ",", "new", "delete" ++ /* new[] and delete[] require special whitespace handling */ ++ }; ++ + /* Return 1 if STRING is clearly already in canonical form. This + function is conservative; things which it does not recognize are + assumed to be non-canonical, and the parser will sort them out +@@ -175,7 +190,8 @@ mangled_name_to_comp (const char *mangled_name, int options, return ret; } @@ -12267,20 +2133,106 @@ index bf42636..9f04c86 100644 char * cp_class_name_from_physname (const char *physname) +@@ -825,9 +841,9 @@ read_in_psymtabs (const char *func_name) + if (ps->readin) + continue; + +- if ((lookup_partial_symbol (ps, func_name, NULL, 1, VAR_DOMAIN) ++ if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN) + != NULL) +- || (lookup_partial_symbol (ps, func_name, NULL, 0, VAR_DOMAIN) ++ || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN) + != NULL)) + psymtab_to_symtab (ps); + } +@@ -909,6 +925,72 @@ first_component_command (char *arg, int from_tty) + + extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */ + ++#define SKIP_SPACE(P) \ ++ do \ ++ { \ ++ while (*(P) == ' ' || *(P) == '\t') \ ++ ++(P); \ ++ } \ ++ while (0) ++ ++/* Returns the length of the operator name or 0 if INPUT does not ++ point to a valid C++ operator. INPUT should start with "operator". */ ++int ++cp_validate_operator (const char *input) ++{ ++ int i; ++ const char *p = input; ++ int valid = 0; ++ ++ /* Most callers appear to do this already, but since this is not ++ really time-critical code, it is double-checked here. */ ++ if (strncmp (p, "operator", 8) == 0) ++ { ++ p += 8; ++ ++ SKIP_SPACE (p); ++ for (i = 0; i < sizeof (operator_tokens) / sizeof (operator_tokens[0]); ++ ++i) ++ { ++ int length = strlen (operator_tokens[i]); ++ /* By using strncmp here, we MUST have operator_tokens ordered! ++ See additional notes where operator_tokens is defined above. */ ++ if (strncmp (p, operator_tokens[i], length) == 0) ++ { ++ const char *op = p; ++ valid = 1; ++ p += length; ++ ++ if (strncmp (op, "new", 3) == 0 ++ || strncmp (op, "delete", 6) == 0) ++ { ++ ++ /* Special case: new[] and delete[]. We must be careful ++ to swallow whitespace before/in "[]".*/ ++ SKIP_SPACE (p); ++ ++ if (*p == '[') ++ { ++ ++p; ++ SKIP_SPACE (p); ++ if (*p == ']') ++ ++p; ++ else ++ valid = 0; ++ } ++ } ++ ++ break; ++ } ++ } ++ ++ if (!valid) ++ p = input; ++ } ++ ++ return (p - input); ++} ++ + void + _initialize_cp_support (void) + { diff --git a/gdb/cp-support.h b/gdb/cp-support.h -index 837ca6c..23f8d5b 100644 +index b5a5c5f..0381686 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h -@@ -38,14 +38,28 @@ struct demangle_component; +@@ -38,14 +38,29 @@ struct demangle_component; /* This struct is designed to store data from using directives. It - says that names from namespace INNER should be visible within -- namespace OUTER. OUTER should always be a strict initial substring -- of INNER. These form a linked list; NEXT is the next element of -- the list. */ -+ namespace OUTER These form a linked list; NEXT is the next element of -+ the list. ALIAS is set to a non empty string if the imported namespace -+ has been aliased.Eg: + says that names from namespace IMPORT_SRC should be visible within +- namespace IMPORT_DEST. IMPORT_DEST should always be a strict initial +- substring of IMPORT_SRC. These form a linked list; NEXT is the next element +- of the list. */ ++ namespace IMPORT_DEST. IMPORT_DEST should always be a strict initial ++ substring of IMPORT_SRC. These form a linked list; NEXT is the next ++ element of the list. ALIAS is set to a non empty string if the imported ++ namespace has been aliased.Eg: + namespace C=A::B; + ALIAS = "C" + DECLARATION is the name of the imported declaration, if this import @@ -12291,19 +2243,19 @@ index 837ca6c..23f8d5b 100644 struct using_direct { - char *inner; - char *outer; -+ + char *import_src; + char *import_dest; ++ + char *alias; -+ ++ + char *declaration; -+ ++ + int line_number; -+ ++ struct using_direct *next; }; -@@ -54,6 +68,7 @@ struct using_direct +@@ -54,6 +69,7 @@ struct using_direct extern char *cp_canonicalize_string (const char *string); @@ -12311,259 +2263,69 @@ index 837ca6c..23f8d5b 100644 extern char *cp_class_name_from_physname (const char *physname); extern char *method_name_from_physname (const char *physname); -@@ -76,9 +91,18 @@ extern struct type *cp_lookup_rtti_type (const char *name, +@@ -72,15 +88,23 @@ extern struct symbol **make_symbol_overload_list (const char *, + extern struct type *cp_lookup_rtti_type (const char *name, + struct block *block); + ++extern int cp_validate_operator (const char *input); ++ + /* Functions/variables from cp-namespace.c. */ extern int cp_is_anonymous (const char *namespace); --extern void cp_add_using_directive (const char *name, -- unsigned int outer_length, -- unsigned int inner_length); -+extern void cp_add_using_directive (const char *outer, -+ const char *inner, + extern void cp_add_using_directive (const char *dest, +- const char *src); ++ const char *src, + const char *alias, + const char *declaration, + const int line_number); -+ -+extern struct using_direct *cp_add_using (const char *outer, -+ const char *inner, + + extern struct using_direct *cp_add_using (const char *dest, + const char *src, + const char *alias, + const char *declaration, + const int line_number, -+ struct using_direct *next); + struct using_direct *next); extern void cp_initialize_namespace (void); +@@ -97,15 +121,27 @@ extern void cp_set_block_scope (const struct symbol *symbol, + extern void cp_scan_for_anonymous_namespaces (const struct symbol *symbol); -@@ -98,6 +122,19 @@ extern struct symbol *cp_lookup_symbol_nonlocal (const char *name, + extern struct symbol *cp_lookup_symbol_nonlocal (const char *name, +- const char *linkage_name, const struct block *block, const domain_enum domain); +extern struct symbol *lookup_namespace_scope (const char *name, -+ const char *linkage_name, + const struct block *block, + const domain_enum domain, + const char *scope, -+ int scope_len); ++ int scope_len, ++ int declaration_only); + +extern struct symbol *cp_lookup_symbol_namespace_incremental (const char *namespace, + const char *name, -+ const char *linkage_name, + const struct block *block, -+ const domain_enum domain); ++ const domain_enum domain, ++ int declaration_only); + extern struct symbol *cp_lookup_symbol_namespace (const char *namespace, - const char *name, - const char *linkage_name, -diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c -index 8b7d868..4e33fa0 100644 ---- a/gdb/cp-valprint.c -+++ b/gdb/cp-valprint.c -@@ -36,6 +36,7 @@ - #include "valprint.h" - #include "cp-support.h" - #include "language.h" -+#include "python/python.h" - - /* Controls printing of vtbl's */ - static void -@@ -418,12 +419,27 @@ cp_print_value (struct type *type, struct type *real_type, - if (skip >= 1) - fprintf_filtered (stream, ""); - else -- cp_print_value_fields (baseclass, thistype, base_valaddr, -- thisoffset + boffset, address + boffset, -- stream, recurse, options, -- ((struct type **) -- obstack_base (&dont_print_vb_obstack)), -- 0); -+ { -+ int result = 0; -+ -+ /* Attempt to run the Python pretty-printers on the -+ baseclass if possible. */ -+ if (!options->raw) -+ result = apply_val_pretty_printer (baseclass, base_valaddr, -+ thisoffset + boffset, -+ address + boffset, -+ stream, recurse, -+ options, -+ current_language); -+ -+ if (!result) -+ cp_print_value_fields (baseclass, thistype, base_valaddr, -+ thisoffset + boffset, address + boffset, -+ stream, recurse, options, -+ ((struct type **) -+ obstack_base (&dont_print_vb_obstack)), -+ 0); -+ } - fputs_filtered (", ", stream); - - flush_it: -@@ -461,6 +477,7 @@ cp_print_static_field (struct type *type, - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) - { - CORE_ADDR *first_dont_print; -+ CORE_ADDR addr; - int i; - - first_dont_print -@@ -470,7 +487,7 @@ cp_print_static_field (struct type *type, - - while (--i >= 0) - { -- if (VALUE_ADDRESS (val) == first_dont_print[i]) -+ if (value_address (val) == first_dont_print[i]) - { - fputs_filtered ("", -@@ -479,12 +496,13 @@ cp_print_static_field (struct type *type, - } - } - -- obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val), -+ addr = value_address (val); -+ obstack_grow (&dont_print_statmem_obstack, (char *) &addr, - sizeof (CORE_ADDR)); - - CHECK_TYPEDEF (type); - cp_print_value_fields (type, type, value_contents_all (val), -- value_embedded_offset (val), VALUE_ADDRESS (val), -+ value_embedded_offset (val), value_address (val), - stream, recurse, options, NULL, 1); - return; - } -@@ -492,7 +510,7 @@ cp_print_static_field (struct type *type, - opts = *options; - opts.deref_ref = 0; - val_print (type, value_contents_all (val), -- value_embedded_offset (val), VALUE_ADDRESS (val), -+ value_embedded_offset (val), value_address (val), - stream, recurse, &opts, current_language); - } +- const char *name, +- const char *linkage_name, +- const struct block *block, +- const domain_enum domain); ++ const char *name, ++ const struct block *block, ++ const domain_enum domain, ++ int declaration_only); + extern struct type *cp_lookup_nested_type (struct type *parent_type, + const char *nested_name, diff --git a/gdb/dbxread.c b/gdb/dbxread.c -index 115bdef..23ea50c 100644 +index 7cb016d..bb9e35a 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c -@@ -1,6 +1,6 @@ - /* Read dbx symbol tables and convert to internal format, for GDB. - Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, -- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008. -+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008, 2009. - Free Software Foundation, Inc. - - This file is part of GDB. -@@ -1198,6 +1198,8 @@ read_dbx_symtab (struct objfile *objfile) - bfd *abfd; - int textlow_not_set; - int data_sect_index; -+ char *sym_name; -+ int sym_len; - - /* Current partial symtab */ - struct partial_symtab *pst; -@@ -1681,6 +1683,28 @@ pos %d"), - if (!p) - continue; /* Not a debugging symbol. */ - -+ sym_len = 0; -+ if (psymtab_language == language_cplus) -+ { -+ char *new_name, *name = alloca (p - namestring + 1); -+ memcpy (name, namestring, p - namestring); -+ name[p - namestring] = '\0'; -+ new_name = cp_canonicalize_string (name); -+ if (new_name != NULL) -+ { -+ sym_len = strlen (new_name); -+ sym_name = obsavestring (new_name, sym_len, -+ &objfile->objfile_obstack); -+ xfree (new_name); -+ } -+ } -+ -+ if (sym_len == 0) -+ { -+ sym_name = namestring; -+ sym_len = p - namestring; -+ } -+ - /* Main processing section for debugging symbols which - the initial read through the symbol tables needs to worry - about. If we reach this point, the symbol which we are -@@ -1698,7 +1722,7 @@ pos %d"), - namestring = gdbarch_static_transform_name (gdbarch, - namestring); - -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_STATIC, - &objfile->static_psymbols, - 0, nlist.n_value, -@@ -1710,7 +1734,7 @@ pos %d"), - data_sect_index); - /* The addresses in these entries are reported to be - wrong. See the code that reads 'G's for symtabs. */ -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_STATIC, - &objfile->global_psymbols, - 0, nlist.n_value, -@@ -1728,7 +1752,7 @@ pos %d"), - || (p == namestring + 1 - && namestring[0] != ' ')) - { -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - STRUCT_DOMAIN, LOC_TYPEDEF, - &objfile->static_psymbols, - nlist.n_value, 0, -@@ -1736,7 +1760,7 @@ pos %d"), - if (p[2] == 't') - { - /* Also a typedef with the same name. */ -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_TYPEDEF, - &objfile->static_psymbols, - nlist.n_value, 0, -@@ -1749,7 +1773,7 @@ pos %d"), - case 't': - if (p != namestring) /* a name is there, not just :T... */ - { -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_TYPEDEF, - &objfile->static_psymbols, - nlist.n_value, 0, -@@ -1829,7 +1853,7 @@ pos %d"), - - case 'c': - /* Constant, e.g. from "const" in Pascal. */ -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_CONST, - &objfile->static_psymbols, nlist.n_value, - 0, psymtab_language, objfile); -@@ -1893,7 +1917,7 @@ pos %d"), - pst->textlow = nlist.n_value; - textlow_not_set = 0; - } -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_BLOCK, - &objfile->static_psymbols, - 0, nlist.n_value, -@@ -1961,7 +1985,7 @@ pos %d"), - pst->textlow = nlist.n_value; - textlow_not_set = 0; - } -- add_psymbol_to_list (namestring, p - namestring, -+ add_psymbol_to_list (sym_name, sym_len, - VAR_DOMAIN, LOC_BLOCK, - &objfile->global_psymbols, - 0, nlist.n_value, -@@ -3547,6 +3571,7 @@ static struct sym_fns aout_sym_fns = +@@ -3581,6 +3581,7 @@ static struct sym_fns aout_sym_fns = dbx_new_init, /* sym_new_init: init anything gbl to entire symtab */ dbx_symfile_init, /* sym_init: read initial info, setup for sym_read() */ dbx_symfile_read, /* sym_read: read a symbol file into symtab */ @@ -12571,35 +2333,11 @@ index 115bdef..23ea50c 100644 dbx_symfile_finish, /* sym_finish: finished with file, cleanup */ default_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */ -diff --git a/gdb/defs.h b/gdb/defs.h -index 845b320..ad6e7d7 100644 ---- a/gdb/defs.h -+++ b/gdb/defs.h -@@ -151,6 +151,9 @@ extern int dbx_commands; - /* System root path, used to find libraries etc. */ - extern char *gdb_sysroot; - -+/* GDB datadir, used to store data files. */ -+extern char *gdb_datadir; -+ - /* Search path for separate debug files. */ - extern char *debug_file_directory; - -@@ -366,6 +369,9 @@ extern struct cleanup *make_cleanup_fclose (FILE *file); - - extern struct cleanup *make_cleanup_bfd_close (bfd *abfd); - -+struct obstack; -+extern struct cleanup *make_cleanup_obstack_free (struct obstack *obstack); -+ - extern struct cleanup *make_cleanup_restore_integer (int *variable); - - extern struct cleanup *make_final_cleanup (make_cleanup_ftype *, void *); diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo -index 10e7388..099f88a 100644 +index fab05fc..44cc1f2 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo -@@ -955,8 +955,10 @@ Connect to process ID @var{number}, as with the @code{attach} command. +@@ -958,8 +958,10 @@ Connect to process ID @var{number}, as with the @code{attach} command. @itemx -x @var{file} @cindex @code{--command} @cindex @code{-x} @@ -12612,7 +2350,7 @@ index 10e7388..099f88a 100644 @item -eval-command @var{command} @itemx -ex @var{command} -@@ -1148,6 +1150,16 @@ for remote debugging. +@@ -1151,6 +1153,16 @@ for remote debugging. Run using @var{device} for your program's standard input and output. @c FIXME: kingdon thinks there is more to -tty. Investigate. @@ -12629,307 +2367,7 @@ index 10e7388..099f88a 100644 @c resolve the situation of these eventually @item -tui @cindex @code{--tui} -@@ -3636,6 +3648,98 @@ A failed Ada assertion. - A call to @code{exec}. This is currently only available for HP-UX - and @sc{gnu}/Linux. - -+@item syscall -+@itemx syscall @r{[}@var{name} @r{|} @var{number}@r{]} @r{...} -+@cindex break on a system call. -+A call to or return from a @code{syscall}. If no argument is specified, -+then it catches a call to or return from any system call. -+ -+@var{name} can be any valid system call name in the system. You can -+use the @value{GDBN} command-line completion facilities to list the -+available choices. @xref{Completion,, Command Completion}, for -+details on how to do this. -+ -+You may also specify the system call numerically. This may be useful -+if @value{GDBN} does not fully support your system's list of system -+calls. -+ -+The example below illustrates how this command works if you don't provide -+arguments to it: -+ -+@smallexample -+(@value{GDBP}) catch syscall -+Catchpoint 1 (syscall) -+(@value{GDBP}) r -+Starting program: /tmp/catch-syscall -+ -+Catchpoint 1 (call to syscall 'close'), 0xffffe424 in __kernel_vsyscall () -+(@value{GDBP}) c -+Continuing. -+ -+Catchpoint 1 (returned from syscall 'close'), 0xffffe424 in __kernel_vsyscall () -+(@value{GDBP}) -+@end smallexample -+ -+Here is an example of catching a system call by name: -+ -+@smallexample -+(@value{GDBP}) catch syscall chroot -+Catchpoint 1 (syscall(s) 'chroot') -+(@value{GDBP}) r -+Starting program: /tmp/catch-syscall -+ -+Catchpoint 1 (call to syscall 'chroot'), 0xffffe424 in __kernel_vsyscall () -+(@value{GDBP}) c -+Continuing. -+ -+Catchpoint 1 (returned from syscall 'chroot'), 0xffffe424 in __kernel_vsyscall () -+(@value{GDBP}) -+@end smallexample -+ -+And last but not least, an example of specifying a system call -+numerically: -+ -+@smallexample -+(@value{GDBP}) catch syscall 252 -+Catchpoint 1 (syscall(s) 'exit_group') -+(@value{GDBP}) r -+Starting program: /tmp/catch-syscall -+ -+Catchpoint 1 (call to syscall 'exit_group'), 0xffffe424 in __kernel_vsyscall () -+(@value{GDBP}) c -+Continuing. -+ -+Program exited normally. -+(@value{GDBP}) -+@end smallexample -+ -+If you configure @value{GDBN} using the @samp{--without-expat} option, -+it will not be able to display syscall names. Also, if your -+architecture does not have an XML file describing its system calls, -+you will not be able to see the syscall names. In either case, you -+will see a warning like this: -+ -+@smallexample -+(@value{GDBP}) catch syscall -+warning: Could not open "syscalls/i386-linux.xml" -+warning: Could not load the syscall XML file 'syscalls/i386-linux.xml'. -+GDB will not be able to display syscall names. -+Catchpoint 1 (syscall) -+(@value{GDBP}) -+@end smallexample -+ -+Of course, the file name will change depending on your architecture and system. -+ -+Still using the example above, you can also try to catch a syscall by its -+number. In this case, you would see something like: -+ -+@smallexample -+(@value{GDBP}) catch syscall 252 -+Catchpoint 1 (syscall(s) 252) -+@end smallexample -+ -+Again, in this case @value{GDBN} would not be able to display syscall's names. -+ - @item fork - A call to @code{fork}. This is currently only available for HP-UX - and @sc{gnu}/Linux. -@@ -4711,6 +4815,24 @@ the program to report that some thread has stopped before prompting for - another command. In background execution, @value{GDBN} immediately gives - a command prompt so that you can issue other commands while your program runs. - -+You need to explicitly enable asynchronous mode before you can use -+background execution commands. You can use these commands to -+manipulate the asynchronous mode setting: -+ -+@table @code -+@kindex set target-async -+@item set target-async on -+Enable asynchronous mode. -+@item set target-async off -+Disable asynchronous mode. -+@kindex show target-async -+@item show target-async -+Show the current target-async setting. -+@end table -+ -+If the target doesn't support async mode, @value{GDBN} issues an error -+message if you attempt to use the background execution commands. -+ - To specify background execution, add a @code{&} to the command. For example, - the background form of the @code{continue} command is @code{continue&}, or - just @code{c&}. The execution commands that accept background execution -@@ -4776,11 +4898,6 @@ only the current thread. To stop the whole program in non-stop mode, - use @code{interrupt -a}. - @end table - --You may need to explicitly enable async mode before you can use background --execution commands, with the @code{set target-async 1} command. If the --target doesn't support async mode, @value{GDBN} issues an error message --if you attempt to use the background execution commands. -- - @node Thread-Specific Breakpoints - @subsection Thread-Specific Breakpoints - -@@ -6536,6 +6653,12 @@ Without this format, @value{GDBN} displays pointers to and arrays of - @code{char}, @w{@code{unsigned char}}, and @w{@code{signed char}} as - strings. Single-byte members of a vector are displayed as an integer - array. -+ -+@item r -+@cindex raw printing -+Print using the @samp{raw} formatting. By default, @value{GDBN} will -+use a type-specific pretty-printer. The @samp{r} format bypasses any -+pretty-printer which might exist for the value's type. - @end table - - For example, to print the program counter in hex (@pxref{Registers}), type -@@ -7408,6 +7531,20 @@ On HP-UX systems, if you refer to a function or variable name that - begins with a dollar sign, @value{GDBN} searches for a user or system - name first, before it searches for a convenience variable. - -+@cindex convenience functions -+@value{GDBN} also supplies some @dfn{convenience functions}. These -+have a syntax similar to convenience variables. A convenience -+function can be used in an expression just like an ordinary function; -+however, a convenience function is implemented internally to -+@value{GDBN}. -+ -+@table @code -+@item help function -+@kindex help function -+@cindex show all convenience functions -+Print a list of all convenience functions. -+@end table -+ - @node Registers - @section Registers - -@@ -7931,13 +8068,17 @@ support: - @table @code - @item set target-charset @var{charset} - @kindex set target-charset --Set the current target character set to @var{charset}. We list the --character set names @value{GDBN} recognizes below, but if you type --@code{set target-charset} followed by @key{TAB}@key{TAB}, @value{GDBN} will --list the target character sets it supports. --@end table -+Set the current target character set to @var{charset}. If you type -+@code{set target-charset} followed by @key{TAB}@key{TAB}, @value{GDBN} -+will list the target character sets it supports. -+ -+@item set target-wide-charset @var{charset} -+@kindex set target-wide-charset -+Set the current target wide character set to @var{charset}. The -+target wide character set is the character set used by @code{wchar_t}. -+If you type @code{set target-charset} followed by @key{TAB}@key{TAB}, -+@value{GDBN} will list the target character sets it supports. - --@table @code - @item set host-charset @var{charset} - @kindex set host-charset - Set the current host character set to @var{charset}. -@@ -7947,10 +8088,9 @@ system it is running on; you can override that default using the - @code{set host-charset} command. - - @value{GDBN} can only use certain character sets as its host character --set. We list the character set names @value{GDBN} recognizes below, and --indicate which can be host character sets, but if you type --@code{set target-charset} followed by @key{TAB}@key{TAB}, @value{GDBN} will --list the host character sets it supports. -+set. If you type @code{set target-charset} followed by -+@key{TAB}@key{TAB}, @value{GDBN} will list the host character sets it -+supports. - - @item set charset @var{charset} - @kindex set charset -@@ -7974,37 +8114,6 @@ Show the name of the current target charset. - - @end table - --@value{GDBN} currently includes support for the following character --sets: -- --@table @code -- --@item ASCII --@cindex ASCII character set --Seven-bit U.S. @sc{ascii}. @value{GDBN} can use this as its host --character set. -- --@item ISO-8859-1 --@cindex ISO 8859-1 character set --@cindex ISO Latin 1 character set --The ISO Latin 1 character set. This extends @sc{ascii} with accented --characters needed for French, German, and Spanish. @value{GDBN} can use --this as its host character set. -- --@item EBCDIC-US --@itemx IBM1047 --@cindex EBCDIC character set --@cindex IBM1047 character set --Variants of the @sc{ebcdic} character set, used on some of IBM's --mainframe operating systems. (@sc{gnu}/Linux on the S/390 uses U.S. @sc{ascii}.) --@value{GDBN} cannot use these as its host character set. -- --@end table -- --Note that these are all single-byte character sets. More work inside --@value{GDBN} is needed to support multi-byte or variable-width character --encodings, like the UTF-8 and UCS-2 encodings of Unicode. -- - Here is an example of @value{GDBN}'s character set support in action. - Assume that the following source code has been placed in the file - @file{charset-test.c}: -@@ -12481,6 +12590,53 @@ returned. In contrast, the @code{finish} command (@pxref{Continuing - and Stepping, ,Continuing and Stepping}) resumes execution until the - selected stack frame returns naturally. - -+@value{GDBN} needs to know how the @var{expression} argument should be set for -+the inferior. The concrete registers assignment depends on the OS ABI and the -+type being returned by the selected stack frame. For example it is common for -+OS ABI to return floating point values in FPU registers while integer values in -+CPU registers. Still some ABIs return even floating point values in CPU -+registers. Larger integer widths (such as @code{long long int}) also have -+specific placement rules. @value{GDBN} already knows the OS ABI from its -+current target so it needs to find out also the type being returned to make the -+assignment into the right register(s). -+ -+Normally, the selected stack frame has debug info. @value{GDBN} will always -+use the debug info instead of the implicit type of @var{expression} when the -+debug info is available. For example, if you type @kbd{return -1}, and the -+function in the current stack frame is declared to return a @code{long long -+int}, @value{GDBN} transparently converts the implicit @code{int} value of -1 -+into a @code{long long int}: -+ -+@smallexample -+Breakpoint 1, func () at gdb.base/return-nodebug.c:29 -+29 return 31; -+(@value{GDBP}) return -1 -+Make func return now? (y or n) y -+#0 0x004004f6 in main () at gdb.base/return-nodebug.c:43 -+43 printf ("result=%lld\n", func ()); -+(@value{GDBP}) -+@end smallexample -+ -+However, if the selected stack frame does not have a debug info, e.g., if the -+function was compiled without debug info, @value{GDBN} has to find out the type -+to return from user. Specifying a different type by mistake may set the value -+in different inferior registers than the caller code expects. For example, -+typing @kbd{return -1} with its implicit type @code{int} would set only a part -+of a @code{long long int} result for a debug info less function (on 32-bit -+architectures). Therefore the user is required to specify the return type by -+an appropriate cast explicitly: -+ -+@smallexample -+Breakpoint 2, 0x0040050b in func () -+(@value{GDBP}) return -1 -+Return value type not available for selected stack frame. -+Please use an explicit cast of the value to return. -+(@value{GDBP}) return (long long int) -1 -+Make selected stack frame return now? (y or n) y -+#0 0x00400526 in main () -+(@value{GDBP}) -+@end smallexample -+ - @node Calling - @section Calling Program Functions - -@@ -17815,7 +17971,7 @@ command: +@@ -18427,7 +18439,7 @@ command: @table @code @kindex source @cindex execute commands from a file @@ -12938,7 +2376,7 @@ index 10e7388..099f88a 100644 Execute the command file @var{filename}. @end table -@@ -17832,6 +17988,11 @@ If @code{-v}, for verbose mode, is given then @value{GDBN} displays +@@ -18444,6 +18456,11 @@ If @code{-v}, for verbose mode, is given then @value{GDBN} displays each command as it is executed. The option must be given before @var{filename}, and is interpreted as part of the filename anywhere else. @@ -12950,7 +2388,7 @@ index 10e7388..099f88a 100644 Commands that would ask for confirmation if used interactively proceed without asking when used in a command file. Many @value{GDBN} commands that normally print messages to say what they are doing omit the messages -@@ -18093,8 +18254,6 @@ containing @code{end}. For example: +@@ -18705,8 +18722,6 @@ containing @code{end}. For example: @smallexample (@value{GDBP}) python @@ -12959,7 +2397,7 @@ index 10e7388..099f88a 100644 >print 23 >end 23 -@@ -18107,6 +18266,14 @@ in a Python script. This can be controlled using @code{maint set +@@ -18719,6 +18734,14 @@ in a Python script. This can be controlled using @code{maint set python print-stack}: if @code{on}, the default, then Python stack printing is enabled; if @code{off}, then Python stack printing is disabled. @@ -12974,7 +2412,7 @@ index 10e7388..099f88a 100644 @end table @node Python API -@@ -18114,6 +18281,14 @@ disabled. +@@ -18726,6 +18749,14 @@ disabled. @cindex python api @cindex programming in python @@ -12989,61 +2427,47 @@ index 10e7388..099f88a 100644 @cindex python stdout @cindex python pagination At startup, @value{GDBN} overrides Python's @code{sys.stdout} and -@@ -18125,8 +18300,17 @@ situation, a Python @code{KeyboardInterrupt} exception is thrown. - @menu +@@ -18738,13 +18769,17 @@ situation, a Python @code{KeyboardInterrupt} exception is thrown. * Basic Python:: Basic Python Functions. * Exception Handling:: + * Auto-loading:: Automatically loading Python code. -* Values From Inferior:: -+* Auto-loading:: Automatically loading Python code. +* Values From Inferior:: Python representation of values. -+* Types In Python:: Python representation of types. -+* Pretty Printing:: Pretty-printing values. + * Types In Python:: Python representation of types. + * Pretty Printing:: Pretty-printing values. + * Selecting Pretty-Printers:: How GDB chooses a pretty-printer. ++* Inferiors In Python:: Python representation of inferiors (processes) +* Threads In Python:: Accessing inferior threads from Python. * Commands In Python:: Implementing new commands in Python. +* Parameters In Python:: Adding new @value{GDBN} parameters. -+* Functions In Python:: Writing new convenience functions. -+* Objfiles In Python:: Object files. + * Functions In Python:: Writing new convenience functions. + * Objfiles In Python:: Object files. +* Breakpoints In Python:: Manipulating breakpoints using Python. -+* Frames In Python:: Acessing inferior stack frames from Python. + * Frames In Python:: Acessing inferior stack frames from Python. @end menu - @node Basic Python -@@ -18152,10 +18336,30 @@ command as having originated from the user invoking it interactively. +@@ -18771,6 +18806,12 @@ command as having originated from the user invoking it interactively. It must be a boolean value. If omitted, it defaults to @code{False}. @end defun --@findex gdb.get_parameter --@defun get_parameter parameter --Return the value of a @value{GDBN} parameter. @var{parameter} is a --string naming the parameter to look up; @var{parameter} may contain -+@findex gdb.current_objfile -+@defun current_objfile -+When auto-loading a Python script (@pxref{Auto-loading}), @value{GDBN} -+sets the ``current objfile'' to the corresponding objfile. This -+function returns the current objfile. If there is no current objfile, -+this function returns @code{None}. -+@end defun -+ +@findex gdb.breakpoints +@defun breakpoints +Return a sequence holding all of @value{GDBN}'s breakpoints. +@xref{Breakpoints In Python}, for more information. +@end defun + -+@findex gdb.objfiles -+@defun objfiles -+Return a sequence of all the objfiles current known to @value{GDBN}. -+@xref{Objfiles In Python}. -+@end defun + @findex gdb.parameter + @defun parameter parameter + Return the value of a @value{GDBN} parameter. @var{parameter} is a +@@ -18787,6 +18828,7 @@ a Python value of the appropriate type, and returned. + @defun history number + Return a value from @value{GDBN}'s value history (@pxref{Value + History}). @var{number} indicates which history element to return. + -+@findex gdb.parameter -+@defun parameter name -+Return the value of the named @value{GDBN} parameter. @var{name} is a -+string naming the parameter to look up; @var{name} may contain - spaces if the parameter has a multi-part name. For example, - @samp{print object} is a valid parameter name. - -@@ -18179,6 +18383,28 @@ If no exception is raised, the return value is always an instance of + If @var{number} is negative, then @value{GDBN} will take its absolute value + and count backward from the last element (i.e., the most recent element) to + find the value to return. If @var{number} is zero, then @value{GDBN} will +@@ -18798,6 +18840,28 @@ If no exception is raised, the return value is always an instance of @code{gdb.Value} (@pxref{Values From Inferior}). @end defun @@ -13072,65 +2496,10 @@ index 10e7388..099f88a 100644 @findex gdb.write @defun write string Print a string to @value{GDBN}'s paginated standard output stream. -@@ -18193,6 +18419,66 @@ Flush @value{GDBN}'s paginated standard output stream. Flushing +@@ -18812,6 +18876,11 @@ Flush @value{GDBN}'s paginated standard output stream. Flushing function. @end defun -+@findex gdb.frames -+@defun frames -+Return a tuple of all frame objects. -+@end defun -+ -+@findex gdb.newest_frame -+@defun newest_frame -+Return the newest frame object. -+@end defun -+ -+@findex gdb.selected_frame -+@defun selected_frame -+Return the selected frame object. -+@end defun -+ -+@findex gdb.frame_stop_reason_string -+@defun frame_stop_reason_string @var{reason} -+Return a string explaining the reason why @value{GDBN} stopped unwinding -+frames, as expressed by the given @var{reason} code (an integer, see the -+@code{unwind_stop_reason} method in -+@xref{Frames In Python,,Accessing inferior stack frames from Python}.) -+@end defun -+ -+@findex gdb.read_memory -+@defun read_memory @var{address} @var{length} -+Read @var{length} bytes of memory from the inferior, starting at @var{address}. -+Returns a buffer object, which behaves much like an array or a string. It -+can be modified and given to the @code{gdb.write_memory} function. -+@end defun -+ -+@findex gdb.write_memory -+@defun write_memory @var{address} @var{buffer} @r{[}@var{length}@r{]} -+Write the contents of @var{buffer} (a Python object which supports the buffer -+protocol, i.e., a string, an array or the object returned from -+@code{gdb.read_memory}) to the inferior, starting at @var{address}. If given, -+@var{length} determines the number of bytes from @var{buffer} to be written. -+@end defun -+ -+@findex gdb.search_memory -+@defun search_memory @var{address} @var{length} @var{pattern} @r{[}@var{size}@r{]} @r{[}@var{max_count}@r{]} -+Search a region of the inferior memory starting at @var{address} with the given -+@var{length}. @var{pattern} can be a string, a byte array, a buffer object, -+a number, a @code{gdb.Value} object (@pxref{Values From Inferior}) or a list -+or tuple with elements in any combination of those types. If @var{size} is -+given and is non-zero, it specifies the size in bytes of a Python scalar or -+@code{gdb.Value} in the search pattern. If @var{size} is zero or not specified, -+ it is taken from the value's type in the current language. -+This is useful when one wants to specify the search -+pattern as a mixture of types. -+Note that this means, for example, that in the case of C-like languages -+a search for an untyped 0x42 will search for @samp{(int) 0x42} -+which is typically four bytes. @var{max_count} is the highest number of matches -+to search for. -+@end defun -+ +@findex gdb.solib_address +@defun solib_address @var{address} +Return the name of the shared library holding the given address, or None. @@ -13139,593 +2508,188 @@ index 10e7388..099f88a 100644 @node Exception Handling @subsubsection Exception Handling @cindex python exceptions -@@ -18224,6 +18510,44 @@ message as its value, and the Python call stack backtrace at the - Python statement closest to where the @value{GDBN} error occured as the - traceback. +@@ -18948,6 +19017,13 @@ The type of this @code{gdb.Value}. The value of this attribute is a + The following methods are provided: -+@node Auto-loading -+@subsubsection Auto-loading -+ -+When a new object file (@pxref{Objfiles In Python}) is read (for -+example, due to the @code{file} command, or because the inferior has -+loaded a shared library), @value{GDBN} will look for a file named by -+adding @samp{-gdb.py} to the object file's real name (the name formed -+after following all symlinks and resolving @code{.} and @code{..} -+components). If this file exists and is readable, @value{GDBN} will -+evaluate it as a Python script. -+ -+If this file does not exist, and if the parameter -+@code{debug-file-directory} is set, then @value{GDBN} will append the -+object file's real name to the value of this parameter, and try again. -+ -+Finally, if this file does not exist, then @value{GDBN} will look in -+subdirectory of @code{gdb_datadir} (whose value is available from -+@code{maint show gdb_datadir}). Specifically, @value{GDBN} will take -+the value of @code{gdb_datadir}, append @samp{python/auto-load}, and -+then append the object file's real name. -+ -+Also, if a separate debug file is used, @value{GDBN} will look for the -+@samp{-gdb.py} file both in the directory associated with the -+application and the directory associated with the separate debug file. -+ -+When reading a @samp{-gdb.py} file, @value{GDBN} sets the ``current -+objfile''. This is available via the @code{gdb.current_objfile} -+function. This can be useful for registering objfile-specific -+pretty-printers. -+ -+This feature is useful for supplying application-specific debugging -+commands and scripts. It can be disabled using @code{maint set python -+auto-load}. -+ -+@value{GDBN} does not track which files it has already auto-loaded. -+So, your @samp{-gdb.py} file should take care to ensure that it may be -+evaluated multiple times without error. -+ - @node Values From Inferior - @subsubsection Values From Inferior - @cindex values from inferior, with Python -@@ -18258,8 +18582,36 @@ bar = some_val['foo'] - - Again, @code{bar} will also be a @code{gdb.Value} object. - --For pointer data types, @code{gdb.Value} provides a method for --dereferencing the pointer to obtain the object it points to. -+The following attributes are provided: -+ -+@table @code -+@defivar Value address -+If this object is addressable, this read-only attribute holds a -+@code{gdb.Value} object representing the address. Otherwise, -+this attribute holds @code{None}. -+@end defivar -+ -+@cindex optimized out value in Python -+@defivar Value is_optimized_out -+This read-only boolean attribute is true if the compiler optimized out -+this value, thus it is not available for fetching from the inferior. -+@end defivar -+ -+@defivar Value type -+The type of this @code{gdb.Value}. The result is a @code{gdb.Type} -+object. -+@end defivar -+@end table -+ -+The following methods are provided: -+ -+@table @code + @table @code +@defmethod Value cast type +Cast the @code{gdb.Value} to the type represented by @var{type}, and +return a new @code{gdb.Value}. @var{type} must be a @code{gdb.Type} +object. If the cast cannot be performed for some reason, an exception +is thrown. +@end defmethod - ++ @defmethod Value dereference - This method returns a new @code{gdb.Value} object whose contents is -@@ -18282,7 +18634,7 @@ The result @code{bar} will be a @code{gdb.Value} object holding the - value pointed to by @code{foo}. + For pointer data types, this method returns a new @code{gdb.Value} object + whose contents is the object pointed to by the pointer. For example, if +@@ -19019,6 +19095,9 @@ module: + This function looks up a type by name. @var{name} is the name of the + type to look up. It must be a string. + ++If @var{block} is given, then @var{name} is looked up in that scope. ++Otherwise, it is searched for globally. ++ + Ordinarily, this function will return an instance of @code{gdb.Type}. + If the named type cannot be found, it will throw an exception. + @end defun +@@ -19071,6 +19150,12 @@ This is @code{True} if the field is artificial, usually meaning that + it was provided by the compiler and not the user. This attribute is + always provided, and is @code{False} if the field is not artificial. + ++@item is_base_class ++This is @code{True} if the field represents a base class of a C@t{++} ++structure. This attribute is always provided, and is @code{False} ++if the field is not a base class of the type on which @code{fields} was ++called, or if that type was not a C@t{++} class. ++ + @item bitsize + If the field is packed, or is a bitfield, then this will have a + non-zero value, which is the size of the field in bits. Otherwise, +@@ -19123,7 +19208,7 @@ If the type does not have a target, this method will throw an + exception. @end defmethod --@defmethod Value string @r{[}encoding @r{[}errors@r{]}@r{]} -+@defmethod Value string @r{[}encoding@r{]} @r{[}errors@r{]} - If this @code{gdb.Value} represents a string, then this method - converts the contents to a Python string. Otherwise, this method will - throw an exception. -@@ -18308,6 +18660,465 @@ will be used, if the current language is able to supply one. - The optional @var{errors} argument is the same as the corresponding - argument to Python's @code{string.decode} method. +-@defmethod Type template_argument n ++@defmethod Type template_argument n [block] + If this @code{gdb.Type} is an instantiation of a template, this will + return a new @code{gdb.Type} which represents the type of the + @var{n}th template argument. +@@ -19131,7 +19216,8 @@ return a new @code{gdb.Type} which represents the type of the + If this @code{gdb.Type} is not a template type, this will throw an + exception. Ordinarily, only C@t{++} code will have template types. + +-@var{name} is searched for globally. ++If @var{block} is given, then @var{name} is looked up in that scope. ++Otherwise, it is searched for globally. @end defmethod -+@end table + @end table + +@@ -19485,6 +19571,121 @@ import gdb.libstdcxx.v6 + gdb.libstdcxx.v6.register_printers (gdb.current_objfile ()) + @end smallexample + ++@node Inferiors In Python ++@subsubsection Inferiors In Python + -+@node Types In Python -+@subsubsection Types In Python -+@cindex types in Python -+@cindex Python, working with types ++Programs which are being run under @value{GDBN} are called inferiors ++(@pxref{Inferiors}). Python scripts can access information about and ++manipulate inferiors controlled by @value{GDBN} via objects of the ++@code{gdb.Inferior} class. + -+@tindex gdb.Type -+@value{GDBN} represents types from the inferior using the class -+@code{gdb.Type}. -+ -+The following type-related functions are available in the @code{gdb} ++The following inferior-related functions are available in the @code{gdb} +module: + -+@findex gdb.lookup_type -+@defun lookup_type name [block] -+This function looks up a type by name. @var{name} is the name of the -+type to look up. It must be a string. -+ -+If @var{block} is given, then @var{name} is looked up in that scope. -+Otherwise, it is searched for globally. -+ -+Ordinarily, this function will return an instance of @code{gdb.Type}. -+If the named type cannot be found, it will throw an exception. ++@defun inferiors ++Return a tuple containing all inferior objects. +@end defun + -+An instance of @code{Type} has the following attributes: ++A @code{gdb.Inferior} object has the following attributes: + +@table @code -+@defivar Type code -+The type code for this type. The type code will be one of the -+@code{TYPE_CODE_} constants defined below. ++@defivar Inferior num ++ID of inferior, as assigned by GDB. +@end defivar + -+@defivar Type sizeof -+The size of this type, in target @code{char} units. Usually, a -+target's @code{char} type will be an 8-bit byte. However, on some -+unusual platforms, this type may have a different size. ++@defivar Inferior pid ++Process ID of the inferior, assigned by the underlying OS. +@end defivar + -+@defivar Type tag -+The tag name for this type. The tag name is the name after -+@code{struct}, @code{union}, or @code{enum} in C and C@t{++}; not all -+languages have this concept. If this type has no tag name, then -+@code{None} is returned. ++@defivar Inferior was_attached ++Boolean signaling whether the inferior was created using `attach', or ++started by @value{GDBN} itself. +@end defivar +@end table + -+The following methods are provided: ++A @code{gdb.Inferior} object has the following methods: + +@table @code -+@defmethod Type fields -+For structure and union types, this method returns the fields. Range -+types have two fields, the minimum and maximum values. Enum types -+have one field per enum constant. Function and method types have one -+field per parameter. The base types of C@t{++} classes are also -+represented as fields. If the type has no fields, or does not fit -+into one of these categories, an empty sequence will be returned. -+ -+Each field is an object, with some pre-defined attributes: -+@table @code -+@item bitpos -+This attribute is not available for @code{static} fields (as in -+C@t{++} or Java). For non-@code{static} fields, the value is the bit -+position of the field. -+ -+@item name -+The name of the field, or @code{None} for anonymous fields. -+ -+@item artificial -+This is @code{True} if the field is artificial, usually meaning that -+it was provided by the compiler and not the user. This attribute is -+always provided, and is @code{False} if the field is not artificial. -+ -+@item bitsize -+If the field is packed, or is a bitfield, then this will have a -+non-zero value, which is the size of the field in bits. Otherwise, -+this will be zero; in this case the field's size is given by its type. -+ -+@item type -+The type of the field. This is usually an instance of @code{Type}, -+but it can be @code{None} in some situations. -+@end table ++@defmethod Inferior threads ++This method returns a tuple holding all the threads which are valid ++when it is called. If there are no valid threads, the method will ++return an empty list. +@end defmethod + -+@defmethod Type const -+Return a new @code{gdb.Type} object which represents a -+@code{const}-qualified variant of this type. ++@findex gdb.read_memory ++@defmethod Inferior read_memory @var{address} @var{length} ++Read @var{length} bytes of memory from the inferior, starting at ++@var{address}. Returns a buffer object, which behaves much like an array ++or a string. It can be modified and given to the @code{gdb.write_memory} ++function. +@end defmethod + -+@defmethod Type volatile -+Return a new @code{gdb.Type} object which represents a -+@code{volatile}-qualified variant of this type. ++@findex gdb.write_memory ++@defmethod Inferior write_memory @var{address} @var{buffer} @r{[}@var{length}@r{]} ++Write the contents of @var{buffer} (a Python object which supports the ++buffer protocol, i.e., a string, an array or the object returned from ++@code{gdb.read_memory}) to the inferior, starting at @var{address}. ++If given, @var{length} determines the number of bytes from @var{buffer} to ++be written. +@end defmethod + -+@defmethod Type unqualified -+Return a new @code{gdb.Type} object which represents an unqualified -+variant of this type. That is, the result is neither @code{const} nor -+@code{volatile}. -+@end defmethod -+ -+@defmethod Type reference -+Return a new @code{gdb.Type} object which represents a reference to this -+type. -+@end defmethod -+ -+@defmethod Type strip_typedefs -+Return a new @code{gdb.Type} that represents the real type, -+after removing all layers of typedefs. -+@end defmethod -+ -+@defmethod Type target -+Return a new @code{gdb.Type} object which represents the target type -+of this type. -+ -+For a pointer type, the target type is the type of the pointed-to -+object. For an array type (meaning C-like arrays), the target type is -+the type of the elements of the array. For a function or method type, -+the target type is the type of the return value. For a complex type, -+the target type is the type of the elements. For a typedef, the -+target type is the aliased type. -+ -+If the type does not have a target, this method will throw an -+exception. -+@end defmethod -+ -+@defmethod Type template_argument n [block] -+If this @code{gdb.Type} is an instantiation of a template, this will -+return a new @code{gdb.Type} which represents the type of the -+@var{n}th template argument. -+ -+If this @code{gdb.Type} is not a template type, this will throw an -+exception. Ordinarily, only C@t{++} code will have template types. -+ -+If @var{block} is given, then @var{name} is looked up in that scope. -+Otherwise, it is searched for globally. ++@findex gdb.search_memory ++@defmethod Inferior search_memory @var{address} @var{length} @var{pattern} @r{[}@var{size}@r{]} @r{[}@var{max_count}@r{]} ++Search a region of the inferior memory starting at @var{address} with the ++given @var{length}. @var{pattern} can be a string, a byte array, a buffer ++object, a number, a @code{gdb.Value} object (@pxref{Values From Inferior}) ++or a list or tuple with elements in any combination of those types. If ++@var{size} is given and is non-zero, it specifies the size in bytes of a ++Python scalar or @code{gdb.Value} in the search pattern. If @var{size} is ++zero or not specified, it is taken from the value's type in the current ++language. This is useful when one wants to specify the search pattern as ++a mixture of types. Note that this means, for example, that in the case of ++C-like languages a search for an untyped 0x42 will search for ++@samp{(int) 0x42} which is typically four bytes. @var{max_count} is the ++highest number of matches to search for. +@end defmethod +@end table + -+ -+Each type has a code, which indicates what category this type falls -+into. The available type categories are represented by constants -+defined in the @code{gdb} module: -+ -+@table @code -+@findex TYPE_CODE_PTR -+@findex gdb.TYPE_CODE_PTR -+@item TYPE_CODE_PTR -+The type is a pointer. -+ -+@findex TYPE_CODE_ARRAY -+@findex gdb.TYPE_CODE_ARRAY -+@item TYPE_CODE_ARRAY -+The type is an array. -+ -+@findex TYPE_CODE_STRUCT -+@findex gdb.TYPE_CODE_STRUCT -+@item TYPE_CODE_STRUCT -+The type is a structure. -+ -+@findex TYPE_CODE_UNION -+@findex gdb.TYPE_CODE_UNION -+@item TYPE_CODE_UNION -+The type is a union. -+ -+@findex TYPE_CODE_ENUM -+@findex gdb.TYPE_CODE_ENUM -+@item TYPE_CODE_ENUM -+The type is an enum. -+ -+@findex TYPE_CODE_FLAGS -+@findex gdb.TYPE_CODE_FLAGS -+@item TYPE_CODE_FLAGS -+A bit flags type, used for things such as status registers. -+ -+@findex TYPE_CODE_FUNC -+@findex gdb.TYPE_CODE_FUNC -+@item TYPE_CODE_FUNC -+The type is a function. -+ -+@findex TYPE_CODE_INT -+@findex gdb.TYPE_CODE_INT -+@item TYPE_CODE_INT -+The type is an integer type. -+ -+@findex TYPE_CODE_FLT -+@findex gdb.TYPE_CODE_FLT -+@item TYPE_CODE_FLT -+A floating point type. -+ -+@findex TYPE_CODE_VOID -+@findex gdb.TYPE_CODE_VOID -+@item TYPE_CODE_VOID -+The special type @code{void}. -+ -+@findex TYPE_CODE_SET -+@findex gdb.TYPE_CODE_SET -+@item TYPE_CODE_SET -+A Pascal set type. -+ -+@findex TYPE_CODE_RANGE -+@findex gdb.TYPE_CODE_RANGE -+@item TYPE_CODE_RANGE -+A range type, that is, an integer type with bounds. -+ -+@findex TYPE_CODE_STRING -+@findex gdb.TYPE_CODE_STRING -+@item TYPE_CODE_STRING -+A string type. Note that this is only used for certain languages with -+language-defined string types; C strings are not represented this way. -+ -+@findex TYPE_CODE_BITSTRING -+@findex gdb.TYPE_CODE_BITSTRING -+@item TYPE_CODE_BITSTRING -+A string of bits. -+ -+@findex TYPE_CODE_ERROR -+@findex gdb.TYPE_CODE_ERROR -+@item TYPE_CODE_ERROR -+An unknown or erroneous type. -+ -+@findex TYPE_CODE_METHOD -+@findex gdb.TYPE_CODE_METHOD -+@item TYPE_CODE_METHOD -+A method type, as found in C++ or Java. -+ -+@findex TYPE_CODE_METHODPTR -+@findex gdb.TYPE_CODE_METHODPTR -+@item TYPE_CODE_METHODPTR -+A pointer-to-member-function. -+ -+@findex TYPE_CODE_MEMBERPTR -+@findex gdb.TYPE_CODE_MEMBERPTR -+@item TYPE_CODE_MEMBERPTR -+A pointer-to-member. -+ -+@findex TYPE_CODE_REF -+@findex gdb.TYPE_CODE_REF -+@item TYPE_CODE_REF -+A reference type. -+ -+@findex TYPE_CODE_CHAR -+@findex gdb.TYPE_CODE_CHAR -+@item TYPE_CODE_CHAR -+A character type. -+ -+@findex TYPE_CODE_BOOL -+@findex gdb.TYPE_CODE_BOOL -+@item TYPE_CODE_BOOL -+A boolean type. -+ -+@findex TYPE_CODE_COMPLEX -+@findex gdb.TYPE_CODE_COMPLEX -+@item TYPE_CODE_COMPLEX -+A complex float type. -+ -+@findex TYPE_CODE_TYPEDEF -+@findex gdb.TYPE_CODE_TYPEDEF -+@item TYPE_CODE_TYPEDEF -+A typedef to some other type. -+ -+@findex TYPE_CODE_NAMESPACE -+@findex gdb.TYPE_CODE_NAMESPACE -+@item TYPE_CODE_NAMESPACE -+A C++ namespace. -+ -+@findex TYPE_CODE_DECFLOAT -+@findex gdb.TYPE_CODE_DECFLOAT -+@item TYPE_CODE_DECFLOAT -+A decimal floating point type. -+ -+@findex TYPE_CODE_INTERNAL_FUNCTION -+@findex gdb.TYPE_CODE_INTERNAL_FUNCTION -+@item TYPE_CODE_INTERNAL_FUNCTION -+A function internal to @value{GDBN}. This is the type used to represent -+convenience functions. -+@end table -+ -+@node Pretty Printing -+@subsubsection Pretty Printing -+ -+@value{GDBN} provides a mechanism to allow pretty-printing of values -+using Python code. This mechanism works for both MI and the CLI. -+ -+A pretty-printer is an object that implements a specific interface. -+There is no predefined base class for pretty-printers. -+ -+@defop Operation {pretty printer} __init__ (self, val) -+When printing a value, @value{GDBN} constructs an instance of the -+pretty-printer. @var{val} is the value to be printed, an instance of -+@code{gdb.Value}. -+@end defop -+ -+@defop Operation {pretty printer} children (self) -+When printing a value, @value{GDBN} will call this method to compute -+the children of the value passed to the object's constructor. -+ -+This method must return an object conforming to the Python iterator -+protocol. Each element returned by the iterator must be a tuple -+holding two elements. The first element is the ``name'' of the child; -+the second element is the child's value. The value can be any Python -+object which is convertible to a @value{GDBN} value. -+ -+This method is optional. If it does not exist, @value{GDBN} will act -+as though the value has no children. -+@end defop -+ -+@defop Operation {pretty printer} display_hint (self) -+This method must return a string. The CLI may use this to change the -+formatting of children of a value. The result will also be supplied -+to an MI consumer as a @samp{displayhint} attribute of the variable -+being printed. -+ -+Some display hints are predefined by @value{GDBN}: -+ -+@table @samp -+@item array -+Indicate that the object being printed is ``array-like''. The CLI -+uses this to respect parameters such as @code{set print elements} and -+@code{set print array}. -+ -+@item map -+Indicate that the object being printed is ``map-like'', and that the -+children of this value can be assumed to alternate between keys and -+values. -+ -+@item string -+Indicate that the object being printed is ``string-like''. If the -+printer's @code{to_string} method returns a Python string of some -+kind, then @value{GDBN} will call its internal language-specific -+string-printing function to format the string. For the CLI this means -+adding quotation marks, possibly escaping some characters, respecting -+@code{set print elements}, and the like. -+@end table -+@end defop -+ -+@defop Operation {pretty printer} to_string (self) -+@value{GDBN} will call this method to display the string -+representation of the value passed to the object's constructor. -+ -+When printing from the CLI, if the @code{to_string} method exists, -+then @value{GDBN} will prepend its result to the values returned by -+@code{children}. -+ -+If this method returns a string, it is printed verbatim. Otherwise, -+the result is converted to a @code{gdb.Value}, following the usual -+algorithm. Then @value{GDBN} prints this value; this may possibly -+result in a call to another pretty-printer. If the result is not -+convertible to @code{gdb.Value}, an exception is raised. -+@end defop -+ -+@subsubsection Selecting Pretty-Printers -+ -+The Python list @code{gdb.pretty_printers} contains an array of -+functions that have been registered via addition as a pretty-printer. -+Each function will be called with a @code{gdb.Value} to be -+pretty-printed. Each @code{gdb.Objfile} also contains a -+@code{pretty_printers} attribute. A function on one of these lists -+takes a single @code{gdb.Value} argument and returns a pretty-printer -+object conforming to the interface definition above. If this function -+cannot create a pretty-printer for the value, it should return -+@code{None}. -+ -+@value{GDBN} first checks the @code{pretty_printers} attribute of each -+@code{gdb.Objfile} and iteratively calls each function in the list for -+that @code{gdb.Objfile} until it receives a pretty-printer object. -+After these @code{gdb.Objfile} have been exhausted, it tries the -+global @code{gdb.pretty-printers} list, again calling each function -+until an object is returned. -+ -+The order in which the objfiles are searched is not specified. -+Functions are always invoked from the head of the -+@code{gdb.pretty-printers} list, and iterated over sequentially until -+the end of the list, or a printer object is returned. -+ -+Here is an example showing how a @code{std::string} printer might be -+written: -+ -+@smallexample -+class StdStringPrinter: -+ "Print a std::string" -+ -+ def __init__ (self, val): -+ self.val = val -+ -+ def to_string (self): -+ return self.val['_M_dataplus']['_M_p'] -+@end smallexample -+ -+And here is an example showing how a lookup function for -+the printer example above might be written. -+ -+@smallexample -+def str_lookup_function (val): -+ -+ lookup_tag = val.type.tag -+ regex = re.compile ("^std::basic_string$") -+ if lookup_tag == None: -+ return None -+ if regex.match (lookup_tag): -+ return StdStringPrinter (val) -+ -+ return None -+@end smallexample -+ -+The example lookup function extracts the value's type, and attempts to -+match it to a type that it can pretty-print. If it is a type the -+printer can pretty-print, it will return a printer object. If not, it -+returns: @code{None}. -+ -+We recommend that you put your core pretty-printers into a versioned -+python package, and then restrict your auto-loaded code to idempotent -+behavior -- for example, just @code{import}s of your printer modules, -+followed by a call to a register pretty-printers with the current -+objfile. This approach will scale more nicely to multiple inferiors, -+potentially using different library versions. -+ -+For example, in addition to the above, this code might appear in -+@code{gdb.libstdcxx.v6}: -+ -+@smallexample -+def register_printers (objfile): -+ objfile.pretty_printers.add (str_lookup_function) -+@end smallexample -+ -+And then the corresponding contents of the auto-load file would be: -+ -+@smallexample -+import gdb.libstdcxx.v6 -+gdb.libstdcxx.v6.register_printers (gdb.current_objfile ()) -+@end smallexample -+ +@node Threads In Python +@subsubsection Threads In Python + -+Python scripts can access information about the inferior's threads -+using some functions provided by @value{GDBN}. Like all of -+@value{GDBN}'s Python additions, these are in the @code{gdb} module: ++Python scripts can access information about and manipulate inferior threads ++controlled by @value{GDBN} via objects of the @code{gdb.InferiorThread} class. + -+@findex gdb.threads -+@defun threads -+This function returns a tuple holding all the thread IDs which are -+valid when the function is called. If there are no valid threads, -+this will return @code{None}. -+@end defun ++The following inferior-related functions are available in the @code{gdb} ++module: + -+@findex gdb.current_thread -+@defun current_thread -+This function returns the thread ID of the selected thread. If there ++@findex gdb.selected_thread ++@defun selected_thread ++This function returns the thread object for the selected thread. If there +is no selected thread, this will return @code{None}. +@end defun + -+@findex gdb.switch_to_thread -+@defun switch_to_thread id -+This changes @value{GDBN}'s currently selected thread to the thread -+given by @var{id}. @var{id} must be a valid thread ID as returned by -+@code{threads}. If @var{id} is invalid, this function throws an -+exception. -+@end defun - ++A @code{gdb.InferiorThread} object has the following attributes: ++ ++@table @code ++@defivar InferiorThread num ++ID of the thread, as assigned by GDB. ++@end defivar ++@end table ++ ++A @code{gdb.InferiorThread} object has the following methods: ++ ++@table @code ++@defmethod InferiorThread frames ++Return a tuple containing all frames in the thread. ++@end defmethod ++ ++@defmethod InferiorThread newest_frame ++Return the newest frame thread's stack. ++@end defmethod ++ ++@defmethod InferiorThread switch_to_thread ++This changes @value{GDBN}'s currently selected thread to the one represented ++by this object. ++@end defmethod ++@end table ++ @node Commands In Python @subsubsection Commands In Python -@@ -18320,7 +19131,7 @@ You can implement new @value{GDBN} CLI commands in Python. A CLI - command is implemented using an instance of the @code{gdb.Command} - class, most commonly using a subclass. --@defmethod Command __init__ name @var{command-class} @r{[}@var{completer-class} @var{prefix}@r{]} -+@defmethod Command __init__ name @var{command_class} @r{[}@var{completer_class}@r{]} @r{[}@var{prefix}@r{]} - The object initializer for @code{Command} registers the new command - with @value{GDBN}. This initializer is normally invoked from the - subclass' own @code{__init__} method. -@@ -18332,11 +19143,11 @@ an exception is raised. - - There is no support for multi-line commands. - --@var{command-class} should be one of the @samp{COMMAND_} constants -+@var{command_class} should be one of the @samp{COMMAND_} constants - defined below. This argument tells @value{GDBN} how to categorize the - new command in the help system. - --@var{completer-class} is an optional argument. If given, it should be -+@var{completer_class} is an optional argument. If given, it should be - one of the @samp{COMPLETE_} constants defined below. This argument - tells @value{GDBN} how to perform completion for this command. If not - given, @value{GDBN} will attempt to complete using the object's -@@ -18563,6 +19374,374 @@ registration of the command with @value{GDBN}. Depending on how the +@@ -19737,6 +19938,135 @@ registration of the command with @value{GDBN}. Depending on how the Python code is read into @value{GDBN}, you may need to import the @code{gdb} module explicitly. -+ +@node Parameters In Python +@subsubsection Parameters In Python + @@ -13855,92 +2819,13 @@ index 10e7388..099f88a 100644 +constants provided when the parameter is created. +@end table + -+@node Functions In Python -+@subsubsection Writing new convenience functions -+ -+@cindex writing convenience functions -+@cindex convenience functions in python -+@cindex python convenience functions -+@tindex gdb.Function -+@tindex Function -+You can implement new convenience functions (@pxref{Convenience Vars}) -+in Python. A convenience function is an instance of a subclass of the -+class @code{gdb.Function}. -+ -+@defmethod Function __init__ name -+The initializer for @code{Function} registers the new function with -+@value{GDBN}. The argument @var{name} is the name of the function, -+a string. The function will be visible to the user as a convenience -+variable of type @code{internal function}, whose name is the same as -+the given @var{name}. -+ -+The documentation for the new function is taken from the documentation -+string for the new class. -+@end defmethod -+ -+@defmethod Function invoke @var{*args} -+When a convenience function is evaluated, its arguments are converted -+to instances of @code{gdb.Value}, and then the function's -+@code{invoke} method is called. Note that @value{GDBN} does not -+predetermine the arity of convenience functions. Instead, all -+available arguments are passed to @code{invoke}, following the -+standard Python calling convention. In particular, a convenience -+function can have default values for parameters without ill effect. -+ -+The return value of this method is used as its value in the enclosing -+expression. If an ordinary Python value is returned, it is converted -+to a @code{gdb.Value} following the usual rules. -+@end defmethod -+ -+The following code snippet shows how a trivial convenience function can -+be implemented in Python: -+ -+@smallexample -+class Greet (gdb.Function): -+ """Return string to greet someone. -+Takes a name as argument.""" -+ -+ def __init__ (self): -+ super (Greet, self).__init__ ("greet") -+ -+ def invoke (self, name): -+ return "Hello, %s!" % name.string () -+ -+Greet () -+@end smallexample -+ -+The last line instantiates the class, and is necessary to trigger the -+registration of the function with @value{GDBN}. Depending on how the -+Python code is read into @value{GDBN}, you may need to import the -+@code{gdb} module explicitly. -+ -+@node Objfiles In Python -+@subsubsection Objfiles In Python -+ -+@cindex objfiles in python -+@cindex python objfiles -+@tindex gdb.Objfile -+@tindex Objfile -+@value{GDBN} loads symbols for an inferior from various -+symbol-containing files. These include the primary executable file, -+any shared libraries used by the inferior, and any separate debug info -+files. @value{GDBN} calls these symbol-containing files -+@dfn{objfiles}. -+ -+Each objfile is represented by an instance of the @code{gdb.Objfile} -+class. -+ -+@defivar Objfile filename -+The file name of the objfile as a string. -+@end defivar -+ -+@defivar Objfile pretty_printers -+The @code{pretty_printers} attribute is used to look up -+pretty-printers by type. This is a dictionary which maps regular -+expressions (strings) to pretty-printing objects. @xref{Pretty -+Printing}, for more information. -+@end defivar -+ + @node Functions In Python + @subsubsection Writing new convenience functions + +@@ -19841,6 +20171,82 @@ which is used to format the value. @xref{Pretty Printing}, for more + information. + @end defivar + +@node Breakpoints In Python +@subsubsection Manipulating breakpoints using Python + @@ -14017,231 +2902,274 @@ index 10e7388..099f88a 100644 +@code{None}. This attribute is not writable. +@end defivar + -+@node Frames In Python -+@subsubsection Accessing inferior stack frames from Python. -+ -+@cindex frames in python -+@tindex gdb.Frame -+@tindex Frame -+When the debugged program stops, @value{GDBN} is able to analyse its call -+stack (@pxref{Frames,,Stack frames}). The @code{gdb.Frame} class -+represents a frame in the stack. You can get a tuple containing all the -+frames in the stack with the @code{gdb.frames} function, the newest -+frame with the @code{gdb.newest_frame} function, and the selected frame -+with the @code{gdb.selected_frame} function -+(see @xref{Selection,,Selecting a Frame}.) See -+@xref{Basic Python,,Basic Python}. -+ -+A @code{gdb.Frame} object has the following methods: -+ -+@table @code -+@defmethod Frame equals @code{frame} -+Compare frames. -+@end defmethod -+ -+@defmethod Frame is_valid -+Returns true if the @code{gdb.Frame} object is valid, false if not. -+A frame object can become invalid if the frame it refers to doesn't -+exist anymore in the inferior. All @code{gdb.Frame} methods will throw -+an exception if it is invalid at the time the method call is made. -+@end defmethod -+ -+@defmethod Frame name -+Returns the function name of the frame, or @code{None} if it can't be -+obtained. -+@end defmethod -+ -+@defmethod Frame type -+Returns the type of the frame. The value can be one of -+@code{gdb.NORMAL_FRAME}, @code{gdb.DUMMY_FRAME}, @code{gdb.SIGTRAMP_FRAME} -+or @code{gdb.SENTINEL_FRAME}. -+@end defmethod -+ -+@defmethod Frame unwind_stop_reason -+Return an integer representing the reason why it's not possible to find -+frames older than this. Use @code{gdb.frame_stop_reason_string} to convert -+the value returned by this function to a string. -+@end defmethod -+ -+@defmethod Frame pc -+Returns the frame's resume address. -+@end defmethod -+ + @node Frames In Python + @subsubsection Acessing inferior stack frames from Python. + +@@ -19905,6 +20311,14 @@ function to a string. + Returns the frame's resume address. + @end defmethod + +@defmethod Frame block -+Returns the frame's code block. @c (see @xref{Block,,Code Blocks and Scopes}). ++Returns the frame's code block. @c (@pxref{Block,,Code Blocks and Scopes}). +@end defmethod + -+@defmethod Frame address_in_block -+Returns an address which falls within the frame's code block. -+@end defmethod -+ -+@defmethod Frame older -+Return the frame immediately older (outer) to this frame. -+@end defmethod -+ -+@defmethod Frame newer -+Return the frame immediately newer (inner) to this frame. ++@defmethod Frame function ++Returns the symbol for the function corresponding to this frame. @c (@pxref{Symbols In Python}). +@end defmethod + + @defmethod Frame older + Return the frame that called this frame. + @end defmethod +@@ -19913,10 +20327,18 @@ Return the frame that called this frame. + Return the frame called by this frame. + @end defmethod + +@defmethod Frame find_sal -+Return the frame's symtab and line object. @c (see @xref{Symtab_and_line,, Symtab and line}). ++Return the frame's symtab and line object. @c (@pxref{Symtab_and_line,, Symtab and line}). +@end defmethod + -+@defmethod Frame read_var @var{variable} -+Return the value of the given variable in this frame. @code{variable} can be -+either a string or a @code{gdb.Symbol} object. @c (@pxref{Symbols In Python}). -+@end defmethod -+@end table + @defmethod Frame read_var variable + Return the value of the given variable in this frame. @var{variable} must + be a string. + @end defmethod + ++@defmethod Frame select ++Set this frame to be the user's selected frame. ++@end defmethod + @end table + @node Interpreters - @chapter Command Interpreters - @cindex command interpreters -@@ -22273,6 +23452,103 @@ Unfreezing a variable does not update it, only subsequent - (gdb) +@@ -23238,6 +23660,8 @@ access this functionality: + @item @strong{Operation} + @tab @strong{Description} + ++@item @code{-enable-pretty-printing} ++@tab enable Python-based pretty-printing + @item @code{-var-create} + @tab create a variable object + @item @code{-var-delete} +@@ -23273,6 +23697,23 @@ how it can be used. + + @subheading Description And Use of Operations on Variable Objects + ++@subheading The @code{-enable-pretty-printing} Command ++@findex -enable-pretty-printing ++ ++@smallexample ++-enable-pretty-printing ++@end smallexample ++ ++@var{GDBN} allows Python-based visualizers to affect the output of the ++MI variable object commands. However, because there was no way to ++implement this in a fully backward-compatible way, a front end must ++request that this functionality be enabled. ++ ++Once sent, this command cannot be undone. ++ ++Note that if Python support has not been compiled into @var{GDBN}, ++this command will still succeed. ++ + @subheading The @code{-var-create} Command + @findex -var-create + +@@ -23405,7 +23846,7 @@ Returns the number of children of a variable object @var{name}: + @subsubheading Synopsis + + @smallexample +- -var-list-children [@var{print-values}] @var{name} ++ -var-list-children [@var{print-values}] @var{name} [@var{from} @var{to}] @end smallexample + @anchor{-var-list-children} -+@subheading The @code{-var-set-visualizer} command -+@findex -var-set-visualizer -+@anchor{-var-set-visualizer} -+ -+@subsubheading Synopsis -+ -+@smallexample -+ -var-set-visualizer @var{name} @var{visualizer} -+@end smallexample -+ -+@subheading The @code{-var-set-child-range} command -+@findex -var-set-child-range -+@anchor{-var-set-child-range} -+ -+Set a visualizer for the variable object @var{name}. -+ -+@var{visualizer} is the visualizer to use. The special value -+@samp{None} means to disable any visualizer in use. -+ -+If not @samp{None}, @var{visualizer} must be a Python expression. -+This expression must evaluate to a callable object which accepts a -+single argument. @value{GDBN} will call this object with the value of -+the varobj @var{name} as an argument. This function must return an -+object which conforms to the pretty-printing interface (@pxref{Pretty -+Printing}). -+ -+The pre-defined function @code{gdb.default_visualizer} may be used -+to select a visualizer according to the type of the varobj. This is -+called when a varobj is created, and so ordinarily is not needed. -+ -+@code{gdb.default_visualizer} looks in the global dictionary named -+@code{gdb.pretty_printers}. -+ -+This feature is only available if Python support is enabled. -+ -+@subsubheading Example -+ -+Resetting the visualizer: -+ -+@smallexample -+(gdb) -+-var-set-visualizer V None -+^done -+@end smallexample -+ -+Reselecting the default (type-based) visualizer: -+ -+@smallexample -+(gdb) -+-var-set-visualizer V gdb.default_visualizer -+^done -+@end smallexample -+ -+Suppose @code{SomeClass} is a visualizer class. A lambda expression -+can be used to instantiate this class for a varobj: -+ -+@smallexample -+(gdb) -+-var-set-visualizer V "lambda val: SomeClass()" -+^done -+@end smallexample -+ -+@subsubheading Synopsis -+ -+@smallexample -+ -var-set-child-range @var{name} @var{from} @var{to} -+@end smallexample -+ -+Select a sub-range of the children of the variable object @var{name}; -+future calls to @code{-var-list-children} will only report the -+selected range of children. This allows an MI consumer to avoid -+inefficiencies if the varobj has very many children. -+ -+If either @var{from} or @var{to} is less than zero, then sub-range -+selection is disabled, and @code{-var-list-children} will report all -+children. -+ -+Otherwise, @var{from} and @var{to} are indexes into the array of -+children. Children starting at @var{from} and stopping jsut before -+@var{to} will be reported. -+ -+@subsubheading Example -+ -+@smallexample -+(gdb) -+ -var-list-children n -+ ^done,numchild=3,children=[@{name="a",numchild=0,type="int"@}, -+ @{name="b",numchild=0,type="int"@}, -+ @{name="c",numchild=0,type="int"@}] -+(gdb) -+ -var-set-child-range n 1 2 -+(gdb) -+ -var-list-children n -+ ^done,numchild=3,children=[@{name="b",numchild=0,type="int"@}, -+ @{name="c",numchild=0,type="int"@}] -+@end smallexample -+ +@@ -23418,6 +23859,14 @@ values; and if it is 2 or @code{--simple-values} print the name and + value for simple data types and just the name for arrays, structures + and unions. - @c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - @node GDB/MI Data Manipulation -@@ -23832,6 +25108,10 @@ as possible presense of the @code{frozen} field in the output - of @code{-varobj-create}. - @item pending-breakpoints - Indicates presence of the @option{-f} option to the @code{-break-insert} command. -+@item python -+Indicates presence of Python scripting support, Python-based -+pretty-printing commands, and possible presence of the -+@samp{display_hint} field in the output of @code{-var-list-children} - @item thread-info - Indicates presence of the @code{-thread-info} command. ++@var{from} and @var{to}, if specified, indicate the range of children ++to report. If @var{from} or @var{to} is less than zero, the range is ++reset and all children will be reported. Otherwise, children starting ++at @var{from} (zero-based) and ending just before @var{to} will be ++reported. The selected range is sticky; future calls to ++@code{-var-update} or @code{-var-list-children} will use any ++previously set range. ++ + For each child the following results are returned: -@@ -25402,28 +26682,6 @@ data in a @file{gmon.out} file, be sure to move it to a safe location. - Configuring with @samp{--enable-profiling} arranges for @value{GDBN} to be - compiled with the @samp{-pg} compiler option. + @table @var +@@ -23449,6 +23898,10 @@ Otherwise this result is not present. --@kindex maint set linux-async --@kindex maint show linux-async --@cindex asynchronous support --@item maint set linux-async --@itemx maint show linux-async --Control the GNU/Linux native asynchronous support --(@pxref{Background Execution}) of @value{GDBN}. -- --GNU/Linux native asynchronous support will be disabled until you use --the @samp{maint set linux-async} command to enable it. -- --@kindex maint set remote-async --@kindex maint show remote-async --@cindex asynchronous support --@item maint set remote-async --@itemx maint show remote-async --Control the remote asynchronous support --(@pxref{Background Execution}) of @value{GDBN}. -- --Remote asynchronous support will be disabled until you use --the @samp{maint set remote-async} command to enable it. -- - @kindex maint show-debug-regs - @cindex x86 hardware debug registers - @item maint show-debug-regs + @item frozen + If the variable object is frozen, this variable will be present with a value of 1. ++ ++@item has_more ++This is an integer attribute which is nonzero if there are children ++remaining after the end of the selected range. + @end table + + @subsubheading Example +diff --git a/gdb/doc/gdbint.texinfo b/gdb/doc/gdbint.texinfo +index b1c0452..da24b98 100644 +--- a/gdb/doc/gdbint.texinfo ++++ b/gdb/doc/gdbint.texinfo +@@ -2106,6 +2106,18 @@ time, and so we attempt to handle symbols incrementally. For instance, + we create @dfn{partial symbol tables} consisting of only selected + symbols, and only expand them to full symbol tables when necessary. + ++@menu ++* Symbol Reading:: ++* Partial Symbol Tables:: ++* Types:: ++* Object File Formats:: ++* Debugging File Formats:: ++* Adding a New Symbol Reader to GDB:: ++* Memory Management for Symbol Files:: ++* Memory Management for Types:: ++@end menu ++ ++@node Symbol Reading + @section Symbol Reading + + @cindex symbol reading +@@ -2198,6 +2210,7 @@ symtab. Upon return, @code{pst->readin} should have been set to 1, and + zero if there were no symbols in that part of the symbol file. + @end table + ++@node Partial Symbol Tables + @section Partial Symbol Tables + + @value{GDBN} has three types of symbol tables: +@@ -2293,6 +2306,7 @@ and all the psymbols themselves are allocated in a pair of large arrays + on an obstack, so there is little to be gained by trying to free them + unless you want to do a lot more work. + ++@node Types + @section Types + + @unnumberedsubsec Fundamental Types (e.g., @code{FT_VOID}, @code{FT_BOOLEAN}). +@@ -2315,6 +2329,7 @@ types map to one @code{TYPE_CODE_*} type, and are distinguished by + other members of the type struct, such as whether the type is signed + or unsigned, and how many bits it uses. + ++@anchor{Builtin Types} + @unnumberedsubsec Builtin Types (e.g., @code{builtin_type_void}, @code{builtin_type_char}). + + These are instances of type structs that roughly correspond to +@@ -2329,6 +2344,7 @@ only one instance exists, while @file{c-lang.c} builds as many + @code{TYPE_CODE_INT} types as needed, with each one associated with + some particular objfile. + ++@node Object File Formats + @section Object File Formats + @cindex object file formats + +@@ -2414,6 +2430,7 @@ SOM, which is a cross-language ABI). + + The SOM reader is in @file{somread.c}. + ++@node Debugging File Formats + @section Debugging File Formats + + This section describes characteristics of debugging information that +@@ -2485,6 +2502,7 @@ DWARF 3 is an improved version of DWARF 2. + @cindex SOM debugging info + Like COFF, the SOM definition includes debugging information. + ++@node Adding a New Symbol Reader to GDB + @section Adding a New Symbol Reader to @value{GDBN} + + @cindex adding debugging info reader +@@ -2507,6 +2525,7 @@ will only ever be implemented by one object file format may be called + directly. This interface should be described in a file + @file{bfd/lib@var{xyz}.h}, which is included by @value{GDBN}. + ++@node Memory Management for Symbol Files + @section Memory Management for Symbol Files + + Most memory associated with a loaded symbol file is stored on +@@ -2518,10 +2537,45 @@ released when the objfile is unloaded or reloaded. Therefore one + objfile must not reference symbol or type data from another objfile; + they could be unloaded at different times. + +-User convenience variables, et cetera, have associated types. Normally +-these types live in the associated objfile. However, when the objfile +-is unloaded, those types are deep copied to global memory, so that +-the values of the user variables and history items are not lost. ++@node Memory Management for Types ++@section Memory Management for Types ++@cindex memory management for types ++ ++@findex TYPE_OBJFILE ++@code{TYPE_OBJFILE} macro indicates the current memory owner of the type. ++Non-@code{NULL} value indicates it is owned by an objfile (specifically by its ++obstack) and in such case the type remains valid till the objfile is unloaded ++or reloaded. For such types with an associated objfile no reference counting ++is being made. ++ ++User convenience variables, et cetera, have associated types. Normally these ++types live in the associated objfile. However, when the objfile is unloaded, ++those types are deep copied to global memory, so that the values of the user ++variables and history items are not lost. During the copy they will get their ++@code{TYPE_OBJFILE} set to @code{NULL} and become so-called @dfn{reclaimable} ++types. ++ ++Types with null @code{TYPE_OBJFILE} can be either permanent types ++(@pxref{Builtin Types}) or reclaimable types which will be deallocated at the ++first idle @value{GDBN} moment if the last object referencing them is removed. ++Permanent types are allocated by the function @code{alloc_type} (and its ++derivations like @code{init_type}) specifying objfile as @code{NULL}. The ++reclaimable types are created the same way but moreover they need to have ++@code{type_init_group} called to start their tracking as being possibly ++deallocatable. ++ ++@findex free_all_types ++When @value{GDBN} gets idle it always calls the @code{free_all_types} function ++which deallocates any unused types. All types currently not owned by an ++objfile must be marked as used on each @code{free_all_types} call as they would ++get deallocated as unused otherwise. ++ ++@code{free_all_types} automatically checks for any cross-type references such ++as through @code{TYPE_TARGET_TYPE}, @code{TYPE_POINTER_TYPE} etc.@: and ++prevents early deallocation for any such existing references. Reclaimable ++types may reference any other reclaimable types or even permanent types. But ++permanent types must not reference reclaimable types (nor an objfile associated ++type). + + + @node Language Support +diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi +index 4984f31..4bbbe4e 100644 +--- a/gdb/doc/observer.texi ++++ b/gdb/doc/observer.texi +@@ -130,6 +130,15 @@ Called with @var{objfile} equal to @code{NULL} to indicate + previously loaded symbol table data has now been invalidated. + @end deftypefun + ++@deftypefun void objfile_unloading (struct objfile *@var{objfile}) ++The file specified by @var{objfile} is going to be removed from @value{GDBN}. ++@end deftypefun ++ ++@deftypefun void objfile_unloaded (void) ++Removal of @var{objfile} started by @code{objfile_unloading} finished and ++@var{objfile} is no longer known to @value{GDBN}. ++@end deftypefun ++ + @deftypefun void new_thread (struct thread_info *@var{t}) + The thread specified by @var{t} has been created. + @end deftypefun +@@ -206,6 +215,11 @@ Either @value{GDBN} detached from the inferior, or the inferior + exited. The argument @var{pid} identifies the inferior. + @end deftypefun + ++@deftypefun void mark_used (void) ++Mark any possibly reclaimable objects as used during a mark-and-sweep garbage ++collector pass. Currently only @code{type_mark_used} marker is supported. ++@end deftypefun ++ + @deftypefun void test_notification (int @var{somearg}) + This observer is used for internal testing. Do not use. + See testsuite/gdb.gdb/observer.exp. diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c -index ce11d89..eaa6a13 100644 +index c620067..6c4faf1 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -38,6 +38,7 @@ @@ -14252,7 +3180,54 @@ index ce11d89..eaa6a13 100644 struct comp_unit; -@@ -1499,6 +1500,14 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) +@@ -305,6 +306,13 @@ no_get_frame_base (void *baton, gdb_byte **start, size_t *length) + } + + static CORE_ADDR ++no_get_frame_cfa (void *baton) ++{ ++ internal_error (__FILE__, __LINE__, ++ _("Support for DW_OP_call_frame_cfa is unimplemented")); ++} ++ ++static CORE_ADDR + no_get_tls_address (void *baton, CORE_ADDR offset) + { + internal_error (__FILE__, __LINE__, +@@ -355,14 +363,16 @@ execute_stack_op (gdb_byte *exp, ULONGEST len, int addr_size, + ctx->read_reg = read_reg; + ctx->read_mem = read_mem; + ctx->get_frame_base = no_get_frame_base; ++ ctx->get_frame_cfa = no_get_frame_cfa; + ctx->get_tls_address = no_get_tls_address; + + dwarf_expr_push (ctx, initial); + dwarf_expr_eval (ctx, exp, len); + result = dwarf_expr_fetch (ctx, 0); + +- if (ctx->in_reg) ++ if (ctx->location == DWARF_VALUE_REGISTER) + result = read_reg (this_frame, result); ++ /* FIXME */ + + free_dwarf_expr_context (ctx); + +@@ -1242,6 +1252,14 @@ dwarf2_frame_base_sniffer (struct frame_info *this_frame) + + return NULL; + } ++ ++CORE_ADDR ++dwarf2_frame_cfa (struct frame_info *this_frame) ++{ ++ if (! frame_base_is (this_frame, &dwarf2_frame_base)) ++ error (_("can't compute CFA for this frame")); ++ return get_frame_base_address (this_frame); ++} + + const struct objfile_data *dwarf2_frame_objfile_data; + +@@ -1504,6 +1522,14 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) struct dwarf2_fde *fde; CORE_ADDR offset; @@ -14267,11 +3242,172 @@ index ce11d89..eaa6a13 100644 fde = objfile_data (objfile, dwarf2_frame_objfile_data); if (fde == NULL) continue; +diff --git a/gdb/dwarf2-frame.h b/gdb/dwarf2-frame.h +index b203661..dd03d59 100644 +--- a/gdb/dwarf2-frame.h ++++ b/gdb/dwarf2-frame.h +@@ -118,4 +118,8 @@ extern const struct frame_base * + + void dwarf2_frame_build_info (struct objfile *objfile); + ++/* Compute the DWARF CFA for a frame. */ ++ ++CORE_ADDR dwarf2_frame_cfa (struct frame_info *this_frame); ++ + #endif /* dwarf2-frame.h */ diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c -index 75a4ec7..aa8ab33 100644 +index 8dbf976..aec7b92 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c -@@ -752,6 +752,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, +@@ -109,8 +109,7 @@ dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n) + + /* Add a new piece to CTX's piece list. */ + static void +-add_piece (struct dwarf_expr_context *ctx, +- int in_reg, CORE_ADDR value, ULONGEST size) ++add_piece (struct dwarf_expr_context *ctx, ULONGEST size) + { + struct dwarf_expr_piece *p; + +@@ -125,9 +124,15 @@ add_piece (struct dwarf_expr_context *ctx, + * sizeof (struct dwarf_expr_piece)); + + p = &ctx->pieces[ctx->num_pieces - 1]; +- p->in_reg = in_reg; +- p->value = value; ++ p->location = ctx->location; + p->size = size; ++ if (p->location == DWARF_VALUE_LITERAL) ++ { ++ p->v.literal.data = ctx->data; ++ p->v.literal.length = ctx->len; ++ } ++ else ++ p->v.value = dwarf_expr_fetch (ctx, 0); + } + + /* Evaluate the expression at ADDR (LEN bytes long) using the context +@@ -271,6 +276,21 @@ signed_address_type (struct gdbarch *gdbarch, int addr_size) + } + } + ++ ++/* Check that the current operator is either at the end of an ++ expression, or that it is followed by a composition operator. */ ++ ++static void ++require_composition (gdb_byte *op_ptr, gdb_byte *op_end, const char *op_name) ++{ ++ /* FIXME: DW_OP_GNU_uninit? */ ++ if (op_ptr != op_end && *op_ptr != DW_OP_piece && *op_ptr != DW_OP_bit_piece) ++ error (_("DWARF-2 expression error: `%s' operations must be " ++ "used either alone or in conjuction with DW_OP_piece " ++ "or DW_OP_bit_piece."), ++ op_name); ++} ++ + /* The engine for the expression evaluator. Using the context in CTX, + evaluate the expression between OP_PTR and OP_END. */ + +@@ -279,8 +299,7 @@ execute_stack_op (struct dwarf_expr_context *ctx, + gdb_byte *op_ptr, gdb_byte *op_end) + { + enum bfd_endian byte_order = gdbarch_byte_order (ctx->gdbarch); +- +- ctx->in_reg = 0; ++ ctx->location = DWARF_VALUE_MEMORY; + ctx->initialized = 1; /* Default is initialized. */ + + if (ctx->recursion_depth > ctx->max_recursion_depth) +@@ -420,20 +439,36 @@ execute_stack_op (struct dwarf_expr_context *ctx, + "used either alone or in conjuction with DW_OP_piece.")); + + result = op - DW_OP_reg0; +- ctx->in_reg = 1; +- ++ ctx->location = DWARF_VALUE_REGISTER; + break; + + case DW_OP_regx: + op_ptr = read_uleb128 (op_ptr, op_end, ®); +- if (op_ptr != op_end && *op_ptr != DW_OP_piece) +- error (_("DWARF-2 expression error: DW_OP_reg operations must be " +- "used either alone or in conjuction with DW_OP_piece.")); ++ require_composition (op_ptr, op_end, "DW_OP_regx"); + + result = reg; +- ctx->in_reg = 1; ++ ctx->location = DWARF_VALUE_REGISTER; + break; + ++ case DW_OP_implicit_value: ++ { ++ ULONGEST len; ++ op_ptr = read_uleb128 (op_ptr, op_end, &len); ++ if (op_ptr + len >= op_end) ++ error (_("DW_OP_implicit_value: too few bytes available.")); ++ ctx->len = len; ++ ctx->data = op_ptr; ++ ctx->location = DWARF_VALUE_LITERAL; ++ op_ptr += len; ++ require_composition (op_ptr, op_end, "DW_OP_implicit_value"); ++ } ++ goto no_push; ++ ++ case DW_OP_stack_value: ++ ctx->location = DWARF_VALUE_STACK; ++ require_composition (op_ptr, op_end, "DW_OP_stack_value"); ++ goto no_push; ++ + case DW_OP_breg0: + case DW_OP_breg1: + case DW_OP_breg2: +@@ -498,11 +533,12 @@ execute_stack_op (struct dwarf_expr_context *ctx, + (ctx->get_frame_base) (ctx->baton, &datastart, &datalen); + dwarf_expr_eval (ctx, datastart, datalen); + result = dwarf_expr_fetch (ctx, 0); +- if (ctx->in_reg) ++ if (ctx->location == DWARF_VALUE_REGISTER) + result = (ctx->read_reg) (ctx->baton, result); ++ /* FIXME: other DWARF_VALUE_*?? */ + result = result + offset; + ctx->stack_len = before_stack_len; +- ctx->in_reg = 0; ++ ctx->location = DWARF_VALUE_MEMORY; + } + break; + case DW_OP_dup: +@@ -700,6 +736,10 @@ execute_stack_op (struct dwarf_expr_context *ctx, + } + break; + ++ case DW_OP_call_frame_cfa: ++ result = (ctx->get_frame_cfa) (ctx->baton); ++ break; ++ + case DW_OP_GNU_push_tls_address: + /* Variable is at a constant offset in the thread-local + storage block into the objfile for the current thread and +@@ -738,12 +778,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, + + /* Record the piece. */ + op_ptr = read_uleb128 (op_ptr, op_end, &size); +- addr_or_regnum = dwarf_expr_fetch (ctx, 0); +- add_piece (ctx, ctx->in_reg, addr_or_regnum, size); ++ add_piece (ctx, size); + +- /* Pop off the address/regnum, and clear the in_reg flag. */ +- dwarf_expr_pop (ctx); +- ctx->in_reg = 0; ++ /* Pop off the address/regnum, and reset the location ++ type. */ ++ if (ctx->location != DWARF_VALUE_LITERAL) ++ dwarf_expr_pop (ctx); ++ ctx->location = DWARF_VALUE_MEMORY; + } + goto no_push; + +@@ -755,6 +796,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, ctx->initialized = 0; goto no_push; @@ -14286,10 +3422,40 @@ index 75a4ec7..aa8ab33 100644 error (_("Unhandled dwarf expression opcode 0x%x"), op); } diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h -index 7047922..a287b6f 100644 +index 7047922..232208d 100644 --- a/gdb/dwarf2expr.h +++ b/gdb/dwarf2expr.h -@@ -67,10 +67,10 @@ struct dwarf_expr_context +@@ -23,6 +23,19 @@ + #if !defined (DWARF2EXPR_H) + #define DWARF2EXPR_H + ++/* The location of a value. */ ++enum dwarf_value_location ++{ ++ /* The piece is in memory. */ ++ DWARF_VALUE_MEMORY, ++ /* The piece is in a register. */ ++ DWARF_VALUE_REGISTER, ++ /* The piece is on the stack. */ ++ DWARF_VALUE_STACK, ++ /* The piece is a literal. */ ++ DWARF_VALUE_LITERAL ++}; ++ + /* The expression evaluator works with a dwarf_expr_context, describing + its current state and its callbacks. */ + struct dwarf_expr_context +@@ -55,6 +68,9 @@ struct dwarf_expr_context + expression evaluation is complete. */ + void (*get_frame_base) (void *baton, gdb_byte **start, size_t *length); + ++ /* Return the CFA for the frame. */ ++ CORE_ADDR (*get_frame_cfa) (void *baton); ++ + /* Return the thread-local storage address for + DW_OP_GNU_push_tls_address. */ + CORE_ADDR (*get_tls_address) (void *baton, CORE_ADDR offset); +@@ -67,19 +83,23 @@ struct dwarf_expr_context The result must be live until the current expression evaluation is complete. */ unsigned char *(*get_subr) (void *baton, off_t offset, size_t *length); @@ -14301,11 +3467,96 @@ index 7047922..a287b6f 100644 /* The current depth of dwarf expression recursion, via DW_OP_call*, DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum + depth we'll tolerate before raising an error. */ + int recursion_depth, max_recursion_depth; + +- /* Non-zero if the result is in a register. The register number +- will be on the expression stack. */ +- int in_reg; ++ /* Location of the value. */ ++ enum dwarf_value_location location; ++ ++ /* For VALUE_LITERAL, a the current literal value's length and ++ data. */ ++ ULONGEST len; ++ gdb_byte *data; + + /* Initialization status of variable: Non-zero if variable has been + initialized; zero otherwise. */ +@@ -90,9 +110,9 @@ struct dwarf_expr_context + + Each time DW_OP_piece is executed, we add a new element to the + end of this array, recording the current top of the stack, the +- current in_reg flag, and the size given as the operand to +- DW_OP_piece. We then pop the top value from the stack, clear the +- in_reg flag, and resume evaluation. ++ current location, and the size given as the operand to ++ DW_OP_piece. We then pop the top value from the stack, rest the ++ location, and resume evaluation. + + The Dwarf spec doesn't say whether DW_OP_piece pops the top value + from the stack. We do, ensuring that clients of this interface +@@ -103,12 +123,11 @@ struct dwarf_expr_context + + If an expression never uses DW_OP_piece, num_pieces will be zero. + (It would be nice to present these cases as expressions yielding +- a single piece, with in_reg clear, so that callers need not +- distinguish between the no-DW_OP_piece and one-DW_OP_piece cases. +- But expressions with no DW_OP_piece operations have no value to +- place in a piece's 'size' field; the size comes from the +- surrounding data. So the two cases need to be handled +- separately.) */ ++ a single piece, so that callers need not distinguish between the ++ no-DW_OP_piece and one-DW_OP_piece cases. But expressions with ++ no DW_OP_piece operations have no value to place in a piece's ++ 'size' field; the size comes from the surrounding data. So the ++ two cases need to be handled separately.) */ + int num_pieces; + struct dwarf_expr_piece *pieces; + }; +@@ -117,13 +136,22 @@ struct dwarf_expr_context + /* A piece of an object, as recorded by DW_OP_piece. */ + struct dwarf_expr_piece + { +- /* If IN_REG is zero, then the piece is in memory, and VALUE is its address. +- If IN_REG is non-zero, then the piece is in a register, and VALUE +- is the register number. */ +- int in_reg; +- +- /* This piece's address or register number. */ +- CORE_ADDR value; ++ enum dwarf_value_location location; ++ ++ union ++ { ++ /* This piece's address or register number. */ ++ CORE_ADDR value; ++ ++ struct ++ { ++ /* A pointer to the data making up this piece, for literal ++ pieces. */ ++ gdb_byte *data; ++ /* The length of the available data. */ ++ ULONGEST length; ++ } literal; ++ } v; + + /* The length of the piece, in bytes. */ + ULONGEST size; diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c -index cad3db8..2251e48 100644 +index 071b5ac..07bb8ba 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c -@@ -107,6 +107,9 @@ struct dwarf_expr_baton +@@ -36,6 +36,7 @@ + #include "dwarf2.h" + #include "dwarf2expr.h" + #include "dwarf2loc.h" ++#include "dwarf2-frame.h" + + #include "gdb_string.h" + #include "gdb_assert.h" +@@ -115,6 +116,9 @@ struct dwarf_expr_baton { struct frame_info *frame; struct objfile *objfile; @@ -14315,12 +3566,12 @@ index cad3db8..2251e48 100644 }; /* Helper functions for dwarf2_evaluate_loc_desc. */ -@@ -163,22 +166,32 @@ dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length) +@@ -176,22 +180,40 @@ dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length) *start = find_location_expression (symbaton, length, get_frame_address_in_block (frame)); } - else -+ else if (SYMBOL_OPS (framefunc) == &dwarf2_locexpr_funcs) ++ else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_locexpr_funcs) { struct dwarf2_locexpr_baton *symbaton; + @@ -14336,7 +3587,7 @@ index cad3db8..2251e48 100644 + *start = symbaton->data; + *length = symbaton->size; + } -+ else if (SYMBOL_OPS (framefunc) == &dwarf2_missing_funcs) ++ else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_missing_funcs) + { + struct dwarf2_locexpr_baton *symbaton; + @@ -14347,17 +3598,25 @@ index cad3db8..2251e48 100644 } + else + internal_error (__FILE__, __LINE__, -+ _("Unsupported SYMBOL_OPS %p for \"%s\""), -+ SYMBOL_OPS (framefunc), SYMBOL_PRINT_NAME (framefunc)); ++ _("Unsupported SYMBOL_COMPUTED_OPS %p for \"%s\""), ++ SYMBOL_COMPUTED_OPS (framefunc), ++ SYMBOL_PRINT_NAME (framefunc)); if (*start == NULL) error (_("Could not find the frame base for \"%s\"."), - SYMBOL_NATURAL_NAME (framefunc)); + SYMBOL_PRINT_NAME (framefunc)); ++} ++ ++static CORE_ADDR ++dwarf_expr_frame_cfa (void *baton) ++{ ++ struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton; ++ return dwarf2_frame_cfa (debaton->frame); } /* Using the objfile specified in BATON, find the address for the -@@ -191,6 +204,119 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) +@@ -204,6 +226,118 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) return target_translate_tls_address (debaton->objfile, offset); } @@ -14396,7 +3655,7 @@ index cad3db8..2251e48 100644 + used to derive other object addresses by DW_OP_push_object_address. + + It would be useful to sanity check ADDRESS - such as for some objects with -+ unset VALUE_ADDRESS - but some valid addresses may be zero (such as first ++ unset value_raw_address - but some valid addresses may be zero (such as first + objects in relocatable .o files). */ + +void @@ -14437,6 +3696,7 @@ index cad3db8..2251e48 100644 + ctx->read_reg = dwarf_expr_read_reg; + ctx->read_mem = dwarf_expr_read_mem; + ctx->get_frame_base = dwarf_expr_frame_base; ++ ctx->get_frame_cfa = dwarf_expr_frame_cfa; + ctx->get_tls_address = dwarf_expr_tls_address; + ctx->get_object_address = dwarf_expr_object_address; + @@ -14464,8 +3724,6 @@ index cad3db8..2251e48 100644 + dlbaton->per_cu); + if (ctx->num_pieces > 0) + error (_("DW_OP_*piece is unsupported for DW_FORM_block")); -+ else if (ctx->in_reg) -+ error (_("Register result is unsupported for DW_FORM_block")); + + retval = dwarf_expr_fetch (ctx, 0); + @@ -14477,7 +3735,7 @@ index cad3db8..2251e48 100644 /* Evaluate a location description, starting at DATA and with length SIZE, to find the current location of variable VAR in the context of FRAME. */ -@@ -200,8 +326,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, +@@ -213,8 +347,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, struct dwarf2_per_cu_data *per_cu) { struct value *retval; @@ -14487,7 +3745,7 @@ index cad3db8..2251e48 100644 if (size == 0) { -@@ -211,19 +337,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, +@@ -224,19 +358,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, return retval; } @@ -14508,19 +3766,142 @@ index cad3db8..2251e48 100644 if (ctx->num_pieces > 0) { int i; -@@ -261,15 +376,19 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, - { - CORE_ADDR address = dwarf_expr_fetch (ctx, 0); - -+ /* object_address_set called here is required in ALLOCATE_VALUE's -+ CHECK_TYPEDEF for the object's possible DW_OP_push_object_address. */ -+ object_address_set (address); +@@ -248,41 +371,120 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, + for (i = 0; i < ctx->num_pieces; i++) + { + struct dwarf_expr_piece *p = &ctx->pieces[i]; +- if (p->in_reg) +- { +- struct gdbarch *arch = get_frame_arch (frame); +- bfd_byte regval[MAX_REGISTER_SIZE]; +- int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->value); +- get_frame_register (frame, gdb_regnum, regval); +- memcpy (contents + offset, regval, p->size); +- } +- else /* In memory? */ ++ switch (p->location) + { +- read_memory (p->value, contents + offset, p->size); ++ case DWARF_VALUE_REGISTER: ++ { ++ struct gdbarch *arch = get_frame_arch (frame); ++ bfd_byte regval[MAX_REGISTER_SIZE]; ++ int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, ++ p->v.value); ++ get_frame_register (frame, gdb_regnum, regval); ++ memcpy (contents + offset, regval, p->size); ++ } ++ break; + - retval = allocate_value (SYMBOL_TYPE (var)); - VALUE_LVAL (retval) = lval_memory; - set_value_lazy (retval, 1); -- VALUE_ADDRESS (retval) = address; -+ set_value_address (retval, address); ++ case DWARF_VALUE_MEMORY: ++ read_memory (p->v.value, contents + offset, p->size); ++ break; ++ ++ case DWARF_VALUE_STACK: ++ { ++ gdb_byte bytes[sizeof (ULONGEST)]; ++ size_t n; ++ store_unsigned_integer (bytes, ctx->addr_size, ++ gdbarch_byte_order (ctx->gdbarch), ++ p->v.value); ++ n = p->size; ++ if (n > ctx->addr_size) ++ n = ctx->addr_size; ++ memcpy (contents + offset, bytes, n); ++ } ++ break; ++ ++ case DWARF_VALUE_LITERAL: ++ { ++ size_t n = p->size; ++ if (n > p->v.literal.length) ++ n = p->v.literal.length; ++ memcpy (contents + offset, p->v.literal.data, n); ++ } ++ break; ++ ++ default: ++ internal_error (__FILE__, __LINE__, _("invalid location type")); + } + offset += p->size; + } + } +- else if (ctx->in_reg) +- { +- struct gdbarch *arch = get_frame_arch (frame); +- CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0); +- int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum); +- retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame); +- } + else + { +- CORE_ADDR address = dwarf_expr_fetch (ctx, 0); +- +- retval = allocate_value (SYMBOL_TYPE (var)); +- VALUE_LVAL (retval) = lval_memory; +- set_value_lazy (retval, 1); +- set_value_address (retval, address); ++ switch (ctx->location) ++ { ++ case DWARF_VALUE_REGISTER: ++ { ++ struct gdbarch *arch = get_frame_arch (frame); ++ CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0); ++ int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum); ++ retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame); ++ } ++ break; ++ ++ case DWARF_VALUE_MEMORY: ++ { ++ CORE_ADDR address = dwarf_expr_fetch (ctx, 0); ++ ++ /* object_address_set called here is required in ALLOCATE_VALUE's ++ CHECK_TYPEDEF for the object's possible ++ DW_OP_push_object_address. */ ++ object_address_set (address); ++ ++ retval = allocate_value (SYMBOL_TYPE (var)); ++ VALUE_LVAL (retval) = lval_memory; ++ set_value_lazy (retval, 1); ++ set_value_address (retval, address); ++ } ++ break; ++ ++ case DWARF_VALUE_STACK: ++ { ++ gdb_byte bytes[sizeof (ULONGEST)]; ++ ULONGEST value = (ULONGEST) dwarf_expr_fetch (ctx, 0); ++ bfd_byte *contents; ++ size_t n = ctx->addr_size; ++ ++ store_unsigned_integer (bytes, ctx->addr_size, ++ gdbarch_byte_order (ctx->gdbarch), ++ value); ++ retval = allocate_value (SYMBOL_TYPE (var)); ++ contents = value_contents_raw (retval); ++ if (n > TYPE_LENGTH (SYMBOL_TYPE (var))) ++ n = TYPE_LENGTH (SYMBOL_TYPE (var)); ++ memcpy (contents, bytes, n); ++ } ++ break; ++ ++ case DWARF_VALUE_LITERAL: ++ { ++ bfd_byte *contents; ++ size_t n = ctx->len; ++ ++ retval = allocate_value (SYMBOL_TYPE (var)); ++ contents = value_contents_raw (retval); ++ if (n > TYPE_LENGTH (SYMBOL_TYPE (var))) ++ n = TYPE_LENGTH (SYMBOL_TYPE (var)); ++ memcpy (contents, ctx->data, n); ++ } ++ break; ++ ++ default: ++ internal_error (__FILE__, __LINE__, _("invalid location type")); ++ } } set_value_initialized (retval, ctx->initialized); @@ -14530,7 +3911,46 @@ index cad3db8..2251e48 100644 return retval; } -@@ -587,7 +706,7 @@ static int +@@ -327,6 +529,15 @@ needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length) + nf_baton->needs_frame = 1; + } + ++/* CFA accesses require a frame. */ ++static CORE_ADDR ++needs_frame_frame_cfa (void *baton) ++{ ++ struct needs_frame_baton *nf_baton = baton; ++ nf_baton->needs_frame = 1; ++ return 1; ++} ++ + /* Thread-local accesses do require a frame. */ + static CORE_ADDR + needs_frame_tls_address (void *baton, CORE_ADDR offset) +@@ -356,11 +567,12 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size, + ctx->read_reg = needs_frame_read_reg; + ctx->read_mem = needs_frame_read_mem; + ctx->get_frame_base = needs_frame_frame_base; ++ ctx->get_frame_cfa = needs_frame_frame_cfa; + ctx->get_tls_address = needs_frame_tls_address; + + dwarf_expr_eval (ctx, data, size); + +- in_reg = ctx->in_reg; ++ in_reg = ctx->location == DWARF_VALUE_REGISTER; + + if (ctx->num_pieces > 0) + { +@@ -369,7 +581,7 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size, + /* If the location has several pieces, and any of them are in + registers, then we will need a frame to fetch them from. */ + for (i = 0; i < ctx->num_pieces; i++) +- if (ctx->pieces[i].in_reg) ++ if (ctx->pieces[i].location == DWARF_VALUE_REGISTER) + in_reg = 1; + } + +@@ -601,7 +813,7 @@ static int loclist_describe_location (struct symbol *symbol, struct ui_file *stream) { /* FIXME: Could print the entire list of locations. */ @@ -14539,20 +3959,20 @@ index cad3db8..2251e48 100644 return 1; } -@@ -603,16 +722,56 @@ loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax, +@@ -617,16 +829,56 @@ loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, data = find_location_expression (dlbaton, &size, ax->scope); if (data == NULL) - error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol)); + error (_("Variable \"%s\" is not available."), SYMBOL_PRINT_NAME (symbol)); - dwarf2_tracepoint_var_ref (symbol, ax, value, data, size); + dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size); } -/* The set of location functions used with the DWARF-2 expression - evaluator and location lists. */ +/* The set of location functions used with the DWARF-2 location lists. */ - const struct symbol_ops dwarf2_loclist_funcs = { + const struct symbol_computed_ops dwarf2_loclist_funcs = { loclist_read_variable, loclist_read_needs_frame, loclist_describe_location, @@ -14582,8 +4002,8 @@ index cad3db8..2251e48 100644 +} + +static void -+missing_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax, -+ struct axs_value *value) ++missing_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, ++ struct agent_expr *ax, struct axs_value *value) +{ + struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); + @@ -14593,21 +4013,21 @@ index cad3db8..2251e48 100644 + +/* The set of location functions used with the DWARF-2 evaluator when we are + unable to resolve the symbols. */ -+const struct symbol_ops dwarf2_missing_funcs = { ++const struct symbol_computed_ops dwarf2_missing_funcs = { + missing_read_variable, + missing_read_needs_frame, + missing_describe_location, + missing_tracepoint_var_ref +}; diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h -index 76577f1..bf46761 100644 +index 0bfcfca..01018d6 100644 --- a/gdb/dwarf2loc.h +++ b/gdb/dwarf2loc.h @@ -71,5 +71,11 @@ struct dwarf2_loclist_baton - extern const struct symbol_ops dwarf2_locexpr_funcs; - extern const struct symbol_ops dwarf2_loclist_funcs; -+extern const struct symbol_ops dwarf2_missing_funcs; + extern const struct symbol_computed_ops dwarf2_locexpr_funcs; + extern const struct symbol_computed_ops dwarf2_loclist_funcs; ++extern const struct symbol_computed_ops dwarf2_missing_funcs; + +extern void object_address_set (CORE_ADDR address); + @@ -14616,7 +4036,7 @@ index 76577f1..bf46761 100644 #endif /* dwarf2loc.h */ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c -index 55868da..9bc1386 100644 +index 445bab8..be2dc2a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1,8 +1,7 @@ @@ -14629,18 +4049,19 @@ index 55868da..9bc1386 100644 Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, Inc. with support from Florida State University (under contract -@@ -47,6 +46,10 @@ - #include "command.h" +@@ -48,6 +47,11 @@ #include "gdbcmd.h" + #include "block.h" #include "addrmap.h" +#include "f-lang.h" +#include "c-lang.h" ++#include "jv-lang.h" +#include "typeprint.h" -+#include "block.h" ++#include "vec.h" #include #include "gdb_string.h" -@@ -103,7 +106,7 @@ typedef struct pubnames_header +@@ -93,7 +97,7 @@ typedef struct pubnames_header _PUBNAMES_HEADER; #define _ACTUAL_PUBNAMES_HEADER_SIZE 13 @@ -14649,56 +4070,30 @@ index 55868da..9bc1386 100644 Because of alignment constraints, this structure has padding and cannot be mapped directly onto the beginning of the .debug_info section. */ typedef struct aranges_header -@@ -299,9 +302,6 @@ struct dwarf2_cu - /* Hash table holding all the loaded partial DIEs. */ - htab_t partial_dies; - -- /* `.debug_ranges' offset for this `DW_TAG_compile_unit' DIE. */ -- unsigned int ranges_offset; -- - /* Storage for things with the same lifetime as this read-in compilation - unit, including partial DIEs. */ - struct obstack comp_unit_obstack; -@@ -350,8 +350,18 @@ struct dwarf2_cu - from mangled names. */ - unsigned int has_namespace_info : 1; - -- /* Field `ranges_offset' is filled in; flag as the value may be zero. */ -- unsigned int has_ranges_offset : 1; -+ /* Fields are valid according to the LANGUAGE field. */ -+ union -+ { -+ /* language_fortran */ -+ struct -+ { -+ /* Module names imported to the block being currently read in. */ -+ struct fortran_using *use; -+ } -+ fortran; -+ } -+ language_specific; +@@ -150,7 +154,10 @@ struct dwarf2_section_info + asection *asection; + gdb_byte *buffer; + bfd_size_type size; +- int was_mmapped; ++ /* A function to call to deallocate BUFFER. If NULL, no ++ deallocation is needed. A pointer to this structure is passed as ++ the only argument. */ ++ void (*destructor) (struct dwarf2_section_info *); }; - /* Persistent data held for a compilation unit, even when not -@@ -451,17 +461,12 @@ struct partial_die_info + struct dwarf2_per_objfile +@@ -474,8 +481,8 @@ struct partial_die_info /* DWARF-2 tag for this DIE. */ ENUM_BITFIELD(dwarf_tag) tag : 16; - /* Language code associated with this DIE. This is only used - for the compilation unit DIE. */ -- unsigned int language : 8; -- - /* Assorted flags describing the data found in this DIE. */ - unsigned int has_children : 1; - unsigned int is_external : 1; - unsigned int is_declaration : 1; - unsigned int has_type : 1; - unsigned int has_specification : 1; -- unsigned int has_stmt_list : 1; - unsigned int has_pc_info : 1; ++ /* Language code associated with this DIE. This is only used ++ for the compilation unit DIE. */ + unsigned int language : 8; - /* Flag set if the SCOPE field of this structure has been -@@ -472,10 +477,12 @@ struct partial_die_info + /* Assorted flags describing the data found in this DIE. */ +@@ -495,8 +502,7 @@ struct partial_die_info unsigned int has_byte_size : 1; /* The name of this DIE. Normally the value of DW_AT_name, but @@ -14706,71 +4101,58 @@ index 55868da..9bc1386 100644 - other fashion. */ + sometimes a default name for unnamed DIEs. */ char *name; -- char *dirname; -+ -+ /* The linkage name of this DIE, from DW_AT_MIPS_linkage_name, or -+ NULL if no linkage name was present. */ -+ char *linkage_name; + char *dirname; - /* The scope to prepend to our children. This is generally - allocated on the comp_unit_obstack, so will disappear -@@ -498,9 +505,6 @@ struct partial_die_info - DW_AT_extension). */ - unsigned int spec_offset; - -- /* If HAS_STMT_LIST, the offset of the Line Number Information data. */ -- unsigned int line_offset; -- - /* Pointers to this DIE's parent, first child, and next sibling, - if any. */ - struct partial_die_info *die_parent, *die_child, *die_sibling; -@@ -523,6 +527,15 @@ struct attr_abbrev - ENUM_BITFIELD(dwarf_form) form : 16; +@@ -691,6 +697,11 @@ struct field_info + int nfnfields; }; -+/* Additional GDB-specific attribute forms. */ -+enum -+ { -+ /* A string which has been updated to GDB's internal -+ representation (e.g. converted to canonical form) and does not -+ need to be updated again. */ -+ GDB_FORM_cached_string = 0xff -+ }; ++/* A vector used during linkage name generation. */ ++typedef struct die_info *die_info_p; ++DEF_VEC_P (die_info_p); ++static VEC(die_info_p) *die_list; + - /* Attributes have a name and a value */ - struct attribute - { -@@ -756,7 +769,7 @@ static void dwarf2_create_include_psymtab (char *, struct partial_symtab *, - struct objfile *); - - static void dwarf2_build_include_psymtabs (struct dwarf2_cu *, -- struct partial_die_info *, -+ struct die_info *, - struct partial_symtab *); - - static void dwarf2_build_psymtabs_hard (struct objfile *, int); -@@ -768,6 +781,9 @@ static void scan_partial_symbols (struct partial_die_info *, + /* One item on the queue of compilation units to read in full symbols + for. */ + struct dwarf2_queue_item +@@ -802,7 +813,10 @@ static void scan_partial_symbols (struct partial_die_info *, static void add_partial_symbol (struct partial_die_info *, struct dwarf2_cu *); +-static int pdi_needs_namespace (enum dwarf_tag tag); +static gdb_byte *read_comp_unit_head (struct comp_unit_head *, gdb_byte *, + bfd *); + - static int pdi_needs_namespace (enum dwarf_tag tag); ++static int die_needs_namespace (struct die_info *, struct dwarf2_cu *); static void add_partial_namespace (struct partial_die_info *pdi, -@@ -794,6 +810,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *); + CORE_ADDR *lowpc, CORE_ADDR *highpc, +@@ -827,6 +841,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *); static void psymtab_to_symtab_1 (struct partial_symtab *); -+static gdb_byte *dwarf2_read_section_1 (struct objfile *objfile, -+ struct obstack *obstack, -+ asection *sectp); ++static void dwarf2_read_section_1 (struct objfile *objfile, ++ struct obstack *obstack, ++ struct dwarf2_section_info *info); + - gdb_byte *dwarf2_read_section (struct objfile *, asection *); - static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu); -@@ -929,7 +949,8 @@ static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *, + + static void dwarf2_free_abbrev_table (void *); +@@ -947,8 +965,13 @@ static struct type *tag_type_to_type (struct die_info *, struct dwarf2_cu *); + + static struct type *read_type_die (struct die_info *, struct dwarf2_cu *); + ++static void physname_prefix_1 (struct ui_file *, struct die_info *, ++ struct dwarf2_cu *); ++ + static char *determine_prefix (struct die_info *die, struct dwarf2_cu *); + ++static char *physname_prefix (struct die_info *die, struct dwarf2_cu *); ++ + static char *typename_concat (struct obstack *, + const char *prefix, + const char *suffix, +@@ -966,7 +989,8 @@ static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *, struct partial_symtab *); static int dwarf2_get_pc_bounds (struct die_info *, @@ -14780,7 +4162,14 @@ index 55868da..9bc1386 100644 static void get_scope_pc_bounds (struct die_info *, CORE_ADDR *, CORE_ADDR *, -@@ -960,8 +981,19 @@ static void read_common_block (struct die_info *, struct dwarf2_cu *); +@@ -990,13 +1014,12 @@ static void dwarf2_attach_fn_fields_to_type (struct field_info *, + + static void process_structure_scope (struct die_info *, struct dwarf2_cu *); + +-static const char *determine_class_name (struct die_info *die, +- struct dwarf2_cu *cu); +- + static void read_common_block (struct die_info *, struct dwarf2_cu *); static void read_namespace (struct die_info *die, struct dwarf2_cu *); @@ -14788,32 +4177,8 @@ index 55868da..9bc1386 100644 + static void read_module (struct die_info *die, struct dwarf2_cu *cu); -+static struct type *read_module_type (struct die_info *die, -+ struct dwarf2_cu *cu); -+ -+static void read_fortran_imported_module (struct die_info *die, -+ struct dwarf2_cu *cu); -+ -+static void read_fortran_imported_declaration (struct die_info *die, -+ struct dwarf2_cu *cu); -+ - static const char *namespace_name (struct die_info *die, - int *is_anonymous, struct dwarf2_cu *); - -@@ -993,6 +1025,12 @@ static void process_die (struct die_info *, struct dwarf2_cu *); - - static char *dwarf2_linkage_name (struct die_info *, struct dwarf2_cu *); - -+static char *fortran_module_linkage_name (struct die_info *die, -+ struct dwarf2_cu *cu); -+ -+static char *dwarf2_canonicalize_name (char *, struct dwarf2_cu *, -+ struct obstack *); -+ - static char *dwarf2_name (struct die_info *die, struct dwarf2_cu *); - - static struct die_info *dwarf2_extension (struct die_info *die, -@@ -1030,7 +1068,14 @@ static void store_in_ref_table (struct die_info *, + static void read_import_statement (struct die_info *die, struct dwarf2_cu *); +@@ -1078,7 +1101,14 @@ static int is_ref_attr (struct attribute *); static unsigned int dwarf2_get_ref_die_offset (struct attribute *); @@ -14827,9 +4192,9 @@ index 55868da..9bc1386 100644 +static enum get_attr_constant_value get_attr_constant_value + (struct attribute *attr, int *val_return); - static struct die_info *follow_die_ref (struct die_info *, - struct attribute *, -@@ -1085,6 +1130,9 @@ static void age_cached_comp_units (void); + static struct die_info *follow_die_ref_or_sig (struct die_info *, + struct attribute *, +@@ -1150,6 +1180,9 @@ static void age_cached_comp_units (void); static void free_one_cached_comp_unit (void *); @@ -14839,10 +4204,12 @@ index 55868da..9bc1386 100644 static struct type *set_die_type (struct die_info *, struct type *, struct dwarf2_cu *); -@@ -1104,19 +1152,28 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *); +@@ -1169,22 +1202,31 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *); static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu); ++static void destroy_section (struct dwarf2_section_info *info); ++ +static struct dwarf2_locexpr_baton *dwarf2_attr_to_locexpr_baton + (struct attribute *attr, struct dwarf2_cu *cu); + @@ -14853,9 +4220,8 @@ index 55868da..9bc1386 100644 dwarf2_has_info (struct objfile *objfile) { - struct dwarf2_per_objfile *data; -+ int update_sizes = 0; - - /* Initialize per-objfile state. */ +- +- /* Initialize per-objfile state. */ - data = obstack_alloc (&objfile->objfile_obstack, sizeof (*data)); - memset (data, 0, sizeof (*data)); - set_objfile_data (objfile, dwarf2_objfile_data_key, data); @@ -14863,127 +4229,84 @@ index 55868da..9bc1386 100644 + dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); + if (!dwarf2_per_objfile) + { ++ /* Initialize per-objfile state. */ + struct dwarf2_per_objfile *data + = obstack_alloc (&objfile->objfile_obstack, sizeof (*data)); + memset (data, 0, sizeof (*data)); + set_objfile_data (objfile, dwarf2_objfile_data_key, data); + dwarf2_per_objfile = data; -+ update_sizes = 1; -+ } - dwarf_info_section = 0; - dwarf_abbrev_section = 0; -@@ -1127,8 +1184,9 @@ dwarf2_has_info (struct objfile *objfile) - dwarf_eh_frame_section = 0; - dwarf_ranges_section = 0; - dwarf_loc_section = 0; -+ dwarf_aranges_section = 0; - - bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); -+ bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, &update_sizes); - return (dwarf_info_section != NULL && dwarf_abbrev_section != NULL); +- return (data->info.asection != NULL && data->abbrev.asection != NULL); ++ bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); ++ } ++ return (dwarf2_per_objfile->info.asection != NULL ++ && dwarf2_per_objfile->abbrev.asection != NULL); } -@@ -1149,51 +1207,61 @@ section_is_p (asection *sectp, const char *name) - in. */ + /* When loading sections, we can either look for ".", or for +@@ -1277,10 +1319,13 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) + } + + /* Decompress a section that was compressed using zlib. Store the +- decompressed buffer, and its size, in OUTBUF and OUTSIZE. */ ++ decompressed buffer, and its size, in OUTBUF and OUTSIZE. The ++ result is allocated on OBSTACK; if OBSTACK is NULL, xmalloc is ++ used. */ static void --dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) -+dwarf2_locate_sections (bfd *abfd, asection *sectp, void *user_data) +-zlib_decompress_section (struct objfile *objfile, asection *sectp, ++zlib_decompress_section (struct objfile *objfile, struct obstack *obstack, ++ asection *sectp, + gdb_byte **outbuf, bfd_size_type *outsize) { -+ int update_sizes = * (int *) user_data; - if (section_is_p (sectp, INFO_SECTION)) + bfd *abfd = objfile->obfd; +@@ -1297,6 +1342,7 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, + z_stream strm; + int rc; + int header_size = 12; ++ struct cleanup *old = NULL; + + if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0 + || bfd_bread (compressed_buffer, compressed_size, abfd) != compressed_size) +@@ -1326,8 +1372,13 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, + strm.avail_in = compressed_size - header_size; + strm.next_in = (Bytef*) compressed_buffer + header_size; + strm.avail_out = uncompressed_size; +- uncompressed_buffer = obstack_alloc (&objfile->objfile_obstack, +- uncompressed_size); ++ if (obstack) ++ uncompressed_buffer = obstack_alloc (obstack, uncompressed_size); ++ else ++ { ++ uncompressed_buffer = xmalloc (uncompressed_size); ++ old = make_cleanup (xfree, uncompressed_buffer); ++ } + rc = inflateInit (&strm); + while (strm.avail_in > 0) { -- dwarf2_per_objfile->info_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->info_size = bfd_get_section_size (sectp); - dwarf_info_section = sectp; - } - else if (section_is_p (sectp, ABBREV_SECTION)) - { -- dwarf2_per_objfile->abbrev_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->abbrev_size = bfd_get_section_size (sectp); - dwarf_abbrev_section = sectp; - } - else if (section_is_p (sectp, LINE_SECTION)) - { -- dwarf2_per_objfile->line_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->line_size = bfd_get_section_size (sectp); - dwarf_line_section = sectp; - } - else if (section_is_p (sectp, PUBNAMES_SECTION)) - { -- dwarf2_per_objfile->pubnames_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->pubnames_size = bfd_get_section_size (sectp); - dwarf_pubnames_section = sectp; - } - else if (section_is_p (sectp, ARANGES_SECTION)) - { -- dwarf2_per_objfile->aranges_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->aranges_size = bfd_get_section_size (sectp); - dwarf_aranges_section = sectp; - } - else if (section_is_p (sectp, LOC_SECTION)) - { -- dwarf2_per_objfile->loc_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->loc_size = bfd_get_section_size (sectp); - dwarf_loc_section = sectp; - } - else if (section_is_p (sectp, MACINFO_SECTION)) - { -- dwarf2_per_objfile->macinfo_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->macinfo_size = bfd_get_section_size (sectp); - dwarf_macinfo_section = sectp; - } - else if (section_is_p (sectp, STR_SECTION)) - { -- dwarf2_per_objfile->str_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->str_size = bfd_get_section_size (sectp); - dwarf_str_section = sectp; - } - else if (section_is_p (sectp, FRAME_SECTION)) - { -- dwarf2_per_objfile->frame_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->frame_size = bfd_get_section_size (sectp); - dwarf_frame_section = sectp; - } - else if (section_is_p (sectp, EH_FRAME_SECTION)) -@@ -1201,13 +1269,15 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) - flagword aflag = bfd_get_section_flags (ignore_abfd, sectp); - if (aflag & SEC_HAS_CONTENTS) - { -- dwarf2_per_objfile->eh_frame_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->eh_frame_size = bfd_get_section_size (sectp); - dwarf_eh_frame_section = sectp; - } - } - else if (section_is_p (sectp, RANGES_SECTION)) - { -- dwarf2_per_objfile->ranges_size = bfd_get_section_size (sectp); -+ if (update_sizes) -+ dwarf2_per_objfile->ranges_size = bfd_get_section_size (sectp); - dwarf_ranges_section = sectp; - } - -@@ -1250,6 +1320,86 @@ dwarf2_resize_section (asection *sectp, bfd_size_type new_size) - sectp->name); +@@ -1348,26 +1399,136 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, + error (_("Dwarf Error: concluding DWARF uncompression in '%s': %d"), + bfd_get_filename (abfd), rc); + ++ if (old) ++ discard_cleanups (old); + do_cleanups (cleanup); + *outbuf = uncompressed_buffer; + *outsize = uncompressed_size; + #endif } -+/* A cleanup that frees an obstack. */ -+static void -+finalize_obstack (void *o) +-/* Read the contents of the section SECTP from object file specified by +- OBJFILE, store info about the section into INFO. +- If the section is compressed, uncompress it before returning. */ ++/* A cleanup that calls destroy_section. */ + + static void +-dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) ++destroy_section_cleanup (void *arg) +{ -+ struct obstack *ob = o; -+ obstack_free (o, 0); ++ destroy_section (arg); +} + +/* Read the .debug_aranges section and construct an address map. */ @@ -14998,20 +4321,21 @@ index 55868da..9bc1386 100644 + struct obstack temp_obstack; + struct addrmap *mutable_map; + -+ if (!dwarf_aranges_section) ++ if (!dwarf2_per_objfile->aranges.asection) + return; + + baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + -+ aranges_buffer = dwarf2_read_section_1 (objfile, NULL, dwarf_aranges_section); ++ dwarf2_read_section_1 (objfile, NULL, &dwarf2_per_objfile->aranges); ++ aranges_buffer = dwarf2_per_objfile->aranges.buffer; + aranges_ptr = aranges_buffer; -+ old = make_cleanup (xfree, aranges_buffer); ++ old = make_cleanup (destroy_section_cleanup, &dwarf2_per_objfile->aranges); + + obstack_init (&temp_obstack); -+ make_cleanup (finalize_obstack, &temp_obstack); ++ make_cleanup_obstack_free (&temp_obstack); + mutable_map = addrmap_create_mutable (&temp_obstack); + -+ while ((aranges_ptr - aranges_buffer) < dwarf2_per_objfile->aranges_size) ++ while ((aranges_ptr - aranges_buffer) < dwarf2_per_objfile->aranges.size) + { + struct comp_unit_head cu_header; + unsigned int bytes_read, segment_size, delta; @@ -15057,11 +4381,118 @@ index 55868da..9bc1386 100644 + do_cleanups (old); +} + ++/* Free a section buffer allocated with xmalloc. */ + - /* Build a partial symbol table. */ ++static void ++xfree_section_buffer (struct dwarf2_section_info *info) ++{ ++ xfree (info->buffer); ++} ++ ++/* If section described by INFO was mmapped, munmap it now. */ ++ ++static void ++munmap_section_buffer (struct dwarf2_section_info *info) ++{ ++#ifdef HAVE_MMAP ++ intptr_t begin = (intptr_t) info->buffer; ++ intptr_t map_begin = begin & ~(pagesize - 1); ++ size_t map_length = info->size + begin - map_begin; ++ gdb_assert (munmap ((void *) map_begin, map_length) == 0); ++#else ++ /* Without HAVE_MMAP, we should never be here to begin with. */ ++ gdb_assert (0); ++#endif ++} ++ ++/* Read the contents of the section at OFFSET and of size SIZE from ++ the object file specified by OBJFILE into OBSTACK and store it into ++ INFO. If OBSTACK is NULL, xmalloc is used instead. If the section ++ is compressed, uncompress it before returning. */ ++ ++static void ++dwarf2_read_section_1 (struct objfile *objfile, ++ struct obstack *obstack, ++ struct dwarf2_section_info *info) + { + bfd *abfd = objfile->obfd; + asection *sectp = info->asection; + gdb_byte *buf, *retbuf; + unsigned char header[4]; ++ struct cleanup *old = NULL; - void -@@ -1453,22 +1603,24 @@ dwarf2_create_include_psymtab (char *name, struct partial_symtab *pst, + info->buffer = NULL; +- info->was_mmapped = 0; ++ info->destructor = 0; + + if (info->asection == NULL || info->size == 0) + return; +@@ -1380,7 +1541,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) + /* Upon decompression, update the buffer and its size. */ + if (strncmp (header, "ZLIB", sizeof (header)) == 0) + { +- zlib_decompress_section (objfile, sectp, &info->buffer, ++ zlib_decompress_section (objfile, obstack, sectp, &info->buffer, + &info->size); + return; + } +@@ -1403,7 +1564,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) + + if (retbuf != MAP_FAILED) + { +- info->was_mmapped = 1; ++ info->destructor = munmap_section_buffer; + info->buffer = retbuf + (sectp->filepos & (pagesize - 1)) ; + return; + } +@@ -1411,8 +1572,15 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) + #endif + + /* If we get here, we are a normal, not-compressed section. */ +- info->buffer = buf +- = obstack_alloc (&objfile->objfile_obstack, info->size); ++ if (obstack) ++ buf = obstack_alloc (obstack, info->size); ++ else ++ { ++ buf = xmalloc (info->size); ++ old = make_cleanup (xfree, buf); ++ info->destructor = xfree_section_buffer; ++ } ++ info->buffer = buf; + + /* When debugging .o files, we may need to apply relocations; see + http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html . +@@ -1421,6 +1589,8 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) + retbuf = symfile_relocate_debug_section (abfd, sectp, buf); + if (retbuf != NULL) + { ++ if (old) ++ discard_cleanups (old); + info->buffer = retbuf; + return; + } +@@ -1429,6 +1599,19 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) + || bfd_bread (buf, info->size, abfd) != info->size) + error (_("Dwarf Error: Can't read DWARF data from '%s'"), + bfd_get_filename (abfd)); ++ ++ if (old) ++ discard_cleanups (old); ++} ++ ++/* Read the contents of the section SECTP from object file specified by ++ OBJFILE, store info about the section into INFO. ++ If the section is compressed, uncompress it before returning. */ ++ ++static void ++dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) ++{ ++ dwarf2_read_section_1 (objfile, &objfile->objfile_obstack, info); + } + + /* Fill in SECTP, BUFP and SIZEP with section info, given OBJFILE and +@@ -1666,11 +1849,7 @@ dwarf2_create_include_psymtab (char *name, struct partial_symtab *pst, /* Read the Line Number Program data and extract the list of files included by the source file represented by PST. Build an include @@ -15074,27 +4505,7 @@ index 55868da..9bc1386 100644 static void dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, -- struct partial_die_info *pdi, -+ struct die_info *die, - struct partial_symtab *pst) - { - struct objfile *objfile = cu->objfile; - bfd *abfd = objfile->obfd; -- struct line_header *lh; -+ struct line_header *lh = NULL; -+ struct attribute *attr; - -- lh = dwarf_decode_line_header (pdi->line_offset, abfd, cu); -+ attr = dwarf2_attr (die, DW_AT_stmt_list, cu); -+ if (attr) -+ { -+ unsigned int line_offset = DW_UNSND (attr); -+ lh = dwarf_decode_line_header (line_offset, abfd, cu); -+ } - if (lh == NULL) - return; /* No linetable, so no includes. */ - -@@ -1477,6 +1629,36 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, +@@ -1690,6 +1869,37 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, free_line_header (lh); } @@ -15128,211 +4539,41 @@ index 55868da..9bc1386 100644 + } + } +} - - /* Build the partial symbol table by doing a quick pass through the - .debug_info and .debug_abbrev sections. */ -@@ -1489,7 +1671,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - bfd *abfd = objfile->obfd; - gdb_byte *info_ptr; - gdb_byte *beg_of_comp_unit; -- struct partial_die_info comp_unit_die; -+ struct die_info *comp_unit_die; - struct partial_symtab *pst; - struct cleanup *back_to; - CORE_ADDR baseaddr; -@@ -1523,9 +1705,12 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - { - struct cleanup *back_to_inner; - struct dwarf2_cu cu; -- struct abbrev_info *abbrev; - unsigned int bytes_read; - struct dwarf2_per_cu_data *this_cu; -+ int has_children, has_pc_info; -+ struct attribute *attr; -+ const char *name; -+ CORE_ADDR best_lowpc, best_highpc; - - beg_of_comp_unit = info_ptr; - -@@ -1551,11 +1736,10 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - this_cu = dwarf2_find_comp_unit (cu.header.offset, objfile); - - /* Read the compilation unit die */ -- abbrev = peek_die_abbrev (info_ptr, &bytes_read, &cu); -- info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read, -- abfd, info_ptr, &cu); -+ info_ptr = read_full_die (&comp_unit_die, abfd, info_ptr, &cu, -+ &has_children); - -- if (comp_unit_die.tag == DW_TAG_partial_unit) -+ if (comp_unit_die->tag == DW_TAG_partial_unit) - { - info_ptr = (beg_of_comp_unit + cu.header.length - + cu.header.initial_length_size); -@@ -1564,20 +1748,27 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - } - - /* Set the language we're debugging */ -- set_cu_language (comp_unit_die.language, &cu); -+ attr = dwarf2_attr (comp_unit_die, DW_AT_language, &cu); -+ if (attr != NULL) -+ set_cu_language (DW_UNSND (attr), &cu); -+ else -+ set_cu_language (language_minimal, &cu); - - /* Allocate a new partial symbol table structure */ -- pst = start_psymtab_common (objfile, objfile->section_offsets, -- comp_unit_die.name ? comp_unit_die.name : "", -+ attr = dwarf2_attr (comp_unit_die, DW_AT_name, &cu); -+ if (attr != NULL) -+ name = DW_STRING (attr); -+ else -+ name = ""; -+ pst = start_psymtab_common (objfile, objfile->section_offsets, name, - /* TEXTLOW and TEXTHIGH are set below. */ - 0, - objfile->global_psymbols.next, - objfile->static_psymbols.next); - -- if (comp_unit_die.dirname) -- pst->dirname = obsavestring (comp_unit_die.dirname, -- strlen (comp_unit_die.dirname), -- &objfile->objfile_obstack); -+ attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, &cu); -+ if (attr != NULL) -+ pst->dirname = xstrdup (DW_STRING (attr)); - - pst->read_symtab_private = (char *) this_cu; - -@@ -1607,24 +1798,17 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - - /* Possibly set the default values of LOWPC and HIGHPC from - `DW_AT_ranges'. */ -- if (cu.has_ranges_offset) -- { -- if (dwarf2_ranges_read (cu.ranges_offset, &comp_unit_die.lowpc, -- &comp_unit_die.highpc, &cu, pst)) -- comp_unit_die.has_pc_info = 1; -- } -- else if (comp_unit_die.has_pc_info -- && comp_unit_die.lowpc < comp_unit_die.highpc) -- /* Store the contiguous range if it is not empty; it can be empty for -- CUs with no code. */ -- addrmap_set_empty (objfile->psymtabs_addrmap, -- comp_unit_die.lowpc + baseaddr, -- comp_unit_die.highpc + baseaddr - 1, pst); -+ has_pc_info = 0; + -+ if (dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc, &best_highpc, &cu, -+ pst)) -+ has_pc_info = 1; -+ dwarf2_find_base_address (comp_unit_die, &cu); - - /* Check if comp unit has_children. - If so, read the rest of the partial symbols from this comp unit. - If not, there's no more debug_info for this comp unit. */ -- if (comp_unit_die.has_children) -+ if (has_children) - { - struct partial_die_info *first_die; - CORE_ADDR lowpc, highpc; -@@ -1635,7 +1819,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - first_die = load_partial_dies (abfd, info_ptr, 1, &cu); - - scan_partial_symbols (first_die, &lowpc, &highpc, -- ! comp_unit_die.has_pc_info, &cu); -+ ! has_pc_info, &cu); - - /* If we didn't find a lowpc, set it to highpc to avoid - complaints from `maint check'. */ -@@ -1644,14 +1828,21 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - - /* If the compilation unit didn't have an explicit address range, - then use the information extracted from its child dies. */ -- if (! comp_unit_die.has_pc_info) -+ if (! has_pc_info) - { -- comp_unit_die.lowpc = lowpc; -- comp_unit_die.highpc = highpc; -+ best_lowpc = lowpc; -+ best_highpc = highpc; - } - } -- pst->textlow = comp_unit_die.lowpc + baseaddr; -- pst->texthigh = comp_unit_die.highpc + baseaddr; -+ pst->textlow = best_lowpc + baseaddr; -+ pst->texthigh = best_highpc + baseaddr; -+ -+ /* Store the contiguous range; `DW_AT_ranges' range is stored above. The -+ range can be also empty for CUs with no code. */ -+ if (dwarf2_attr (comp_unit_die, DW_AT_ranges, &cu) == NULL -+ && pst->textlow < pst->texthigh) -+ addrmap_set_empty (objfile->psymtabs_addrmap, pst->textlow, -+ pst->texthigh - 1, pst); - - pst->n_global_syms = objfile->global_psymbols.next - - (objfile->global_psymbols.list + pst->globals_offset); -@@ -1667,12 +1858,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) - info_ptr = beg_of_comp_unit + cu.header.length - + cu.header.initial_length_size; - -- if (comp_unit_die.has_stmt_list) -- { -- /* Get the list of files included in the current compilation unit, -- and build a psymtab for each of them. */ -- dwarf2_build_include_psymtabs (&cu, &comp_unit_die, pst); -- } -+ /* Get the list of files included in the current compilation unit, -+ and build a psymtab for each of them. */ -+ dwarf2_build_include_psymtabs (&cu, comp_unit_die, pst); - - do_cleanups (back_to_inner); - } -@@ -1690,11 +1878,12 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile) + static hashval_t + hash_type_signature (const void *item) { - bfd *abfd = objfile->obfd; - gdb_byte *info_ptr, *beg_of_comp_unit; -- struct partial_die_info comp_unit_die; -+ struct die_info *comp_unit_die; - struct dwarf2_cu *cu; -- struct abbrev_info *abbrev; - unsigned int bytes_read; - struct cleanup *back_to; -+ struct attribute *attr; -+ int has_children; +@@ -1812,8 +2022,7 @@ lookup_signatured_type (struct objfile *objfile, ULONGEST sig) + return entry; + } - info_ptr = dwarf2_per_objfile->info_buffer + this_cu->offset; - beg_of_comp_unit = info_ptr; -@@ -1716,12 +1905,15 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile) - back_to = make_cleanup (dwarf2_free_abbrev_table, cu); - - /* Read the compilation unit die. */ -- abbrev = peek_die_abbrev (info_ptr, &bytes_read, cu); -- info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read, -- abfd, info_ptr, cu); -+ info_ptr = read_full_die (&comp_unit_die, abfd, info_ptr, cu, -+ &has_children); +-/* Subroutine of process_type_comp_unit and dwarf2_build_psymtabs_hard +- to combine the common parts. ++/* Subroutine of dwarf2_build_psymtabs_hard to simplify it. + Process a compilation unit for a psymtab. + BUFFER is a pointer to the beginning of the dwarf section buffer, + either .debug_info or debug_types. +@@ -1878,7 +2087,7 @@ process_psymtab_comp_unit (struct objfile *objfile, + } /* Set the language we're debugging. */ -- set_cu_language (comp_unit_die.language, cu); -+ attr = dwarf2_attr (comp_unit_die, DW_AT_language, cu); -+ if (attr) -+ set_cu_language (DW_UNSND (attr), cu); -+ else -+ set_cu_language (language_minimal, cu); +- set_cu_language (comp_unit_die.language, &cu); ++ set_cu_language (comp_unit_die.language, &cu); - /* Link this compilation unit into the compilation unit tree. */ - this_cu->cu = cu; -@@ -1731,7 +1923,7 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile) - /* Check if comp unit has_children. - If so, read the rest of the partial symbols from this comp unit. - If not, there's no more debug_info for this comp unit. */ -- if (comp_unit_die.has_children) -+ if (has_children) - load_partial_dies (abfd, info_ptr, 0, cu); - - do_cleanups (back_to); -@@ -1948,7 +2140,7 @@ partial_die_parent_scope (struct partial_die_info *pdi, + /* Allocate a new partial symbol table structure. */ + pst = start_psymtab_common (objfile, objfile->section_offsets, +@@ -1929,8 +2138,8 @@ process_psymtab_comp_unit (struct objfile *objfile, + } + else if (comp_unit_die.has_pc_info + && comp_unit_die.lowpc < comp_unit_die.highpc) +- /* Store the contiguous range if it is not empty; it can be empty for +- CUs with no code. */ ++ /* Store the contiguous range; `DW_AT_ranges' range is stored above. The ++ range can be also empty for CUs with no code. */ + addrmap_set_empty (objfile->psymtabs_addrmap, + comp_unit_die.lowpc + baseaddr, + comp_unit_die.highpc + baseaddr - 1, pst); +@@ -2361,7 +2570,7 @@ partial_die_parent_scope (struct partial_die_info *pdi, ignoring them. */ complaint (&symfile_complaints, _("unhandled containing DIE tag %d for DIE at %d"), @@ -15341,7 +4582,7 @@ index 55868da..9bc1386 100644 parent->scope = grandparent_scope; } -@@ -1963,12 +2155,37 @@ partial_die_full_name (struct partial_die_info *pdi, +@@ -2376,12 +2585,22 @@ partial_die_full_name (struct partial_die_info *pdi, struct dwarf2_cu *cu) { char *parent_scope; @@ -15364,108 +4605,114 @@ index 55868da..9bc1386 100644 + if (parent_scope != NULL) return typename_concat (NULL, parent_scope, pdi->name, cu); + -+ if (!cu->has_namespace_info && pdi->linkage_name -+ && !real_pdi->die_parent) -+ { -+ char *actual_scope -+ = language_class_name_from_physname (cu->language_defn, -+ pdi->linkage_name); -+ if (actual_scope != NULL) -+ { -+ char *actual_name = typename_concat (NULL, actual_scope, -+ pdi->name, cu); -+ xfree (actual_scope); -+ return actual_name; -+ } -+ } -+ + return NULL; } static void -@@ -1984,7 +2201,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) +@@ -2397,12 +2616,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - if (pdi_needs_namespace (pdi->tag)) -+ if (pdi->linkage_name != NULL) -+ actual_name = pdi->linkage_name; -+ else if (pdi_needs_namespace (pdi->tag)) - { - actual_name = partial_die_full_name (pdi, cu); - if (actual_name) -@@ -2080,6 +2299,12 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) - &objfile->global_psymbols, - 0, (CORE_ADDR) 0, cu->language, objfile); +- { +- actual_name = partial_die_full_name (pdi, cu); +- if (actual_name) +- built_actual_name = 1; +- } ++ actual_name = partial_die_full_name (pdi, cu); ++ if (actual_name) ++ built_actual_name = 1; + + if (actual_name == NULL) + actual_name = pdi->name; +@@ -2534,22 +2750,6 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) break; -+ case DW_TAG_module: -+ add_psymbol_to_list (actual_name, strlen (actual_name), -+ MODULE_DOMAIN, LOC_STATIC, -+ &objfile->global_psymbols, -+ 0, (CORE_ADDR) 0, cu->language, objfile); -+ break; - case DW_TAG_class_type: - case DW_TAG_interface_type: - case DW_TAG_structure_type: -@@ -2133,9 +2358,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) - if (cu->language == language_cplus - && cu->has_namespace_info == 0 - && psym != NULL + } + +- /* Check to see if we should scan the name for possible namespace +- info. Only do this if this is C++, if we don't have namespace +- debugging info in the file, if the psym is of an appropriate type +- (otherwise we'll have psym == NULL), and if we actually had a +- mangled name to begin with. */ +- +- /* FIXME drow/2004-02-22: Why don't we do this for classes, i.e. the +- cases which do not set PSYM above? */ +- +- if (cu->language == language_cplus +- && cu->has_namespace_info == 0 +- && psym != NULL - && SYMBOL_CPLUS_DEMANGLED_NAME (psym) != NULL) - cp_check_possible_namespace_symbols (SYMBOL_CPLUS_DEMANGLED_NAME (psym), - objfile); -+ && pdi->linkage_name != NULL) -+ cp_check_possible_namespace_symbols (actual_name, objfile); - +- if (built_actual_name) xfree (actual_name); -@@ -2158,6 +2382,14 @@ pdi_needs_namespace (enum dwarf_tag tag) + } +@@ -2559,9 +2759,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) + name listed in the die. */ + + static int +-pdi_needs_namespace (enum dwarf_tag tag) ++die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu) + { +- switch (tag) ++ switch (die->tag) + { + case DW_TAG_namespace: + case DW_TAG_typedef: +@@ -2571,7 +2771,23 @@ pdi_needs_namespace (enum dwarf_tag tag) case DW_TAG_union_type: case DW_TAG_enumeration_type: case DW_TAG_enumerator: + case DW_TAG_subprogram: -+ case DW_TAG_variable: -+ return 1; + case DW_TAG_member: -+ /* The only time we will encounter member variables in this -+ function is when we are creating a "linkage" name for them; -+ therefore they must be static members, so they do need a -+ class prefix. */ return 1; ++ ++ case DW_TAG_variable: ++ { ++ struct attribute *attr; ++ attr = dwarf2_attr (die, DW_AT_specification, cu); ++ if (attr) ++ return 1; ++ attr = dwarf2_attr (die, DW_AT_external, cu); ++ if (attr == NULL && die->parent->tag != DW_TAG_namespace) ++ return 0; ++ return 1; ++ } ++ break; ++ default: return 0; -@@ -2191,12 +2423,12 @@ static void - add_partial_module (struct partial_die_info *pdi, CORE_ADDR *lowpc, - CORE_ADDR *highpc, int need_pc, struct dwarf2_cu *cu) - { -- /* Now scan partial symbols in that module. -+ /* Add a symbol for the module. */ + } +@@ -2700,27 +2916,6 @@ guess_structure_name (struct partial_die_info *struct_pdi, -- FIXME: Support the separate Fortran module namespaces. */ -+ add_partial_symbol (pdi, cu); - -- if (pdi->has_children) -- scan_partial_symbols (pdi->die_child, lowpc, highpc, need_pc, cu); -+ /* Partial symbols in that module are not scanned as they are never globally -+ visible. They get imported to the specific scopes on the full read. */ + if (real_pdi->die_parent != NULL) + return; +- +- while (child_pdi != NULL) +- { +- if (child_pdi->tag == DW_TAG_subprogram) +- { +- char *actual_class_name +- = language_class_name_from_physname (cu->language_defn, +- child_pdi->name); +- if (actual_class_name != NULL) +- { +- struct_pdi->name +- = obsavestring (actual_class_name, +- strlen (actual_class_name), +- &cu->comp_unit_obstack); +- xfree (actual_class_name); +- } +- break; +- } +- +- child_pdi = child_pdi->die_sibling; +- } + } } - /* Read a partial die corresponding to a subprogram and create a partial -@@ -2290,11 +2522,11 @@ guess_structure_name (struct partial_die_info *struct_pdi, - - while (child_pdi != NULL) - { -- if (child_pdi->tag == DW_TAG_subprogram) -+ if (child_pdi->tag == DW_TAG_subprogram && child_pdi->linkage_name) - { - char *actual_class_name - = language_class_name_from_physname (cu->language_defn, -- child_pdi->name); -+ child_pdi->linkage_name); - if (actual_class_name != NULL) - { - struct_pdi->name -@@ -2741,7 +2973,6 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) +@@ -3170,7 +3365,6 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) CORE_ADDR lowpc, highpc; struct symtab *symtab; struct cleanup *back_to; @@ -15473,7 +4720,7 @@ index 55868da..9bc1386 100644 CORE_ADDR baseaddr; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); -@@ -2751,30 +2982,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) +@@ -3180,30 +3374,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) cu->list_in_scope = &file_symbols; @@ -15505,7 +4752,7 @@ index 55868da..9bc1386 100644 /* Do line number decoding in read_file_scope () */ process_die (cu->dies, cu); -@@ -2805,6 +3013,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) +@@ -3234,6 +3405,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) static void process_die (struct die_info *die, struct dwarf2_cu *cu) { @@ -15513,100 +4760,84 @@ index 55868da..9bc1386 100644 switch (die->tag) { case DW_TAG_padding: -@@ -2849,6 +3058,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) +@@ -3312,42 +3484,69 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) + /* Return the fully qualified name of DIE, based on its DW_AT_name. + If scope qualifiers are appropriate they will be added. The result + will be allocated on the objfile_obstack, or NULL if the DIE does +- not have a name. */ ++ not have a name. ++ ++ The output string will be canonicalized (if C++/Java). */ - case DW_TAG_base_type: - case DW_TAG_subrange_type: -+ case DW_TAG_typedef: - /* Add a typedef symbol for the type definition, if it has a - DW_AT_name. */ - new_symbol (die, read_type_die (die, cu), cu); -@@ -2865,16 +3075,26 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) - case DW_TAG_module: - read_module (die, cu); - break; -- case DW_TAG_imported_declaration: - case DW_TAG_imported_module: -- /* FIXME: carlton/2002-10-16: Eventually, we should use the -- information contained in these. DW_TAG_imported_declaration -- dies shouldn't have children; DW_TAG_imported_module dies -- shouldn't in the C++ case, but conceivably could in the -- Fortran case. */ -+ if (cu->language == language_fortran) -+ { -+ read_fortran_imported_module (die, cu); -+ break; -+ } -+ /* PASSTHRU */ -+ case DW_TAG_imported_declaration: - processing_has_namespace_info = 1; -- complaint (&symfile_complaints, _("unsupported tag: '%s'"), -- dwarf_tag_name (die->tag)); -+ if (cu->language == language_fortran -+ && die->tag == DW_TAG_imported_declaration) -+ { -+ read_fortran_imported_declaration (die, cu); -+ break; -+ } -+ if (die->child != NULL && (die->tag == DW_TAG_imported_declaration -+ || cu->language != language_fortran)) -+ complaint (&symfile_complaints, _("Tag '%s' has unexpected children"), -+ dwarf_tag_name (die->tag)); -+ read_import_statement (die, cu); - break; - default: - new_symbol (die, NULL, cu); -@@ -2904,22 +3124,130 @@ dwarf2_full_name (struct die_info *die, struct dwarf2_cu *cu) - return name; + static const char * + dwarf2_full_name (struct die_info *die, struct dwarf2_cu *cu) + { +- struct attribute *attr; +- char *prefix, *name; +- struct ui_file *buf = NULL; ++ char *name; - /* If no prefix is necessary for this type of DIE, return the + name = dwarf2_name (die, cu); +- if (!name) +- return NULL; + + /* These are the only languages we know how to qualify names in. */ +- if (cu->language != language_cplus +- && cu->language != language_java) +- return name; ++ if (name != NULL ++ && (cu->language == language_cplus || cu->language == language_java)) ++ { ++ if (die_needs_namespace (die, cu)) ++ { ++ long length; ++ char *prefix; ++ struct ui_file *buf; + +- /* If no prefix is necessary for this type of DIE, return the - unqualified name. The other three tags listed could be handled - in pdi_needs_namespace, but that requires broader changes. */ - if (!pdi_needs_namespace (die->tag) - && die->tag != DW_TAG_subprogram - && die->tag != DW_TAG_variable - && die->tag != DW_TAG_member) -+ unqualified name. */ -+ if (!pdi_needs_namespace (die->tag)) - return name; +- return name; ++ buf = mem_fileopen (); ++ prefix = determine_prefix (die, cu); ++ if (*prefix != '\0') ++ { ++ char *prefixed_name = typename_concat (NULL, prefix, name, cu); ++ fputs_unfiltered (prefixed_name, buf); ++ xfree (prefixed_name); ++ } ++ else ++ fputs_unfiltered (name, buf); - prefix = determine_prefix (die, cu); - if (*prefix != '\0') +- prefix = determine_prefix (die, cu); +- if (*prefix != '\0') - name = typename_concat (&cu->objfile->objfile_obstack, prefix, - name, cu); -+ { -+ char *prefixed_name = typename_concat (NULL, prefix, name, cu); -+ buf = mem_fileopen (); -+ fputs_unfiltered (prefixed_name, buf); -+ xfree (prefixed_name); -+ } ++ name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, ++ &length); ++ ui_file_delete (buf); + -+ if (cu->language == language_cplus && die->tag == DW_TAG_subprogram) -+ { -+ struct type *type = read_type_die (die, cu); -+ -+ if (buf == NULL) -+ { -+ buf = mem_fileopen (); -+ fputs_unfiltered (name, buf); ++ if (cu->language == language_cplus) ++ { ++ char *cname ++ = dwarf2_canonicalize_name (name, cu, ++ &cu->objfile->objfile_obstack); ++ if (cname != NULL) ++ name = cname; ++ } + } -+ -+ c_type_print_args (type, buf, 0); -+ } -+ -+ if (buf != NULL) -+ { -+ long length; -+ name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, -+ &length); -+ ui_file_delete (buf); + } return name; } +-/* Read the import statement specified by the given die and record it. */ +/* read the given die's decl_line number. Return -1 if in case of an error */ -+static int dwarf2_read_decl_line (struct die_info *die, struct dwarf2_cu *cu){ ++static const int dwarf2_read_decl_line (struct die_info *die, struct dwarf2_cu *cu){ + struct attribute *line_attr; + + line_attr = dwarf2_attr (die, DW_AT_decl_line, cu); @@ -15618,15 +4849,16 @@ index 55868da..9bc1386 100644 +} + +/* Read the import statement specified by the given die and record it. */ -+ -+static void -+read_import_statement (struct die_info *die, struct dwarf2_cu *cu) -+{ -+ struct attribute *import_attr; -+ struct die_info *imported_die; -+ const char *imported_name; -+ const char *imported_name_prefix; -+ char *canonical_name; + + static void + read_import_statement (struct die_info *die, struct dwarf2_cu *cu) +@@ -3356,9 +3555,15 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) + struct die_info *imported_die; + const char *imported_name; + const char *imported_name_prefix; +- const char *import_prefix; + char *canonical_name; +- + const char *import_alias; + const char *imported_declaration = ""; + const char *import_prefix; @@ -15635,22 +4867,16 @@ index 55868da..9bc1386 100644 + + int is_anonymous = 0; + -+ import_attr = dwarf2_attr (die, DW_AT_import, cu); -+ if (import_attr == NULL) -+ { -+ complaint (&symfile_complaints, _("Tag '%s' has no DW_AT_import"), -+ dwarf_tag_name (die->tag)); -+ return; -+ } -+ -+ imported_die = follow_die_ref (die, import_attr, &cu); -+ imported_name = namespace_name (imported_die, &is_anonymous, cu); -+ if (imported_name == NULL) -+ { -+ /* C++ imports from std:: DW_TAG_base_type with no DW_AT_name - why? */ -+ return; -+ } -+ + import_attr = dwarf2_attr (die, DW_AT_import, cu); + if (import_attr == NULL) + { +@@ -3406,29 +3611,45 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) + return; + } + +- /* FIXME: dwarf2_name (die); for the local name after import. */ +- +- /* Figure out where the statement is being imported to. */ + /* Figure out the local name after import. */ + import_alias = dwarf2_name(die, cu); + if(import_alias == NULL){ @@ -15661,27 +4887,37 @@ index 55868da..9bc1386 100644 + line_number = dwarf2_read_decl_line(die, cu); + + /* Figure out where the statement is being imported to */ -+ import_prefix = determine_prefix (die, cu); -+ + import_prefix = determine_prefix (die, cu); + +- /* Figure out what the scope of the imported die is and prepend it +- to the name of the imported die. */ + /* + Figure out what the scope of the imported die is and prepend it + to the name of the imported die + */ -+ imported_name_prefix = determine_prefix (imported_die, cu); + imported_name_prefix = determine_prefix (imported_die, cu); +- +- if (strlen (imported_name_prefix) > 0) +- { + + if(imported_die->tag != DW_TAG_namespace){ + imported_declaration = imported_name; + canonical_name = (char*)imported_name_prefix; + }else{ + if(strlen (imported_name_prefix) > 0){ -+ canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1); -+ strcpy (canonical_name, imported_name_prefix); -+ strcat (canonical_name, "::"); -+ strcat (canonical_name, imported_name); + canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1); + strcpy (canonical_name, imported_name_prefix); + strcat (canonical_name, "::"); + strcat (canonical_name, imported_name); +- } +- else +- { + }else{ -+ canonical_name = alloca (strlen (imported_name) + 1); -+ strcpy (canonical_name, imported_name); -+ } + canonical_name = alloca (strlen (imported_name) + 1); + strcpy (canonical_name, imported_name); + } +- +- using_directives = cp_add_using (import_prefix,canonical_name, using_directives); + } + + using_directives = cp_add_using (import_prefix, @@ -15690,24 +4926,13 @@ index 55868da..9bc1386 100644 + imported_declaration, + line_number, + using_directives); -+} -+ - static void - initialize_cu_func_list (struct dwarf2_cu *cu) - { -@@ -3076,6 +3404,103 @@ add_to_cu_func_list (const char *name, CORE_ADDR lowpc, CORE_ADDR highpc, - cu->last_fn = thisfn; } -+static int -+unsigned_int_compar (const void *ap, const void *bp) -+{ -+ unsigned int a = *(unsigned int *) ap; -+ unsigned int b = *(unsigned int *) bp; -+ -+ return (a > b) - (b > a); -+} -+ + static void +@@ -3677,6 +3898,93 @@ unsigned_int_compar (const void *ap, const void *bp) + return (a > b) - (b > a); + } + +static void explore_abstract_origin(struct die_info *die, struct dwarf2_cu *cu, unsigned* die_children_p){ + struct attribute *attr; + unsigned die_children = *die_children_p; @@ -15793,17 +5018,20 @@ index 55868da..9bc1386 100644 + + do_cleanups (cleanups); + } -+ +} -+ - static void - read_func_scope (struct die_info *die, struct dwarf2_cu *cu) - { -@@ -3088,15 +3513,27 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) ++ + /* DW_AT_abstract_origin inherits whole DIEs (not just their attributes). + Inherit only the children of the DW_AT_abstract_origin DIE not being already + referenced by DW_AT_abstract_origin from the children of the current DIE. */ +@@ -3795,6 +4103,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) char *name; CORE_ADDR baseaddr; struct block *block; -+ unsigned die_children; ++ unsigned die_children = 0; + int inlined_func = (die->tag == DW_TAG_inlined_subroutine); + + if (inlined_func) +@@ -3813,13 +4122,23 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -15817,7 +5045,6 @@ index 55868da..9bc1386 100644 + /* explore abstract origins if present. They might contain useful information + such as import statements. */ + child_die = die->child; -+ die_children = 0; + while (child_die && child_die->tag) + { + child_die = sibling_die (child_die); @@ -15825,130 +5052,36 @@ index 55868da..9bc1386 100644 + } + explore_abstract_origin(die, cu, &die_children); return; +- + } - ++ lowpc += baseaddr; highpc += baseaddr; -@@ -3124,14 +3561,94 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) + +@@ -3846,16 +4165,15 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) cu->list_in_scope = &local_symbols; - if (die->child != NULL) -+ switch (cu->language) -+ { -+ case language_fortran: -+ cu->language_specific.fortran.use = NULL; -+ break; -+ } -+ + child_die = die->child; -+ die_children = 0; + while (child_die && child_die->tag) -+ { + { +- child_die = die->child; +- while (child_die && child_die->tag) +- { +- process_die (child_die, cu); +- child_die = sibling_die (child_die); +- } + process_die (child_die, cu); + child_die = sibling_die (child_die); + die_children++; -+ } -+ -+ attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); -+ if (attr) - { -+ /* For the list of CHILD_DIEs. */ -+ unsigned *offsets; -+ unsigned *offsets_end, *offsetp; -+ struct die_info *origin_die, *origin_child_die; -+ struct cleanup *cleanups; -+ -+ origin_die = follow_die_ref (die, attr, &cu); -+ if (die->tag != origin_die->tag) -+ complaint (&symfile_complaints, -+ _("DIE 0x%x and its abstract origin 0x%x have different " -+ "tags"), -+ die->offset, origin_die->offset); -+ -+ offsets = xmalloc (sizeof (*offsets) * die_children); -+ cleanups = make_cleanup (xfree, offsets); -+ -+ offsets_end = offsets; - child_die = die->child; - while (child_die && child_die->tag) - { -- process_die (child_die, cu); -+ attr = dwarf2_attr (child_die, DW_AT_abstract_origin, cu); -+ if (!attr) -+ complaint (&symfile_complaints, -+ _("Child DIE 0x%x of DIE 0x%x has missing " -+ "DW_AT_abstract_origin"), -+ child_die->offset, die->offset); -+ else -+ { -+ struct die_info *child_origin_die; -+ -+ child_origin_die = follow_die_ref (child_die, attr, &cu); -+ if (child_die->tag != child_origin_die->tag) -+ complaint (&symfile_complaints, -+ _("Child DIE 0x%x and its abstract origin 0x%x have " -+ "different tags"), -+ child_die->offset, child_origin_die->offset); -+ *offsets_end++ = child_origin_die->offset; -+ } - child_die = sibling_die (child_die); - } -+ qsort (offsets, offsets_end - offsets, sizeof (*offsets), -+ unsigned_int_compar); -+ /* Disabled as excessively expensive - check if we may ever complain. */ -+ if (0) -+ { -+ for (offsetp = offsets + 1; offsetp < offsets_end; offsetp++) -+ if (offsetp[-1] == *offsetp) -+ complaint (&symfile_complaints, -+ _("Child DIEs of DIE 0x%x duplicitly abstract-origin " -+ "referenced DIE 0x%x"), -+ die->offset, *offsetp); -+ } -+ -+ offsetp = offsets; -+ origin_child_die = origin_die->child; -+ while (origin_child_die && origin_child_die->tag) -+ { -+ /* Is origin_child_die referenced by any of the DIE children? */ -+ while (offsetp < offsets_end && *offsetp < origin_child_die->offset) -+ offsetp++; -+ if (offsetp >= offsets_end || *offsetp > origin_child_die->offset) -+ { -+ /* Found that origin_child_die is really not referenced. */ -+ process_die (origin_child_die, cu); -+ } -+ origin_child_die = sibling_die (origin_child_die); -+ } -+ -+ do_cleanups (cleanups); } ++ explore_abstract_origin(die, cu, &die_children); + inherit_abstract_dies (die, cu); + new = pop_context (); -@@ -3145,6 +3662,13 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) - determine_prefix (die, cu), - processing_has_namespace_info); - -+ switch (cu->language) -+ { -+ case language_fortran: -+ BLOCK_FORTRAN_USE (block) = cu->language_specific.fortran.use; -+ break; -+ } -+ - /* If we have address ranges, record them. */ - dwarf2_record_block_ranges (die, block, baseaddr, cu); - -@@ -3154,6 +3678,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) - back to building a containing block's symbol lists. */ - local_symbols = new->locals; - param_symbols = new->params; -+ using_directives = new->using_directives; - - /* If we've finished processing a top-level function, subsequent - symbols go in the file symbol list. */ -@@ -3180,7 +3705,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) +@@ -3905,7 +4223,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) as multiple lexical blocks? Handling children in a sane way would be nasty. Might be easier to properly extend generic blocks to describe ranges. */ @@ -15957,7 +5090,7 @@ index 55868da..9bc1386 100644 return; lowpc += baseaddr; highpc += baseaddr; -@@ -3197,7 +3722,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) +@@ -3922,7 +4240,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) } new = pop_context (); @@ -15966,15 +5099,7 @@ index 55868da..9bc1386 100644 { struct block *block = finish_block (0, &local_symbols, new->old_blocks, new->start_addr, -@@ -3216,6 +3741,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) - dwarf2_record_block_ranges (die, block, baseaddr, cu); - } - local_symbols = new->locals; -+ using_directives = new->using_directives; - } - - /* Get low and high pc attributes from DW_AT_ranges attribute value OFFSET. -@@ -3351,7 +3877,8 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, +@@ -4077,7 +4395,8 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, discontinuous, i.e. derived from DW_AT_ranges information. */ static int dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, @@ -15984,7 +5109,7 @@ index 55868da..9bc1386 100644 { struct attribute *attr; CORE_ADDR low = 0; -@@ -3379,7 +3906,7 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, +@@ -4105,7 +4424,7 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, { /* Value of the DW_AT_ranges attribute is the offset in the .debug_ranges section. */ @@ -15993,7 +5118,7 @@ index 55868da..9bc1386 100644 return 0; /* Found discontinuous range of addresses. */ ret = -1; -@@ -3418,7 +3945,7 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die, +@@ -4144,7 +4463,7 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die, CORE_ADDR low, high; struct die_info *child = die->child; @@ -16002,7 +5127,7 @@ index 55868da..9bc1386 100644 { *lowpc = min (*lowpc, low); *highpc = max (*highpc, high); -@@ -3455,7 +3982,7 @@ get_scope_pc_bounds (struct die_info *die, +@@ -4181,7 +4500,7 @@ get_scope_pc_bounds (struct die_info *die, CORE_ADDR best_high = (CORE_ADDR) 0; CORE_ADDR current_low, current_high; @@ -16011,7 +5136,7 @@ index 55868da..9bc1386 100644 { best_low = current_low; best_high = current_high; -@@ -3667,7 +4194,12 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, +@@ -4393,7 +4712,12 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, byte_offset = 0; } else if (attr_form_is_constant (attr)) @@ -16025,7 +5150,7 @@ index 55868da..9bc1386 100644 else byte_offset = decode_locdesc (DW_BLOCK (attr), cu); -@@ -3750,8 +4282,14 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, +@@ -4476,7 +4800,11 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, if (fieldname == NULL) return; @@ -16036,12 +5161,9 @@ index 55868da..9bc1386 100644 + when GDB supports canonicalization of C++ symbol names, we will not + need the linkage name for anything. */ physname = dwarf2_linkage_name (die, cu); -+ if (physname == NULL) -+ physname = (char *) dwarf2_full_name (die, cu); /* The name is already allocated along with this objfile, so we don't - need to duplicate it for the type. */ -@@ -3881,8 +4419,14 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, +@@ -4607,7 +4935,11 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, if (fieldname == NULL) return; @@ -16052,12 +5174,9 @@ index 55868da..9bc1386 100644 + when GDB supports canonicalization of C++ symbol names, we will not + need the linkage name for anything. */ physname = dwarf2_linkage_name (die, cu); -+ if (physname == NULL) -+ physname = (char *) dwarf2_full_name (die, cu); /* Look up member function name in fieldlist. */ - for (i = 0; i < fip->nfnfields; i++) -@@ -3926,7 +4470,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, +@@ -4652,7 +4984,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, /* The name is already allocated along with this objfile, so we don't need to duplicate it for the type. */ fnp->physname = physname ? physname : ""; @@ -16066,7 +5185,7 @@ index 55868da..9bc1386 100644 this_type = read_type_die (die, cu); if (this_type && TYPE_CODE (this_type) == TYPE_CODE_FUNC) { -@@ -4110,7 +4654,7 @@ quirk_gcc_member_function_pointer (struct die_info *die, struct dwarf2_cu *cu) +@@ -4836,7 +5168,7 @@ quirk_gcc_member_function_pointer (struct die_info *die, struct dwarf2_cu *cu) return NULL; domain_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (pfn_type, 0)); @@ -16075,44 +5194,99 @@ index 55868da..9bc1386 100644 smash_to_method_type (type, domain_type, TYPE_TARGET_TYPE (pfn_type), TYPE_FIELDS (pfn_type), TYPE_NFIELDS (pfn_type), TYPE_VARARGS (pfn_type)); -@@ -4147,7 +4691,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) - if (type) - return type; +@@ -4889,7 +5221,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) + return set_die_type (die, type, cu); + } - type = alloc_type (objfile); + type = alloc_type (objfile, NULL); INIT_CPLUS_SPECIFIC (type); + name = dwarf2_name (die, cu); - if (name != NULL) -@@ -4360,7 +4904,7 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) - struct attribute *attr; - const char *name; +@@ -4898,14 +5230,18 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) + if (cu->language == language_cplus + || cu->language == language_java) + { +- const char *new_prefix = determine_class_name (die, cu); +- TYPE_TAG_NAME (type) = (char *) new_prefix; ++ TYPE_TAG_NAME (type) = (char *) dwarf2_full_name (die, cu); ++ if (die->tag == DW_TAG_structure_type ++ || die->tag == DW_TAG_class_type) ++ TYPE_NAME (type) = TYPE_TAG_NAME (type); + } + else + { + /* The name is already allocated along with this objfile, so + we don't need to duplicate it for the type. */ +- TYPE_TAG_NAME (type) = name; ++ TYPE_TAG_NAME (type) = (char *) name; ++ if (die->tag == DW_TAG_class_type) ++ TYPE_NAME (type) = TYPE_TAG_NAME (type); + } + } + +@@ -5115,7 +5451,7 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) + return set_die_type (die, type, cu); + } - type = alloc_type (objfile); + type = alloc_type (objfile, NULL); TYPE_CODE (type) = TYPE_CODE_ENUM; name = dwarf2_full_name (die, cu); -@@ -4410,10 +4954,15 @@ determine_class_name (struct die_info *die, struct dwarf2_cu *cu) - { - if (child->tag == DW_TAG_subprogram) - { +@@ -5143,51 +5479,6 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) + return set_die_type (die, type, cu); + } + +-/* Determine the name of the type represented by DIE, which should be +- a named C++ or Java compound type. Return the name in question, +- allocated on the objfile obstack. */ +- +-static const char * +-determine_class_name (struct die_info *die, struct dwarf2_cu *cu) +-{ +- const char *new_prefix = NULL; +- +- /* If we don't have namespace debug info, guess the name by trying +- to demangle the names of members, just like we did in +- guess_structure_name. */ +- if (!processing_has_namespace_info) +- { +- struct die_info *child; +- +- for (child = die->child; +- child != NULL && child->tag != 0; +- child = sibling_die (child)) +- { +- if (child->tag == DW_TAG_subprogram) +- { - char *phys_prefix -+ char *phys_prefix; -+ char *linkage_name = dwarf2_linkage_name (child, cu); -+ -+ if (linkage_name == NULL) -+ continue; -+ -+ phys_prefix - = language_class_name_from_physname (cu->language_defn, +- = language_class_name_from_physname (cu->language_defn, - dwarf2_linkage_name - (child, cu)); -+ linkage_name); - - if (phys_prefix != NULL) - { -@@ -4510,6 +5059,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu) +- +- if (phys_prefix != NULL) +- { +- new_prefix +- = obsavestring (phys_prefix, strlen (phys_prefix), +- &cu->objfile->objfile_obstack); +- xfree (phys_prefix); +- break; +- } +- } +- } +- } +- +- if (new_prefix == NULL) +- new_prefix = dwarf2_full_name (die, cu); +- +- return new_prefix; +-} +- + /* Given a pointer to a die which begins an enumeration, process all + the dies that define the members of the enumeration, and create the + symbol for the enumeration type. +@@ -5265,6 +5556,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu) new_symbol (die, this_type, cu); } @@ -16142,7 +5316,7 @@ index 55868da..9bc1386 100644 /* Extract all information from a DW_TAG_array_type DIE and put it in the DIE's type field. For now, this only handles one dimensional arrays. */ -@@ -4523,7 +5095,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -5278,7 +5592,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) struct type *element_type, *range_type, *index_type; struct type **range_types = NULL; struct attribute *attr; @@ -16151,7 +5325,7 @@ index 55868da..9bc1386 100644 struct cleanup *back_to; char *name; -@@ -4570,16 +5142,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -5325,16 +5639,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) type = element_type; if (read_array_order (die, cu) == DW_ORD_col_major) @@ -16173,7 +5347,7 @@ index 55868da..9bc1386 100644 /* Understand Dwarf2 support for vector types (like they occur on the PowerPC w/ AltiVec). Gcc just adds another attribute to the -@@ -4646,12 +5213,14 @@ read_set_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -5401,12 +5710,14 @@ read_set_type (struct die_info *die, struct dwarf2_cu *cu) return set_die_type (die, set_type, cu); } @@ -16190,7 +5364,7 @@ index 55868da..9bc1386 100644 struct attribute *attr; struct symbol *sym; CORE_ADDR base = (CORE_ADDR) 0; -@@ -4676,10 +5245,40 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu) +@@ -5431,10 +5742,40 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu) } if (die->child != NULL) { @@ -16206,9 +5380,9 @@ index 55868da..9bc1386 100644 + /* Artificial type to be used only by `info common'. */ + TYPE_NAME (type) = ""; + -+ child_die = die->child; -+ while (child_die && child_die->tag) -+ { + child_die = die->child; + while (child_die && child_die->tag) + { + TYPE_NFIELDS (type)++; + child_die = sibling_die (child_die); + } @@ -16220,9 +5394,9 @@ index 55868da..9bc1386 100644 + * TYPE_NFIELDS (type)); + + field = TYPE_FIELDS (type); - child_die = die->child; - while (child_die && child_die->tag) - { ++ child_die = die->child; ++ while (child_die && child_die->tag) ++ { + /* Create the symbol in the DW_TAG_common_block block in the current + symbol scope. */ sym = new_symbol (child_die, NULL, cu); @@ -16231,7 +5405,7 @@ index 55868da..9bc1386 100644 attr = dwarf2_attr (child_die, DW_AT_data_member_location, cu); if (attr) { -@@ -4687,8 +5286,25 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu) +@@ -5442,8 +5783,25 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu) base + decode_locdesc (DW_BLOCK (attr), cu); add_symbol_to_list (sym, &global_symbols); } @@ -16257,186 +5431,25 @@ index 55868da..9bc1386 100644 } } -@@ -4756,9 +5372,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu) +@@ -5511,7 +5869,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu) if (is_anonymous) { const char *previous_prefix = determine_prefix (die, cu); -- cp_add_using_directive (TYPE_NAME (type), -- strlen (previous_prefix), -- strlen (TYPE_NAME (type))); +- cp_add_using_directive (previous_prefix, TYPE_NAME (type)); + cp_add_using_directive (previous_prefix, TYPE_NAME (type), "", "", dwarf2_read_decl_line(die, cu)); } } -@@ -4774,20 +5388,155 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu) - } - } - --/* Read a Fortran module. */ -+/* Read a Fortran module as global symbol which can be later looked up by -+ f_lookup_symbol_nonlocal. */ - - static void - read_module (struct die_info *die, struct dwarf2_cu *cu) - { -- struct die_info *child_die = die->child; -+ struct type *type; - -- /* FIXME: Support the separate Fortran module namespaces. */ -+ type = read_module_type (die, cu); - -+ if (type) -+ new_symbol (die, type, cu); -+} -+ -+/* Read a Fortran module as type. -+ -+ Modules present only as declarations - being used only for DW_AT_import of -+ DW_TAG_imported_module - are ignored here. They are read in only in form of -+ the module name by read_fortran_imported_module. */ -+ -+static struct type * -+read_module_type (struct die_info *die, struct dwarf2_cu *cu) -+{ -+ struct objfile *objfile = cu->objfile; -+ struct die_info *child_die; -+ struct type *type; -+ char *module_name; -+ struct context_stack *new; -+ struct pending *save_file_symbols; -+ struct pending *save_global_symbols; -+ struct pending **save_list_in_scope; -+ -+ if (die_is_declaration (die, cu)) -+ return NULL; -+ -+ module_name = dwarf2_name (die, cu); -+ if (!module_name) -+ complaint (&symfile_complaints, _("DW_TAG_module has no name, offset 0x%x"), -+ die->offset); -+ type = init_type (TYPE_CODE_MODULE, 0, 0, module_name, objfile); -+ -+ /* Create a context for reading the module variables. */ -+ -+ new = push_context (0, 0); -+ -+ save_file_symbols = file_symbols; -+ file_symbols = NULL; -+ save_global_symbols = global_symbols; -+ global_symbols = NULL; -+ save_list_in_scope = cu->list_in_scope; -+ -+ /* Process the child DIEs. */ -+ -+ child_die = die->child; - while (child_die && child_die->tag) - { -+ /* Any DW_TAG_subprogram will reset LIST_IN_SCOPE to LOCAL_SYMBOLS. */ -+ cu->list_in_scope = &global_symbols; -+ - process_die (child_die, cu); - child_die = sibling_die (child_die); - } -+ -+ /* Finish this module and restore the context. */ -+ -+ TYPE_MODULE_BLOCK (type) = finish_block (NULL, &global_symbols, -+ new->old_blocks, 0, 0, objfile); -+ -+ if (file_symbols) -+ complaint (&symfile_complaints, _("DW_TAG_module contains static symbols")); -+ if (local_symbols) -+ complaint (&symfile_complaints, _("DW_TAG_module contains local symbols")); -+ if (param_symbols) -+ complaint (&symfile_complaints, _("DW_TAG_module contains function " -+ "parameters")); -+ -+ file_symbols = save_file_symbols; -+ global_symbols = save_global_symbols; -+ cu->list_in_scope = save_list_in_scope; -+ -+ pop_context (); -+ -+ set_die_type (die, type, cu); -+ -+ return type; -+} -+ -+/* Import a Fortran module. Only store the module name for its later lookup by -+ f_lookup_symbol_nonlocal. */ -+ -+static void -+read_fortran_imported_module (struct die_info *die, struct dwarf2_cu *cu) -+{ -+ struct objfile *objfile = cu->objfile; -+ struct attribute *attr; -+ struct die_info *module_die; -+ char *module_name; -+ struct fortran_using *use; -+ -+ attr = dwarf2_attr (die, DW_AT_import, cu); -+ if (attr == NULL) -+ return; -+ -+ module_die = follow_die_ref (die, attr, &cu); -+ module_name = dwarf2_name (module_die, cu); -+ if (module_name == NULL) -+ { -+ complaint (&symfile_complaints, -+ _("Imported DIE at offset 0x%x has no name"), die->offset); -+ return; -+ } -+ -+ /* Fortran does not allow any duplicity between local and any of the imported -+ symbols. Therefore the order of the USE statements is not portant. -+ gfortran prints: -+ Error: Name 'X' at (1) is an ambiguous reference to 'X' from module 'Y' */ -+ -+ use = obstack_alloc (&objfile->objfile_obstack, sizeof (*use) -+ + strlen (module_name)); -+ strcpy (use->module_name, module_name); -+ gdb_assert (cu->language == language_fortran); -+ use->next = cu->language_specific.fortran.use; -+ cu->language_specific.fortran.use = use; -+} -+ -+/* Import a single Fortran declaration and possibly rename it. */ -+ -+static void -+read_fortran_imported_declaration (struct die_info *die, struct dwarf2_cu *cu) -+{ -+ struct attribute *attr; -+ struct die_info *imported_die; -+ struct symbol *sym; -+ char *rename = dwarf2_name (die, cu); -+ -+ attr = dwarf2_attr (die, DW_AT_import, cu); -+ if (attr == NULL) -+ { -+ complaint (&symfile_complaints, -+ _("Fortran DW_TAG_imported_declaration is missing " -+ "DW_AT_import at offset 0x%x"), die->offset); -+ return; -+ } -+ imported_die = follow_die_ref (die, attr, &cu); -+ -+ sym = new_symbol (imported_die, NULL, cu); -+ -+ if (sym && rename) -+ sym->ginfo.language_specific.cplus_specific.demangled_name = rename; - } - - /* Return the name of the namespace represented by DIE. Set -@@ -4951,29 +5700,95 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) - struct objfile *objfile = cu->objfile; +@@ -5705,29 +6063,95 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) + struct gdbarch *gdbarch = get_objfile_arch (objfile); struct type *type, *range_type, *index_type, *char_type; struct attribute *attr; - unsigned int length; + int length; + -+ index_type = builtin_type_int32; -+ /* RANGE_TYPE is allocated from OBJFILE, not OBJFILE_INTERNAL. */ -+ range_type = alloc_type (objfile, index_type); ++ index_type = objfile_type (objfile)->builtin_int; ++ /* RANGE_TYPE is allocated from OBJFILE, not as a permanent type. */ ++ range_type = alloc_type (objfile, NULL); + /* LOW_BOUND and HIGH_BOUND are set for real below. */ + range_type = create_range_type (range_type, index_type, 0, -1); + @@ -16536,12 +5549,12 @@ index 55868da..9bc1386 100644 + break; } -- index_type = builtin_type_int32; +- index_type = objfile_type (objfile)->builtin_int; - range_type = create_range_type (NULL, index_type, 1, length); - type = create_string_type (NULL, range_type); + char_type = language_string_char_type (cu->language_defn, gdbarch); + type = create_string_type (NULL, char_type, range_type); - return set_die_type (die, type, cu); -@@ -5067,7 +5882,6 @@ static struct type * +@@ -5822,7 +6246,6 @@ static struct type * read_typedef (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; @@ -16549,7 +5562,7 @@ index 55868da..9bc1386 100644 const char *name = NULL; struct type *this_type; -@@ -5175,8 +5989,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -5930,8 +6353,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) struct type *base_type; struct type *range_type; struct attribute *attr; @@ -16560,7 +5573,7 @@ index 55868da..9bc1386 100644 char *name; base_type = die_type (die, cu); -@@ -5189,42 +6003,90 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -5944,42 +6367,90 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) 0, NULL, cu->objfile); } @@ -16681,246 +5694,32 @@ index 55868da..9bc1386 100644 name = dwarf2_name (die, cu); if (name) -@@ -5386,10 +6248,13 @@ read_die_and_siblings (gdb_byte *info_ptr, bfd *abfd, - } - - /* Decompress a section that was compressed using zlib. Store the -- decompressed buffer, and its size, in OUTBUF and OUTSIZE. */ -+ decompressed buffer, and its size, in OUTBUF and OUTSIZE. The -+ result is allocated on OBSTACK; if OBSTACK is NULL, xmalloc is -+ used. */ - - static void --zlib_decompress_section (struct objfile *objfile, asection *sectp, -+zlib_decompress_section (struct objfile *objfile, struct obstack *obstack, -+ asection *sectp, - gdb_byte **outbuf, bfd_size_type *outsize) - { - bfd *abfd = objfile->obfd; -@@ -5405,6 +6270,7 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, - z_stream strm; - int rc; - int header_size = 12; -+ struct cleanup *old = NULL; - - if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0 - || bfd_bread (compressed_buffer, compressed_size, abfd) != compressed_size) -@@ -5434,8 +6300,13 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, - strm.avail_in = compressed_size - header_size; - strm.next_in = (Bytef*) compressed_buffer + header_size; - strm.avail_out = uncompressed_size; -- uncompressed_buffer = obstack_alloc (&objfile->objfile_obstack, -- uncompressed_size); -+ if (obstack) -+ uncompressed_buffer = obstack_alloc (obstack, uncompressed_size); -+ else -+ { -+ uncompressed_buffer = xmalloc (uncompressed_size); -+ old = make_cleanup (xfree, uncompressed_buffer); -+ } - rc = inflateInit (&strm); - while (strm.avail_in > 0) - { -@@ -5456,6 +6327,8 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, - error (_("Dwarf Error: concluding DWARF uncompression in '%s': %d"), - bfd_get_filename (abfd), rc); - -+ if (old) -+ discard_cleanups (old); - xfree (compressed_buffer); - *outbuf = uncompressed_buffer; - *outsize = uncompressed_size; -@@ -5463,17 +6336,20 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp, - } - - --/* Read the contents of the section at OFFSET and of size SIZE from the -- object file specified by OBJFILE into the objfile_obstack and return it. -- If the section is compressed, uncompress it before returning. */ -+/* Read the contents of the section at OFFSET and of size SIZE from -+ the object file specified by OBJFILE into OBSTACK and return it. -+ If OBSTACK is NULL, xmalloc is used instead. If the section is -+ compressed, uncompress it before returning. */ - --gdb_byte * --dwarf2_read_section (struct objfile *objfile, asection *sectp) -+static gdb_byte * -+dwarf2_read_section_1 (struct objfile *objfile, struct obstack *obstack, -+ asection *sectp) - { - bfd *abfd = objfile->obfd; - gdb_byte *buf, *retbuf; - bfd_size_type size = bfd_get_section_size (sectp); - unsigned char header[4]; -+ struct cleanup *old = NULL; - - if (size == 0) - return NULL; -@@ -5486,30 +6362,49 @@ dwarf2_read_section (struct objfile *objfile, asection *sectp) - /* Upon decompression, update the buffer and its size. */ - if (strncmp (header, "ZLIB", sizeof (header)) == 0) - { -- zlib_decompress_section (objfile, sectp, &buf, &size); -+ zlib_decompress_section (objfile, obstack, sectp, &buf, &size); - dwarf2_resize_section (sectp, size); - return buf; - } - } - - /* If we get here, we are a normal, not-compressed section. */ -- buf = obstack_alloc (&objfile->objfile_obstack, size); -+ if (obstack) -+ buf = obstack_alloc (obstack, size); -+ else -+ { -+ buf = xmalloc (size); -+ old = make_cleanup (xfree, buf); -+ } - /* When debugging .o files, we may need to apply relocations; see - http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html . - We never compress sections in .o files, so we only need to - try this when the section is not compressed. */ - retbuf = symfile_relocate_debug_section (abfd, sectp, buf); - if (retbuf != NULL) -- return retbuf; -+ { -+ if (old) -+ discard_cleanups (old); -+ return retbuf; -+ } - - if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0 - || bfd_bread (buf, size, abfd) != size) - error (_("Dwarf Error: Can't read DWARF data from '%s'"), - bfd_get_filename (abfd)); - -+ if (old) -+ discard_cleanups (old); -+ - return buf; - } - -+gdb_byte * -+dwarf2_read_section (struct objfile *objfile, asection *sectp) -+{ -+ return dwarf2_read_section_1 (objfile, &objfile->objfile_obstack, sectp); -+} -+ - /* In DWARF version 2, the description of the debugging information is - stored in a separate .debug_abbrev section. Before we read any - dies from a section we read in all abbreviations and install them -@@ -5749,6 +6644,7 @@ load_partial_dies (bfd *abfd, gdb_byte *info_ptr, int building_psymtab, - && abbrev->tag != DW_TAG_lexical_block - && abbrev->tag != DW_TAG_variable - && abbrev->tag != DW_TAG_namespace -+ && abbrev->tag != DW_TAG_module - && abbrev->tag != DW_TAG_member) - { - /* Otherwise we skip to the next sibling, if any. */ -@@ -5914,15 +6810,6 @@ read_partial_die (struct partial_die_info *part_die, - struct attribute attr; - int has_low_pc_attr = 0; - int has_high_pc_attr = 0; -- CORE_ADDR base_address = 0; -- enum -- { -- base_address_none, -- base_address_low_pc, -- /* Overrides BASE_ADDRESS_LOW_PC. */ -- base_address_entry_pc -- } -- base_address_type = base_address_none; - - memset (part_die, 0, sizeof (struct partial_die_info)); - -@@ -5945,47 +6832,35 @@ read_partial_die (struct partial_die_info *part_die, - switch (attr.name) - { - case DW_AT_name: -- -- /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name. */ -- if (part_die->name == NULL) -- part_die->name = DW_STRING (&attr); -- break; -- case DW_AT_comp_dir: -- if (part_die->dirname == NULL) -- part_die->dirname = DW_STRING (&attr); -+ switch (part_die->tag) -+ { -+ case DW_TAG_compile_unit: -+ /* Compilation units have a DW_AT_name that is a filename, not -+ a source language identifier. */ -+ case DW_TAG_enumeration_type: -+ case DW_TAG_enumerator: -+ /* These tags always have simple identifiers already; no need -+ to canonicalize them. */ -+ part_die->name = DW_STRING (&attr); -+ break; -+ default: -+ part_die->name -+ = dwarf2_canonicalize_name (DW_STRING (&attr), cu, -+ &cu->comp_unit_obstack); -+ break; -+ } +@@ -6670,9 +7141,6 @@ read_partial_die (struct partial_die_info *part_die, + if (part_die->dirname == NULL) + part_die->dirname = DW_STRING (&attr); break; - case DW_AT_MIPS_linkage_name: +- case DW_AT_MIPS_linkage_name: - part_die->name = DW_STRING (&attr); -+ part_die->linkage_name = DW_STRING (&attr); - break; +- break; case DW_AT_low_pc: has_low_pc_attr = 1; part_die->lowpc = DW_ADDR (&attr); -- if (part_die->tag == DW_TAG_compile_unit -- && base_address_type < base_address_low_pc) -- { -- base_address = DW_ADDR (&attr); -- base_address_type = base_address_low_pc; -- } - break; - case DW_AT_high_pc: - has_high_pc_attr = 1; - part_die->highpc = DW_ADDR (&attr); - break; -- case DW_AT_entry_pc: -- if (part_die->tag == DW_TAG_compile_unit -- && base_address_type < base_address_entry_pc) -- { -- base_address = DW_ADDR (&attr); -- base_address_type = base_address_entry_pc; -- } -- break; -- case DW_AT_ranges: -- if (part_die->tag == DW_TAG_compile_unit) -- { -- cu->ranges_offset = DW_UNSND (&attr); -- cu->has_ranges_offset = 1; -- } -- break; - case DW_AT_location: - /* Support the .debug_loc offsets */ - if (attr_form_is_block (&attr)) -@@ -6002,9 +6877,6 @@ read_partial_die (struct partial_die_info *part_die, - "partial symbol information"); - } - break; -- case DW_AT_language: -- part_die->language = DW_UNSND (&attr); -- break; - case DW_AT_external: - part_die->is_external = DW_UNSND (&attr); - break; -@@ -6029,10 +6901,6 @@ read_partial_die (struct partial_die_info *part_die, - part_die->sibling = dwarf2_per_objfile->info_buffer - + dwarf2_get_ref_die_offset (&attr); +@@ -6744,10 +7212,10 @@ read_partial_die (struct partial_die_info *part_die, + else + part_die->sibling = buffer + dwarf2_get_ref_die_offset (&attr); break; - case DW_AT_stmt_list: - part_die->has_stmt_list = 1; - part_die->line_offset = DW_UNSND (&attr); - break; ++ case DW_AT_stmt_list: ++ part_die->has_stmt_list = 1; ++ part_die->line_offset = DW_UNSND (&attr); ++ break; case DW_AT_byte_size: part_die->has_byte_size = 1; break; -@@ -6074,13 +6942,6 @@ read_partial_die (struct partial_die_info *part_die, +@@ -6789,13 +7257,6 @@ read_partial_die (struct partial_die_info *part_die, || dwarf2_per_objfile->has_section_at_zero)) part_die->has_pc_info = 1; @@ -16934,28 +5733,17 @@ index 55868da..9bc1386 100644 return info_ptr; } -@@ -6173,7 +7034,9 @@ fixup_partial_die (struct partial_die_info *part_die, +@@ -6904,7 +7365,8 @@ fixup_partial_die (struct partial_die_info *part_die, /* If we found a reference attribute and the DIE has no name, try to find a name in the referred to DIE. */ - if (part_die->name == NULL && part_die->has_specification) + if (part_die->has_specification -+ && (part_die->name == NULL || part_die->linkage_name == NULL -+ || !part_die->is_external)) ++ && (part_die->name == NULL || !part_die->is_external)) { struct partial_die_info *spec_die; -@@ -6189,6 +7052,9 @@ fixup_partial_die (struct partial_die_info *part_die, - if (spec_die->is_external) - part_die->is_external = spec_die->is_external; - } -+ -+ if (spec_die->linkage_name) -+ part_die->linkage_name = spec_die->linkage_name; - } - - /* Set default names for some unnamed DIEs. */ -@@ -7512,10 +8378,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym, +@@ -8244,10 +8706,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym, (i.e. when the value of a register or memory location is referenced, or a thread-local block, etc.). Then again, it might not be worthwhile. I'm assuming that it isn't unless performance @@ -16970,15 +5758,16 @@ index 55868da..9bc1386 100644 } /* Given a pointer to a DWARF information entry, figure out if we need -@@ -7538,20 +8406,49 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) +@@ -8269,21 +8733,24 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - if (die->tag != DW_TAG_namespace) +- if (die->tag != DW_TAG_namespace) - name = dwarf2_linkage_name (die, cu); -+ name = dwarf2_name (die, cu); - else - name = TYPE_NAME (type); - +- else +- name = TYPE_NAME (type); +- ++ name = dwarf2_name (die, cu); if (name) { + const char *linkagename; @@ -16987,8 +5776,8 @@ index 55868da..9bc1386 100644 sizeof (struct symbol)); OBJSTAT (objfile, n_syms++); memset (sym, 0, sizeof (struct symbol)); -+ /* Some methods are called without checking SYMBOL_OPS validity. */ -+ SYMBOL_OPS (sym) = &dwarf2_missing_funcs; ++ /* Some methods are called w/o checking SYMBOL_COMPUTED_OPS validity. */ ++ SYMBOL_COMPUTED_OPS (sym) = &dwarf2_missing_funcs; - /* Cache this symbol's name and the name's demangled form (if any). */ SYMBOL_LANGUAGE (sym) = cu->language; @@ -16997,33 +5786,11 @@ index 55868da..9bc1386 100644 + /* Cache this symbol's name and the name's demangled form (if any). */ + + linkagename = dwarf2_linkage_name (die, cu); -+ if (linkagename) -+ /* We use the linkage name if available, for the same reason -+ we used it for TYPE_FN_FIELD_PHYSNAME earlier in this file. -+ This usage can be removed someday. */ -+ SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), objfile); -+ else if (die->tag == DW_TAG_namespace) -+ SYMBOL_SET_LINKAGE_NAME (sym, name); -+ else -+ { -+ linkagename = dwarf2_full_name (die, cu); -+ -+ /* Set just the "linkage" name to the fully qualified name. -+ While this is not really a linkage name, it should match -+ the demangled version of the corresponding minimal symbol -+ if there is one. */ -+ SYMBOL_SET_LINKAGE_NAME (sym, (char *) linkagename); -+ } -+ if (cu->language == language_fortran) -+ { -+ sym->ginfo.language_specific.cplus_specific.demangled_name -+ = SYMBOL_LINKAGE_NAME (sym); -+ SYMBOL_LINKAGE_NAME (sym) = fortran_module_linkage_name (die, cu); -+ } ++ SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), objfile); /* Default assumptions. Use the passed type or decode it from the die. */ -@@ -7637,9 +8534,28 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) +@@ -8381,7 +8848,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) if (attr) { var_decode_location (attr, sym, cu); @@ -17037,32 +5804,18 @@ index 55868da..9bc1386 100644 + attr2 = NULL; + if (attr2 && (DW_UNSND (attr2) != 0)) -- add_symbol_to_list (sym, &global_symbols); -+ { -+ /* Workaround gfortran PR debug/40040 - it uses -+ DW_AT_location for variables in -fPIC libraries which may -+ get overriden by other libraries/executable and get -+ a different address. Resolve it by .dynsym instead. */ -+ -+ if (cu->language == language_fortran && die->parent -+ && die->parent->tag == DW_TAG_module) -+ SYMBOL_CLASS (sym) = LOC_UNRESOLVED; -+ -+ add_symbol_to_list (sym, &global_symbols); -+ } + add_symbol_to_list (sym, &global_symbols); else - add_symbol_to_list (sym, cu->list_in_scope); - } -@@ -7656,7 +8572,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) - && dwarf2_attr (die, DW_AT_type, cu) != NULL) - { - SYMBOL_CLASS (sym) = LOC_UNRESOLVED; -- add_symbol_to_list (sym, &global_symbols); -+ add_symbol_to_list (sym, cu->list_in_scope); - } - } +@@ -8513,7 +8988,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + add_symbol_to_list (sym, cu->list_in_scope); break; -@@ -7780,6 +8696,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + case DW_TAG_enumerator: +- SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_full_name (die, cu); ++ SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_name (die, cu); + attr = dwarf2_attr (die, DW_AT_const_value, cu); + if (attr) + { +@@ -8537,6 +9012,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) SYMBOL_CLASS (sym) = LOC_TYPEDEF; add_symbol_to_list (sym, &global_symbols); break; @@ -17070,33 +5823,21 @@ index 55868da..9bc1386 100644 + SYMBOL_CLASS (sym) = LOC_STATIC; + SYMBOL_DOMAIN (sym) = COMMON_BLOCK_DOMAIN; + add_symbol_to_list (sym, cu->list_in_scope); -+ break; -+ case DW_TAG_module: -+ SYMBOL_CLASS (sym) = LOC_STATIC; -+ SYMBOL_DOMAIN (sym) = MODULE_DOMAIN; -+ add_symbol_to_list (sym, &global_symbols); + break; default: /* Not a tag we recognize. Hopefully we aren't processing trash data, but since we must specifically ignore things -@@ -7826,6 +8752,7 @@ dwarf2_const_value (struct attribute *attr, struct symbol *sym, - DW_ADDR (attr)); - SYMBOL_CLASS (sym) = LOC_CONST_BYTES; - break; -+ case DW_FORM_string: - case DW_FORM_strp: - /* DW_STRING is already allocated on the obstack, point directly - to it. */ -@@ -8042,12 +8969,18 @@ read_type_die (struct die_info *die, struct dwarf2_cu *cu) - case DW_TAG_namespace: - this_type = read_namespace_type (die, cu); - break; -+ case DW_TAG_module: -+ this_type = read_module_type (die, cu); -+ break; - default: - complaint (&symfile_complaints, _("unexpected tag in read_type_die: '%s'"), - dwarf_tag_name (die->tag)); +@@ -8550,8 +9030,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + /* For the benefit of old versions of GCC, check for anonymous + namespaces based on the demangled name. */ + if (!processing_has_namespace_info +- && cu->language == language_cplus +- && dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu) != NULL) ++ && cu->language == language_cplus) + cp_scan_for_anonymous_namespaces (sym); + } + return (sym); +@@ -8808,6 +9287,9 @@ read_type_die (struct die_info *die, struct dwarf2_cu *cu) break; } @@ -17106,160 +5847,188 @@ index 55868da..9bc1386 100644 return this_type; } -@@ -8113,9 +9046,18 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) - switch (parent->tag) - { - case DW_TAG_namespace: -- parent_type = read_type_die (parent, cu); -- /* We give a name to even anonymous namespaces. */ -- return TYPE_TAG_NAME (parent_type); -+ { -+ char *prefix; -+ parent_type = read_type_die (parent, cu); -+ /* We give a name to even anonymous namespaces. */ -+ prefix = TYPE_TAG_NAME (parent_type); -+ /* Special hack for bogus global namespace that is emitted as an -+ explicit namespace with the name '::' in g++ 4.1, for -+ some decls. */ -+ if (strcmp(prefix, "::")==0) -+ return ""; -+ return prefix; -+ } - case DW_TAG_class_type: - case DW_TAG_interface_type: - case DW_TAG_structure_type: -@@ -8128,6 +9070,19 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) - members; no typedefs, no member functions, et cetera. +@@ -8889,10 +9371,97 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) So it does not need a prefix. */ return ""; -+ -+ case DW_TAG_subprogram: -+ /* A class's symbol, or a variable's symbol, will live -+ directly in a function's block, so no prefix is -+ appropriate. However, what about methods of a -+ function-local class? They end up in the global symbol -+ table because they are separate functions... their mangling -+ normally would make them inaccessible. They'll show up -+ wrong in breakpoints too. This is a symptom of the -+ inconsistent way we handle symbol tables. Namespaces and -+ classes should have dictionaries just like blocks do. */ -+ return ""; -+ default: - return determine_prefix (parent, cu); +- return determine_prefix (parent, cu); ++ return determine_prefix (parent, cu); } -@@ -8192,12 +9147,64 @@ dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu) - attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); - if (attr && DW_STRING (attr)) - return DW_STRING (attr); -- attr = dwarf2_attr (die, DW_AT_name, cu); -- if (attr && DW_STRING (attr)) -- return DW_STRING (attr); - return NULL; } -+/* Return the fully qualified .symtab name for symbols contained in Fortran -+ modules. Return DWARF2_NAME otherwise. */ ++/* Determines the prefix for a symbol's physname. Unlike determine_prefix, ++ this method does not simply look at the DIE's immediate parent. ++ It will compute the symbol's physname by scanning through all parent ++ DIEs until it gets to the compilation unit's DIE. */ + +static char * -+fortran_module_linkage_name (struct die_info *die, struct dwarf2_cu *cu) ++physname_prefix (struct die_info *die, struct dwarf2_cu *cu) +{ -+ char *name; ++ long length; ++ struct ui_file *buf; ++ struct die_info *d, *spec_die; ++ struct dwarf2_cu *spec_cu; + -+ gdb_assert (cu->language == language_fortran); ++ /* Construct a stack containing all of the DIE's parents. Caution ++ must be observed for dealing with DW_AT_specification. */ ++ spec_cu = cu; ++ spec_die = die_specification (die, &spec_cu); ++ if (spec_die != NULL) ++ d = spec_die->parent; ++ else ++ d = die->parent; ++ while (d != NULL && d->tag != DW_TAG_compile_unit) ++ { ++ struct attribute *attr; ++ ++ spec_die = die_specification (d, &spec_cu); ++ if (spec_die != NULL) ++ d = spec_die; ++ ++ VEC_quick_push (die_info_p, die_list, d); ++ d = d->parent; ++ } ++ ++ /* Now pop all the elements, printing their names as we go */ ++ buf = mem_fileopen (); ++ while (!VEC_empty (die_info_p, die_list)) ++ { ++ d = VEC_pop (die_info_p, die_list); ++ physname_prefix_1 (buf, d, cu); ++ ++ if (!VEC_empty (die_info_p, die_list)) ++ { ++ if (cu->language == language_cplus) ++ fputs_unfiltered ("::", buf); ++ else ++ fputs_unfiltered (".", buf); ++ } ++ } ++ ++ return ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, &length); ++} ++ ++static void ++physname_prefix_1 (struct ui_file *buf, struct die_info *die, ++ struct dwarf2_cu *cu) ++{ ++ const char *name = NULL; ++ gdb_assert (buf != NULL); ++ ++ if (die != NULL) ++ { ++ switch (die->tag) ++ { ++ case DW_TAG_namespace: ++ name = dwarf2_name (die, cu); ++ if (name == NULL) ++ name = "(anonymous namespace)"; ++ break; ++ ++ case DW_TAG_class_type: ++ case DW_TAG_structure_type: ++ case DW_TAG_union_type: ++ case DW_TAG_enumeration_type: ++ case DW_TAG_interface_type: ++ case DW_TAG_subprogram: ++ name = dwarf2_name (die, cu); ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ if (name != NULL) ++ fputs_unfiltered (name, buf); ++} ++ + /* Return a newly-allocated string formed by concatenating PREFIX and + SUFFIX with appropriate separator. If PREFIX or SUFFIX is NULL or empty, then + simply copy the SUFFIX or PREFIX, respectively. If OBS is non-null, +@@ -8948,14 +9517,75 @@ static char * + dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu) + { + struct attribute *attr; ++ char *name; + + name = dwarf2_name (die, cu); + -+ if (name && die->parent && die->parent->tag == DW_TAG_module) ++ /* These are the only languages we know how to qualify names in. */ ++ if (cu->language != language_cplus ++ && cu->language != language_java) ++ return name; ++ ++ if (die_needs_namespace (die, cu)) + { -+ char *module_name = dwarf2_name (die->parent, cu); ++ long length; ++ char *prefix; ++ struct ui_file *buf; + -+ if (module_name) ++ prefix = physname_prefix (die, cu); ++ buf = mem_fileopen (); ++ if (*prefix != '\0') + { -+ char *retval; ++ char *prefixed_name = typename_concat (NULL, prefix, name, cu); ++ fputs_unfiltered (prefixed_name, buf); ++ xfree (prefixed_name); ++ } ++ else ++ fputs_unfiltered (name ? name : "", buf); + -+ /* `__modulename_MOD_variablename0'. */ -+ retval = obstack_alloc (&cu->objfile->objfile_obstack, -+ 2 + strlen (module_name) + 5 + strlen (name) -+ + 1); -+ sprintf (retval, "__%s_MOD_%s", module_name, name); ++ /* For Java and C++ methods, append formal parameter type ++ information. */ ++ if ((cu->language == language_cplus || cu->language == language_java) ++ && die->tag == DW_TAG_subprogram) ++ { ++ struct type *type = read_type_die (die, cu); + -+ return retval; ++ c_type_print_args (type, buf, 0, cu->language); ++ ++ if (cu->language == language_java) ++ { ++ /* For java, we must append the return type to method names. */ ++ if (die->tag == DW_TAG_subprogram) ++ java_print_type (TYPE_TARGET_TYPE (type), "", buf, 0, 0); ++ } ++ else if (cu->language == language_cplus) ++ { ++ /* c_type_print_args adds argument types, but it does ++ not add any necessary "const". */ ++ if (TYPE_NFIELDS (type) > 0 && TYPE_FIELD_ARTIFICIAL (type, 0) ++ && TYPE_CONST (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)))) ++ fputs_unfiltered (" const", buf); ++ } ++ } ++ ++ name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, ++ &length); ++ ui_file_delete (buf); ++ ++ if (cu->language == language_cplus) ++ { ++ char *cname ++ = dwarf2_canonicalize_name (name, cu, ++ &cu->objfile->objfile_obstack); ++ if (cname != NULL) ++ name = cname; + } + } -+ -+ return name; -+} -+ -+/* Get name of a die, return NULL if not found. */ -+ -+static char * -+dwarf2_canonicalize_name (char *name, struct dwarf2_cu *cu, -+ struct obstack *obstack) -+{ -+ if (name && cu->language == language_cplus) -+ { -+ char *canon_name = cp_canonicalize_string (name); -+ -+ if (canon_name != NULL) -+ { -+ if (strcmp (canon_name, name) != 0) -+ name = obsavestring (canon_name, strlen (canon_name), -+ obstack); -+ xfree (canon_name); -+ } -+ } -+ -+ return name; -+} -+ - /* Get name of a die, return NULL if not found. */ - static char * -@@ -8206,9 +9213,29 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) - struct attribute *attr; - - attr = dwarf2_attr (die, DW_AT_name, cu); +- attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); - if (attr && DW_STRING (attr)) - return DW_STRING (attr); -- return NULL; -+ if (!attr || !DW_STRING (attr)) -+ return NULL; -+ -+ switch (die->tag) -+ { -+ case DW_TAG_compile_unit: -+ /* Compilation units have a DW_AT_name that is a filename, not -+ a source language identifier. */ -+ case DW_TAG_enumeration_type: -+ case DW_TAG_enumerator: -+ /* These tags always have simple identifiers already; no need -+ to canonicalize them. */ -+ return DW_STRING (attr); -+ default: -+ if (attr->form != GDB_FORM_cached_string) -+ { -+ DW_STRING (attr) -+ = dwarf2_canonicalize_name (DW_STRING (attr), cu, -+ &cu->objfile->objfile_obstack); -+ attr->form = GDB_FORM_cached_string; -+ } -+ return DW_STRING (attr); -+ } +- return dwarf2_name (die, cu); ++ return name; } - /* Return the die that this die in an extension of, or NULL if there -@@ -8703,6 +9730,8 @@ dwarf_form_name (unsigned form) - return "DW_FORM_ref_udata"; - case DW_FORM_indirect: - return "DW_FORM_indirect"; -+ case GDB_FORM_cached_string: -+ return "GDB_FORM_cached_string"; - default: - return "DW_FORM_"; - } -@@ -9353,26 +10382,35 @@ dwarf2_get_ref_die_offset (struct attribute *attr) - return result; +-/* Get name of a die, return NULL if not found. */ ++/* Canonicalize the name of the given DIE. */ + + static char * + dwarf2_canonicalize_name (char *name, struct dwarf2_cu *cu, +@@ -10181,26 +10811,35 @@ dwarf2_get_ref_die_offset (struct attribute *attr) + return 0; } -/* Return the constant value held by the given attribute. Return -1 @@ -17288,7 +6057,7 @@ index 55868da..9bc1386 100644 - return default_value; + *val_return = DW_SND (attr); + return dwarf2_attr_const; -+ } + } + if (attr->form == DW_FORM_udata + || attr->form == DW_FORM_data1 + || attr->form == DW_FORM_data2 @@ -17297,7 +6066,7 @@ index 55868da..9bc1386 100644 + { + *val_return = DW_UNSND (attr); + return dwarf2_attr_const; - } ++ } + if (attr->form == DW_FORM_block + || attr->form == DW_FORM_block1 + || attr->form == DW_FORM_block2 @@ -17309,215 +6078,223 @@ index 55868da..9bc1386 100644 } /* THIS_CU has a reference to PER_CU. If necessary, load the new compilation -@@ -9963,6 +11001,17 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, +@@ -10990,8 +11629,6 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, { gdb_byte *mac_ptr, *mac_end; struct macro_source_file *current_file = 0; -+ enum dwarf_macinfo_record_type macinfo_type; -+ -+ /* Flag is in use by the second pass and determines if GDB is still before -+ first DW_MACINFO_start_file. If true GDB is still reading the definitions -+ from command line. First DW_MACINFO_start_file will need to be ignored as -+ it was already executed to create CURRENT_FILE for the main source holding -+ also the command line definitions. On first met DW_MACINFO_start_file -+ this flag is reset to normally execute all the remaining -+ DW_MACINFO_start_file macinfos. */ -+ -+ int at_commandline; +- enum dwarf_macinfo_record_type macinfo_type; +- int at_commandline; - if (dwarf2_per_objfile->macinfo_buffer == NULL) + if (dwarf2_per_objfile->macinfo.buffer == NULL) { -@@ -9970,19 +11019,24 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, +@@ -10999,29 +11636,19 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, return; } -+ /* Start the first pass to find ahead the main source file name. GDB has to -+ create CURRENT_FILE where to place the macros given to the compiler -+ from the command line. Such command line macros are present before first -+ DW_MACINFO_start_file but still those macros are associated to the -+ compilation unit. The compilation unit GDB identifies by its main source -+ file name. */ -+ - mac_ptr = dwarf2_per_objfile->macinfo_buffer + offset; - mac_end = dwarf2_per_objfile->macinfo_buffer - + dwarf2_per_objfile->macinfo_size; - -- for (;;) -+ do - { -- enum dwarf_macinfo_record_type macinfo_type; +- /* First pass: Find the name of the base filename. +- This filename is needed in order to process all macros whose definition +- (or undefinition) comes from the command line. These macros are defined +- before the first DW_MACINFO_start_file entry, and yet still need to be +- associated to the base file. - +- To determine the base file name, we scan the macro definitions until we +- reach the first DW_MACINFO_start_file entry. We then initialize +- CURRENT_FILE accordingly so that any macro definition found before the +- first DW_MACINFO_start_file can still be associated to the base file. */ +- + mac_ptr = dwarf2_per_objfile->macinfo.buffer + offset; + mac_end = dwarf2_per_objfile->macinfo.buffer + + dwarf2_per_objfile->macinfo.size; + +- do ++ for (;;) + { ++ enum dwarf_macinfo_record_type macinfo_type; ++ /* Do we at least have room for a macinfo type byte? */ if (mac_ptr >= mac_end) { - dwarf2_macros_too_long_complaint (); -- return; -+ break; +- /* Complaint is printed during the second pass as GDB will probably +- stop the first pass earlier upon finding DW_MACINFO_start_file. */ +- break; ++ dwarf2_macros_too_long_complaint (); ++ return; } macinfo_type = read_1_byte (abfd, mac_ptr); -@@ -9993,7 +11047,81 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, +@@ -11032,92 +11659,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, /* A zero macinfo type indicates the end of the macro information. */ case 0: -- return; -+ break; -+ -+ case DW_MACINFO_define: -+ case DW_MACINFO_undef: -+ /* Only skip the data by MAC_PTR. */ -+ { -+ unsigned int bytes_read; -+ -+ read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); -+ mac_ptr += bytes_read; -+ read_string (abfd, mac_ptr, &bytes_read); -+ mac_ptr += bytes_read; -+ } -+ break; -+ -+ case DW_MACINFO_start_file: -+ { -+ unsigned int bytes_read; -+ int line, file; -+ -+ line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); -+ mac_ptr += bytes_read; -+ file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); -+ mac_ptr += bytes_read; -+ -+ current_file = macro_start_file (file, line, current_file, comp_dir, -+ lh, cu->objfile); -+ } -+ break; -+ -+ case DW_MACINFO_end_file: -+ /* No data to skip by MAC_PTR. */ -+ break; -+ -+ case DW_MACINFO_vendor_ext: -+ /* Only skip the data by MAC_PTR. */ -+ { -+ unsigned int bytes_read; -+ -+ read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); -+ mac_ptr += bytes_read; -+ read_string (abfd, mac_ptr, &bytes_read); -+ mac_ptr += bytes_read; -+ } -+ break; -+ -+ default: -+ break; -+ } -+ } while (macinfo_type != 0 && current_file == NULL); -+ -+ /* Here is the second pass to read in the macros starting from the ones -+ defined at the command line. */ -+ -+ mac_ptr = dwarf2_per_objfile->macinfo_buffer + offset; -+ at_commandline = 1; -+ -+ do -+ { -+ /* Do we at least have room for a macinfo type byte? */ -+ if (mac_ptr >= mac_end) -+ { -+ /* Complaint is in the first pass above. */ -+ break; -+ } -+ -+ macinfo_type = read_1_byte (abfd, mac_ptr); -+ mac_ptr++; -+ -+ switch (macinfo_type) -+ { -+ /* A zero macinfo type indicates the end of the macro -+ information. */ -+ case 0: -+ break; +- break; +- +- case DW_MACINFO_define: +- case DW_MACINFO_undef: +- /* Only skip the data by MAC_PTR. */ +- { +- unsigned int bytes_read; +- +- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); +- mac_ptr += bytes_read; +- read_string (abfd, mac_ptr, &bytes_read); +- mac_ptr += bytes_read; +- } +- break; +- +- case DW_MACINFO_start_file: +- { +- unsigned int bytes_read; +- int line, file; +- +- line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); +- mac_ptr += bytes_read; +- file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); +- mac_ptr += bytes_read; +- +- current_file = macro_start_file (file, line, current_file, comp_dir, +- lh, cu->objfile); +- } +- break; +- +- case DW_MACINFO_end_file: +- /* No data to skip by MAC_PTR. */ +- break; +- +- case DW_MACINFO_vendor_ext: +- /* Only skip the data by MAC_PTR. */ +- { +- unsigned int bytes_read; +- +- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); +- mac_ptr += bytes_read; +- read_string (abfd, mac_ptr, &bytes_read); +- mac_ptr += bytes_read; +- } +- break; +- +- default: +- break; +- } +- } while (macinfo_type != 0 && current_file == NULL); +- +- /* Second pass: Process all entries. +- +- Use the AT_COMMAND_LINE flag to determine whether we are still processing +- command-line macro definitions/undefinitions. This flag is unset when we +- reach the first DW_MACINFO_start_file entry. */ +- +- mac_ptr = dwarf2_per_objfile->macinfo.buffer + offset; +- +- /* Determines if GDB is still before first DW_MACINFO_start_file. If true +- GDB is still reading the definitions from command line. First +- DW_MACINFO_start_file will need to be ignored as it was already executed +- to create CURRENT_FILE for the main source holding also the command line +- definitions. On first met DW_MACINFO_start_file this flag is reset to +- normally execute all the remaining DW_MACINFO_start_file macinfos. */ +- +- at_commandline = 1; +- +- do +- { +- /* Do we at least have room for a macinfo type byte? */ +- if (mac_ptr >= mac_end) +- { +- dwarf2_macros_too_long_complaint (); +- break; +- } +- +- macinfo_type = read_1_byte (abfd, mac_ptr); +- mac_ptr++; +- +- switch (macinfo_type) +- { +- /* A zero macinfo type indicates the end of the macro +- information. */ +- case 0: +- break; ++ return; case DW_MACINFO_define: case DW_MACINFO_undef: -@@ -10008,19 +11136,31 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, +@@ -11132,31 +11674,19 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, mac_ptr += bytes_read; if (! current_file) -+ { -+ /* DWARF violation as no main source is present. */ -+ complaint (&symfile_complaints, -+ _("debug info with no main source gives macro %s " -+ "on line %d: %s"), -+ macinfo_type == -+ DW_MACINFO_define ? _("definition") : macinfo_type == -+ DW_MACINFO_undef ? _("undefinition") : -+ "something-or-other", line, body); -+ break; -+ } -+ if (at_commandline != (line == 0)) +- { +- /* DWARF violation as no main source is present. */ +- complaint (&symfile_complaints, +- _("debug info with no main source gives macro %s " +- "on line %d: %s"), +- macinfo_type == +- DW_MACINFO_define ? _("definition") : macinfo_type == +- DW_MACINFO_undef ? _("undefinition") : +- "something-or-other", line, body); +- break; +- } +- if ((line == 0 && !at_commandline) || (line != 0 && at_commandline)) complaint (&symfile_complaints, -- _("debug info gives macro %s outside of any file: %s"), -+ _("debug info gives %s macro %s with %s line %d: %s"), -+ at_commandline ? _("command-line") : _("in-file"), +- _("debug info gives %s macro %s with %s line %d: %s"), +- at_commandline ? _("command-line") : _("in-file"), ++ _("debug info gives macro %s outside of any file: %s"), macinfo_type == -- DW_MACINFO_define ? "definition" : macinfo_type == -- DW_MACINFO_undef ? "undefinition" : -- "something-or-other", body); -- else -- { -- if (macinfo_type == DW_MACINFO_define) -- parse_macro_definition (current_file, line, body); -- else if (macinfo_type == DW_MACINFO_undef) -- macro_undef (current_file, line, body); -- } -+ DW_MACINFO_define ? _("definition") : macinfo_type == -+ DW_MACINFO_undef ? _("undefinition") : -+ "something-or-other", -+ line == 0 ? _("zero") : _("non-zero"), line, body); -+ -+ if (macinfo_type == DW_MACINFO_define) -+ parse_macro_definition (current_file, line, body); -+ else if (macinfo_type == DW_MACINFO_undef) -+ macro_undef (current_file, line, body); +- DW_MACINFO_define ? _("definition") : macinfo_type == +- DW_MACINFO_undef ? _("undefinition") : +- "something-or-other", +- line == 0 ? _("zero") : _("non-zero"), line, body); +- +- if (macinfo_type == DW_MACINFO_define) +- parse_macro_definition (current_file, line, body); +- else if (macinfo_type == DW_MACINFO_undef) +- macro_undef (current_file, line, body); ++ DW_MACINFO_define ? "definition" : macinfo_type == ++ DW_MACINFO_undef ? "undefinition" : ++ "something-or-other", body); ++ else ++ { ++ if (macinfo_type == DW_MACINFO_define) ++ parse_macro_definition (current_file, line, body); ++ else if (macinfo_type == DW_MACINFO_undef) ++ macro_undef (current_file, line, body); ++ } } break; -@@ -10034,9 +11174,22 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, +@@ -11170,22 +11700,9 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); mac_ptr += bytes_read; -- current_file = macro_start_file (file, line, -- current_file, comp_dir, -- lh, cu->objfile); -+ if (at_commandline != (line == 0)) -+ complaint (&symfile_complaints, -+ _("debug info gives source %d included " -+ "from %s at %s line %d"), -+ file, at_commandline ? _("command-line") : _("file"), -+ line == 0 ? _("zero") : _("non-zero"), line); -+ -+ if (at_commandline) -+ { -+ /* This DW_MACINFO_start_file was executed in the pass one. */ -+ at_commandline = 0; -+ } -+ else -+ current_file = macro_start_file (file, line, -+ current_file, comp_dir, -+ lh, cu->objfile); +- if ((line == 0 && !at_commandline) || (line != 0 && at_commandline)) +- complaint (&symfile_complaints, +- _("debug info gives source %d included " +- "from %s at %s line %d"), +- file, at_commandline ? _("command-line") : _("file"), +- line == 0 ? _("zero") : _("non-zero"), line); +- +- if (at_commandline) +- { +- /* This DW_MACINFO_start_file was executed in the pass one. */ +- at_commandline = 0; +- } +- else +- current_file = macro_start_file (file, line, +- current_file, comp_dir, +- lh, cu->objfile); ++ current_file = macro_start_file (file, line, ++ current_file, comp_dir, ++ lh, cu->objfile); } break; -@@ -10090,7 +11243,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, +@@ -11239,7 +11756,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, } break; } -- } -+ } while (macinfo_type != 0); +- } while (macinfo_type != 0); ++ } } /* Check if the attribute's form is a DW_FORM_block* -@@ -10123,7 +11276,7 @@ attr_form_is_section_offset (struct attribute *attr) +@@ -11272,7 +11789,7 @@ attr_form_is_section_offset (struct attribute *attr) /* Return non-zero if ATTR's value falls in the 'constant' class, or zero otherwise. When this function returns true, you can apply @@ -17526,7 +6303,7 @@ index 55868da..9bc1386 100644 However, note that for some attributes you must check attr_form_is_section_offset before using this test. DW_FORM_data4 -@@ -10150,6 +11303,34 @@ attr_form_is_constant (struct attribute *attr) +@@ -11299,6 +11816,34 @@ attr_form_is_constant (struct attribute *attr) } } @@ -17561,13 +6338,13 @@ index 55868da..9bc1386 100644 static void dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym, struct dwarf2_cu *cu) -@@ -10179,35 +11360,24 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym, - SYMBOL_OPS (sym) = &dwarf2_loclist_funcs; +@@ -11328,35 +11873,25 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym, + SYMBOL_COMPUTED_OPS (sym) = &dwarf2_loclist_funcs; SYMBOL_LOCATION_BATON (sym) = baton; } + else if (attr_form_is_block (attr)) + { -+ SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs; ++ SYMBOL_COMPUTED_OPS (sym) = &dwarf2_locexpr_funcs; + SYMBOL_LOCATION_BATON (sym) = dwarf2_attr_to_locexpr_baton (attr, cu); + } else @@ -17580,9 +6357,7 @@ index 55868da..9bc1386 100644 - sizeof (struct dwarf2_locexpr_baton)); - baton->per_cu = cu->per_cu; - gdb_assert (baton->per_cu); -+ /* Some methods are called without checking SYMBOL_OPS validity. */ -+ SYMBOL_OPS (sym) = &dwarf2_missing_funcs; -+ SYMBOL_LOCATION_BATON (sym) = NULL; ++ /* Some methods are called w/o checking SYMBOL_COMPUTED_OPS validity. */ - if (attr_form_is_block (attr)) - { @@ -17602,8 +6377,11 @@ index 55868da..9bc1386 100644 - baton->data = NULL; - } - -- SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs; +- SYMBOL_COMPUTED_OPS (sym) = &dwarf2_locexpr_funcs; - SYMBOL_LOCATION_BATON (sym) = baton; ++ SYMBOL_COMPUTED_OPS (sym) = &dwarf2_missing_funcs; ++ SYMBOL_LOCATION_BATON (sym) = NULL; ++ + /* For functions a missing DW_AT_frame_base does not optimize out the + whole function definition, only its frame base resolving. */ + if (attr->name == DW_AT_location) @@ -17611,7 +6389,7 @@ index 55868da..9bc1386 100644 } } -@@ -10482,6 +11652,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) +@@ -11644,6 +12179,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) return ofs_lhs->offset == ofs_rhs->offset; } @@ -17643,7 +6421,7 @@ index 55868da..9bc1386 100644 /* Set the type associated with DIE to TYPE. Save it in CU's hash table if necessary. For convenience, return TYPE. */ -@@ -10490,6 +11685,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) +@@ -11652,6 +12212,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) { struct dwarf2_offset_and_type **slot, ofs; @@ -17652,11 +6430,72 @@ index 55868da..9bc1386 100644 if (cu->type_hash == NULL) { gdb_assert (cu->per_cu != NULL); +@@ -11794,23 +12356,13 @@ show_dwarf2_cmd (char *args, int from_tty) + cmd_show_list (show_dwarf2_cmdlist, from_tty, ""); + } + +-/* If section described by INFO was mmapped, munmap it now. */ ++/* A helper function to destroy a debug section. */ + + static void +-munmap_section_buffer (struct dwarf2_section_info *info) ++destroy_section (struct dwarf2_section_info *info) + { +- if (info->was_mmapped) +- { +-#ifdef HAVE_MMAP +- intptr_t begin = (intptr_t) info->buffer; +- intptr_t map_begin = begin & ~(pagesize - 1); +- size_t map_length = info->size + begin - map_begin; +- gdb_assert (munmap ((void *) map_begin, map_length) == 0); +-#else +- /* Without HAVE_MMAP, we should never be here to begin with. */ +- gdb_assert (0); +-#endif +- } ++ if (info->destructor) ++ (*info->destructor) (info); + } + + /* munmap debug sections for OBJFILE, if necessary. */ +@@ -11819,15 +12371,15 @@ static void + dwarf2_per_objfile_cleanup (struct objfile *objfile, void *d) + { + struct dwarf2_per_objfile *data = d; +- munmap_section_buffer (&data->info); +- munmap_section_buffer (&data->abbrev); +- munmap_section_buffer (&data->line); +- munmap_section_buffer (&data->str); +- munmap_section_buffer (&data->macinfo); +- munmap_section_buffer (&data->ranges); +- munmap_section_buffer (&data->loc); +- munmap_section_buffer (&data->frame); +- munmap_section_buffer (&data->eh_frame); ++ destroy_section (&data->info); ++ destroy_section (&data->abbrev); ++ destroy_section (&data->line); ++ destroy_section (&data->str); ++ destroy_section (&data->macinfo); ++ destroy_section (&data->ranges); ++ destroy_section (&data->loc); ++ destroy_section (&data->frame); ++ destroy_section (&data->eh_frame); + } + + void _initialize_dwarf2_read (void); +@@ -11835,6 +12387,7 @@ void _initialize_dwarf2_read (void); + void + _initialize_dwarf2_read (void) + { ++ die_list = VEC_alloc (die_info_p, 32); + dwarf2_objfile_data_key + = register_objfile_data_with_cleanup (dwarf2_per_objfile_cleanup); + diff --git a/gdb/elfread.c b/gdb/elfread.c -index ff220a2..13158f4 100644 +index 6e79d4a..198bae3 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c -@@ -727,10 +727,18 @@ elf_symfile_read (struct objfile *objfile, int mainline) +@@ -728,10 +728,18 @@ elf_symfile_read (struct objfile *objfile, int mainline) str_sect->filepos, bfd_section_size (abfd, str_sect)); } @@ -17676,7 +6515,7 @@ index ff220a2..13158f4 100644 } /* FIXME: kettenis/20030504: This still needs to be integrated with -@@ -880,6 +888,7 @@ static struct sym_fns elf_sym_fns = +@@ -881,6 +889,7 @@ static struct sym_fns elf_sym_fns = elf_new_init, /* sym_new_init: init anything gbl to entire symtab */ elf_symfile_init, /* sym_init: read initial info, setup for sym_read() */ elf_symfile_read, /* sym_read: read a symbol file into symtab */ @@ -17685,92 +6524,60 @@ index ff220a2..13158f4 100644 default_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */ elf_symfile_segments, /* sym_segments: Get segment information from diff --git a/gdb/eval.c b/gdb/eval.c -index 1d35571..6a97e09 100644 +index 7e41d39..37ffe23 100644 --- a/gdb/eval.c +++ b/gdb/eval.c -@@ -39,10 +39,16 @@ +@@ -39,8 +39,12 @@ #include "exceptions.h" #include "regcache.h" #include "user-regs.h" +#include "python/python.h" #include "valprint.h" -+#include "dwarf2loc.h" +#include "gdb_obstack.h" +#include "objfiles.h" + #include "python/python.h" ++#include "dwarf2loc.h" #include "gdb_assert.h" -+#include -+ - /* This is defined in valops.c */ - extern int overload_resolution; - -@@ -651,6 +657,64 @@ ptrmath_type_p (struct type *type) +@@ -651,6 +655,36 @@ ptrmath_type_p (struct type *type) } } -+/* Compares the two method/function types T1 and T2 for "equality" -+ with respect to the the methods' parameters. If the types of the -+ two parameter lists are the same, returns 1; 0 otherwise. This -+ comparison ignores any artificial this pointer. */ -+int -+compare_parameters (struct type *t1, struct type *t2) -+{ -+ int i, has_this; -+ /* Hacky: we don't know a priori whether or not t1 is a static -+ method, so we skip any artificial "this" pointer and hope -+ for the best. t2, which comes as user input, never contains a -+ "this" pointer (a user would never enter it into expressions. */ -+ if (TYPE_NFIELDS (t1) > 0) -+ has_this = TYPE_FIELD_ARTIFICIAL (t1, 0) ? 1 : 0; -+ else -+ has_this = 0; -+ -+ /* Special case: a method taking void. t1 will contain either -+ no fields or just "this". t2 will contain TYPE_CODE_VOID. */ -+ if ((TYPE_NFIELDS (t1) - has_this) == 0 && TYPE_NFIELDS (t2) == 1 -+ && TYPE_CODE (TYPE_FIELD_TYPE (t2, 0)) == TYPE_CODE_VOID) -+ return 1; -+ -+ if ((TYPE_NFIELDS (t1) - has_this) == TYPE_NFIELDS (t2)) -+ { -+ for (i = has_this; i < TYPE_NFIELDS (t1); ++i) -+ { -+ if (rank_one_type (TYPE_FIELD_TYPE (t1, i), -+ TYPE_FIELD_TYPE (t2, i - has_this)) -+ != 0) -+ return 0; -+ } -+ -+ return 1; -+ } -+ -+ return 0; -+} -+ +/* Constructs a fake method with the given parameter types. */ ++static void ++free_param_types (void *arg) ++{ ++ struct type *type = (struct type *) arg; ++ xfree (TYPE_FIELDS (type)); ++ xfree (TYPE_MAIN_TYPE (type)); ++ xfree (type); ++} + +static struct type * +make_params (int num_types, struct type **param_types) +{ -+ struct type *type = alloc_type (NULL, NULL); ++ struct type *type = XZALLOC (struct type); ++ TYPE_MAIN_TYPE (type) = XZALLOC (struct main_type); + TYPE_LENGTH (type) = 1; + TYPE_CODE (type) = TYPE_CODE_METHOD; ++ TYPE_VPTR_FIELDNO (type) = -1; ++ TYPE_CHAIN (type) = type; + TYPE_NFIELDS (type) = num_types; + TYPE_FIELDS (type) = (struct field *) -+ TYPE_ALLOC (type, sizeof (struct field) * num_types); -+ memset (TYPE_FIELDS (type), 0, sizeof (struct field) * num_types); ++ TYPE_ZALLOC (type, sizeof (struct field) * num_types); + + while (num_types-- > 0) + TYPE_FIELD_TYPE (type, num_types) = param_types[num_types]; + ++ make_cleanup (free_param_types, type); + return type; +} + struct value * evaluate_subexp_standard (struct type *expect_type, struct expression *exp, int *pos, -@@ -671,6 +735,7 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -671,6 +705,7 @@ evaluate_subexp_standard (struct type *expect_type, long mem_offset; struct type **arg_types; int save_pos1; @@ -17778,7 +6585,7 @@ index 1d35571..6a97e09 100644 pc = (*pos)++; op = exp->elts[pc].opcode; -@@ -684,7 +749,7 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -684,7 +719,7 @@ evaluate_subexp_standard (struct type *expect_type, goto nosideret; arg1 = value_aggregate_elt (exp->elts[pc + 1].type, &exp->elts[pc + 3].string, @@ -17787,19 +6594,7 @@ index 1d35571..6a97e09 100644 if (arg1 == NULL) error (_("There is no field named %s"), &exp->elts[pc + 3].string); return arg1; -@@ -1208,9 +1273,9 @@ evaluate_subexp_standard (struct type *expect_type, - if (TYPE_CODE (value_type (method)) != TYPE_CODE_FUNC) - error (_("method address has symbol information with non-function type; skipping")); - if (struct_return) -- VALUE_ADDRESS (method) = value_as_address (msg_send_stret); -+ set_value_address (method, value_as_address (msg_send_stret)); - else -- VALUE_ADDRESS (method) = value_as_address (msg_send); -+ set_value_address (method, value_as_address (msg_send)); - called_method = method; - } - else -@@ -1284,7 +1349,6 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -1293,7 +1328,6 @@ evaluate_subexp_standard (struct type *expect_type, argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 3)); if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { @@ -17807,7 +6602,7 @@ index 1d35571..6a97e09 100644 /* First, evaluate the structure into arg2 */ pc2 = (*pos)++; -@@ -1308,21 +1372,40 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -1317,21 +1351,40 @@ evaluate_subexp_standard (struct type *expect_type, arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); @@ -17860,16 +6655,7 @@ index 1d35571..6a97e09 100644 } else if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR) { -@@ -1434,7 +1517,7 @@ evaluate_subexp_standard (struct type *expect_type, - of the ``this'' pointer if necessary, so modify argvec[1] to - reflect any ``this'' changes. */ - arg2 = value_from_longest (lookup_pointer_type(value_type (temp)), -- VALUE_ADDRESS (temp) + value_offset (temp) -+ value_address (temp) - + value_embedded_offset (temp)); - argvec[1] = arg2; /* the ``this'' pointer */ - } -@@ -1448,8 +1531,7 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -1457,8 +1510,7 @@ evaluate_subexp_standard (struct type *expect_type, } else if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { @@ -17879,28 +6665,18 @@ index 1d35571..6a97e09 100644 } else if (op == OP_VAR_VALUE) { -@@ -1512,6 +1594,9 @@ evaluate_subexp_standard (struct type *expect_type, - else - error (_("Expression of type other than \"Function returning ...\" used as function")); - } -+ if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_INTERNAL_FUNCTION) -+ return call_internal_function (argvec[0], nargs, argvec + 1); -+ - return call_function_by_hand (argvec[0], nargs, argvec + 1); - /* pai: FIXME save value from call_function_by_hand, then adjust pc by adjust_fn_pc if +ve */ - -@@ -1529,7 +1614,10 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -1542,7 +1594,10 @@ evaluate_subexp_standard (struct type *expect_type, /* First determine the type code we are dealing with. */ arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + old_chain = make_cleanup (null_cleanup, 0); -+ object_address_set (VALUE_ADDRESS (arg1)); ++ object_address_set (value_raw_address (arg1)); type = check_typedef (value_type (arg1)); + do_cleanups (old_chain); code = TYPE_CODE (type); if (code == TYPE_CODE_PTR) -@@ -1696,6 +1784,37 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -1709,6 +1764,37 @@ evaluate_subexp_standard (struct type *expect_type, error (_("non-pointer-to-member value used in pointer-to-member construct")); } @@ -17938,7 +6714,7 @@ index 1d35571..6a97e09 100644 case BINOP_CONCAT: arg1 = evaluate_subexp_with_coercion (exp, pos, noside); arg2 = evaluate_subexp_with_coercion (exp, pos, noside); -@@ -1963,13 +2082,19 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -1980,13 +2066,19 @@ evaluate_subexp_standard (struct type *expect_type, { int subscript_array[MAX_FORTRAN_DIMS]; int array_size_array[MAX_FORTRAN_DIMS]; @@ -17953,12 +6729,12 @@ index 1d35571..6a97e09 100644 error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS); + old_chain = make_cleanup (null_cleanup, 0); -+ object_address_set (VALUE_ADDRESS (arg1)); ++ object_address_set (value_raw_address (arg1)); + tmp_type = check_typedef (value_type (arg1)); ndimensions = calc_f77_array_dims (type); -@@ -1999,6 +2124,9 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -2016,6 +2108,9 @@ evaluate_subexp_standard (struct type *expect_type, upper = f77_get_upperbound (tmp_type); lower = f77_get_lowerbound (tmp_type); @@ -17968,24 +6744,19 @@ index 1d35571..6a97e09 100644 array_size_array[nargs - i - 1] = upper - lower + 1; /* Zero-normalize subscripts so that offsetting will work. */ -@@ -2017,17 +2145,25 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -2034,13 +2129,25 @@ evaluate_subexp_standard (struct type *expect_type, tmp_type = check_typedef (TYPE_TARGET_TYPE (tmp_type)); } -- /* Now let us calculate the offset for this item */ + /* Kept for the f77_get_upperbound / f77_get_lowerbound calls above. */ + do_cleanups (old_chain); ++ + /* Now let us calculate the offset for this item */ - offset_item = subscript_array[ndimensions - 1]; -+ /* Now let us calculate the offset for this item */ - -- for (i = ndimensions - 1; i > 0; --i) -- offset_item = -- array_size_array[i - 1] * offset_item + subscript_array[i - 1]; + offset_item = 0; + offset_byte = 0; - -- /* Construct a value node with the value of the offset */ ++ + for (i = ndimensions - 1; i >= 0; --i) + { + offset_item *= array_size_array[i]; @@ -17995,41 +6766,24 @@ index 1d35571..6a97e09 100644 + offset_byte += subscript_array[i] * byte_stride_array[i]; + } -- arg2 = value_from_longest (builtin_type_int32, offset_item); +- for (i = ndimensions - 1; i > 0; --i) +- offset_item = +- array_size_array[i - 1] * offset_item + subscript_array[i - 1]; + element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (tmp_type)); + offset_byte += offset_item * element_size; /* Let us now play a dirty trick: we will take arg1 which is a value node pointing to the topmost level -@@ -2037,7 +2173,7 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -2050,7 +2157,7 @@ evaluate_subexp_standard (struct type *expect_type, returns the correct type value */ deprecated_set_value_type (arg1, tmp_type); -- return value_subscripted_rvalue (arg1, arg2, 0); +- return value_subscripted_rvalue (arg1, offset_item, 0); + return value_subscripted_rvalue (arg1, offset_byte); } case BINOP_LOGICAL_AND: -@@ -2475,7 +2611,17 @@ evaluate_subexp_standard (struct type *expect_type, - if (noside == EVAL_SKIP) - goto nosideret; - else if (noside == EVAL_AVOID_SIDE_EFFECTS) -- return allocate_value (exp->elts[pc + 1].type); -+ { -+ struct type *type = exp->elts[pc + 1].type; -+ /* If this is a typedef, then find its immediate target. We -+ use check_typedef to resolve stubs, but we ignore its -+ result because we do not want to dig past all -+ typedefs. */ -+ check_typedef (type); -+ if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) -+ type = TYPE_TARGET_TYPE (type); -+ return allocate_value (type); -+ } - else - error (_("Attempt to use a type name as an expression")); - -@@ -2568,7 +2714,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos, +@@ -2591,7 +2698,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos, (*pos) += 5 + BYTES_TO_EXP_ELEM (tem + 1); x = value_aggregate_elt (exp->elts[pc + 1].type, &exp->elts[pc + 3].string, @@ -18038,7 +6792,7 @@ index 1d35571..6a97e09 100644 if (x == NULL) error (_("There is no field named %s"), &exp->elts[pc + 3].string); return x; -@@ -2613,7 +2759,7 @@ evaluate_subexp_with_coercion (struct expression *exp, +@@ -2636,7 +2743,7 @@ evaluate_subexp_with_coercion (struct expression *exp, { enum exp_opcode op; int pc; @@ -18047,7 +6801,7 @@ index 1d35571..6a97e09 100644 struct symbol *var; struct type *type; -@@ -2624,12 +2770,17 @@ evaluate_subexp_with_coercion (struct expression *exp, +@@ -2647,12 +2754,17 @@ evaluate_subexp_with_coercion (struct expression *exp, { case OP_VAR_VALUE: var = exp->elts[pc + 2].symbol; @@ -18066,7 +6820,7 @@ index 1d35571..6a97e09 100644 return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)), val); } -@@ -2681,9 +2832,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos) +@@ -2704,9 +2816,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos) case OP_VAR_VALUE: (*pos) += 4; @@ -18083,45 +6837,8 @@ index 1d35571..6a97e09 100644 default: val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS); -diff --git a/gdb/expprint.c b/gdb/expprint.c -index 89bae03..f768940 100644 ---- a/gdb/expprint.c -+++ b/gdb/expprint.c -@@ -186,8 +186,8 @@ print_subexp_standard (struct expression *exp, int *pos, - If necessary, we can temporarily set it to zero, or pass it as an - additional parameter to LA_PRINT_STRING. -fnf */ - get_user_print_options (&opts); -- LA_PRINT_STRING (stream, &exp->elts[pc + 2].string, nargs, 1, 0, -- &opts); -+ LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char, -+ &exp->elts[pc + 2].string, nargs, 0, &opts); - } - return; - -@@ -205,8 +205,8 @@ print_subexp_standard (struct expression *exp, int *pos, - (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1); - fputs_filtered ("@\"", stream); - get_user_print_options (&opts); -- LA_PRINT_STRING (stream, &exp->elts[pc + 2].string, nargs, 1, 0, -- &opts); -+ LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char, -+ &exp->elts[pc + 2].string, nargs, 0, &opts); - fputs_filtered ("\"", stream); - } - return; -@@ -291,8 +291,8 @@ print_subexp_standard (struct expression *exp, int *pos, - { - struct value_print_options opts; - get_user_print_options (&opts); -- LA_PRINT_STRING (stream, tempstr, nargs - 1, 1, 0, -- &opts); -+ LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char, -+ tempstr, nargs - 1, 0, &opts); - (*pos) = pc; - } - else diff --git a/gdb/expression.h b/gdb/expression.h -index 12163e3..789cb89 100644 +index 12163e3..bf2b518 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -88,6 +88,16 @@ enum exp_opcode @@ -18141,26 +6858,17 @@ index 12163e3..789cb89 100644 /* end of C++. */ /* For Modula-2 integer division DIV */ -@@ -426,6 +436,8 @@ enum noside - extern struct value *evaluate_subexp_standard - (struct type *, struct expression *, int *, enum noside); - -+extern int compare_parameters (struct type *, struct type *); -+ - /* From expprint.c */ - - extern void print_expression (struct expression *, struct ui_file *); -@@ -435,4 +447,5 @@ extern char *op_string (enum exp_opcode); +@@ -435,4 +445,5 @@ extern char *op_string (enum exp_opcode); extern void dump_raw_expression (struct expression *, struct ui_file *, char *); extern void dump_prefix_expression (struct expression *, struct ui_file *); + #endif /* !defined (EXPRESSION_H) */ diff --git a/gdb/f-exp.y b/gdb/f-exp.y -index d91c413..c984e85 100644 +index c04c8f4..ddcd460 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y -@@ -198,6 +198,7 @@ static int parse_number (char *, int, int, YYSTYPE *); +@@ -196,6 +196,7 @@ static int parse_number (char *, int, int, YYSTYPE *); /* Special type cases, put in to allow the parser to distinguish different legal basetypes. */ %token INT_KEYWORD INT_S2_KEYWORD LOGICAL_S1_KEYWORD LOGICAL_S2_KEYWORD @@ -18168,7 +6876,7 @@ index d91c413..c984e85 100644 %token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD %token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD %token BOOL_AND BOOL_OR BOOL_NOT -@@ -608,6 +609,8 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */ +@@ -606,6 +607,8 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */ { $$ = parse_f_type->builtin_integer_s2; } | CHARACTER { $$ = parse_f_type->builtin_character; } @@ -18177,7 +6885,7 @@ index d91c413..c984e85 100644 | LOGICAL_KEYWORD { $$ = parse_f_type->builtin_logical; } | LOGICAL_S2_KEYWORD -@@ -860,6 +863,7 @@ static const struct token f77_keywords[] = +@@ -858,6 +861,7 @@ static const struct token f77_keywords[] = { "integer_2", INT_S2_KEYWORD, BINOP_END }, { "logical_1", LOGICAL_S1_KEYWORD, BINOP_END }, { "logical_2", LOGICAL_S2_KEYWORD, BINOP_END }, @@ -18186,19 +6894,10 @@ index d91c413..c984e85 100644 { "integer", INT_KEYWORD, BINOP_END }, { "logical", LOGICAL_KEYWORD, BINOP_END }, diff --git a/gdb/f-lang.c b/gdb/f-lang.c -index 6359841..00921c4 100644 +index 19c1316..8d2a538 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c -@@ -31,6 +31,8 @@ - #include "f-lang.h" - #include "valprint.h" - #include "value.h" -+#include "block.h" -+#include "gdb_assert.h" - - - /* Following is dubious stuff that had been in the xcoff reader. */ -@@ -55,23 +57,10 @@ typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR; +@@ -55,20 +55,6 @@ typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR; /* Local functions */ extern void _initialize_f_language (void); @@ -18216,75 +6915,10 @@ index 6359841..00921c4 100644 -static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void); -static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int); -#endif -- --static void f_printchar (int c, struct ui_file * stream); --static void f_emit_char (int c, struct ui_file * stream, int quoter); -+ -+static void f_printchar (int c, struct type *type, struct ui_file * stream); -+static void f_emit_char (int c, struct type *type, -+ struct ui_file * stream, int quoter); - /* Print the character C on STREAM as part of the contents of a literal - string whose delimiter is QUOTER. Note that that format for printing -@@ -80,7 +69,7 @@ static void f_emit_char (int c, struct ui_file * stream, int quoter); - be replaced with a true F77 version. */ - - static void --f_emit_char (int c, struct ui_file *stream, int quoter) -+f_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) - { - c &= 0xFF; /* Avoid sign bit follies */ - -@@ -126,10 +115,10 @@ f_emit_char (int c, struct ui_file *stream, int quoter) - be replaced with a true F77version. */ - - static void --f_printchar (int c, struct ui_file *stream) -+f_printchar (int c, struct type *type, struct ui_file *stream) - { - fputs_filtered ("'", stream); -- LA_EMIT_CHAR (c, stream, '\''); -+ LA_EMIT_CHAR (c, type, stream, '\''); - fputs_filtered ("'", stream); - } - -@@ -141,14 +130,15 @@ f_printchar (int c, struct ui_file *stream) - be replaced with a true F77 version. */ - - static void --f_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+f_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, -+ unsigned int length, int force_ellipses, - const struct value_print_options *options) - { - unsigned int i; - unsigned int things_printed = 0; - int in_quotes = 0; - int need_comma = 0; -+ int width = TYPE_LENGTH (type); - - if (length == 0) - { -@@ -190,7 +180,7 @@ f_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("', ", stream); - in_quotes = 0; - } -- f_printchar (string[i], stream); -+ f_printchar (string[i], type, stream); - fprintf_filtered (stream, " ", reps); - i = rep1 - 1; - things_printed += options->repeat_count_threshold; -@@ -206,7 +196,7 @@ f_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("'", stream); - in_quotes = 1; - } -- LA_EMIT_CHAR (string[i], stream, '"'); -+ LA_EMIT_CHAR (string[i], type, stream, '"'); - ++things_printed; - } - } -@@ -257,6 +247,7 @@ enum f_primitive_types { + static void f_printchar (int c, struct type *type, struct ui_file * stream); + static void f_emit_char (int c, struct type *type, +@@ -259,6 +245,7 @@ enum f_primitive_types { f_primitive_type_logical, f_primitive_type_logical_s1, f_primitive_type_logical_s2, @@ -18292,7 +6926,7 @@ index 6359841..00921c4 100644 f_primitive_type_integer, f_primitive_type_integer_s2, f_primitive_type_real, -@@ -287,6 +278,8 @@ f_language_arch_info (struct gdbarch *gdbarch, +@@ -289,6 +276,8 @@ f_language_arch_info (struct gdbarch *gdbarch, = builtin->builtin_logical_s1; lai->primitive_type_vector [f_primitive_type_logical_s2] = builtin->builtin_logical_s2; @@ -18301,77 +6935,18 @@ index 6359841..00921c4 100644 lai->primitive_type_vector [f_primitive_type_real] = builtin->builtin_real; lai->primitive_type_vector [f_primitive_type_real_s8] -@@ -304,6 +297,48 @@ f_language_arch_info (struct gdbarch *gdbarch, - lai->bool_type_default = builtin->builtin_logical_s2; - } +@@ -372,6 +361,10 @@ build_fortran_types (struct gdbarch *gdbarch) + = arch_boolean_type (gdbarch, gdbarch_short_bit (gdbarch), 1, + "logical*2"); -+/* Find if NAME is not contained in any of the Fortran modules imported by the -+ Fortran USE statement. ++ builtin_f_type->builtin_logical_s8 ++ = arch_boolean_type (gdbarch, gdbarch_long_long_bit (gdbarch), 1, ++ "logical*8"); + -+ As Fortran has no nested blocks such lookup can be processed from -+ lookup_symbol_nonlocal - when no local blocks could satisfy the lookup. */ -+ -+static struct symbol * -+f_lookup_symbol_nonlocal (const char *name, -+ const char *linkage_name, -+ const struct block *block, -+ const domain_enum domain) -+{ -+ struct fortran_using *use; -+ -+ if (!block) -+ return NULL; -+ -+ for (use = BLOCK_FORTRAN_USE (block); use; use = use->next) -+ { -+ struct symbol *sym; -+ struct type *type; -+ struct symbol *retval; -+ -+ sym = lookup_symbol_global (use->module_name, NULL, block, MODULE_DOMAIN); -+ -+ /* Module name lookup should not fail with correct debug info. */ -+ if (sym == NULL) -+ continue; -+ -+ type = SYMBOL_TYPE (sym); -+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_MODULE); -+ gdb_assert (TYPE_MODULE_BLOCK (type) != NULL); -+ -+ retval = lookup_block_symbol (TYPE_MODULE_BLOCK (type), name, -+ linkage_name, domain); -+ if (retval) -+ return retval; -+ } -+ -+ return basic_lookup_symbol_nonlocal (name, linkage_name, block, domain); -+} -+ - /* This is declared in c-lang.h but it is silly to import that file for what - is already just a hack. */ - extern int c_value_print (struct value *, struct ui_file *, -@@ -331,7 +366,7 @@ const struct language_defn f_language_defn = - c_value_print, /* FIXME */ - NULL, /* Language specific skip_trampoline */ - NULL, /* name_of_this */ -- basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ -+ f_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ - basic_lookup_transparent_type,/* lookup_transparent_type */ - NULL, /* Language specific symbol demangler */ - NULL, /* Language specific class_name_from_physname */ -@@ -378,6 +413,11 @@ build_fortran_types (struct gdbarch *gdbarch) - gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, "logical*2", (struct objfile *) NULL); - -+ builtin_f_type->builtin_logical_s8 = -+ init_type (TYPE_CODE_BOOL, -+ gdbarch_long_long_bit (gdbarch) / TARGET_CHAR_BIT, -+ TYPE_FLAG_UNSIGNED, "logical*8", (struct objfile *) NULL); -+ - builtin_f_type->builtin_integer = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, -@@ -451,395 +491,3 @@ _initialize_f_language (void) + builtin_f_type->builtin_integer + = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, + "integer"); +@@ -418,395 +411,3 @@ _initialize_f_language (void) add_language (&f_language_defn); } @@ -18768,7 +7343,7 @@ index 6359841..00921c4 100644 -} -#endif diff --git a/gdb/f-lang.h b/gdb/f-lang.h -index 711bdba..9d7d92b 100644 +index 711bdba..cd2f804 100644 --- a/gdb/f-lang.h +++ b/gdb/f-lang.h @@ -28,6 +28,10 @@ extern void f_error (char *); /* Defined in f-exp.y */ @@ -18832,17 +7407,6 @@ index 711bdba..9d7d92b 100644 struct type *builtin_real; struct type *builtin_real_s8; struct type *builtin_real_s16; -@@ -125,3 +97,10 @@ struct builtin_f_type - /* Return the Fortran type table for the specified architecture. */ - extern const struct builtin_f_type *builtin_f_type (struct gdbarch *gdbarch); - -+/* List of module names being imported by a block though BLOCK_FORTRAN_USE. */ -+ -+struct fortran_using -+ { -+ struct fortran_using *next; -+ char module_name[1]; -+ }; diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 6c9668f..852b9a8 100644 --- a/gdb/f-typeprint.c @@ -18912,7 +7476,7 @@ index 6c9668f..852b9a8 100644 { case TYPE_CODE_ARRAY: diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c -index 5721041..2cff7bc 100644 +index 0a57404..a9ccc77 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -34,10 +34,8 @@ @@ -19052,7 +7616,7 @@ index 5721041..2cff7bc 100644 fprintf_filtered (stream, "..."); } } -@@ -251,12 +259,16 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, +@@ -253,6 +261,9 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR addr; int index; @@ -19062,33 +7626,7 @@ index 5721041..2cff7bc 100644 CHECK_TYPEDEF (type); switch (TYPE_CODE (type)) { - case TYPE_CODE_STRING: - f77_get_dynamic_length_of_aggregate (type); -- LA_PRINT_STRING (stream, valaddr, TYPE_LENGTH (type), 1, 0, options); -+ LA_PRINT_STRING (stream, builtin_type (current_gdbarch)->builtin_char, -+ valaddr, TYPE_LENGTH (type), 0, options); - break; - - case TYPE_CODE_ARRAY: -@@ -293,7 +305,7 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - && TYPE_CODE (elttype) == TYPE_CODE_INT - && (options->format == 0 || options->format == 's') - && addr != 0) -- i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream, -+ i = val_print_string (TYPE_TARGET_TYPE (type), addr, -1, stream, - options); - - /* Return number of characters printed, including the terminating -@@ -365,7 +377,7 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - { - fputs_filtered (" ", stream); - LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr), -- stream); -+ type, stream); - } - } - break; -@@ -464,22 +476,54 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, +@@ -467,22 +478,54 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, return 0; } @@ -19158,7 +7696,7 @@ index 5721041..2cff7bc 100644 } /* This function is used to print out the values in a given COMMON -@@ -489,11 +533,9 @@ list_all_visible_commons (char *funname) +@@ -492,11 +535,9 @@ list_all_visible_commons (char *funname) static void info_common_command (char *comname, int from_tty) { @@ -19172,7 +7710,7 @@ index 5721041..2cff7bc 100644 /* We have been told to display the contents of F77 COMMON block supposedly visible in this function. Let us -@@ -505,136 +547,32 @@ info_common_command (char *comname, int from_tty) +@@ -508,136 +549,32 @@ info_common_command (char *comname, int from_tty) /* The following is generally ripped off from stack.c's routine print_frame_info() */ @@ -19325,10 +7863,10 @@ index 5721041..2cff7bc 100644 void _initialize_f_valprint (void) diff --git a/gdb/findcmd.c b/gdb/findcmd.c -index 7ae43e5..2894948 100644 +index 1d28914..d176341 100644 --- a/gdb/findcmd.c +++ b/gdb/findcmd.c -@@ -26,7 +26,7 @@ +@@ -27,7 +27,7 @@ /* Copied from bfd_put_bits. */ @@ -19337,7 +7875,7 @@ index 7ae43e5..2894948 100644 put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) { int i; -@@ -44,6 +44,41 @@ put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) +@@ -45,6 +45,41 @@ put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) } } @@ -19379,7 +7917,7 @@ index 7ae43e5..2894948 100644 /* Subroutine of find_command to simplify it. Parse the arguments of the "find" command. */ -@@ -59,8 +94,7 @@ parse_find_args (char *args, ULONGEST *max_countp, +@@ -61,8 +96,7 @@ parse_find_args (char *args, ULONGEST *max_countp, char *pattern_buf; /* Current size of search pattern buffer. We realloc space as needed. */ @@ -19389,7 +7927,7 @@ index 7ae43e5..2894948 100644 /* Pointer to one past the last in-use part of pattern_buf. */ char *pattern_buf_end; ULONGEST pattern_len; -@@ -74,8 +108,7 @@ parse_find_args (char *args, ULONGEST *max_countp, +@@ -75,8 +109,7 @@ parse_find_args (char *args, ULONGEST *max_countp, if (args == NULL) error (_("Missing search parameters.")); @@ -19399,7 +7937,7 @@ index 7ae43e5..2894948 100644 old_cleanups = make_cleanup (free_current_contents, &pattern_buf); /* Get search granularity and/or max count if specified. -@@ -172,16 +205,8 @@ parse_find_args (char *args, ULONGEST *max_countp, +@@ -173,16 +206,8 @@ parse_find_args (char *args, ULONGEST *max_countp, v = parse_to_comma_and_eval (&s); val_bytes = TYPE_LENGTH (value_type (v)); @@ -19418,7 +7956,7 @@ index 7ae43e5..2894948 100644 if (size != '\0') { -@@ -236,6 +261,45 @@ parse_find_args (char *args, ULONGEST *max_countp, +@@ -237,6 +262,45 @@ parse_find_args (char *args, ULONGEST *max_countp, discard_cleanups (old_cleanups); } @@ -19464,7 +8002,7 @@ index 7ae43e5..2894948 100644 static void find_command (char *args, int from_tty) { -@@ -264,12 +328,11 @@ find_command (char *args, int from_tty) +@@ -267,12 +331,11 @@ find_command (char *args, int from_tty) while (search_space_len >= pattern_len && found_count < max_count) { @@ -19480,7 +8018,7 @@ index 7ae43e5..2894948 100644 if (found <= 0) break; -@@ -277,16 +340,6 @@ find_command (char *args, int from_tty) +@@ -280,16 +343,6 @@ find_command (char *args, int from_tty) printf_filtered ("\n"); ++found_count; last_found_addr = found_addr; @@ -19498,7 +8036,7 @@ index 7ae43e5..2894948 100644 /* Record and print the results. */ diff --git a/gdb/findvar.c b/gdb/findvar.c -index 1048887..b958ec6 100644 +index 8c027c9..d201f76 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -35,6 +35,7 @@ @@ -19509,16 +8047,7 @@ index 1048887..b958ec6 100644 /* Basic byte-swapping routines. GDB has needed these for a long time... All extract a target-format integer at ADDR which is LEN bytes long. */ -@@ -275,7 +276,7 @@ value_of_register (int regnum, struct frame_info *frame) - memcpy (value_contents_raw (reg_val), raw_buffer, - register_size (gdbarch, regnum)); - VALUE_LVAL (reg_val) = lval; -- VALUE_ADDRESS (reg_val) = addr; -+ set_value_address (reg_val, addr); - VALUE_REGNUM (reg_val) = regnum; - set_value_optimized_out (reg_val, optim); - VALUE_FRAME_ID (reg_val) = get_frame_id (frame); -@@ -382,27 +383,16 @@ symbol_read_needs_frame (struct symbol *sym) +@@ -394,27 +395,16 @@ symbol_read_needs_frame (struct symbol *sym) /* Given a struct symbol for a variable, and a stack frame id, read the value of the variable and return a (pointer to a) struct value containing the value. @@ -19550,12 +8079,13 @@ index 1048887..b958ec6 100644 if (symbol_read_needs_frame (var)) gdb_assert (frame); -@@ -410,31 +400,39 @@ read_var_value (struct symbol *var, struct frame_info *frame) +@@ -422,32 +412,40 @@ read_var_value (struct symbol *var, struct frame_info *frame) switch (SYMBOL_CLASS (var)) { case LOC_CONST: - /* Put the constant back in target format. */ - store_signed_integer (value_contents_raw (v), len, +- gdbarch_byte_order (get_type_arch (type)), - (LONGEST) SYMBOL_VALUE (var)); - VALUE_LVAL (v) = not_lval; - return v; @@ -19564,6 +8094,7 @@ index 1048887..b958ec6 100644 + struct value *v = allocate_value (type); + VALUE_LVAL (v) = not_lval; + store_signed_integer (value_contents_raw (v), TYPE_LENGTH (type), ++ gdbarch_byte_order (get_type_arch (type)), + (LONGEST) SYMBOL_VALUE (var)); + return v; + } @@ -19609,15 +8140,15 @@ index 1048887..b958ec6 100644 return v; } -@@ -476,12 +474,23 @@ read_var_value (struct symbol *var, struct frame_info *frame) +@@ -489,12 +487,23 @@ read_var_value (struct symbol *var, struct frame_info *frame) break; case LOC_BLOCK: - if (overlay_debugging) -- VALUE_ADDRESS (v) = symbol_overlayed_address -- (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var)); +- set_value_address (v, symbol_overlayed_address +- (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var))); - else -- VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (var)); +- set_value_address (v, BLOCK_START (SYMBOL_BLOCK_VALUE (var))); - return v; + { + CORE_ADDR addr; @@ -19632,14 +8163,14 @@ index 1048887..b958ec6 100644 + DW_OP_push_object_address. */ + object_address_set (addr); + v = allocate_value (type); -+ VALUE_ADDRESS (v) = addr; + VALUE_LVAL (v) = lval_memory; ++ set_value_address (v, addr); + return v; + } case LOC_REGISTER: case LOC_REGPARM_ADDR: -@@ -499,7 +508,6 @@ read_var_value (struct symbol *var, struct frame_info *frame) +@@ -513,7 +522,6 @@ read_var_value (struct symbol *var, struct frame_info *frame) error (_("Value of register variable not available.")); addr = value_as_address (regval); @@ -19647,7 +8178,7 @@ index 1048887..b958ec6 100644 } else { -@@ -542,18 +550,33 @@ read_var_value (struct symbol *var, struct frame_info *frame) +@@ -556,18 +564,33 @@ read_var_value (struct symbol *var, struct frame_info *frame) break; case LOC_OPTIMIZED_OUT: @@ -19667,7 +8198,7 @@ index 1048887..b958ec6 100644 break; } -- VALUE_ADDRESS (v) = addr; +- set_value_address (v, addr); - set_value_lazy (v, 1); - return v; + { @@ -19677,8 +8208,8 @@ index 1048887..b958ec6 100644 + DW_OP_PUSH_OBJECT_ADDRESS. */ + object_address_set (addr); + v = allocate_value (type); -+ VALUE_ADDRESS (v) = addr; + VALUE_LVAL (v) = lval_memory; ++ set_value_address (v, addr); + + set_value_lazy (v, 1); + @@ -19687,7 +8218,7 @@ index 1048887..b958ec6 100644 } /* Install default attributes for register values. */ -@@ -590,10 +613,11 @@ struct value * +@@ -604,10 +627,11 @@ struct value * value_from_register (struct type *type, int regnum, struct frame_info *frame) { struct gdbarch *gdbarch = get_frame_arch (frame); @@ -19701,7 +8232,7 @@ index 1048887..b958ec6 100644 { /* The ISA/ABI need to something weird when obtaining the specified value from this register. It might need to -@@ -607,7 +631,7 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) +@@ -621,7 +645,7 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) VALUE_FRAME_ID (v) = get_frame_id (frame); VALUE_REGNUM (v) = regnum; gdbarch_register_to_value (gdbarch, @@ -19711,385 +8242,56 @@ index 1048887..b958ec6 100644 else { diff --git a/gdb/frame.c b/gdb/frame.c -index dfd6b3d..2ea37c3 100644 +index 67e0607..1eb7f9d 100644 --- a/gdb/frame.c +++ b/gdb/frame.c -@@ -596,7 +596,7 @@ frame_register_unwind (struct frame_info *frame, int regnum, +@@ -1109,6 +1109,14 @@ has_stack_frames (void) + if (ptid_equal (inferior_ptid, null_ptid)) + return 0; - *optimizedp = value_optimized_out (value); - *lvalp = VALUE_LVAL (value); -- *addrp = VALUE_ADDRESS (value); -+ *addrp = value_address (value); - *realnump = VALUE_REGNUM (value); - - if (bufferp) -@@ -682,7 +682,7 @@ frame_unwind_register_value (struct frame_info *frame, int regnum) - VALUE_REGNUM (value)); - else if (VALUE_LVAL (value) == lval_memory) - fprintf_unfiltered (gdb_stdlog, " address=0x%s", -- paddr_nz (VALUE_ADDRESS (value))); -+ paddr_nz (value_address (value))); - else - fprintf_unfiltered (gdb_stdlog, " computed"); - -diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c -index ff387db..452f70c 100644 ---- a/gdb/frv-tdep.c -+++ b/gdb/frv-tdep.c -@@ -1230,7 +1230,7 @@ frv_push_dummy_call (struct gdbarch *gdbarch, struct value *function, - - if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION) - { -- store_unsigned_integer (valbuf, 4, VALUE_ADDRESS (arg)); -+ store_unsigned_integer (valbuf, 4, value_address (arg)); - typecode = TYPE_CODE_PTR; - len = 4; - val = valbuf; -diff --git a/gdb/gdb_locale.h b/gdb/gdb_locale.h -index e8ba0ea..4fa4d3d 100644 ---- a/gdb/gdb_locale.h -+++ b/gdb/gdb_locale.h -@@ -41,4 +41,8 @@ - # define N_(String) (String) - #endif - -+#ifdef HAVE_LANGINFO_CODESET -+#include -+#endif ++ /* FIXME: Workaround archer-tromey-python crash in ++ add_inferior_object->get_current_arch on FSF GDB update: ++ is_thread_state would assertion check here as ++ remote_start_remote->add_inferior_silent->observer_notify_new_inferior is ++ before remote_start_remote->add_thread_silent. */ ++ if (find_thread_ptid (inferior_ptid) == NULL) ++ return 0; + - #endif /* GDB_LOCALE_H */ -diff --git a/gdb/gdb_obstack.h b/gdb/gdb_obstack.h -index 48f49cd..cd1a1d7 100644 ---- a/gdb/gdb_obstack.h -+++ b/gdb/gdb_obstack.h -@@ -45,4 +45,7 @@ - #define obstack_grow_str0(OBSTACK,STRING) \ - obstack_grow0 (OBSTACK, STRING, strlen (STRING)) - -+#define obstack_grow_wstr(OBSTACK, WSTRING) \ -+ obstack_grow (OBSTACK, WSTRING, sizeof (wchar_t) * wcslen (WSTRING)) -+ - #endif -diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c -index 3273b34..d6c737b 100644 ---- a/gdb/gdbarch.c -+++ b/gdb/gdbarch.c -@@ -243,6 +243,11 @@ struct gdbarch - gdbarch_target_signal_to_host_ftype *target_signal_to_host; - gdbarch_get_siginfo_type_ftype *get_siginfo_type; - gdbarch_record_special_symbol_ftype *record_special_symbol; -+ gdbarch_get_syscall_number_ftype *get_syscall_number; -+ gdbarch_get_syscall_by_number_ftype *get_syscall_by_number; -+ gdbarch_get_syscall_by_name_ftype *get_syscall_by_name; -+ gdbarch_get_syscall_names_ftype *get_syscall_names; -+ const char * xml_syscall_filename; - int has_global_solist; - }; - -@@ -378,6 +383,11 @@ struct gdbarch startup_gdbarch = - default_target_signal_to_host, /* target_signal_to_host */ - 0, /* get_siginfo_type */ - 0, /* record_special_symbol */ -+ 0, /* get_syscall_number */ -+ 0, /* get_syscall_by_number */ -+ 0, /* get_syscall_by_name */ -+ 0, /* get_syscall_names */ -+ 0, /* xml_syscall_filename */ - 0, /* has_global_solist */ - /* startup_gdbarch() */ - }; -@@ -634,6 +644,11 @@ verify_gdbarch (struct gdbarch *gdbarch) - /* Skip verify of target_signal_to_host, invalid_p == 0 */ - /* Skip verify of get_siginfo_type, has predicate */ - /* Skip verify of record_special_symbol, has predicate */ -+ /* Skip verify of get_syscall_number, has predicate */ -+ /* Skip verify of get_syscall_by_number, has predicate */ -+ /* Skip verify of get_syscall_by_name, has predicate */ -+ /* Skip verify of get_syscall_names, has predicate */ -+ /* Skip verify of xml_syscall_filename, invalid_p == 0 */ - /* Skip verify of has_global_solist, invalid_p == 0 */ - buf = ui_file_xstrdup (log, &dummy); - make_cleanup (xfree, buf); -@@ -859,6 +874,30 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) - "gdbarch_dump: get_siginfo_type = <%s>\n", - host_address_to_string (gdbarch->get_siginfo_type)); - fprintf_unfiltered (file, -+ "gdbarch_dump: gdbarch_get_syscall_by_name_p() = %d\n", -+ gdbarch_get_syscall_by_name_p (gdbarch)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: get_syscall_by_name = <%s>\n", -+ host_address_to_string (gdbarch->get_syscall_by_name)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: gdbarch_get_syscall_by_number_p() = %d\n", -+ gdbarch_get_syscall_by_number_p (gdbarch)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: get_syscall_by_number = <%s>\n", -+ host_address_to_string (gdbarch->get_syscall_by_number)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: gdbarch_get_syscall_names_p() = %d\n", -+ gdbarch_get_syscall_names_p (gdbarch)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: get_syscall_names = <%s>\n", -+ host_address_to_string (gdbarch->get_syscall_names)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: gdbarch_get_syscall_number_p() = %d\n", -+ gdbarch_get_syscall_number_p (gdbarch)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: get_syscall_number = <%s>\n", -+ host_address_to_string (gdbarch->get_syscall_number)); -+ fprintf_unfiltered (file, - "gdbarch_dump: has_global_solist = %s\n", - plongest (gdbarch->has_global_solist)); - fprintf_unfiltered (file, -@@ -1122,6 +1161,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) - fprintf_unfiltered (file, - "gdbarch_dump: write_pc = <%s>\n", - host_address_to_string (gdbarch->write_pc)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: xml_syscall_filename = %s\n", -+ gdbarch->xml_syscall_filename); - if (gdbarch->dump_tdep != NULL) - gdbarch->dump_tdep (gdbarch, file); - } -@@ -3333,6 +3375,119 @@ set_gdbarch_record_special_symbol (struct gdbarch *gdbarch, + /* Don't try to read from a dead thread. */ + if (is_exited (inferior_ptid)) + return 0; +@@ -1843,6 +1851,17 @@ get_frame_args_address (struct frame_info *fi) + return fi->base->this_args (fi, &fi->base_cache); } - int -+gdbarch_get_syscall_number_p (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ return gdbarch->get_syscall_number != NULL; -+} -+ -+LONGEST -+gdbarch_get_syscall_number (struct gdbarch *gdbarch, ptid_t ptid) -+{ -+ gdb_assert (gdbarch != NULL); -+ gdb_assert (gdbarch->get_syscall_number != NULL); -+ if (gdbarch_debug >= 2) -+ fprintf_unfiltered (gdb_stdlog, "gdbarch_get_syscall_number called\n"); -+ return gdbarch->get_syscall_number (gdbarch, ptid); -+} -+ -+void -+set_gdbarch_get_syscall_number (struct gdbarch *gdbarch, -+ gdbarch_get_syscall_number_ftype get_syscall_number) -+{ -+ gdbarch->get_syscall_number = get_syscall_number; -+} ++/* Return true if the frame base for frame FI is BASE; false ++ otherwise. */ + +int -+gdbarch_get_syscall_by_number_p (struct gdbarch *gdbarch) ++frame_base_is (struct frame_info *fi, const struct frame_base *base) +{ -+ gdb_assert (gdbarch != NULL); -+ return gdbarch->get_syscall_by_number != NULL; ++ if (fi->base == NULL) ++ fi->base = frame_base_find_by_frame (fi); ++ return fi->base == base; +} + -+void -+gdbarch_get_syscall_by_number (struct gdbarch *gdbarch, int syscall_number, struct syscall *s) -+{ -+ gdb_assert (gdbarch != NULL); -+ gdb_assert (gdbarch->get_syscall_by_number != NULL); -+ if (gdbarch_debug >= 2) -+ fprintf_unfiltered (gdb_stdlog, "gdbarch_get_syscall_by_number called\n"); -+ gdbarch->get_syscall_by_number (gdbarch, syscall_number, s); -+} -+ -+void -+set_gdbarch_get_syscall_by_number (struct gdbarch *gdbarch, -+ gdbarch_get_syscall_by_number_ftype get_syscall_by_number) -+{ -+ gdbarch->get_syscall_by_number = get_syscall_by_number; -+} -+ -+int -+gdbarch_get_syscall_by_name_p (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ return gdbarch->get_syscall_by_name != NULL; -+} -+ -+void -+gdbarch_get_syscall_by_name (struct gdbarch *gdbarch, const char *syscall_name, struct syscall *s) -+{ -+ gdb_assert (gdbarch != NULL); -+ gdb_assert (gdbarch->get_syscall_by_name != NULL); -+ if (gdbarch_debug >= 2) -+ fprintf_unfiltered (gdb_stdlog, "gdbarch_get_syscall_by_name called\n"); -+ gdbarch->get_syscall_by_name (gdbarch, syscall_name, s); -+} -+ -+void -+set_gdbarch_get_syscall_by_name (struct gdbarch *gdbarch, -+ gdbarch_get_syscall_by_name_ftype get_syscall_by_name) -+{ -+ gdbarch->get_syscall_by_name = get_syscall_by_name; -+} -+ -+int -+gdbarch_get_syscall_names_p (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ return gdbarch->get_syscall_names != NULL; -+} -+ -+const char ** -+gdbarch_get_syscall_names (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ gdb_assert (gdbarch->get_syscall_names != NULL); -+ if (gdbarch_debug >= 2) -+ fprintf_unfiltered (gdb_stdlog, "gdbarch_get_syscall_names called\n"); -+ return gdbarch->get_syscall_names (gdbarch); -+} -+ -+void -+set_gdbarch_get_syscall_names (struct gdbarch *gdbarch, -+ gdbarch_get_syscall_names_ftype get_syscall_names) -+{ -+ gdbarch->get_syscall_names = get_syscall_names; -+} -+ -+const char * -+gdbarch_xml_syscall_filename (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ /* Skip verify of xml_syscall_filename, invalid_p == 0 */ -+ if (gdbarch_debug >= 2) -+ fprintf_unfiltered (gdb_stdlog, "gdbarch_xml_syscall_filename called\n"); -+ return gdbarch->xml_syscall_filename; -+} -+ -+void -+set_gdbarch_xml_syscall_filename (struct gdbarch *gdbarch, -+ const char * xml_syscall_filename) -+{ -+ gdbarch->xml_syscall_filename = xml_syscall_filename; -+} -+ -+int - gdbarch_has_global_solist (struct gdbarch *gdbarch) - { - gdb_assert (gdbarch != NULL); -diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h -index 04c8920..017b9df 100644 ---- a/gdb/gdbarch.h -+++ b/gdb/gdbarch.h -@@ -52,6 +52,7 @@ struct bp_target_info; - struct target_desc; - struct displaced_step_closure; - struct core_regset_section; -+struct syscall; + /* Level of the selected frame: 0 for innermost, 1 for its caller, ... + or -1 for a NULL frame. */ - extern struct gdbarch *current_gdbarch; - extern struct gdbarch *target_gdbarch; -@@ -839,6 +840,47 @@ typedef void (gdbarch_record_special_symbol_ftype) (struct gdbarch *gdbarch, str - extern void gdbarch_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile, asymbol *sym); - extern void set_gdbarch_record_special_symbol (struct gdbarch *gdbarch, gdbarch_record_special_symbol_ftype *record_special_symbol); +diff --git a/gdb/frame.h b/gdb/frame.h +index febef5c..09bf628 100644 +--- a/gdb/frame.h ++++ b/gdb/frame.h +@@ -696,4 +696,9 @@ extern struct frame_info *deprecated_safe_get_selected_frame (void); -+/* Functions for the 'catch syscall' feature. -+ Get architecture-specific system calls information from registers. */ -+ -+extern int gdbarch_get_syscall_number_p (struct gdbarch *gdbarch); -+ -+typedef LONGEST (gdbarch_get_syscall_number_ftype) (struct gdbarch *gdbarch, ptid_t ptid); -+extern LONGEST gdbarch_get_syscall_number (struct gdbarch *gdbarch, ptid_t ptid); -+extern void set_gdbarch_get_syscall_number (struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype *get_syscall_number); -+ -+/* Fills the struct syscall (passed as argument) with the corresponding -+ system call represented by syscall_number. */ -+ -+extern int gdbarch_get_syscall_by_number_p (struct gdbarch *gdbarch); -+ -+typedef void (gdbarch_get_syscall_by_number_ftype) (struct gdbarch *gdbarch, int syscall_number, struct syscall *s); -+extern void gdbarch_get_syscall_by_number (struct gdbarch *gdbarch, int syscall_number, struct syscall *s); -+extern void set_gdbarch_get_syscall_by_number (struct gdbarch *gdbarch, gdbarch_get_syscall_by_number_ftype *get_syscall_by_number); -+ -+/* Fills the struct syscall (passed as argument) with the corresponding -+ system call represented by syscall_name. */ -+ -+extern int gdbarch_get_syscall_by_name_p (struct gdbarch *gdbarch); -+ -+typedef void (gdbarch_get_syscall_by_name_ftype) (struct gdbarch *gdbarch, const char *syscall_name, struct syscall *s); -+extern void gdbarch_get_syscall_by_name (struct gdbarch *gdbarch, const char *syscall_name, struct syscall *s); -+extern void set_gdbarch_get_syscall_by_name (struct gdbarch *gdbarch, gdbarch_get_syscall_by_name_ftype *get_syscall_by_name); -+ -+/* Returns the array containing the syscall names for the architecture. */ -+ -+extern int gdbarch_get_syscall_names_p (struct gdbarch *gdbarch); -+ -+typedef const char ** (gdbarch_get_syscall_names_ftype) (struct gdbarch *gdbarch); -+extern const char ** gdbarch_get_syscall_names (struct gdbarch *gdbarch); -+extern void set_gdbarch_get_syscall_names (struct gdbarch *gdbarch, gdbarch_get_syscall_names_ftype *get_syscall_names); -+ -+/* Stores the name of syscall's XML file. Contains NULL if the file -+ was not set. */ -+ -+extern const char * gdbarch_xml_syscall_filename (struct gdbarch *gdbarch); -+extern void set_gdbarch_xml_syscall_filename (struct gdbarch *gdbarch, const char * xml_syscall_filename); -+ - /* True if the list of shared libraries is one and only for all - processes, as opposed to a list of shared libraries per inferior. - When this property is true, GDB assumes that since shared libraries -@@ -848,6 +890,9 @@ extern void set_gdbarch_record_special_symbol (struct gdbarch *gdbarch, gdbarch_ - extern int gdbarch_has_global_solist (struct gdbarch *gdbarch); - extern void set_gdbarch_has_global_solist (struct gdbarch *gdbarch, int has_global_solist); + extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc); -+/* Definition for an unknown syscall, used basically in error-cases. */ -+#define UNKNOWN_SYSCALL (-1) ++/* Return true if the frame base for frame FI is BASE; false ++ otherwise. */ + - extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch); - - -diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh -index f93bfc1..66cbcd0 100755 ---- a/gdb/gdbarch.sh -+++ b/gdb/gdbarch.sh -@@ -724,6 +724,26 @@ M:struct type *:get_siginfo_type:void: - # Record architecture-specific information from the symbol table. - M:void:record_special_symbol:struct objfile *objfile, asymbol *sym:objfile, sym - -+# Functions for the 'catch syscall' feature. ++extern int frame_base_is (struct frame_info *fi, const struct frame_base *base); + -+# Get architecture-specific system calls information from registers. -+M:LONGEST:get_syscall_number:ptid_t ptid:ptid -+ -+# Fills the struct syscall (passed as argument) with the corresponding -+# system call represented by syscall_number. -+M:void:get_syscall_by_number:int syscall_number, struct syscall *s:syscall_number, s -+ -+# Fills the struct syscall (passed as argument) with the corresponding -+# system call represented by syscall_name. -+M:void:get_syscall_by_name:const char *syscall_name, struct syscall *s:syscall_name, s -+ -+# Returns the array containing the syscall names for the architecture. -+M:const char **:get_syscall_names:void: -+ -+# Stores the name of syscall's XML file. Contains NULL if the file -+# was not set. -+v:const char *:xml_syscall_filename:::0:0::0:gdbarch->xml_syscall_filename -+ - # True if the list of shared libraries is one and only for all - # processes, as opposed to a list of shared libraries per inferior. - # When this property is true, GDB assumes that since shared libraries -@@ -842,6 +862,7 @@ struct bp_target_info; - struct target_desc; - struct displaced_step_closure; - struct core_regset_section; -+struct syscall; - - extern struct gdbarch *current_gdbarch; - extern struct gdbarch *target_gdbarch; -@@ -911,6 +932,9 @@ done - # close it off - cat <. */ ++ ++#include "server.h" ++#include "linux-low.h" ++#include "i387-fp.h" ++ ++#include "gdb_proc_service.h" ++ ++#include ++ ++#ifdef HAVE_SYS_REG_H ++#include ++#endif ++ ++#ifndef PTRACE_GET_THREAD_AREA ++#define PTRACE_GET_THREAD_AREA 25 ++#endif ++ ++/* Defined in auto-generated file reg-i386-linux.c. */ ++void init_registers_i386_linux (void); ++ ++ ++/* This module only supports access to the general purpose registers. */ ++ ++#define i386_num_regs 16 ++ ++/* This stuff comes from i386-linux-nat.c. */ ++ ++/* Mapping between the general-purpose registers in `struct user' ++ format and GDB's register array layout. */ ++static int i386_regmap[] = ++{ ++ EAX * 4, ECX * 4, EDX * 4, EBX * 4, ++ UESP * 4, EBP * 4, ESI * 4, EDI * 4, ++ EIP * 4, EFL * 4, CS * 4, SS * 4, ++ DS * 4, ES * 4, FS * 4, GS * 4 ++}; ++ ++/* Called by libthread_db. */ ++ ++ps_err_e ++ps_get_thread_area (const struct ps_prochandle *ph, ++ lwpid_t lwpid, int idx, void **base) ++{ ++ unsigned int desc[4]; ++ ++ if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, ++ (void *) idx, (unsigned long) &desc) < 0) ++ return PS_ERR; ++ ++ *(int *)base = desc[1]; ++ return PS_OK; ++} ++ ++static int ++i386_cannot_store_register (int regno) ++{ ++ return (regno >= i386_num_regs); ++} ++ ++static int ++i386_cannot_fetch_register (int regno) ++{ ++ return (regno >= i386_num_regs); ++} ++ ++ ++#ifdef HAVE_PTRACE_GETREGS ++#include ++#include ++ ++static void ++i386_fill_gregset (void *buf) ++{ ++ int i; ++ ++ for (i = 0; i < i386_num_regs; i++) ++ collect_register (i, ((char *) buf) + i386_regmap[i]); ++ ++ collect_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4); ++} ++ ++static void ++i386_store_gregset (const void *buf) ++{ ++ int i; ++ ++ for (i = 0; i < i386_num_regs; i++) ++ supply_register (i, ((char *) buf) + i386_regmap[i]); ++ ++ supply_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4); ++} ++ ++static void ++i386_fill_fpregset (void *buf) ++{ ++ i387_cache_to_fsave (buf); ++} ++ ++static void ++i386_store_fpregset (const void *buf) ++{ ++ i387_fsave_to_cache (buf); ++} ++ ++static void ++i386_fill_fpxregset (void *buf) ++{ ++ i387_cache_to_fxsave (buf); ++} ++ ++static void ++i386_store_fpxregset (const void *buf) ++{ ++ i387_fxsave_to_cache (buf); ++} ++ ++#endif /* HAVE_PTRACE_GETREGS */ ++ ++struct regset_info target_regsets[] = { ++#ifdef HAVE_PTRACE_GETREGS ++ { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t), ++ GENERAL_REGS, ++ i386_fill_gregset, i386_store_gregset }, ++# ifdef HAVE_PTRACE_GETFPXREGS ++ { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, sizeof (elf_fpxregset_t), ++ EXTENDED_REGS, ++ i386_fill_fpxregset, i386_store_fpxregset }, ++# endif ++ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t), ++ FP_REGS, ++ i386_fill_fpregset, i386_store_fpregset }, ++#endif /* HAVE_PTRACE_GETREGS */ ++ { 0, 0, -1, -1, NULL, NULL } ++}; ++ ++static const unsigned char i386_breakpoint[] = { 0xCC }; ++#define i386_breakpoint_len 1 ++ ++extern int debug_threads; ++ ++static CORE_ADDR ++i386_get_pc () ++{ ++ unsigned long pc; ++ ++ collect_register_by_name ("eip", &pc); ++ ++ if (debug_threads) ++ fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc); ++ return pc; ++} ++ ++static void ++i386_set_pc (CORE_ADDR newpc) ++{ ++ if (debug_threads) ++ fprintf (stderr, "set pc to %08lx\n", (long) newpc); ++ supply_register_by_name ("eip", &newpc); ++} ++ ++static int ++i386_breakpoint_at (CORE_ADDR pc) ++{ ++ unsigned char c; ++ ++ read_inferior_memory (pc, &c, 1); ++ if (c == 0xCC) ++ return 1; ++ ++ return 0; ++} ++ ++struct linux_target_ops the_low_target = { ++ init_registers_i386_linux, ++ i386_num_regs, ++ i386_regmap, ++ i386_cannot_fetch_register, ++ i386_cannot_store_register, ++ i386_get_pc, ++ i386_set_pc, ++ i386_breakpoint, ++ i386_breakpoint_len, ++ NULL, ++ 1, ++ i386_breakpoint_at, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++}; +diff --git a/gdb/gdbserver/linux-x86-64-low.c b/gdb/gdbserver/linux-x86-64-low.c +new file mode 100644 +index 0000000..b8213f5 +--- /dev/null ++++ b/gdb/gdbserver/linux-x86-64-low.c +@@ -0,0 +1,184 @@ ++/* GNU/Linux/x86-64 specific low level interface, for the remote server ++ for GDB. ++ Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009 ++ Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#include "server.h" ++#include "linux-low.h" ++#include "i387-fp.h" ++ ++#include "gdb_proc_service.h" ++ ++/* Defined in auto-generated file reg-x86-64-linux.c. */ ++void init_registers_x86_64_linux (void); ++ ++#include ++#include ++#include ++ ++/* This definition comes from prctl.h, but some kernels may not have it. */ ++#ifndef PTRACE_ARCH_PRCTL ++#define PTRACE_ARCH_PRCTL 30 ++#endif ++ ++/* The following definitions come from prctl.h, but may be absent ++ for certain configurations. */ ++#ifndef ARCH_GET_FS ++#define ARCH_SET_GS 0x1001 ++#define ARCH_SET_FS 0x1002 ++#define ARCH_GET_FS 0x1003 ++#define ARCH_GET_GS 0x1004 ++#endif ++ ++static int x86_64_regmap[] = { ++ RAX * 8, RBX * 8, RCX * 8, RDX * 8, ++ RSI * 8, RDI * 8, RBP * 8, RSP * 8, ++ R8 * 8, R9 * 8, R10 * 8, R11 * 8, ++ R12 * 8, R13 * 8, R14 * 8, R15 * 8, ++ RIP * 8, EFLAGS * 8, CS * 8, SS * 8, ++ DS * 8, ES * 8, FS * 8, GS * 8, ++ -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, -1, ++ ORIG_RAX * 8 ++}; ++ ++#define X86_64_NUM_GREGS (sizeof(x86_64_regmap)/sizeof(int)) ++ ++/* Called by libthread_db. */ ++ ++ps_err_e ++ps_get_thread_area (const struct ps_prochandle *ph, ++ lwpid_t lwpid, int idx, void **base) ++{ ++ switch (idx) ++ { ++ case FS: ++ if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0) ++ return PS_OK; ++ break; ++ case GS: ++ if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0) ++ return PS_OK; ++ break; ++ default: ++ return PS_BADADDR; ++ } ++ return PS_ERR; ++} ++ ++static void ++x86_64_fill_gregset (void *buf) ++{ ++ int i; ++ ++ for (i = 0; i < X86_64_NUM_GREGS; i++) ++ if (x86_64_regmap[i] != -1) ++ collect_register (i, ((char *) buf) + x86_64_regmap[i]); ++} ++ ++static void ++x86_64_store_gregset (const void *buf) ++{ ++ int i; ++ ++ for (i = 0; i < X86_64_NUM_GREGS; i++) ++ if (x86_64_regmap[i] != -1) ++ supply_register (i, ((char *) buf) + x86_64_regmap[i]); ++} ++ ++static void ++x86_64_fill_fpregset (void *buf) ++{ ++ i387_cache_to_fxsave (buf); ++} ++ ++static void ++x86_64_store_fpregset (const void *buf) ++{ ++ i387_fxsave_to_cache (buf); ++} ++ ++struct regset_info target_regsets[] = { ++ { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t), ++ GENERAL_REGS, ++ x86_64_fill_gregset, x86_64_store_gregset }, ++ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t), ++ FP_REGS, ++ x86_64_fill_fpregset, x86_64_store_fpregset }, ++ { 0, 0, -1, -1, NULL, NULL } ++}; ++ ++static const unsigned char x86_64_breakpoint[] = { 0xCC }; ++#define x86_64_breakpoint_len 1 ++ ++extern int debug_threads; ++ ++static CORE_ADDR ++x86_64_get_pc () ++{ ++ unsigned long pc; ++ ++ collect_register_by_name ("rip", &pc); ++ ++ if (debug_threads) ++ fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc); ++ return pc; ++} ++ ++static void ++x86_64_set_pc (CORE_ADDR newpc) ++{ ++ if (debug_threads) ++ fprintf (stderr, "set pc to %08lx\n", (long) newpc); ++ supply_register_by_name ("rip", &newpc); ++} ++ ++static int ++x86_64_breakpoint_at (CORE_ADDR pc) ++{ ++ unsigned char c; ++ ++ read_inferior_memory (pc, &c, 1); ++ if (c == 0xCC) ++ return 1; ++ ++ return 0; ++} ++ ++struct linux_target_ops the_low_target = { ++ init_registers_x86_64_linux, ++ -1, ++ NULL, ++ NULL, ++ NULL, ++ x86_64_get_pc, ++ x86_64_set_pc, ++ x86_64_breakpoint, ++ x86_64_breakpoint_len, ++ NULL, ++ 1, ++ x86_64_breakpoint_at, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++ NULL, ++}; diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h -index 3a405a8..a2e2636 100644 +index 79d33fe..aecd820 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h -@@ -228,6 +228,9 @@ struct thread_info *find_thread_id (int num); +@@ -249,6 +249,9 @@ extern struct thread_info *any_thread_of_process (int pid); /* Change the ptid of thread OLD_PTID to NEW_PTID. */ void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid); @@ -20125,24 +8733,23 @@ index 3a405a8..a2e2636 100644 once for each known thread. */ typedef int (*thread_callback_func) (struct thread_info *, void *); diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c -index 8102321..9899727 100644 +index 2f77dca..09f15dc 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c -@@ -38,6 +38,8 @@ +@@ -38,6 +38,9 @@ #include "cp-abi.h" #include "gdb_assert.h" #include "hashtab.h" ++#include "observer.h" +#include "dwarf2expr.h" +#include "dwarf2loc.h" - /* These variables point to the objects - representing the predefined C data types. */ -@@ -146,6 +148,23 @@ static void print_bit_vector (B_TYPE *, int); - static void print_arg_types (struct field *, int, int); + + /* Floatformat pairs. */ +@@ -118,13 +121,31 @@ static void print_arg_types (struct field *, int, int); static void dump_fn_fieldlists (struct type *, int); static void print_cplus_stuff (struct type *, int); -+static void type_init_refc (struct type *new_type, struct type *parent_type); -+ + +/* A reference count structure for the type reference count map. Each + type in a hierarchy of types is mapped to the same reference + count. */ @@ -20156,13 +8763,15 @@ index 8102321..9899727 100644 + int *refc; +}; + -+/* The hash table holding all reference counts. */ -+static htab_t type_refc_table; ++/* The hash table holding all discardable `struct type *' references. */ ++static htab_t type_discardable_table; ++ ++/* Current type_discardable_check pass used for TYPE_DISCARDABLE_AGE. */ ++static int type_discardable_age_current; - - /* Alloc a new type structure and fill it with some defaults. If -@@ -154,23 +173,25 @@ static void print_cplus_stuff (struct type *, int); - structure by xmalloc () (for permanent types). */ + /* Allocate a new OBJFILE-associated type structure and fill it + with some defaults. Space for the type structure is allocated + on the objfile's objfile_obstack. */ struct type * -alloc_type (struct objfile *objfile) @@ -20170,153 +8779,74 @@ index 8102321..9899727 100644 { struct type *type; - /* Alloc the structure and start off with all fields zeroed. */ - -- if (objfile == NULL) -+ switch ((long) objfile) - { -+ case (long) OBJFILE_INTERNAL: -+ case (long) OBJFILE_MALLOC: - type = XZALLOC (struct type); - TYPE_MAIN_TYPE (type) = XZALLOC (struct main_type); -- } -- else -- { -+ break; -+ default: - type = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct type); - TYPE_MAIN_TYPE (type) = OBSTACK_ZALLOC (&objfile->objfile_obstack, - struct main_type); - OBJSTAT (objfile, n_types++); -+ break; - } - - /* Initialize the fields that might not be zero. */ -@@ -180,6 +201,9 @@ alloc_type (struct objfile *objfile) - TYPE_VPTR_FIELDNO (type) = -1; - TYPE_CHAIN (type) = type; /* Chain back to itself. */ - -+ if (objfile == NULL) -+ type_init_refc (type, parent); -+ - return (type); +@@ -148,6 +169,39 @@ alloc_type (struct objfile *objfile) + return type; } -@@ -194,16 +218,24 @@ alloc_type_instance (struct type *oldtype) - - /* Allocate the structure. */ - -- if (TYPE_OBJFILE (oldtype) == NULL) -- type = XZALLOC (struct type); -- else -- type = OBSTACK_ZALLOC (&TYPE_OBJFILE (oldtype)->objfile_obstack, -- struct type); -- -+ switch ((long) TYPE_OBJFILE (oldtype)) -+ { -+ case (long) OBJFILE_INTERNAL: -+ case (long) OBJFILE_MALLOC: -+ type = XZALLOC (struct type); -+ break; -+ default: -+ type = OBSTACK_ZALLOC (&TYPE_OBJFILE (oldtype)->objfile_obstack, -+ struct type); -+ break; -+ } - TYPE_MAIN_TYPE (type) = TYPE_MAIN_TYPE (oldtype); - - TYPE_CHAIN (type) = type; /* Chain back to itself for now. */ - -+ if (TYPE_OBJFILE (oldtype) == NULL) -+ type_init_refc (type, oldtype); ++/* Declare TYPE as discardable on next garbage collection by free_all_types. ++ You must call type_mark_used during each free_all_types to protect TYPE from ++ being deallocated. */ + - return (type); ++static void ++set_type_as_discardable (struct type *type) ++{ ++ void **slot; ++ ++ gdb_assert (!TYPE_DISCARDABLE (type)); ++ ++ TYPE_DISCARDABLE (type) = 1; ++ TYPE_DISCARDABLE_AGE (type) = type_discardable_age_current; ++ ++ slot = htab_find_slot (type_discardable_table, type, INSERT); ++ gdb_assert (!*slot); ++ *slot = type; ++} ++ ++/* Allocate a new type like alloc_type but preserve for it the discardability ++ state of PARENT_TYPE. */ ++ ++static struct type * ++alloc_type_as_parent (struct type *parent_type) ++{ ++ struct type *new_type = alloc_type_copy (parent_type); ++ ++ if (TYPE_DISCARDABLE (parent_type)) ++ set_type_as_discardable (new_type); ++ ++ return new_type; ++} ++ + /* Allocate a new GDBARCH-associated type structure and fill it + with some defaults. Space for the type structure is allocated + on the heap. */ +@@ -184,7 +238,7 @@ struct type * + alloc_type_copy (const struct type *type) + { + if (TYPE_OBJFILE_OWNED (type)) +- return alloc_type (TYPE_OWNER (type).objfile); ++ return alloc_type (TYPE_OWNER (type).objfile, (struct type *) type); + else + return alloc_type_arch (TYPE_OWNER (type).gdbarch); } - -@@ -248,7 +280,7 @@ make_pointer_type (struct type *type, struct type **typeptr) +@@ -273,7 +327,7 @@ make_pointer_type (struct type *type, struct type **typeptr) if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */ { -- ntype = alloc_type (TYPE_OBJFILE (type)); -+ ntype = alloc_type (TYPE_OBJFILE (type), type); +- ntype = alloc_type_copy (type); ++ ntype = alloc_type_as_parent (type); if (typeptr) *typeptr = ntype; } -@@ -260,6 +292,9 @@ make_pointer_type (struct type *type, struct type **typeptr) - smash_type (ntype); - TYPE_CHAIN (ntype) = chain; - TYPE_OBJFILE (ntype) = objfile; -+ -+ /* Callers may only supply storage if there is an objfile. */ -+ gdb_assert (objfile); - } - - TYPE_TARGET_TYPE (ntype) = type; -@@ -328,7 +363,7 @@ make_reference_type (struct type *type, struct type **typeptr) +@@ -350,7 +404,7 @@ make_reference_type (struct type *type, struct type **typeptr) if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */ { -- ntype = alloc_type (TYPE_OBJFILE (type)); -+ ntype = alloc_type (TYPE_OBJFILE (type), type); +- ntype = alloc_type_copy (type); ++ ntype = alloc_type_as_parent (type); if (typeptr) *typeptr = ntype; } -@@ -340,6 +375,9 @@ make_reference_type (struct type *type, struct type **typeptr) - smash_type (ntype); - TYPE_CHAIN (ntype) = chain; - TYPE_OBJFILE (ntype) = objfile; -+ -+ /* Callers may only supply storage if there is an objfile. */ -+ gdb_assert (objfile); - } - - TYPE_TARGET_TYPE (ntype) = type; -@@ -388,7 +426,7 @@ make_function_type (struct type *type, struct type **typeptr) - - if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */ - { -- ntype = alloc_type (TYPE_OBJFILE (type)); -+ ntype = alloc_type (TYPE_OBJFILE (type), type); - if (typeptr) - *typeptr = ntype; - } -@@ -398,6 +436,9 @@ make_function_type (struct type *type, struct type **typeptr) - objfile = TYPE_OBJFILE (ntype); - smash_type (ntype); - TYPE_OBJFILE (ntype) = objfile; -+ -+ /* Callers may only supply storage if there is an objfile. */ -+ gdb_assert (objfile); - } - - TYPE_TARGET_TYPE (ntype) = type; -@@ -643,7 +684,7 @@ lookup_memberptr_type (struct type *type, struct type *domain) - { - struct type *mtype; - -- mtype = alloc_type (TYPE_OBJFILE (type)); -+ mtype = alloc_type (TYPE_OBJFILE (type), NULL); - smash_to_memberptr_type (mtype, domain, type); - return (mtype); - } -@@ -655,7 +696,7 @@ lookup_methodptr_type (struct type *to_type) - { - struct type *mtype; - -- mtype = alloc_type (TYPE_OBJFILE (to_type)); -+ mtype = alloc_type (TYPE_OBJFILE (to_type), NULL); - TYPE_TARGET_TYPE (mtype) = to_type; - TYPE_DOMAIN_TYPE (mtype) = TYPE_DOMAIN_TYPE (to_type); - TYPE_LENGTH (mtype) = cplus_method_ptr_size (to_type); -@@ -696,19 +737,20 @@ create_range_type (struct type *result_type, struct type *index_type, - int low_bound, int high_bound) - { - if (result_type == NULL) -- result_type = alloc_type (TYPE_OBJFILE (index_type)); -+ result_type = alloc_type (TYPE_OBJFILE (index_type), index_type); - TYPE_CODE (result_type) = TYPE_CODE_RANGE; - TYPE_TARGET_TYPE (result_type) = index_type; - if (TYPE_STUB (index_type)) +@@ -721,12 +775,13 @@ create_range_type (struct type *result_type, struct type *index_type, TYPE_TARGET_STUB (result_type) = 1; else TYPE_LENGTH (result_type) = TYPE_LENGTH (check_typedef (index_type)); @@ -20331,19 +8861,8 @@ index 8102321..9899727 100644 if (low_bound >= 0) TYPE_UNSIGNED (result_type) = 1; -@@ -805,30 +847,56 @@ create_array_type (struct type *result_type, +@@ -826,26 +881,45 @@ create_array_type (struct type *result_type, - if (result_type == NULL) - { -- result_type = alloc_type (TYPE_OBJFILE (range_type)); -+ result_type = alloc_type (TYPE_OBJFILE (range_type), range_type); - } -+ else -+ { -+ /* Callers may only supply storage if there is an objfile. */ -+ gdb_assert (TYPE_OBJFILE (result_type)); -+ } -+ TYPE_CODE (result_type) = TYPE_CODE_ARRAY; TYPE_TARGET_TYPE (result_type) = element_type; - if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) @@ -20360,7 +8879,6 @@ index 8102321..9899727 100644 TYPE_NFIELDS (result_type) = 1; TYPE_FIELDS (result_type) = (struct field *) TYPE_ZALLOC (result_type, sizeof (struct field)); -+ /* FIXME: type alloc. */ TYPE_INDEX_TYPE (result_type) = range_type; TYPE_VPTR_FIELDNO (result_type) = -1; @@ -20400,23 +8918,9 @@ index 8102321..9899727 100644 + TYPE_TARGET_STUB (result_type) = 1; + } - return (result_type); + return result_type; } -@@ -865,7 +933,12 @@ create_set_type (struct type *result_type, struct type *domain_type) - { - if (result_type == NULL) - { -- result_type = alloc_type (TYPE_OBJFILE (domain_type)); -+ result_type = alloc_type (TYPE_OBJFILE (domain_type), domain_type); -+ } -+ else -+ { -+ /* Callers may only supply storage if there is an objfile. */ -+ gdb_assert (TYPE_OBJFILE (result_type)); - } - TYPE_CODE (result_type) = TYPE_CODE_SET; - TYPE_NFIELDS (result_type) = 1; -@@ -1368,6 +1441,84 @@ stub_noname_complaint (void) +@@ -1331,6 +1405,84 @@ stub_noname_complaint (void) complaint (&symfile_complaints, _("stub type has NULL name")); } @@ -20501,7 +9005,7 @@ index 8102321..9899727 100644 /* Added by Bryan Boreham, Kewill, Sun Sep 17 18:07:17 1989. If this is a stubbed struct (i.e. declared as struct foo *), see if -@@ -1384,7 +1535,8 @@ stub_noname_complaint (void) +@@ -1347,7 +1499,8 @@ stub_noname_complaint (void) /* Find the real type of TYPE. This function returns the real type, after removing all layers of typedefs and completing opaque or stub types. Completion changes the TYPE argument, but stripping of @@ -20511,16 +9015,7 @@ index 8102321..9899727 100644 struct type * check_typedef (struct type *type) -@@ -1420,7 +1572,7 @@ check_typedef (struct type *type) - if (sym) - TYPE_TARGET_TYPE (type) = SYMBOL_TYPE (sym); - else /* TYPE_CODE_UNDEF */ -- TYPE_TARGET_TYPE (type) = alloc_type (NULL); -+ TYPE_TARGET_TYPE (type) = alloc_type (NULL, NULL); - } - type = TYPE_TARGET_TYPE (type); - } -@@ -1494,34 +1646,37 @@ check_typedef (struct type *type) +@@ -1457,34 +1610,37 @@ check_typedef (struct type *type) } } @@ -20576,7 +9071,7 @@ index 8102321..9899727 100644 TYPE_TARGET_STUB (type) = 0; } else if (TYPE_CODE (type) == TYPE_CODE_RANGE) -@@ -1529,9 +1684,12 @@ check_typedef (struct type *type) +@@ -1492,9 +1648,12 @@ check_typedef (struct type *type) TYPE_LENGTH (type) = TYPE_LENGTH (target_type); TYPE_TARGET_STUB (type) = 0; } @@ -20589,7 +9084,7 @@ index 8102321..9899727 100644 return type; } -@@ -1753,7 +1911,7 @@ init_type (enum type_code code, int length, int flags, +@@ -1716,7 +1875,7 @@ init_type (enum type_code code, int length, int flags, { struct type *type; @@ -20598,41 +9093,7 @@ index 8102321..9899727 100644 TYPE_CODE (type) = code; TYPE_LENGTH (type) = length; -@@ -1783,15 +1941,24 @@ init_type (enum type_code code, int length, int flags, - if (flags & TYPE_FLAG_FIXED_INSTANCE) - TYPE_FIXED_INSTANCE (type) = 1; - -- if ((name != NULL) && (objfile != NULL)) -- { -- TYPE_NAME (type) = obsavestring (name, strlen (name), -- &objfile->objfile_obstack); -- } -- else -- { -- TYPE_NAME (type) = name; -- } -+ if (name) -+ switch ((long) objfile) -+ { -+ case (long) OBJFILE_INTERNAL: -+ TYPE_NAME (type) = name; -+ break; -+ case (long) OBJFILE_MALLOC: -+ TYPE_NAME (type) = xstrdup (name); -+ break; -+#if 0 /* OBJFILE_MALLOC duplication now. */ -+ case (long) NULL: -+ internal_error (__FILE__, __LINE__, -+ _("OBJFILE pointer NULL should be OBJFILE_* instead")); -+#endif -+ default: -+ TYPE_NAME (type) = obsavestring (name, strlen (name), -+ &objfile->objfile_obstack); -+ } - - /* C++ fancies. */ - -@@ -1803,6 +1970,10 @@ init_type (enum type_code code, int length, int flags, +@@ -1760,6 +1919,10 @@ init_type (enum type_code code, int length, int flags, { INIT_CPLUS_SPECIFIC (type); } @@ -20640,10 +9101,10 @@ index 8102321..9899727 100644 + if (!objfile) + type_incref (type); + - return (type); + return type; } -@@ -2916,33 +3087,47 @@ type_pair_eq (const void *item_lhs, const void *item_rhs) +@@ -2820,33 +2983,42 @@ type_pair_eq (const void *item_lhs, const void *item_rhs) } /* Allocate the hash table used by copy_type_recursive to walk @@ -20680,11 +9141,8 @@ index 8102321..9899727 100644 - OBJFILE. Return a new type allocated using malloc, a saved type if - we have already visited TYPE (using COPIED_TYPES), or TYPE if it is - not associated with OBJFILE. */ -+/* A helper for copy_type_recursive. This does all the work. -+ REPRESENTATIVE is a pointer to a type. This is used to register -+ newly-created types in the type_refc_table. Initially it pointer -+ to a NULL pointer, but it is filled in the first time a type is -+ copied. OBJFILE is used only for an assertion checking. */ ++/* A helper for copy_type_recursive. This does all the work. OBJFILE is used ++ only for an assertion checking. */ -struct type * -copy_type_recursive (struct objfile *objfile, @@ -20693,27 +9151,19 @@ index 8102321..9899727 100644 +static struct type * +copy_type_recursive_1 (struct objfile *objfile, + struct type *type, -+ htab_t copied_types, -+ struct type **representative) ++ htab_t copied_types) { struct type_pair *stored, pair; void **slot; struct type *new_type; -- if (TYPE_OBJFILE (type) == NULL) -+ if (TYPE_OBJFILE (type) == OBJFILE_INTERNAL -+ || (objfile == OBJFILE_MALLOC && !TYPE_DYNAMIC (type))) +- if (! TYPE_OBJFILE_OWNED (type)) ++ if (! TYPE_OBJFILE_OWNED (type) && !TYPE_DYNAMIC (type)) return type; /* This type shouldn't be pointing to any types in other objfiles; -@@ -2954,11 +3139,15 @@ copy_type_recursive (struct objfile *objfile, - if (*slot != NULL) - return ((struct type_pair *) *slot)->new; - -- new_type = alloc_type (NULL); -+ new_type = alloc_type (OBJFILE_MALLOC, *representative); -+ if (!*representative) -+ *representative = new_type; +@@ -2861,8 +3033,10 @@ copy_type_recursive (struct objfile *objfile, + new_type = alloc_type_arch (get_type_arch (type)); /* We must add the new type to the hash table immediately, in case - we encounter this type again during a recursive call below. */ @@ -20725,10 +9175,16 @@ index 8102321..9899727 100644 stored->old = type; stored->new = new_type; *slot = stored; -@@ -2968,6 +3157,13 @@ copy_type_recursive (struct objfile *objfile, - *TYPE_MAIN_TYPE (new_type) = *TYPE_MAIN_TYPE (type); - TYPE_OBJFILE (new_type) = NULL; +@@ -2873,6 +3047,19 @@ copy_type_recursive (struct objfile *objfile, + TYPE_OBJFILE_OWNED (new_type) = 0; + TYPE_OWNER (new_type).gdbarch = get_type_arch (type); ++ /* TYPE_MAIN_TYPE memory copy above rewrote the TYPE_DISCARDABLE flag so we ++ need to initialize it again. And even if TYPE was already discardable ++ NEW_TYPE so far is not registered in TYPE_DISCARDABLE_TABLE. */ ++ TYPE_DISCARDABLE (new_type) = 0; ++ set_type_as_discardable (new_type); ++ + /* Pre-clear the fields processed by delete_main_type. If DWARF block + evaluations below call error we would leave an unfreeable TYPE. */ + TYPE_TARGET_TYPE (new_type) = NULL; @@ -20739,7 +9195,7 @@ index 8102321..9899727 100644 if (TYPE_NAME (type)) TYPE_NAME (new_type) = xstrdup (TYPE_NAME (type)); if (TYPE_TAG_NAME (type)) -@@ -2976,12 +3172,45 @@ copy_type_recursive (struct objfile *objfile, +@@ -2881,12 +3068,45 @@ copy_type_recursive (struct objfile *objfile, TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); TYPE_LENGTH (new_type) = TYPE_LENGTH (type); @@ -20785,18 +9241,18 @@ index 8102321..9899727 100644 TYPE_FIELDS (new_type) = XCALLOC (nfields, struct field); for (i = 0; i < nfields; i++) { -@@ -2990,8 +3219,8 @@ copy_type_recursive (struct objfile *objfile, +@@ -2895,8 +3115,8 @@ copy_type_recursive (struct objfile *objfile, TYPE_FIELD_BITSIZE (new_type, i) = TYPE_FIELD_BITSIZE (type, i); if (TYPE_FIELD_TYPE (type, i)) TYPE_FIELD_TYPE (new_type, i) - = copy_type_recursive (objfile, TYPE_FIELD_TYPE (type, i), - copied_types); + = copy_type_recursive_1 (objfile, TYPE_FIELD_TYPE (type, i), -+ copied_types, representative); ++ copied_types); if (TYPE_FIELD_NAME (type, i)) TYPE_FIELD_NAME (new_type, i) = xstrdup (TYPE_FIELD_NAME (type, i)); -@@ -3010,6 +3239,16 @@ copy_type_recursive (struct objfile *objfile, +@@ -2915,6 +3135,16 @@ copy_type_recursive (struct objfile *objfile, xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type, i))); break; @@ -20813,7 +9269,7 @@ index 8102321..9899727 100644 default: internal_error (__FILE__, __LINE__, _("Unexpected type field location kind: %d"), -@@ -3018,17 +3257,32 @@ copy_type_recursive (struct objfile *objfile, +@@ -2923,17 +3153,30 @@ copy_type_recursive (struct objfile *objfile, } } @@ -20838,8 +9294,7 @@ index 8102321..9899727 100644 - copied_types); + copy_type_recursive_1 (objfile, + TYPE_TARGET_TYPE (type), -+ copied_types, -+ representative); ++ copied_types); if (TYPE_VPTR_BASETYPE (type)) TYPE_VPTR_BASETYPE (new_type) = - copy_type_recursive (objfile, @@ -20847,12 +9302,11 @@ index 8102321..9899727 100644 - copied_types); + copy_type_recursive_1 (objfile, + TYPE_VPTR_BASETYPE (type), -+ copied_types, -+ representative); ++ copied_types); /* Maybe copy the type_specific bits. NOTE drow/2005-12-09: We do not copy the C++-specific bits like -@@ -3046,6 +3300,20 @@ copy_type_recursive (struct objfile *objfile, +@@ -2951,6 +3194,17 @@ copy_type_recursive (struct objfile *objfile, return new_type; } @@ -20864,44 +9318,76 @@ index 8102321..9899727 100644 +copy_type_recursive (struct type *type, + htab_t copied_types) +{ -+ struct type *representative = NULL; -+ -+ return copy_type_recursive_1 (TYPE_OBJFILE (type), type, copied_types, -+ &representative); ++ return copy_type_recursive_1 (TYPE_OBJFILE (type), type, copied_types); +} + /* Make a copy of the given TYPE, except that the pointer & reference types are not preserved. -@@ -3059,7 +3327,7 @@ copy_type (const struct type *type) - - gdb_assert (TYPE_OBJFILE (type) != NULL); - -- new_type = alloc_type (TYPE_OBJFILE (type)); -+ new_type = alloc_type (TYPE_OBJFILE (type), NULL); - TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); - TYPE_LENGTH (new_type) = TYPE_LENGTH (type); - memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type), -@@ -3068,6 +3336,232 @@ copy_type (const struct type *type) +@@ -2973,6 +3227,219 @@ copy_type (const struct type *type) return new_type; } -+static void delete_type (struct type *type); ++/* Callback type for main_type_crawl. */ ++typedef int (*main_type_crawl_iter) (struct type *type, void *data); ++ ++/* Iterate all main_type structures reachable through any `struct type *' from ++ TYPE. ITER will be called only for one type of each main_type, use ++ TYPE_CHAIN traversal to find all the type instances. ITER is being called ++ for each main_type found. ITER returns non-zero if main_type_crawl should ++ depth-first enter the specific type. ITER must provide some detection for ++ reentering the same main_type as this function would otherwise endlessly ++ loop. */ ++ ++static void ++main_type_crawl (struct type *type, main_type_crawl_iter iter, void *data) ++{ ++ struct type *type_iter; ++ int i; ++ ++ if (!type) ++ return; ++ ++ gdb_assert (TYPE_OBJFILE (type) == NULL); ++ ++ /* `struct cplus_struct_type' handling is unsupported by this function. */ ++ gdb_assert ((TYPE_CODE (type) != TYPE_CODE_STRUCT ++ && TYPE_CODE (type) != TYPE_CODE_UNION) ++ || !HAVE_CPLUS_STRUCT (type) || !TYPE_CPLUS_SPECIFIC (type)); ++ ++ if (!(*iter) (type, data)) ++ return; ++ ++ /* Iterate all the type instances of this main_type. */ ++ type_iter = type; ++ do ++ { ++ gdb_assert (TYPE_MAIN_TYPE (type_iter) == TYPE_MAIN_TYPE (type)); ++ ++ main_type_crawl (TYPE_POINTER_TYPE (type), iter, data); ++ main_type_crawl (TYPE_REFERENCE_TYPE (type), iter, data); ++ ++ type_iter = TYPE_CHAIN (type_iter); ++ } ++ while (type_iter != type); ++ ++ for (i = 0; i < TYPE_NFIELDS (type); i++) ++ main_type_crawl (TYPE_FIELD_TYPE (type, i), iter, data); ++ ++ main_type_crawl (TYPE_TARGET_TYPE (type), iter, data); ++ main_type_crawl (TYPE_VPTR_BASETYPE (type), iter, data); ++} + +/* A helper for delete_type which deletes a main_type and the things to which + it refers. TYPE is a type whose main_type we wish to destroy. */ + +static void -+delete_main_type (struct main_type *main_type) ++delete_main_type (struct type *type) +{ + int i; -+ void **slot; -+ struct -+ { -+ struct main_type *main_type; -+ } type_local = { main_type }, *type = &type_local; + -+ gdb_assert (TYPE_OBJFILE (type) == OBJFILE_MALLOC); ++ gdb_assert (TYPE_DISCARDABLE (type)); ++ gdb_assert (TYPE_OBJFILE (type) == NULL); + + xfree (TYPE_NAME (type)); + xfree (TYPE_TAG_NAME (type)); @@ -20915,457 +9401,166 @@ index 8102321..9899727 100644 + } + xfree (TYPE_FIELDS (type)); + -+ /* Strangely, HAVE_CPLUS_STRUCT will return true when there isn't -+ one at all. */ -+ gdb_assert (!HAVE_CPLUS_STRUCT (type) || !TYPE_CPLUS_SPECIFIC (type)); ++ /* `struct cplus_struct_type' handling is unsupported by this function. */ ++ gdb_assert ((TYPE_CODE (type) != TYPE_CODE_STRUCT ++ && TYPE_CODE (type) != TYPE_CODE_UNION) ++ || !HAVE_CPLUS_STRUCT (type) || !TYPE_CPLUS_SPECIFIC (type)); + + xfree (TYPE_MAIN_TYPE (type)); +} + -+/* Store `struct main_type *' entries which got `struct type *' deleted. */ -+ -+static htab_t deleted_main_types_hash; -+ -+/* To be called before any call of delete_type. */ ++/* Delete all the instances on TYPE_CHAIN of TYPE, including their referenced ++ main_type. TYPE must be a reclaimable type - neither permanent nor objfile ++ associated. */ + +static void -+delete_type_begin (void) ++delete_type_chain (struct type *type) +{ -+ gdb_assert (deleted_main_types_hash == NULL); ++ struct type *type_iter, *type_iter_to_free; + -+ deleted_main_types_hash = htab_create_alloc (10, htab_hash_pointer, -+ htab_eq_pointer, NULL, xcalloc, xfree); ++ gdb_assert (TYPE_DISCARDABLE (type)); ++ gdb_assert (TYPE_OBJFILE (type) == NULL); ++ ++ delete_main_type (type); ++ ++ type_iter = type; ++ do ++ { ++ type_iter_to_free = type_iter; ++ type_iter = TYPE_CHAIN (type_iter); ++ xfree (type_iter_to_free); ++ } ++ while (type_iter != type); +} + -+/* Helper for delete_type_finish. */ -+ -+static int -+delete_type_finish_traverse (void **slot, void *unused) -+{ -+ struct main_type *main_type = *slot; -+ -+ delete_main_type (main_type); -+ -+ return 1; -+} -+ -+/* To be called after all the calls of delete_type. Each MAIN_TYPE must have -+ either none or all of its TYPE entries deleted. */ -+ -+static void -+delete_type_finish (void) -+{ -+ htab_traverse (deleted_main_types_hash, delete_type_finish_traverse, NULL); -+ -+ htab_delete (deleted_main_types_hash); -+ deleted_main_types_hash = NULL; -+} -+ -+/* Delete TYPE and remember MAIN_TYPE it references. TYPE must have been -+ allocated using xmalloc -- not using an objfile. You must wrap calls of -+ this function by delete_type_begin and delete_type_finish. */ -+ -+static void -+delete_type (struct type *type) -+{ -+ void **slot; -+ -+ if (!type) -+ return; -+ -+ if (TYPE_OBJFILE (type) == OBJFILE_INTERNAL) -+ return; -+ gdb_assert (TYPE_OBJFILE (type) == OBJFILE_MALLOC); -+ -+ slot = htab_find_slot (deleted_main_types_hash, TYPE_MAIN_TYPE (type), -+ INSERT); -+ gdb_assert (!*slot); -+ *slot = TYPE_MAIN_TYPE (type); -+ -+ xfree (type); -+} -+ -+/* Hash function for type_refc_table. */ ++/* Hash function for type_discardable_table. */ + +static hashval_t -+type_refc_hash (const void *p) ++type_discardable_hash (const void *p) +{ -+ const struct type_refc_entry *entry = p; -+ return htab_hash_pointer (entry->type); ++ const struct type *type = p; ++ ++ return htab_hash_pointer (TYPE_MAIN_TYPE (type)); +} + -+/* Equality function for type_refc_table. */ ++/* Equality function for type_discardable_table. */ + +static int -+type_refc_equal (const void *a, const void *b) ++type_discardable_equal (const void *a, const void *b) +{ -+ const struct type_refc_entry *left = a; -+ const struct type_refc_entry *right = b; -+ return left->type == right->type; ++ const struct type *left = a; ++ const struct type *right = b; ++ ++ return TYPE_MAIN_TYPE (left) == TYPE_MAIN_TYPE (right); +} + -+/* Insert the new type NEW_TYPE into the table. Does nothing if -+ NEW_TYPE has an objfile. If PARENT_TYPE is not NULL, then NEW_TYPE -+ will be inserted into the same hierarchy as PARENT_TYPE. In this -+ case, PARENT_TYPE must already exist in the reference count map. -+ If PARENT_TYPE is NULL, a new reference count is allocated and set -+ to one. */ ++/* A helper for type_mark_used. */ + -+static void -+type_init_refc (struct type *new_type, struct type *parent_type) ++static int ++type_mark_used_crawl (struct type *type, void *unused) +{ -+ int *refc; -+ void **slot; -+ struct type_refc_entry *new_entry; ++ if (!TYPE_DISCARDABLE (type)) ++ return 0; + -+ if (TYPE_OBJFILE (new_type)) -+ return; ++ if (TYPE_DISCARDABLE_AGE (type) == type_discardable_age_current) ++ return 0; + -+ if (parent_type) -+ { -+ struct type_refc_entry entry, *found; -+ entry.type = parent_type; -+ found = htab_find (type_refc_table, &entry); -+ gdb_assert (found); -+ refc = found->refc; -+ } -+ else -+ { -+ refc = xmalloc (sizeof (int)); -+ *refc = 0; -+ } ++ TYPE_DISCARDABLE_AGE (type) = type_discardable_age_current; + -+ new_entry = XNEW (struct type_refc_entry); -+ new_entry->type = new_type; -+ new_entry->refc = refc; -+ -+ slot = htab_find_slot (type_refc_table, new_entry, INSERT); -+ gdb_assert (!*slot); -+ *slot = new_entry; ++ /* Continue the traversal. */ ++ return 1; +} + -+/* Increment the reference count for TYPE. */ ++/* Mark TYPE and its connected types as used in this free_all_types pass. */ + +void -+type_incref (struct type *type) ++type_mark_used (struct type *type) +{ -+ struct type_refc_entry entry, *found; -+ -+ if (TYPE_OBJFILE (type)) ++ if (type == NULL) + return; + -+ entry.type = type; -+ found = htab_find (type_refc_table, &entry); -+ gdb_assert (found); -+ ++*(found->refc); ++ if (!TYPE_DISCARDABLE (type)) ++ return; ++ ++ main_type_crawl (type, type_mark_used_crawl, NULL); +} + -+/* A traverse callback for type_refc_table which removes any entry -+ whose reference count is zero (unused entry). */ ++/* A traverse callback for type_discardable_table which removes any ++ type_discardable whose reference count is now zero (unused link). */ + +static int -+type_refc_remove (void **slot, void *unused) ++type_discardable_remove (void **slot, void *unused) +{ -+ struct type_refc_entry *entry = *slot; ++ struct type *type = *slot; + -+ if (*entry->refc == 0) ++ gdb_assert (TYPE_DISCARDABLE (type)); ++ ++ if (TYPE_DISCARDABLE_AGE (type) != type_discardable_age_current) + { -+ delete_type (entry->type); ++ delete_type_chain (type); + -+ xfree (entry); -+ htab_clear_slot (type_refc_table, slot); ++ htab_clear_slot (type_discardable_table, slot); + } + + return 1; +} + -+/* Decrement the reference count for TYPE. Even if TYPE has no more -+ references still do not delete it as callers may hold pointers to types -+ dynamically generated by check_typedef where type_incref is never called. -+ Always rely on the free_all_types garbage collector. */ ++/* Free all the reclaimable types that have been allocated and that have ++ currently zero reference counter. + -+void -+type_decref (struct type *type) -+{ -+ struct type_refc_entry entry, *found; -+ -+ if (TYPE_OBJFILE (type)) -+ return; -+ -+ entry.type = type; -+ found = htab_find (type_refc_table, &entry); -+ gdb_assert (found); -+ gdb_assert (found->refc > 0); -+ --*(found->refc); -+} -+ -+/* Free all the types that have been allocated and that are not used according -+ to type_refc_entry->refc. Called after each command, successful or not. -+ Use this cleanup only in the GDB idle state as GDB code does not necessarily -+ use type_incref / type_decref during temporary use of types. */ ++ This function is called after each command, successful or not. Use this ++ cleanup only in the GDB idle state as GDB only marks those types used by ++ globally tracked objects (with no autovariable references tracking). */ + +void +free_all_types (void) +{ -+ delete_type_begin (); -+ htab_traverse (type_refc_table, type_refc_remove, NULL); -+ delete_type_finish (); ++ /* Mark a new pass. As GDB checks all the entries were visited after each ++ pass there cannot be any stale entries already containing the changed ++ value. */ ++ type_discardable_age_current ^= 1; ++ ++ observer_notify_mark_used (); ++ ++ htab_traverse (type_discardable_table, type_discardable_remove, NULL); +} + - static struct type * - build_flt (int bit, char *name, const struct floatformat **floatformats) - { -@@ -3105,7 +3599,7 @@ build_complex (int bit, char *name, struct type *target_type) - return builtin_type_error; - } - t = init_type (TYPE_CODE_COMPLEX, 2 * bit / TARGET_CHAR_BIT, -- 0, name, (struct objfile *) NULL); -+ 0, name, OBJFILE_INTERNAL); - TYPE_TARGET_TYPE (t) = target_type; - return t; - } -@@ -3119,56 +3613,56 @@ gdbtypes_post_init (struct gdbarch *gdbarch) - builtin_type->builtin_void = - init_type (TYPE_CODE_VOID, 1, - 0, -- "void", (struct objfile *) NULL); -+ "void", OBJFILE_INTERNAL); - builtin_type->builtin_char = - init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - (TYPE_FLAG_NOSIGN - | (gdbarch_char_signed (gdbarch) ? 0 : TYPE_FLAG_UNSIGNED)), -- "char", (struct objfile *) NULL); -+ "char", OBJFILE_INTERNAL); - builtin_type->builtin_signed_char = - init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - 0, -- "signed char", (struct objfile *) NULL); -+ "signed char", OBJFILE_INTERNAL); - builtin_type->builtin_unsigned_char = - init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, -- "unsigned char", (struct objfile *) NULL); -+ "unsigned char", OBJFILE_INTERNAL); - builtin_type->builtin_short = - init_type (TYPE_CODE_INT, - gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT, -- 0, "short", (struct objfile *) NULL); -+ 0, "short", OBJFILE_INTERNAL); - builtin_type->builtin_unsigned_short = - init_type (TYPE_CODE_INT, - gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, "unsigned short", -- (struct objfile *) NULL); -+ OBJFILE_INTERNAL); - builtin_type->builtin_int = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, -- 0, "int", (struct objfile *) NULL); -+ 0, "int", OBJFILE_INTERNAL); - builtin_type->builtin_unsigned_int = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, "unsigned int", -- (struct objfile *) NULL); -+ OBJFILE_INTERNAL); - builtin_type->builtin_long = - init_type (TYPE_CODE_INT, - gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT, -- 0, "long", (struct objfile *) NULL); -+ 0, "long", OBJFILE_INTERNAL); - builtin_type->builtin_unsigned_long = - init_type (TYPE_CODE_INT, - gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, "unsigned long", -- (struct objfile *) NULL); -+ OBJFILE_INTERNAL); - builtin_type->builtin_long_long = - init_type (TYPE_CODE_INT, - gdbarch_long_long_bit (gdbarch) / TARGET_CHAR_BIT, -- 0, "long long", (struct objfile *) NULL); -+ 0, "long long", OBJFILE_INTERNAL); - builtin_type->builtin_unsigned_long_long = - init_type (TYPE_CODE_INT, - gdbarch_long_long_bit (gdbarch) / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, "unsigned long long", -- (struct objfile *) NULL); -+ OBJFILE_INTERNAL); - builtin_type->builtin_float - = build_flt (gdbarch_float_bit (gdbarch), "float", - gdbarch_float_format (gdbarch)); -@@ -3187,26 +3681,26 @@ gdbtypes_post_init (struct gdbarch *gdbarch) - builtin_type->builtin_string = - init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - 0, -- "string", (struct objfile *) NULL); -+ "string", OBJFILE_INTERNAL); - builtin_type->builtin_bool = - init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - 0, -- "bool", (struct objfile *) NULL); -+ "bool", OBJFILE_INTERNAL); ++/* Increment the reference count for TYPE. */ ++/* We'll be replacing this with type GC soon. */ ++ ++void ++type_incref (struct type *type) ++{ ++} ++ ++/* Decrement the reference count for TYPE. If TYPE has no more ++ references, delete it. */ ++/* We'll be replacing this with type GC soon. */ ++ ++void ++type_decref (struct type *type) ++{ ++} - /* The following three are about decimal floating point types, which - are 32-bits, 64-bits and 128-bits respectively. */ - builtin_type->builtin_decfloat - = init_type (TYPE_CODE_DECFLOAT, 32 / 8, - 0, -- "_Decimal32", (struct objfile *) NULL); -+ "_Decimal32", OBJFILE_INTERNAL); - builtin_type->builtin_decdouble - = init_type (TYPE_CODE_DECFLOAT, 64 / 8, - 0, -- "_Decimal64", (struct objfile *) NULL); -+ "_Decimal64", OBJFILE_INTERNAL); - builtin_type->builtin_declong - = init_type (TYPE_CODE_DECFLOAT, 128 / 8, - 0, -- "_Decimal128", (struct objfile *) NULL); -+ "_Decimal128", OBJFILE_INTERNAL); + /* Helper functions to initialize architecture-specific types. */ - /* Pointer/Address types. */ - -@@ -3245,27 +3739,28 @@ gdbtypes_post_init (struct gdbarch *gdbarch) - init_type (TYPE_CODE_INT, - gdbarch_addr_bit (gdbarch) / 8, - TYPE_FLAG_UNSIGNED, -- "__CORE_ADDR", (struct objfile *) NULL); -+ "__CORE_ADDR", OBJFILE_INTERNAL); - - - /* The following set of types is used for symbols with no - debug information. */ - builtin_type->nodebug_text_symbol = - init_type (TYPE_CODE_FUNC, 1, 0, -- "", NULL); -+ "", OBJFILE_INTERNAL); - TYPE_TARGET_TYPE (builtin_type->nodebug_text_symbol) = - builtin_type->builtin_int; - builtin_type->nodebug_data_symbol = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0, -- "", NULL); -+ "", OBJFILE_INTERNAL); - builtin_type->nodebug_unknown_symbol = - init_type (TYPE_CODE_INT, 1, 0, -- "", NULL); -+ "", -+ OBJFILE_INTERNAL); - builtin_type->nodebug_tls_symbol = - init_type (TYPE_CODE_INT, - gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0, -- "", NULL); -+ "", OBJFILE_INTERNAL); - - return builtin_type; - } -@@ -3276,6 +3771,9 @@ _initialize_gdbtypes (void) +@@ -3463,6 +3930,11 @@ void + _initialize_gdbtypes (void) { gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init); - -+ type_refc_table = htab_create_alloc (20, type_refc_hash, type_refc_equal, -+ NULL, xcalloc, xfree); + - /* FIXME: The following types are architecture-neutral. However, - they contain pointer_type and reference_type fields potentially - caching pointer or reference types that *are* architecture -@@ -3284,47 +3782,47 @@ _initialize_gdbtypes (void) - builtin_type_int0 = - init_type (TYPE_CODE_INT, 0 / 8, - 0, -- "int0_t", (struct objfile *) NULL); -+ "int0_t", OBJFILE_INTERNAL); - builtin_type_int8 = - init_type (TYPE_CODE_INT, 8 / 8, - TYPE_FLAG_NOTTEXT, -- "int8_t", (struct objfile *) NULL); -+ "int8_t", OBJFILE_INTERNAL); - builtin_type_uint8 = - init_type (TYPE_CODE_INT, 8 / 8, - TYPE_FLAG_UNSIGNED | TYPE_FLAG_NOTTEXT, -- "uint8_t", (struct objfile *) NULL); -+ "uint8_t", OBJFILE_INTERNAL); - builtin_type_int16 = - init_type (TYPE_CODE_INT, 16 / 8, - 0, -- "int16_t", (struct objfile *) NULL); -+ "int16_t", OBJFILE_INTERNAL); - builtin_type_uint16 = - init_type (TYPE_CODE_INT, 16 / 8, - TYPE_FLAG_UNSIGNED, -- "uint16_t", (struct objfile *) NULL); -+ "uint16_t", OBJFILE_INTERNAL); - builtin_type_int32 = - init_type (TYPE_CODE_INT, 32 / 8, - 0, -- "int32_t", (struct objfile *) NULL); -+ "int32_t", OBJFILE_INTERNAL); - builtin_type_uint32 = - init_type (TYPE_CODE_INT, 32 / 8, - TYPE_FLAG_UNSIGNED, -- "uint32_t", (struct objfile *) NULL); -+ "uint32_t", OBJFILE_INTERNAL); - builtin_type_int64 = - init_type (TYPE_CODE_INT, 64 / 8, - 0, -- "int64_t", (struct objfile *) NULL); -+ "int64_t", OBJFILE_INTERNAL); - builtin_type_uint64 = - init_type (TYPE_CODE_INT, 64 / 8, - TYPE_FLAG_UNSIGNED, -- "uint64_t", (struct objfile *) NULL); -+ "uint64_t", OBJFILE_INTERNAL); - builtin_type_int128 = - init_type (TYPE_CODE_INT, 128 / 8, - 0, -- "int128_t", (struct objfile *) NULL); -+ "int128_t", OBJFILE_INTERNAL); - builtin_type_uint128 = - init_type (TYPE_CODE_INT, 128 / 8, - TYPE_FLAG_UNSIGNED, -- "uint128_t", (struct objfile *) NULL); -+ "uint128_t", OBJFILE_INTERNAL); - - builtin_type_ieee_single = - build_flt (-1, "builtin_type_ieee_single", floatformats_ieee_single); -@@ -3344,15 +3842,15 @@ _initialize_gdbtypes (void) - builtin_type_void = - init_type (TYPE_CODE_VOID, 1, - 0, -- "void", (struct objfile *) NULL); -+ "void", OBJFILE_INTERNAL); - builtin_type_true_char = - init_type (TYPE_CODE_CHAR, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - 0, -- "true character", (struct objfile *) NULL); -+ "true character", OBJFILE_INTERNAL); - builtin_type_true_unsigned_char = - init_type (TYPE_CODE_CHAR, TARGET_CHAR_BIT / TARGET_CHAR_BIT, - TYPE_FLAG_UNSIGNED, -- "true character", (struct objfile *) NULL); -+ "true character", OBJFILE_INTERNAL); ++ type_discardable_table = htab_create_alloc (20, type_discardable_hash, ++ type_discardable_equal, NULL, ++ xcalloc, xfree); ++ + objfile_type_data = register_objfile_data (); add_setshow_zinteger_cmd ("overload", no_class, &overload_debug, _("\ - Set debugging of C++ overloading."), _("\ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h -index c90b6d7..63b5389 100644 +index be6ed55..cf8c4d8 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h -@@ -134,7 +134,12 @@ enum type_code - - TYPE_CODE_NAMESPACE, /* C++ namespace. */ - -- TYPE_CODE_DECFLOAT /* Decimal floating point. */ -+ TYPE_CODE_DECFLOAT, /* Decimal floating point. */ -+ -+ TYPE_CODE_MODULE, /* Fortran module. */ -+ -+ /* Internal function type. */ -+ TYPE_CODE_INTERNAL_FUNCTION - }; - - /* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an -@@ -209,6 +214,11 @@ enum type_instance_flag_value +@@ -213,6 +213,11 @@ enum type_instance_flag_value #define TYPE_TARGET_STUB(t) (TYPE_MAIN_TYPE (t)->flag_target_stub) @@ -21377,10 +9572,22 @@ index c90b6d7..63b5389 100644 /* Static type. If this is set, the corresponding type had * a static modifier. * Note: This may be unnecessary, since static data members -@@ -266,6 +276,36 @@ enum type_instance_flag_value - - #define TYPE_NOTTEXT(t) (TYPE_MAIN_TYPE (t)->flag_nottext) +@@ -278,6 +283,48 @@ enum type_instance_flag_value + #define TYPE_OWNER(t) TYPE_MAIN_TYPE(t)->owner + #define TYPE_OBJFILE(t) (TYPE_OBJFILE_OWNED(t)? TYPE_OWNER(t).objfile : NULL) ++/* Define this type as being reclaimable during free_all_types. Type is ++ required to be have TYPE_OBJFILE set to NULL. Setting this flag requires ++ initializing TYPE_DISCARDABLE_AGE, see alloc_type_discardable. */ ++ ++#define TYPE_DISCARDABLE(t) (TYPE_MAIN_TYPE (t)->flag_discardable) ++ ++/* Marker this type has been visited by the type_mark_used by this ++ mark-and-sweep types garbage collecting pass. Current pass is represented ++ by TYPE_DISCARDABLE_AGE_CURRENT. */ ++ ++#define TYPE_DISCARDABLE_AGE(t) (TYPE_MAIN_TYPE (t)->flag_discardable_age) ++ +/* Is HIGH_BOUND a low-bound relative count (1) or the high bound itself (0)? */ + +#define TYPE_RANGE_HIGH_BOUND_IS_COUNT(range_type) \ @@ -21405,7 +9612,7 @@ index c90b6d7..63b5389 100644 + false. If TYPE_DATA_LOCATION_IS_ADDR set then TYPE_DATA_LOCATION_ADDR value + is the actual data address value. If unset and + TYPE_DATA_LOCATION_DWARF_BLOCK is NULL then the value is the normal -+ VALUE_ADDRESS copy. If unset and TYPE_DATA_LOCATION_DWARF_BLOCK is not NULL ++ value_raw_address. If unset and TYPE_DATA_LOCATION_DWARF_BLOCK is not NULL + then its DWARF block determines the actual data address. */ + +#define TYPE_DATA_LOCATION_IS_ADDR(t) \ @@ -21414,10 +9621,12 @@ index c90b6d7..63b5389 100644 /* Constant type. If this is set, the corresponding type has a * const modifier. */ -@@ -352,6 +392,11 @@ struct main_type - unsigned int flag_stub_supported : 1; +@@ -365,6 +412,13 @@ struct main_type unsigned int flag_nottext : 1; unsigned int flag_fixed_instance : 1; + unsigned int flag_objfile_owned : 1; ++ unsigned int flag_discardable : 1; ++ unsigned int flag_discardable_age : 1; + unsigned int flag_dynamic : 1; + unsigned int flag_range_high_bound_is_count : 1; + unsigned int flag_not_allocated : 1; @@ -21426,7 +9635,7 @@ index c90b6d7..63b5389 100644 /* Number of fields described for this type. This field appears at this location because it packs nicely here. */ -@@ -414,6 +459,20 @@ struct main_type +@@ -431,6 +485,20 @@ struct main_type struct type *target_type; @@ -21447,17 +9656,7 @@ index c90b6d7..63b5389 100644 /* For structure and union types, a description of each field. For set and pascal array types, there is one "field", whose type is the domain type of the set or array. -@@ -521,6 +580,9 @@ struct main_type - supporting multiple ABIs. Right now this is only fetched from - the Dwarf-2 DW_AT_calling_convention attribute. */ - unsigned calling_convention; -+ -+ /* For TYPE_CODE_MODULE, the list of symbols contained in the module. */ -+ struct block *module_block; - } type_specific; - }; - -@@ -795,9 +857,9 @@ extern void allocate_cplus_struct_type (struct type *); +@@ -812,9 +880,9 @@ extern void allocate_cplus_struct_type (struct type *); #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type #define TYPE_CHAIN(thistype) (thistype)->chain @@ -21469,8 +9668,8 @@ index c90b6d7..63b5389 100644 + type, so you only have to call check_typedef once. Since allocate_value calls check_typedef, TYPE_LENGTH (VALUE_TYPE (X)) is safe. */ #define TYPE_LENGTH(thistype) (thistype)->length - #define TYPE_OBJFILE(thistype) TYPE_MAIN_TYPE(thistype)->objfile -@@ -807,23 +869,44 @@ extern void allocate_cplus_struct_type (struct type *); + /* Note that TYPE_CODE can be TYPE_CODE_TYPEDEF, so if you want the real +@@ -823,23 +891,44 @@ extern void allocate_cplus_struct_type (struct type *); #define TYPE_NFIELDS(thistype) TYPE_MAIN_TYPE(thistype)->nfields #define TYPE_FIELDS(thistype) TYPE_MAIN_TYPE(thistype)->fields #define TYPE_TEMPLATE_ARGS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->template_args @@ -21525,63 +9724,18 @@ index c90b6d7..63b5389 100644 /* C++ */ -@@ -839,6 +922,7 @@ extern void allocate_cplus_struct_type (struct type *); - #define TYPE_CPLUS_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.cplus_stuff - #define TYPE_FLOATFORMAT(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.floatformat - #define TYPE_CALLING_CONVENTION(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.calling_convention -+#define TYPE_MODULE_BLOCK(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.module_block - #define TYPE_BASECLASS(thistype,index) TYPE_MAIN_TYPE(thistype)->fields[index].type - #define TYPE_N_BASECLASSES(thistype) TYPE_CPLUS_SPECIFIC(thistype)->n_baseclasses - #define TYPE_BASECLASS_NAME(thistype,index) TYPE_MAIN_TYPE(thistype)->fields[index].name -@@ -1078,6 +1162,16 @@ extern struct type *builtin_type_error; - (TYPE_UNSIGNED(t) ? UMIN_OF_SIZE(TYPE_LENGTH(t)) \ - : MIN_OF_SIZE(TYPE_LENGTH(t))) - -+/* Virtual OBJFILE used for builtin types. */ -+#define OBJFILE_INTERNAL ((struct objfile *) 1L) -+ -+/* Virtual OBJFILE used for types allocated by malloc. FIXME: Currently -+ backward compatible with the old NULL value; fix then also init_type. */ -+#define OBJFILE_MALLOC ((struct objfile *) 0L) -+ -+#define OBJFILE_IS_VIRTUAL(objfile) ((objfile) == OBJFILE_INTERNAL \ -+ || (objfile) == OBJFILE_MALLOC) -+ - /* Allocate space for storing data associated with a particular type. - We ensure that the space is allocated using the same mechanism that - was used to allocate the space for the type structure itself. I.E. -@@ -1087,18 +1181,18 @@ extern struct type *builtin_type_error; - builtin types), then the data space will be allocated with xmalloc, - the same as for the type structure. */ - --#define TYPE_ALLOC(t,size) \ -- (TYPE_OBJFILE (t) != NULL \ -- ? obstack_alloc (&TYPE_OBJFILE (t) -> objfile_obstack, size) \ -- : xmalloc (size)) -+#define TYPE_ALLOC(t,size) \ -+ (OBJFILE_IS_VIRTUAL (TYPE_OBJFILE (t)) \ -+ ? xmalloc (size) \ -+ : obstack_alloc (&TYPE_OBJFILE (t) -> objfile_obstack, size)) - --#define TYPE_ZALLOC(t,size) \ -- (TYPE_OBJFILE (t) != NULL \ -- ? memset (obstack_alloc (&TYPE_OBJFILE (t)->objfile_obstack, size), \ -- 0, size) \ -- : xzalloc (size)) -+#define TYPE_ZALLOC(t,size) \ -+ (OBJFILE_IS_VIRTUAL (TYPE_OBJFILE (t)) \ -+ ? xzalloc (size) \ -+ : memset (obstack_alloc (&TYPE_OBJFILE (t)->objfile_obstack, size), \ -+ 0, size)) - +@@ -1131,7 +1220,7 @@ extern const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN + Use alloc_type_arch to allocate a type owned by an architecture. + Use alloc_type_copy to allocate a type with the same owner as a + pre-existing template type, no matter whether objfile or gdbarch. */ -extern struct type *alloc_type (struct objfile *); +extern struct type *alloc_type (struct objfile *, struct type *); + extern struct type *alloc_type_arch (struct gdbarch *); + extern struct type *alloc_type_copy (const struct type *); - extern struct type *init_type (enum type_code, int, int, char *, - struct objfile *); -@@ -1172,6 +1266,18 @@ extern struct type *create_range_type (struct type *, struct type *, int, - extern struct type *create_array_type (struct type *, struct type *, +@@ -1226,6 +1315,18 @@ extern struct type *create_array_type (struct type *, struct type *, struct type *); + extern struct type *lookup_array_range_type (struct type *, int, int); +extern CORE_ADDR type_range_any_field_internal (struct type *range_type, + int fieldno); @@ -21595,10 +9749,19 @@ index c90b6d7..63b5389 100644 + +extern void finalize_type (struct type *type); + - extern struct type *create_string_type (struct type *, struct type *); + extern struct type *create_string_type (struct type *, struct type *, + struct type *); + extern struct type *lookup_string_range_type (struct type *, int, int); +@@ -1262,6 +1363,8 @@ extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *); - extern struct type *create_set_type (struct type *, struct type *); -@@ -1263,10 +1369,15 @@ extern void maintenance_print_type (char *, int); + extern int is_ancestor (struct type *, struct type *); + ++extern void type_mark_used (struct type *type); ++ + /* Overload resolution */ + + #define LENGTH_MATCH(bv) ((bv)->rank[0]) +@@ -1324,10 +1427,15 @@ extern void maintenance_print_type (char *, int); extern htab_t create_copied_types_hash (struct objfile *objfile); @@ -21609,41 +9772,26 @@ index c90b6d7..63b5389 100644 extern struct type *copy_type (const struct type *type); ++extern void free_all_types (void); ++ +extern void type_incref (struct type *type); + +extern void type_decref (struct type *type); -+ -+extern void free_all_types (void); + #endif /* GDBTYPES_H */ -diff --git a/gdb/gnu-v2-abi.c b/gdb/gnu-v2-abi.c -index 7cacac1..a456228 100644 ---- a/gdb/gnu-v2-abi.c -+++ b/gdb/gnu-v2-abi.c -@@ -242,7 +242,7 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) - we'd waste a bunch of time figuring out we already know the type. - Besides, we don't care about the type, just the actual pointer - */ -- if (VALUE_ADDRESS (value_field (v, known_type_vptr_fieldno)) == 0) -+ if (value_address (value_field (v, known_type_vptr_fieldno)) == 0) - return NULL; - - vtbl = value_as_address (value_field (v, known_type_vptr_fieldno)); diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c -index 3a52df3..6cdf716 100644 +index 0f9d44e..c910e88 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c -@@ -269,8 +269,7 @@ gnuv3_rtti_type (struct value *value, - - /* Find the linker symbol for this vtable. */ - vtable_symbol -- = lookup_minimal_symbol_by_pc (VALUE_ADDRESS (vtable) -- + value_offset (vtable) -+ = lookup_minimal_symbol_by_pc (value_address (vtable) - + value_embedded_offset (vtable)); - if (! vtable_symbol) - return NULL; -@@ -487,10 +486,8 @@ gnuv3_find_method_in (struct type *domain, CORE_ADDR voffset, +@@ -26,6 +26,7 @@ + #include "demangle.h" + #include "objfiles.h" + #include "valprint.h" ++#include "c-lang.h" + + #include "gdb_assert.h" + #include "gdb_string.h" +@@ -459,10 +460,8 @@ gnuv3_find_method_in (struct type *domain, CORE_ADDR voffset, LONGEST adjustment) { int i; @@ -21654,7 +9802,7 @@ index 3a52df3..6cdf716 100644 if (adjustment == 0) { int len; -@@ -615,13 +612,15 @@ gnuv3_print_method_ptr (const gdb_byte *contents, +@@ -590,15 +589,24 @@ gnuv3_print_method_ptr (const gdb_byte *contents, { char *demangled_name = cplus_demangle (physname, DMGL_ANSI | DMGL_PARAMS); @@ -21672,530 +9820,68 @@ index 3a52df3..6cdf716 100644 + return; } } - -diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c -index 2366474..f83de32 100644 ---- a/gdb/i386-linux-nat.c -+++ b/gdb/i386-linux-nat.c -@@ -751,7 +751,13 @@ i386_linux_resume (struct target_ops *ops, - { - int pid = PIDGET (ptid); - -- int request = PTRACE_CONT; -+ int request; -+ -+ if (target_passed_by_entrypoint () > 0 -+ && catch_syscall_enabled () > 0) -+ request = PTRACE_SYSCALL; -+ else -+ request = PTRACE_CONT; - - if (step) - { -diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c -index 1a2e4f0..973eced 100644 ---- a/gdb/i386-linux-tdep.c -+++ b/gdb/i386-linux-tdep.c -@@ -37,6 +37,10 @@ - #include "symtab.h" - #include "arch-utils.h" - #include "regset.h" -+#include "linux-tdep.h" -+ -+/* The syscall's XML filename for i386. */ -+#define XML_SYSCALL_FILENAME_I386 "syscalls/i386-linux.xml" - - /* Supported register note sections. */ - static struct core_regset_section i386_linux_regset_sections[] = -@@ -349,6 +353,26 @@ i386_linux_write_pc (struct regcache *regcache, CORE_ADDR pc) - } - - -+static LONGEST -+i386_linux_get_syscall_number (struct gdbarch *gdbarch, -+ ptid_t ptid) -+{ -+ struct regcache *regcache = get_thread_regcache (ptid); -+ /* The content of a register. */ -+ gdb_byte buf[4]; -+ /* The result. */ -+ LONGEST ret; -+ -+ /* Getting the system call number from the register. -+ When dealing with x86 architecture, this information -+ is stored at %eax register. */ -+ regcache_cooked_read (regcache, I386_LINUX_ORIG_EAX_REGNUM, buf); -+ -+ ret = extract_signed_integer (buf, 4); -+ -+ return ret; -+} -+ - /* The register sets used in GNU/Linux ELF core-dumps are identical to - the register sets in `struct user' that are used for a.out - core-dumps. These are also used by ptrace(2). The corresponding -@@ -419,6 +443,9 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - -+ /* Initializing common functions. */ -+ linux_tdep_init (gdbarch); -+ - /* GNU/Linux uses ELF. */ - i386_elf_init_abi (info, gdbarch); - -@@ -472,6 +499,11 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) - displaced_step_at_entry_point); - - set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); -+ -+ /* Functions for 'catch syscall'. */ -+ set_gdbarch_xml_syscall_filename (gdbarch, XML_SYSCALL_FILENAME_I386); -+ set_gdbarch_get_syscall_number (gdbarch, -+ i386_linux_get_syscall_number); - } - - /* Provide a prototype to silence -Wmissing-prototypes. */ -diff --git a/gdb/inf-child.c b/gdb/inf-child.c -index 38311f1..fc968cf 100644 ---- a/gdb/inf-child.c -+++ b/gdb/inf-child.c -@@ -148,6 +148,15 @@ inf_child_remove_exec_catchpoint (int pid) - } - - static int -+inf_child_set_syscall_catchpoint (int pid, int needed, int any_count, -+ int table_size, int *table) -+{ -+ /* This version of Unix doesn't support notification of syscall -+ events. */ -+ return 0; -+} -+ -+static int - inf_child_can_run (void) - { - return 1; -@@ -190,6 +199,7 @@ inf_child_target (void) - t->to_follow_fork = inf_child_follow_fork; - t->to_insert_exec_catchpoint = inf_child_insert_exec_catchpoint; - t->to_remove_exec_catchpoint = inf_child_remove_exec_catchpoint; -+ t->to_set_syscall_catchpoint = inf_child_set_syscall_catchpoint; - t->to_can_run = inf_child_can_run; - t->to_pid_to_exec_file = inf_child_pid_to_exec_file; - t->to_stratum = process_stratum; -diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c -index f40b6b7..ff429c4 100644 ---- a/gdb/inf-ptrace.c -+++ b/gdb/inf-ptrace.c -@@ -356,13 +356,19 @@ inf_ptrace_resume (struct target_ops *ops, - ptid_t ptid, int step, enum target_signal signal) - { - pid_t pid = ptid_get_pid (ptid); -- int request = PT_CONTINUE; -+ int request; - - if (pid == -1) - /* Resume all threads. Traditionally ptrace() only supports - single-threaded processes, so simply resume the inferior. */ - pid = ptid_get_pid (inferior_ptid); - -+ if (target_passed_by_entrypoint () > 0 -+ && catch_syscall_enabled () > 0) -+ request = PT_SYSCALL; -+ else -+ request = PT_CONTINUE; -+ - if (step) - { - /* If this system does not support PT_STEP, a higher level -diff --git a/gdb/infcall.c b/gdb/infcall.c -index d6da8b2..2f483f3 100644 ---- a/gdb/infcall.c -+++ b/gdb/infcall.c -@@ -217,7 +217,7 @@ find_function_addr (struct value *function, struct type **retval_type) - /* Determine address to call. */ - if (code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD) - { -- funaddr = VALUE_ADDRESS (function); -+ funaddr = value_address (function); - value_type = TYPE_TARGET_TYPE (ftype); - } - else if (code == TYPE_CODE_PTR) -diff --git a/gdb/infcmd.c b/gdb/infcmd.c -index 0a17dab..d48f4b1 100644 ---- a/gdb/infcmd.c -+++ b/gdb/infcmd.c -@@ -466,6 +466,11 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) - init_wait_for_inferior (); - clear_breakpoint_hit_counts (); - -+ /* If we already caught a syscall catchpoint, then reset its -+ syscall_number information because we are starting all over -+ again. */ -+ clear_syscall_catchpoints_info (); -+ - /* Clean up any leftovers from other runs. Some other things from - this function should probably be moved into target_pre_inferior. */ - target_pre_inferior (from_tty); -diff --git a/gdb/infrun.c b/gdb/infrun.c -index ee5f987..2f627ea 100644 ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -1046,7 +1046,7 @@ a command like `return' or `jump' to continue execution.")); - } - } - -- /* If there were any forks/vforks/execs that were caught and are -+ /* If there were any forks/vforks/execs/syscalls that were caught and are - now to be followed, then do so. */ - switch (pending_follow.kind) - { -@@ -1069,6 +1069,11 @@ a command like `return' or `jump' to continue execution.")); - pending_follow.kind = TARGET_WAITKIND_SPURIOUS; - break; - -+ case TARGET_WAITKIND_SYSCALL_ENTRY: -+ case TARGET_WAITKIND_SYSCALL_RETURN: -+ pending_follow.kind = TARGET_WAITKIND_SPURIOUS; -+ break; -+ - default: - break; - } -@@ -1509,7 +1514,7 @@ init_wait_for_inferior (void) - - breakpoint_init_inferior (inf_starting); - -- /* The first resume is not following a fork/vfork/exec. */ -+ /* The first resume is not following a fork/vfork/exec/syscall. */ - pending_follow.kind = TARGET_WAITKIND_SPURIOUS; /* I.e., none. */ - - clear_proceed_status (); -@@ -2155,6 +2160,50 @@ ensure_not_running (void) - error_is_running (); - } - -+/* Auxiliary function that handles syscall entry/return events. -+ It returns 1 if the inferior should keep going (and GDB -+ should ignore the event), or 0 if the event deserves to be -+ processed. */ -+static int -+deal_with_syscall_event (struct execution_control_state *ecs) -+{ -+ int syscall_number = gdbarch_get_syscall_number (current_gdbarch, -+ ecs->ptid); -+ if (catch_syscall_enabled () > 0 -+ && catching_syscall_number (syscall_number) > 0) ++ else if (ptr_value != 0) + { -+ ecs->event_thread->stop_signal = TARGET_SIGNAL_TRAP; -+ pending_follow.kind = ecs->ws.kind; -+ -+ if (!ptid_equal (ecs->ptid, inferior_ptid)) -+ { -+ context_switch (ecs->ptid); -+ reinit_frame_cache (); -+ } -+ -+ stop_pc = read_pc (); -+ -+ ecs->event_thread->stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid); -+ -+ ecs->random_signal = !bpstat_explains_signal (ecs->event_thread->stop_bpstat); -+ -+ /* If no catchpoint triggered for this, then keep going. */ -+ if (ecs->random_signal) -+ { -+ ecs->event_thread->stop_signal = TARGET_SIGNAL_0; -+ keep_going (ecs); -+ return 1; -+ } -+ return 0; ++ /* Found a non-virtual function: print out the type. */ ++ fputs_filtered ("(", stream); ++ c_print_type (type, "", stream, -1, 0); ++ fputs_filtered (") ", stream); + } -+ else -+ { -+ resume (0, TARGET_SIGNAL_0); -+ prepare_to_wait (ecs); -+ return 1; -+ } -+} -+ - /* Given an execution control state that has been freshly filled in - by an event from the inferior, figure out what it means and take - appropriate action. */ -@@ -2449,9 +2498,11 @@ handle_inferior_event (struct execution_control_state *ecs) - case TARGET_WAITKIND_SYSCALL_ENTRY: - if (debug_infrun) - fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SYSCALL_ENTRY\n"); -- resume (0, TARGET_SIGNAL_0); -- prepare_to_wait (ecs); -- return; -+ /* Getting the current syscall number */ -+ if (deal_with_syscall_event (ecs) != 0) -+ return; -+ goto process_event_stop_test; -+ break; - /* Before examining the threads further, step this thread to - get it entirely out of the syscall. (We get notice of the -@@ -2461,9 +2512,10 @@ handle_inferior_event (struct execution_control_state *ecs) - case TARGET_WAITKIND_SYSCALL_RETURN: - if (debug_infrun) - fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SYSCALL_RETURN\n"); -- target_resume (ecs->ptid, 1, TARGET_SIGNAL_0); -- prepare_to_wait (ecs); -- return; -+ if (deal_with_syscall_event (ecs) != 0) -+ return; -+ goto process_event_stop_test; -+ break; + /* We didn't find it; print the raw data. */ + if (vbit) +diff --git a/gdb/gnulib/Makefile.in b/gdb/gnulib/Makefile.in +index 5e55573..5439aba 100644 +--- a/gdb/gnulib/Makefile.in ++++ b/gdb/gnulib/Makefile.in +@@ -1,8 +1,8 @@ + # Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ - case TARGET_WAITKIND_STOPPED: - if (debug_infrun) -@@ -5166,6 +5218,25 @@ inferior_has_execd (ptid_t pid, char **execd_pathname) - return 1; - } - -+int -+inferior_has_called_syscall (ptid_t pid, int *syscall_number) -+{ -+ struct target_waitstatus last; -+ ptid_t last_ptid; -+ -+ get_last_target_status (&last_ptid, &last); -+ -+ if (last.kind != TARGET_WAITKIND_SYSCALL_ENTRY && -+ last.kind != TARGET_WAITKIND_SYSCALL_RETURN) -+ return 0; -+ -+ if (!ptid_equal (last_ptid, pid)) -+ return 0; -+ -+ *syscall_number = last.value.syscall_number; -+ return 1; -+} -+ - /* Oft used ptids */ - ptid_t null_ptid; - ptid_t minus_one_ptid; +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004, 2005 Free Software Foundation, Inc. ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, ++# 2004, 2005, 2009 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c -index b702ebf..a211adf 100644 +index 6b68e7d..5095180 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c -@@ -61,7 +61,8 @@ static char *get_java_utf8_name (struct obstack *obstack, struct value *name); - static int java_class_is_primitive (struct value *clas); - static struct value *java_value_string (char *ptr, int len); - --static void java_emit_char (int c, struct ui_file * stream, int quoter); -+static void java_emit_char (int c, struct type *type, -+ struct ui_file * stream, int quoter); - - static char *java_class_name_from_physname (const char *physname); - -@@ -210,8 +211,7 @@ get_java_utf8_name (struct obstack *obstack, struct value *name) - CORE_ADDR data_addr; - temp = value_struct_elt (&temp, NULL, "length", NULL, "structure"); - name_length = (int) value_as_long (temp); -- data_addr = VALUE_ADDRESS (temp) + value_offset (temp) -- + TYPE_LENGTH (value_type (temp)); -+ data_addr = value_address (temp) + TYPE_LENGTH (value_type (temp)); - chrs = obstack_alloc (obstack, name_length + 1); - chrs[name_length] = '\0'; - read_memory (data_addr, (gdb_byte *) chrs, name_length); -@@ -266,7 +266,7 @@ type_from_class (struct value *clas) - return NULL; - clas = value_ind (clas); - } -- addr = VALUE_ADDRESS (clas) + value_offset (clas); -+ addr = value_address (clas); - - #if 0 - get_java_class_symtab (); -@@ -302,7 +302,7 @@ type_from_class (struct value *clas) - if (type != NULL) - return type; - -- type = alloc_type (objfile); -+ type = alloc_type (objfile, NULL); - TYPE_CODE (type) = TYPE_CODE_STRUCT; - INIT_CPLUS_SPECIFIC (type); - -@@ -422,7 +422,7 @@ java_link_class_type (struct type *type, struct value *clas) - fields = NULL; - nfields--; /* First set up dummy "class" field. */ - SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), -- VALUE_ADDRESS (clas) + value_offset (clas)); -+ value_address (clas)); - TYPE_FIELD_NAME (type, nfields) = "class"; - TYPE_FIELD_TYPE (type, nfields) = value_type (clas); - SET_TYPE_FIELD_PRIVATE (type, nfields); -@@ -439,7 +439,9 @@ java_link_class_type (struct type *type, struct value *clas) - } - else - { /* Re-use field value for next field. */ -- VALUE_ADDRESS (field) += TYPE_LENGTH (value_type (field)); -+ CORE_ADDR addr -+ = value_address (field) + TYPE_LENGTH (value_type (field)); -+ set_value_address (field, addr); - set_value_lazy (field, 1); - } - temp = field; -@@ -509,7 +511,9 @@ java_link_class_type (struct type *type, struct value *clas) - } - else - { /* Re-use method value for next method. */ -- VALUE_ADDRESS (method) += TYPE_LENGTH (value_type (method)); -+ CORE_ADDR addr -+ = value_address (method) + TYPE_LENGTH (value_type (method)); -+ set_value_address (method, addr); - set_value_lazy (method, 1); - } - -@@ -796,7 +800,7 @@ java_value_string (char *ptr, int len) - characters and strings is language specific. */ - - static void --java_emit_char (int c, struct ui_file *stream, int quoter) -+java_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) +@@ -1121,6 +1121,7 @@ const struct exp_descriptor exp_descriptor_java = { - switch (c) - { -diff --git a/gdb/jv-valprint.c b/gdb/jv-valprint.c -index d3606fd..cdcb440 100644 ---- a/gdb/jv-valprint.c -+++ b/gdb/jv-valprint.c -@@ -45,7 +45,7 @@ java_value_print (struct value *val, struct ui_file *stream, - struct value_print_options opts; - - type = value_type (val); -- address = VALUE_ADDRESS (val) + value_offset (val); -+ address = value_address (val); - - if (is_object_type (type)) - { -@@ -143,8 +143,8 @@ java_value_print (struct value *val, struct ui_file *stream, - struct value *v = allocate_value (el_type); - struct value *next_v = allocate_value (el_type); - -- VALUE_ADDRESS (v) = address + JAVA_OBJECT_SIZE + 4; -- VALUE_ADDRESS (next_v) = VALUE_ADDRESS (v); -+ set_value_address (v, address + JAVA_OBJECT_SIZE + 4); -+ set_value_address (next_v, value_raw_address (v)); - - while (i < length && things_printed < options->print_max) - { -@@ -230,7 +230,7 @@ java_value_print (struct value *val, struct ui_file *stream, - - value_free_to_mark (mark); /* Release unnecessary values */ - -- val_print_string (data + boffset, count, 2, stream, options); -+ val_print_string (java_char_type, data + boffset, count, stream, options); - - return 0; - } -@@ -520,7 +520,7 @@ java_val_print (struct type *type, const gdb_byte *valaddr, - || (TYPE_CODE (type) == TYPE_CODE_INT - && TYPE_LENGTH (type) == 2 - && strcmp (TYPE_NAME (type), "char") == 0)) -- LA_PRINT_CHAR ((int) unpack_long (type, valaddr), stream); -+ LA_PRINT_CHAR ((int) unpack_long (type, valaddr), type, stream); - else - val_print_type_code_int (type, valaddr, stream); - break; -diff --git a/gdb/language.c b/gdb/language.c -index 3c37a64..6209d7f 100644 ---- a/gdb/language.c -+++ b/gdb/language.c -@@ -65,9 +65,11 @@ static void set_check (char *, int); - - static void set_type_range_case (void); - --static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter); -+static void unk_lang_emit_char (int c, struct type *type, -+ struct ui_file *stream, int quoter); - --static void unk_lang_printchar (int c, struct ui_file *stream); -+static void unk_lang_printchar (int c, struct type *type, -+ struct ui_file *stream); - - static void unk_lang_print_type (struct type *, char *, struct ui_file *, - int, int); -@@ -1065,20 +1067,22 @@ unk_lang_error (char *msg) - } - - static void --unk_lang_emit_char (int c, struct ui_file *stream, int quoter) -+unk_lang_emit_char (int c, struct type *type, struct ui_file *stream, -+ int quoter) - { - error (_("internal error - unimplemented function unk_lang_emit_char called.")); - } - - static void --unk_lang_printchar (int c, struct ui_file *stream) -+unk_lang_printchar (int c, struct type *type, struct ui_file *stream) - { - error (_("internal error - unimplemented function unk_lang_printchar called.")); - } - - static void --unk_lang_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+unk_lang_printstr (struct ui_file *stream, struct type *type, -+ const gdb_byte *string, unsigned int length, -+ int force_ellipses, - const struct value_print_options *options) - { - error (_("internal error - unimplemented function unk_lang_printstr called.")); + print_subexp_standard, + operator_length_standard, ++ operator_check_standard, + op_name_standard, + dump_subexp_body_standard, + evaluate_subexp_java diff --git a/gdb/language.h b/gdb/language.h -index 85826fd..e5f80ab 100644 +index ba37faa..a8e41d2 100644 --- a/gdb/language.h +++ b/gdb/language.h -@@ -186,14 +186,15 @@ struct language_defn +@@ -237,7 +237,6 @@ struct language_defn + variables. */ - void (*la_post_parser) (struct expression ** expp, int void_context_p); - -- void (*la_printchar) (int ch, struct ui_file * stream); -+ void (*la_printchar) (int ch, struct type *chtype, struct ui_file * stream); - -- void (*la_printstr) (struct ui_file * stream, const gdb_byte *string, -- unsigned int length, int width, -+ void (*la_printstr) (struct ui_file * stream, struct type *elttype, -+ const gdb_byte *string, unsigned int length, - int force_ellipses, - const struct value_print_options *); - -- void (*la_emitchar) (int ch, struct ui_file * stream, int quoter); -+ void (*la_emitchar) (int ch, struct type *chtype, -+ struct ui_file * stream, int quoter); - - /* Print a type using syntax appropriate for this language. */ - -@@ -381,13 +382,13 @@ extern enum language set_language (enum language); - #define LA_VALUE_PRINT(val,stream,options) \ - (current_language->la_value_print(val,stream,options)) - --#define LA_PRINT_CHAR(ch, stream) \ -- (current_language->la_printchar(ch, stream)) --#define LA_PRINT_STRING(stream, string, length, width, force_ellipses,options) \ -- (current_language->la_printstr(stream, string, length, width, \ -+#define LA_PRINT_CHAR(ch, type, stream) \ -+ (current_language->la_printchar(ch, type, stream)) -+#define LA_PRINT_STRING(stream, elttype, string, length, force_ellipses,options) \ -+ (current_language->la_printstr(stream, elttype, string, length, \ - force_ellipses,options)) --#define LA_EMIT_CHAR(ch, stream, quoter) \ -- (current_language->la_emitchar(ch, stream, quoter)) -+#define LA_EMIT_CHAR(ch, type, stream, quoter) \ -+ (current_language->la_emitchar(ch, type, stream, quoter)) - #define LA_GET_STRING(value, buffer, length, encoding) \ - (current_language->la_get_string(value, buffer, length, encoding)) + struct symbol *(*la_lookup_symbol_nonlocal) (const char *, +- const char *, + const struct block *, + const domain_enum); diff --git a/gdb/linespec.c b/gdb/linespec.c -index 6579d42..b3ae6c0 100644 +index debe86f..e17a0b6 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c -@@ -842,13 +842,33 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, +@@ -30,6 +30,7 @@ + #include "value.h" + #include "completer.h" + #include "cp-abi.h" ++#include "cp-support.h" + #include "parser-defs.h" + #include "block.h" + #include "objc-lang.h" +@@ -840,13 +841,33 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, } else if (paren_pointer != NULL) { @@ -22227,631 +9913,120 @@ index 6579d42..b3ae6c0 100644 + if (strncmp (p, " const", 6) == 0) + p += 6; + - copy = (char *) alloca (p - *argptr + 1); - memcpy (copy, *argptr, p - *argptr); - copy[p - *argptr] = '\0'; -diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c -index 12b786e..e30bf9a 100644 ---- a/gdb/linux-nat.c -+++ b/gdb/linux-nat.c -@@ -61,6 +61,10 @@ - # endif - #endif /* HAVE_PERSONALITY */ + /* Keep any template parameters */ + if (*p == '<') + p = find_template_name_end (p); +@@ -1258,7 +1279,10 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, + /* Move pointer ahead to next double-colon. */ + while (*p && (p[0] != ' ') && (p[0] != '\t') && (p[0] != '\'')) + { +- if (p[0] == '<') ++ if (current_language->la_language == language_cplus ++ && strncmp (p, "operator", 8) == 0) ++ p += cp_validate_operator (p); ++ else if (p[0] == '<') + { + temp_end = find_template_name_end (p); + if (!temp_end) +@@ -1335,6 +1359,16 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, + while (*p && *p != ' ' && *p != '\t' && *p != ',' && *p != ':') + p++; + /* At this point p->"". String ended. */ ++ /* Nope. C++ operators could have spaces in them ++ ("foo::operator <" or "foo::operator delete []"). ++ I apologize, this is a bit hacky... */ ++ if (current_language->la_language == language_cplus ++ && *p == ' ' && p - 8 - *argptr + 1 > 0 ++ && strncmp (p - 8, "operator", 8) == 0) ++ { ++ /* The above loop has already swallowed "operator" */ ++ p += cp_validate_operator (p - 8) - 8; ++ } + } -+/* To be used when one needs to know wether a -+ WSTOPSIG (status) is a syscall */ -+#define TRAP_IS_SYSCALL (SIGTRAP | 0x80) -+ - /* This comment documents high-level logic of this file. - - Waiting for events in sync mode -@@ -281,17 +285,29 @@ struct simple_pid_list *stopped_pids; - - static int linux_supports_tracefork_flag = -1; - -+/* This variable is a tri-state flag: -1 for unknown, 0 if PTRACE_O_TRACESYSGOOD -+ can not be used, 1 if it can. */ -+ -+static int linux_supports_tracesysgood_flag = -1; -+ - /* If we have PTRACE_O_TRACEFORK, this flag indicates whether we also have - PTRACE_O_TRACEVFORKDONE. */ - - static int linux_supports_tracevforkdone_flag = -1; - -+/* If the inferior have passed through its entrypoint (AT_ENTRY), -+ then this flag is set to 1. Otherwise, its value is 0. */ -+static int linux_passed_by_entrypoint_flag = 0; -+ - /* Async mode support */ - - /* Zero if the async mode, although enabled, is masked, which means - linux_nat_wait should behave as if async mode was off. */ - static int linux_nat_async_mask_value = 1; - -+/* Stores the current used ptrace() options. */ -+static int current_ptrace_options = 0; -+ - /* The read/write ends of the pipe registered as waitable file in the - event loop. */ - static int linux_nat_event_pipe[2] = { -1, -1 }; -@@ -636,6 +652,41 @@ linux_test_for_tracefork (int original_pid) - linux_nat_async_events (async_events_original_state); - } - -+/* Determine if PTRACE_O_TRACESYSGOOD can be used to follow syscalls. -+ -+ We try to enable syscall tracing on ORIGINAL_PID. If this fails, -+ we know that the feature is not available. This may change the tracing -+ options for ORIGINAL_PID, but we'll be setting them shortly anyway. */ -+ -+static void -+linux_test_for_tracesysgood (int original_pid) -+{ -+ int ret; -+ enum sigchld_state async_events_original_state; -+ -+ async_events_original_state = linux_nat_async_events (sigchld_sync); -+ -+ linux_supports_tracesysgood_flag = 0; -+ -+ ret = ptrace (PTRACE_SETOPTIONS, original_pid, 0, PTRACE_O_TRACESYSGOOD); -+ if (ret != 0) -+ return; -+ -+ linux_supports_tracesysgood_flag = 1; -+ linux_nat_async_events (async_events_original_state); -+} -+ -+/* Determine wether we support PTRACE_O_TRACESYSGOOD option available. -+ This function also sets linux_supports_tracesysgood_flag. */ -+ -+static int -+linux_supports_tracesysgood (int pid) -+{ -+ if (linux_supports_tracesysgood_flag == -1) -+ linux_test_for_tracesysgood (pid); -+ return linux_supports_tracesysgood_flag; -+} -+ - /* Return non-zero iff we have tracefork functionality available. - This function also sets linux_supports_tracefork_flag. */ - -@@ -655,12 +706,34 @@ linux_supports_tracevforkdone (int pid) - return linux_supports_tracevforkdone_flag; - } - -+static void -+linux_enable_tracesysgood (ptid_t ptid) -+{ -+ int pid = ptid_get_lwp (ptid); -+ -+ if (pid == 0) -+ pid = ptid_get_pid (ptid); -+ -+ if (linux_supports_tracesysgood (pid) == 0) -+ return; -+ -+ current_ptrace_options |= PTRACE_O_TRACESYSGOOD; -+ linux_passed_by_entrypoint_flag = 1; -+ -+ ptrace (PTRACE_SETOPTIONS, pid, 0, current_ptrace_options); -+} -+ -+static int -+linux_passed_by_entrypoint (void) -+{ -+ return linux_passed_by_entrypoint_flag; -+} -+ - - void - linux_enable_event_reporting (ptid_t ptid) + /* Allocate our own copy of the substring between argptr and +@@ -1408,6 +1442,7 @@ lookup_prefix_sym (char **argptr, char *p) { - int pid = ptid_get_lwp (ptid); -- int options; + char *p1; + char *copy; ++ struct symbol *sym; - if (pid == 0) - pid = ptid_get_pid (ptid); -@@ -668,15 +741,16 @@ linux_enable_event_reporting (ptid_t ptid) - if (! linux_supports_tracefork (pid)) - return; + /* Extract the class name. */ + p1 = p; +@@ -1426,7 +1461,26 @@ lookup_prefix_sym (char **argptr, char *p) + /* At this point p1->"::inA::fun", p->"inA::fun" copy->"AAA", + argptr->"inA::fun" */ -- options = PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEEXEC -- | PTRACE_O_TRACECLONE; -+ current_ptrace_options |= PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK -+ | PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE; -+ - if (linux_supports_tracevforkdone (pid)) -- options |= PTRACE_O_TRACEVFORKDONE; -+ current_ptrace_options |= PTRACE_O_TRACEVFORKDONE; - - /* Do not enable PTRACE_O_TRACEEXIT until GDB is more prepared to support - read-only process state. */ - -- ptrace (PTRACE_SETOPTIONS, pid, 0, options); -+ ptrace (PTRACE_SETOPTIONS, pid, 0, current_ptrace_options); - } - - static void -@@ -684,6 +758,7 @@ linux_child_post_attach (int pid) - { - linux_enable_event_reporting (pid_to_ptid (pid)); - check_for_thread_db (); -+ linux_enable_tracesysgood (pid_to_ptid (pid)); - } - - static void -@@ -691,6 +766,7 @@ linux_child_post_startup_inferior (ptid_t ptid) - { - linux_enable_event_reporting (ptid); - check_for_thread_db (); -+ linux_enable_tracesysgood (ptid); - } - - static int -@@ -931,6 +1007,16 @@ linux_child_insert_exec_catchpoint (int pid) - error (_("Your system does not support exec catchpoints.")); - } - -+static int -+linux_child_set_syscall_catchpoint (int pid, int needed, int any_count, -+ int table_size, int *table) -+{ -+ if (! linux_supports_tracesysgood (pid)) -+ error (_("Your system does not support syscall catchpoints.")); -+ /* We ignore the arguments. */ -+ return 0; -+} -+ - /* On GNU/Linux there are no real LWP's. The closest thing to LWP's - are processes sharing the same VM space. A multi-threaded process - is basically a group of such processes. However, such a grouping -@@ -1352,6 +1438,9 @@ linux_nat_create_inferior (struct target_ops *ops, - int personality_orig = 0, personality_set = 0; - #endif /* HAVE_PERSONALITY */ - -+ /* We are sarting, so we still have not passed through our entrypoint. */ -+ linux_passed_by_entrypoint_flag = 0; -+ - /* The fork_child mechanism is synchronous and calls target_wait, so - we have to mask the async mode. */ - -@@ -1996,6 +2085,26 @@ linux_handle_extended_wait (struct lwp_info *lp, int status, - return 0; - } - -+ /* Used for 'catch syscall' feature. */ -+ if (WSTOPSIG (status) == TRAP_IS_SYSCALL) +- return lookup_symbol (copy, 0, STRUCT_DOMAIN, 0); ++ sym = lookup_symbol (copy, 0, STRUCT_DOMAIN, 0); ++ if (sym == NULL) + { -+ if (catch_syscall_enabled () == 0) -+ ourstatus->kind = TARGET_WAITKIND_IGNORE; -+ else -+ { -+ struct regcache *regcache = get_thread_regcache (lp->ptid); -+ struct gdbarch *gdbarch = get_regcache_arch (regcache); -+ -+ ourstatus->kind = -+ (lp->syscall_state == TARGET_WAITKIND_SYSCALL_ENTRY) ? -+ TARGET_WAITKIND_SYSCALL_RETURN : TARGET_WAITKIND_SYSCALL_ENTRY; -+ lp->syscall_state = ourstatus->kind; -+ ourstatus->value.syscall_number = -+ (int) gdbarch_get_syscall_number (gdbarch, lp->ptid); -+ } -+ return 0; ++ /* Typedefs are in VAR_DOMAIN so the above symbol lookup will ++ fail when the user attempts to lookup a method of a class ++ via a typedef'd name (NOT via the classes name, which is already ++ handled in symbol_matches_domain). So try the lookup again ++ using VAR_DOMAIN (where typedefs live) and double-check that we ++ found a struct/class type. */ ++ struct symbol *s = lookup_symbol (copy, 0, VAR_DOMAIN, 0); ++ if (s != NULL) ++ { ++ struct type *t = SYMBOL_TYPE (s); ++ CHECK_TYPEDEF (t); ++ if (TYPE_CODE (t) == TYPE_CODE_STRUCT) ++ return s; ++ } + } + - internal_error (__FILE__, __LINE__, - _("unknown ptrace event %d"), event); ++ return sym; } -@@ -2606,11 +2715,16 @@ linux_nat_filter_event (int lwpid, int status, int options) - } - /* Save the trap's siginfo in case we need it later. */ -- if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP) -+ if (WIFSTOPPED (status) -+ && (WSTOPSIG (status) == SIGTRAP || WSTOPSIG (status) == TRAP_IS_SYSCALL)) - save_siginfo (lp); - -- /* Handle GNU/Linux's extended waitstatus for trace events. */ -- if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0) -+ /* Handle GNU/Linux's extended waitstatus for trace events. -+ It is necessary to check if WSTOPSIG is signaling a that -+ the inferior is entering/exiting a system call. */ -+ if (WIFSTOPPED (status) -+ && ((WSTOPSIG (status) == TRAP_IS_SYSCALL) -+ || (WSTOPSIG (status) == SIGTRAP && status >> 16 != 0))) - { - if (debug_linux_nat) - fprintf_unfiltered (gdb_stdlog, -@@ -4262,12 +4376,14 @@ linux_target_install_ops (struct target_ops *t) - t->to_insert_fork_catchpoint = linux_child_insert_fork_catchpoint; - t->to_insert_vfork_catchpoint = linux_child_insert_vfork_catchpoint; - t->to_insert_exec_catchpoint = linux_child_insert_exec_catchpoint; -+ t->to_set_syscall_catchpoint = linux_child_set_syscall_catchpoint; - t->to_pid_to_exec_file = linux_child_pid_to_exec_file; - t->to_post_startup_inferior = linux_child_post_startup_inferior; - t->to_post_attach = linux_child_post_attach; - t->to_follow_fork = linux_child_follow_fork; - t->to_find_memory_regions = linux_nat_find_memory_regions; - t->to_make_corefile_notes = linux_nat_make_corefile_notes; -+ t->to_passed_by_entrypoint = linux_passed_by_entrypoint; - - super_xfer_partial = t->to_xfer_partial; - t->to_xfer_partial = linux_xfer_partial; -diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h -index fec5139..36d2439 100644 ---- a/gdb/linux-nat.h -+++ b/gdb/linux-nat.h -@@ -70,6 +70,13 @@ struct lwp_info - or to a local variable in lin_lwp_wait. */ - struct target_waitstatus waitstatus; - -+ /* Signal wether we are in a SYSCALL_ENTRY or -+ in a SYSCALL_RETURN event. -+ Values: -+ - TARGET_WAITKIND_SYSCALL_ENTRY -+ - TARGET_WAITKIND_SYSCALL_RETURN */ -+ int syscall_state; -+ - /* Next LWP in list. */ - struct lwp_info *next; - }; -diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c -index e18e134..d44b505 100644 ---- a/gdb/linux-tdep.c -+++ b/gdb/linux-tdep.c -@@ -20,6 +20,8 @@ - #include "defs.h" - #include "gdbtypes.h" - #include "linux-tdep.h" -+#include "xml-syscall.h" -+#include "target.h" - - /* This function is suitable for architectures that don't - extend/override the standard siginfo structure. */ -@@ -137,3 +139,81 @@ linux_get_siginfo_type (struct gdbarch *gdbarch) - - return siginfo_type; - } -+ -+/* Structure used to store information about the available syscalls in -+ the system. */ -+static const struct syscalls_info *sysinfo = NULL; -+ -+/* A flag to tell if we already initialized the structure above. */ -+static int have_initialized_sysinfo = 0; -+ -+/* The filename of the syscall's XML. */ -+static const char *xml_syscall_file = NULL; -+ -+/* Initializes the syscalls_info structure according to the -+ architecture. */ -+static void -+init_sysinfo (struct gdbarch *gdbarch) -+{ -+ /* Did we already try to initialize the structure? */ -+ if (have_initialized_sysinfo) -+ return; -+ -+ if (xml_syscall_file == NULL) -+ xml_syscall_file = gdbarch_xml_syscall_filename (gdbarch); -+ -+ sysinfo = xml_init_syscalls_info (xml_syscall_file); -+ -+ have_initialized_sysinfo = 1; -+ -+ if (sysinfo == NULL) -+ { -+ if (xml_syscall_file) -+ /* The initialization failed. Let's show a warning -+ message to the user (just this time) and leave. */ -+ warning (_("Could not load the syscall XML file '%s'.\n\ -+GDB will not be able to display syscall names."), xml_syscall_file); -+ else -+ /* There's no file to open. Let's warn the user. */ -+ warning (_("There is no XML file to open.\n\ -+GDB will not be able to display syscall names.")); -+ } -+} -+ -+static void -+linux_get_syscall_by_number (struct gdbarch *gdbarch, -+ int syscall_number, -+ struct syscall *s) -+{ -+ init_sysinfo (gdbarch); -+ -+ s->number = syscall_number; -+ s->name = xml_get_syscall_name (sysinfo, syscall_number); -+} -+ -+static void -+linux_get_syscall_by_name (struct gdbarch *gdbarch, -+ const char *syscall_name, -+ struct syscall *s) -+{ -+ init_sysinfo (gdbarch); -+ -+ s->number = xml_get_syscall_number (sysinfo, syscall_name); -+ s->name = syscall_name; -+} -+ -+static const char ** -+linux_get_syscall_names (struct gdbarch *gdbarch) -+{ -+ init_sysinfo (gdbarch); -+ -+ return xml_list_of_syscalls (sysinfo); -+} -+ -+void -+linux_tdep_init (struct gdbarch *gdbarch) -+{ -+ set_gdbarch_get_syscall_by_number (gdbarch, linux_get_syscall_by_number); -+ set_gdbarch_get_syscall_by_name (gdbarch, linux_get_syscall_by_name); -+ set_gdbarch_get_syscall_names (gdbarch, linux_get_syscall_names); -+} -diff --git a/gdb/linux-tdep.h b/gdb/linux-tdep.h -index 50af511..1e1e541 100644 ---- a/gdb/linux-tdep.h -+++ b/gdb/linux-tdep.h -@@ -22,4 +22,6 @@ - - struct type *linux_get_siginfo_type (struct gdbarch *); - -+extern void linux_tdep_init (struct gdbarch *gdbarch); -+ - #endif /* linux-tdep.h */ + /* This finds the method COPY in the class whose type is T and whose +@@ -1781,7 +1835,7 @@ symbol_found (int funfirstline, char ***canonical, char *copy, + { + struct blockvector *bv = BLOCKVECTOR (SYMBOL_SYMTAB (sym)); + struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); +- if (lookup_block_symbol (b, copy, NULL, VAR_DOMAIN) != NULL) ++ if (lookup_block_symbol (b, copy, VAR_DOMAIN) != NULL) + build_canonical_line_spec (values.sals, copy, canonical); + } + return values; diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c -index 9e4bb1b..9ca3ae1 100644 +index 88c7e5e..2d0b3ca 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c -@@ -29,8 +29,8 @@ - #include "valprint.h" - - extern void _initialize_m2_language (void); --static void m2_printchar (int, struct ui_file *); --static void m2_emit_char (int, struct ui_file *, int); -+static void m2_printchar (int, struct type *, struct ui_file *); -+static void m2_emit_char (int, struct type *, struct ui_file *, int); - - /* Print the character C on STREAM as part of the contents of a literal - string whose delimiter is QUOTER. Note that that format for printing -@@ -39,7 +39,7 @@ static void m2_emit_char (int, struct ui_file *, int); - be replaced with a true Modula version. */ - - static void --m2_emit_char (int c, struct ui_file *stream, int quoter) -+m2_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) +@@ -356,6 +356,7 @@ const struct exp_descriptor exp_descriptor_modula2 = { - - c &= 0xFF; /* Avoid sign bit follies */ -@@ -88,10 +88,10 @@ m2_emit_char (int c, struct ui_file *stream, int quoter) - be replaced with a true Modula version. */ - - static void --m2_printchar (int c, struct ui_file *stream) -+m2_printchar (int c, struct type *type, struct ui_file *stream) - { - fputs_filtered ("'", stream); -- LA_EMIT_CHAR (c, stream, '\''); -+ LA_EMIT_CHAR (c, type, stream, '\''); - fputs_filtered ("'", stream); - } - -@@ -103,14 +103,15 @@ m2_printchar (int c, struct ui_file *stream) - be replaced with a true Modula version. */ - - static void --m2_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+m2_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, -+ unsigned int length, int force_ellipses, - const struct value_print_options *options) - { - unsigned int i; - unsigned int things_printed = 0; - int in_quotes = 0; - int need_comma = 0; -+ int width = TYPE_LENGTH (type); - - if (length == 0) - { -@@ -152,7 +153,7 @@ m2_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("\", ", stream); - in_quotes = 0; - } -- m2_printchar (string[i], stream); -+ m2_printchar (string[i], type, stream); - fprintf_filtered (stream, " ", reps); - i = rep1 - 1; - things_printed += options->repeat_count_threshold; -@@ -168,7 +169,7 @@ m2_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("\"", stream); - in_quotes = 1; - } -- LA_EMIT_CHAR (string[i], stream, '"'); -+ LA_EMIT_CHAR (string[i], type, stream, '"'); - ++things_printed; - } - } -diff --git a/gdb/m2-valprint.c b/gdb/m2-valprint.c -index 71c410c..41fb8fe 100644 ---- a/gdb/m2-valprint.c -+++ b/gdb/m2-valprint.c -@@ -237,7 +237,8 @@ print_unpacked_pointer (struct type *type, - && TYPE_CODE (elttype) == TYPE_CODE_INT - && (options->format == 0 || options->format == 's') - && addr != 0) -- return val_print_string (addr, -1, TYPE_LENGTH (elttype), stream, options); -+ return val_print_string (TYPE_TARGET_TYPE (type), addr, -1, -+ stream, options); - - return 0; - } -@@ -294,7 +295,7 @@ m2_print_array_contents (struct type *type, const gdb_byte *valaddr, - || ((current_language->la_language == language_m2) - && (TYPE_CODE (type) == TYPE_CODE_CHAR))) - && (options->format == 0 || options->format == 's')) -- val_print_string (address, len+1, eltlen, stream, options); -+ val_print_string (type, address, len+1, stream, options); - else - { - fprintf_filtered (stream, "{"); -@@ -359,7 +360,8 @@ m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - len = temp_len; - } - -- LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0, -+ LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type), -+ valaddr + embedded_offset, len, 0, - options); - i = len; - } -@@ -547,7 +549,7 @@ m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - else - fprintf_filtered (stream, "%d", (int) val); - fputs_filtered (" ", stream); -- LA_PRINT_CHAR ((unsigned char) val, stream); -+ LA_PRINT_CHAR ((unsigned char) val, type, stream); - } - break; - -diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c -index 5f4b9a6..eccfe31 100644 ---- a/gdb/m32r-tdep.c -+++ b/gdb/m32r-tdep.c -@@ -713,7 +713,7 @@ m32r_push_dummy_call (struct gdbarch *gdbarch, struct value *function, - if (len > 8 - && (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)) - { -- store_unsigned_integer (valbuf, 4, VALUE_ADDRESS (args[argnum])); -+ store_unsigned_integer (valbuf, 4, value_address (args[argnum])); - typecode = TYPE_CODE_PTR; - len = 4; - val = valbuf; -diff --git a/gdb/macroexp.c b/gdb/macroexp.c -index f0a8c1f..752a939 100644 ---- a/gdb/macroexp.c -+++ b/gdb/macroexp.c -@@ -23,6 +23,7 @@ - #include "macrotab.h" - #include "macroexp.h" - #include "gdb_assert.h" -+#include "c-lang.h" - - - -@@ -320,14 +321,17 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end) - way GDB's C/C++ lexer does. So we call parse_escape in utils.c - to handle escape sequences. */ - if ((p + 1 <= end && *p == '\'') -- || (p + 2 <= end && p[0] == 'L' && p[1] == '\'')) -+ || (p + 2 <= end -+ && (p[0] == 'L' || p[0] == 'u' || p[0] == 'U') -+ && p[1] == '\'')) - { - char *tok_start = p; - char *body_start; -+ int char_count = 0; - - if (*p == '\'') - p++; -- else if (*p == 'L') -+ else if (*p == 'L' || *p == 'u' || *p == 'U') - p += 2; - else - gdb_assert (0); -@@ -339,7 +343,7 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end) - error (_("Unmatched single quote.")); - else if (*p == '\'') - { -- if (p == body_start) -+ if (!char_count) - error (_("A character constant must contain at least one " - "character.")); - p++; -@@ -348,10 +352,13 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end) - else if (*p == '\\') - { - p++; -- parse_escape (&p); -+ char_count += c_parse_escape (&p, NULL); - } - else -- p++; -+ { -+ p++; -+ char_count++; -+ } - } - - set_token (tok, tok_start, p); -@@ -370,16 +377,16 @@ static int - get_string_literal (struct macro_buffer *tok, char *p, char *end) - { - if ((p + 1 <= end -- && *p == '\"') -+ && *p == '"') - || (p + 2 <= end -- && p[0] == 'L' -- && p[1] == '\"')) -+ && (p[0] == 'L' || p[0] == 'u' || p[0] == 'U') -+ && p[1] == '"')) - { - char *tok_start = p; - -- if (*p == '\"') -+ if (*p == '"') - p++; -- else if (*p == 'L') -+ else if (*p == 'L' || *p == 'u' || *p == 'U') - p += 2; - else - gdb_assert (0); -@@ -388,7 +395,7 @@ get_string_literal (struct macro_buffer *tok, char *p, char *end) - { - if (p >= end) - error (_("Unterminated string in expression.")); -- else if (*p == '\"') -+ else if (*p == '"') - { - p++; - break; -@@ -399,7 +406,7 @@ get_string_literal (struct macro_buffer *tok, char *p, char *end) - else if (*p == '\\') - { - p++; -- parse_escape (&p); -+ c_parse_escape (&p, NULL); - } - else - p++; + print_subexp_standard, + operator_length_standard, ++ operator_check_standard, + op_name_standard, + dump_subexp_body_standard, + evaluate_subexp_modula2 +diff --git a/gdb/machoread.c b/gdb/machoread.c +index 5f9a0fe..66fa067 100644 +--- a/gdb/machoread.c ++++ b/gdb/machoread.c +@@ -681,6 +681,7 @@ static struct sym_fns macho_sym_fns = { + macho_new_init, /* sym_new_init: init anything gbl to entire symtab */ + macho_symfile_init, /* sym_init: read initial info, setup for sym_read() */ + macho_symfile_read, /* sym_read: read a symbol file into symtab */ ++ NULL, /* sym_read_psymbols */ + macho_symfile_finish, /* sym_finish: finished with file, cleanup */ + macho_symfile_offsets, /* sym_offsets: xlate external to internal form */ + NULL /* next: pointer to next struct sym_fns */ diff --git a/gdb/main.c b/gdb/main.c -index 5d4640b..6f9e61b 100644 +index 8b66f78..ddeab6f 100644 --- a/gdb/main.c +++ b/gdb/main.c -@@ -40,6 +40,8 @@ +@@ -40,6 +40,7 @@ #include "interps.h" #include "main.h" +#include "python/python.h" -+ + #include "source.h" + /* If nonzero, display time usage both at startup and for each command. */ - - int display_time; -@@ -62,6 +64,9 @@ int dbx_commands = 0; - /* System root path, used to find libraries etc. */ - char *gdb_sysroot = 0; - -+/* GDB datadir, used to store data files. */ -+char *gdb_datadir = 0; -+ - struct ui_file *gdb_stdout; - struct ui_file *gdb_stderr; - struct ui_file *gdb_stdlog; -@@ -211,6 +216,8 @@ captured_main (void *data) +@@ -259,6 +260,8 @@ captured_main (void *data) char *cdarg = NULL; char *ttyarg = NULL; @@ -22860,48 +10035,7 @@ index 5d4640b..6f9e61b 100644 /* These are static so that we can take their address in an initializer. */ static int print_help; static int print_version; -@@ -357,6 +364,40 @@ captured_main (void *data) - } - } - -+#ifdef GDB_DATADIR_RELOCATABLE -+ gdb_datadir = make_relative_prefix (argv[0], BINDIR, GDB_DATADIR); -+ if (gdb_datadir) -+ { -+ struct stat s; -+ int res = 0; -+ -+ if (stat (gdb_datadir, &s) == 0) -+ if (S_ISDIR (s.st_mode)) -+ res = 1; -+ -+ if (res == 0) -+ { -+ xfree (gdb_datadir); -+ gdb_datadir = xstrdup (GDB_DATADIR); -+ } -+ } -+ else -+ gdb_datadir = xstrdup (GDB_DATADIR); -+#else -+ gdb_datadir = xstrdup (GDB_DATADIR); -+#endif /* GDB_DATADIR_RELOCATABLE */ -+ -+ /* Canonicalize the GDB's datadir path. */ -+ if (*gdb_datadir) -+ { -+ char *canon_debug = lrealpath (gdb_datadir); -+ if (canon_debug) -+ { -+ xfree (gdb_datadir); -+ gdb_datadir = canon_debug; -+ } -+ } -+ - get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit); - - /* There will always be an interpreter. Either the one passed into -@@ -441,10 +482,14 @@ captured_main (void *data) +@@ -434,10 +437,14 @@ captured_main (void *data) {"args", no_argument, &set_args, 1}, {"l", required_argument, 0, 'l'}, {"return-child-result", no_argument, &return_child_result, 1}, @@ -22917,7 +10051,7 @@ index 5d4640b..6f9e61b 100644 { int option_index; -@@ -462,6 +507,9 @@ captured_main (void *data) +@@ -455,6 +462,9 @@ captured_main (void *data) case 0: /* Long option that just sets a flag. */ break; @@ -22927,7 +10061,7 @@ index 5d4640b..6f9e61b 100644 case OPT_SE: symarg = optarg; execarg = optarg; -@@ -638,7 +686,31 @@ extern int gdbtk_test (char *); +@@ -631,7 +641,31 @@ extern int gdbtk_test (char *); use_windows = 0; } @@ -22960,7 +10094,7 @@ index 5d4640b..6f9e61b 100644 { /* The remaining options are the command-line options for the inferior. The first one is the sym/exec file, and the rest -@@ -866,7 +938,8 @@ Can't attach to process and specify a core file at the same time.")); +@@ -864,7 +898,8 @@ Can't attach to process and specify a core file at the same time.")); xfree (cmdarg); /* Read in the old history after all the command files have been read. */ @@ -22970,7 +10104,7 @@ index 5d4640b..6f9e61b 100644 if (batch) { -@@ -895,13 +968,25 @@ Can't attach to process and specify a core file at the same time.")); +@@ -893,13 +928,25 @@ Can't attach to process and specify a core file at the same time.")); #endif } @@ -23002,7 +10136,7 @@ index 5d4640b..6f9e61b 100644 } /* No exit -- exit is through quit_command. */ } -@@ -933,7 +1018,12 @@ print_gdb_help (struct ui_file *stream) +@@ -931,7 +978,12 @@ print_gdb_help (struct ui_file *stream) fputs_unfiltered (_("\ This is the GNU debugger. Usage:\n\n\ gdb [options] [executable-file [core-file or process-id]]\n\ @@ -23016,7 +10150,7 @@ index 5d4640b..6f9e61b 100644 Options:\n\n\ "), stream); fputs_unfiltered (_("\ -@@ -971,7 +1061,13 @@ Options:\n\n\ +@@ -969,7 +1021,13 @@ Options:\n\n\ --nw Do not use a window interface.\n\ --nx Do not read "), stream); fputs_unfiltered (gdbinit, stream); @@ -23032,10 +10166,10 @@ index 5d4640b..6f9e61b 100644 --readnow Fully read symbol files on first access.\n\ "), stream); diff --git a/gdb/maint.c b/gdb/maint.c -index 56cafe9..1b57ff5 100644 +index ecbae12..80fc36e 100644 --- a/gdb/maint.c +++ b/gdb/maint.c -@@ -906,4 +906,12 @@ When enabled GDB is profiled."), +@@ -914,4 +914,12 @@ When enabled GDB is profiled."), show_maintenance_profile_p, &maintenance_set_cmdlist, &maintenance_show_cmdlist); @@ -23049,10 +10183,10 @@ index 56cafe9..1b57ff5 100644 + &maintenance_show_cmdlist); } diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c -index 7cbcc59..e507c3b 100644 +index aac82e9..626292c 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c -@@ -4696,7 +4696,7 @@ new_type (char *name) +@@ -4802,7 +4802,7 @@ new_type (char *name) { struct type *t; @@ -23062,173 +10196,176 @@ index 7cbcc59..e507c3b 100644 TYPE_CPLUS_SPECIFIC (t) = (struct cplus_struct_type *) &cplus_struct_default; return t; diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c -index 143074b..0f4efba 100644 +index 0cf03d9..89936d2 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c -@@ -249,6 +249,41 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) - } - - void -+mi_cmd_var_set_visualizer (char *command, char **argv, int argc) -+{ -+ struct varobj *var; -+ -+ if (argc != 2) -+ error ("Usage: NAME VISUALIZER_FUNCTION."); -+ -+ var = varobj_get_handle (argv[0]); -+ -+ if (var == NULL) -+ error ("Variable object not found"); -+ -+ varobj_set_visualizer (var, argv[1]); -+} -+ -+void -+mi_cmd_var_set_child_range (char *command, char **argv, int argc) -+{ -+ struct varobj *var; -+ int from, to; -+ -+ if (argc != 3) -+ error (_("-var-set-child-range: NAME FROM TO")); -+ -+ var = varobj_get_handle (argv[0]); -+ if (var == NULL) -+ error (_("Variable object not found")); -+ -+ from = atoi (argv[1]); -+ to = atoi (argv[2]); -+ -+ varobj_set_child_range (var, from, to); -+} -+ -+void - mi_cmd_var_set_frozen (char *command, char **argv, int argc) - { - struct varobj *var; -@@ -369,6 +404,8 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) +@@ -369,28 +369,39 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) + struct varobj *var; + VEC(varobj_p) *children; + struct varobj *child; +- struct cleanup *cleanup_children; int numchild; enum print_values print_values; int ix; + int from, to; -+ char *display_hint; + char *display_hint; - if (argc != 1 && argc != 2) - error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME")); -@@ -388,14 +425,22 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) +- if (argc != 1 && argc != 2) +- error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME")); ++ if (argc < 1 || argc > 4) ++ error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME [FROM TO]")); + + /* Get varobj handle, if a valid var obj name was specified */ +- if (argc == 1) ++ if (argc == 1 || argc == 3) + var = varobj_get_handle (argv[0]); + else + var = varobj_get_handle (argv[1]); + ++ if (argc > 2) ++ { ++ from = atoi (argv[argc - 2]); ++ to = atoi (argv[argc - 1]); ++ varobj_set_child_range (var, from, to); ++ } ++ + children = varobj_list_children (var); + ui_out_field_int (uiout, "numchild", VEC_length (varobj_p, children)); +- if (argc == 2) ++ if (argc == 2 || argc == 4) + print_values = mi_parse_values_option (argv[0]); else print_values = PRINT_NO_VALUES; -- if (VEC_length (varobj_p, children) == 0) ++ /* Re-fetch the child range, because varobj_get_child_range computes ++ the real start and end indices for us. */ + varobj_get_child_range (var, children, &from, &to); -+ if (from >= to) - return; ++ + display_hint = varobj_get_display_hint (var); + if (display_hint) + { +@@ -398,21 +409,29 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) + xfree (display_hint); + } -+ display_hint = varobj_get_display_hint (var); -+ if (display_hint) -+ { -+ ui_out_field_string (uiout, "displayhint", display_hint); -+ xfree (display_hint); -+ } -+ - if (mi_version (uiout) == 1) - cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children"); - else - cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children"); +- if (VEC_length (varobj_p, children) == 0) +- return; +- +- if (mi_version (uiout) == 1) +- cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children"); +- else +- cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children"); - for (ix = 0; VEC_iterate (varobj_p, children, ix, child); ++ix) -+ for (ix = from; ix < to && VEC_iterate (varobj_p, children, ix, child); ++ix) ++ if (from < to) { - struct cleanup *cleanup_child; - cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); -@@ -662,6 +707,8 @@ varobj_update_one (struct varobj *var, enum print_values print_values, - - for (i = 0; VEC_iterate (varobj_update_result, changes, i, r); ++i) - { -+ char *display_hint; -+ - if (mi_version (uiout) > 1) - cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); - ui_out_field_string (uiout, "name", varobj_get_objname (r->varobj)); -@@ -695,6 +742,36 @@ varobj_update_one (struct varobj *var, enum print_values print_values, - ui_out_field_int (uiout, "new_num_children", - varobj_get_num_children (r->varobj)); - } -+ -+ display_hint = varobj_get_display_hint (var); -+ if (display_hint) +- struct cleanup *cleanup_child; +- cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); +- print_varobj (child, print_values, 1 /* print expression */); +- do_cleanups (cleanup_child); ++ struct cleanup *cleanup_children; ++ if (mi_version (uiout) == 1) ++ cleanup_children ++ = make_cleanup_ui_out_tuple_begin_end (uiout, "children"); ++ else ++ cleanup_children ++ = make_cleanup_ui_out_list_begin_end (uiout, "children"); ++ for (ix = from; ++ ix < to && VEC_iterate (varobj_p, children, ix, child); ++ ++ix) + { -+ ui_out_field_string (uiout, "displayhint", display_hint); -+ xfree (display_hint); ++ struct cleanup *cleanup_child; ++ cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); ++ print_varobj (child, print_values, 1 /* print expression */); ++ do_cleanups (cleanup_child); + } ++ do_cleanups (cleanup_children); + } +- do_cleanups (cleanup_children); + -+ if (r->children_changed) -+ { ++ ui_out_field_int (uiout, "has_more", ++ VEC_length (varobj_p, children) > to); + } + + void +@@ -644,7 +663,6 @@ mi_cmd_var_update (char *command, char **argv, int argc) + } + else + { +- /* Get varobj handle, if a valid var obj name was specified */ + struct varobj *var = varobj_get_handle (name); + + varobj_update_one (var, print_values, 1 /* explicit */); +@@ -714,14 +732,17 @@ varobj_update_one (struct varobj *var, enum print_values print_values, + + if (r->children_changed) + { +- int ix; + int ix, from, to; -+ struct varobj *child; -+ struct cleanup *cleanup = -+ make_cleanup_ui_out_list_begin_end (uiout, "children"); -+ -+ VEC (varobj_p)* children = varobj_list_children (r->varobj); + struct varobj *child; + struct cleanup *cleanup = + make_cleanup_ui_out_list_begin_end (uiout, "children"); + + VEC (varobj_p)* children = varobj_list_children (r->varobj); + varobj_get_child_range (r->varobj, children, &from, &to); -+ + +- for (ix = 0; VEC_iterate (varobj_p, children, ix, child); ++ix) + for (ix = from; + ix < to && VEC_iterate (varobj_p, children, ix, child); + ++ix) -+ { -+ struct cleanup *cleanup_child; -+ cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); -+ print_varobj (child, print_values, 1 /* print expression */); -+ do_cleanups (cleanup_child); -+ } + { + struct cleanup *cleanup_child; + cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); +@@ -730,6 +751,9 @@ varobj_update_one (struct varobj *var, enum print_values print_values, + } + + do_cleanups (cleanup); + -+ do_cleanups (cleanup); -+ } ++ ui_out_field_int (uiout, "has_more", ++ VEC_length (varobj_p, children) > to); + } if (mi_version (uiout) > 1) - do_cleanups (cleanup); +@@ -737,3 +761,11 @@ varobj_update_one (struct varobj *var, enum print_values print_values, + } + VEC_free (varobj_update_result, changes); + } ++ ++void ++mi_cmd_enable_pretty_printing (char *command, char **argv, int argc) ++{ ++ if (argc != 0) ++ error (_("mi_cmd_enable_pretty_printing: no arguments allowed")); ++ varobj_enable_pretty_printing (); ++} diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c -index 2610b6a..f31233b 100644 +index 4911146..772566e 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c -@@ -160,7 +160,9 @@ struct mi_cmd mi_cmds[] = - { "var-info-num-children", { NULL, 0 }, mi_cmd_var_info_num_children}, - { "var-info-type", { NULL, 0 }, mi_cmd_var_info_type}, - { "var-list-children", { NULL, 0 }, mi_cmd_var_list_children}, -+ { "var-set-child-range", { NULL, 0 }, mi_cmd_var_set_child_range }, - { "var-set-format", { NULL, 0 }, mi_cmd_var_set_format}, -+ { "var-set-visualizer", { NULL, 0 }, mi_cmd_var_set_visualizer}, - { "var-set-frozen", { NULL, 0 }, mi_cmd_var_set_frozen}, - { "var-show-attributes", { NULL, 0 }, mi_cmd_var_show_attributes}, - { "var-show-format", { NULL, 0 }, mi_cmd_var_show_format}, +@@ -51,6 +51,7 @@ struct mi_cmd mi_cmds[] = + { "data-write-memory", { NULL, 0 }, mi_cmd_data_write_memory}, + { "data-write-register-values", { NULL, 0 }, mi_cmd_data_write_register_values}, + { "enable-timings", { NULL, 0 }, mi_cmd_enable_timings}, ++ { "enable-pretty-printing", { NULL, 0 }, mi_cmd_enable_pretty_printing}, + { "environment-cd", { NULL, 0 }, mi_cmd_env_cd}, + { "environment-directory", { NULL, 0 }, mi_cmd_env_dir}, + { "environment-path", { NULL, 0 }, mi_cmd_env_path}, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h -index 39f16fb..291a07f 100644 +index afcba1e..79798ef 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h -@@ -92,7 +92,9 @@ extern mi_cmd_argv_ftype mi_cmd_var_info_num_children; - extern mi_cmd_argv_ftype mi_cmd_var_info_type; - extern mi_cmd_argv_ftype mi_cmd_var_list_children; - extern mi_cmd_argv_ftype mi_cmd_var_set_format; -+extern mi_cmd_argv_ftype mi_cmd_var_set_child_range; - extern mi_cmd_argv_ftype mi_cmd_var_set_frozen; -+extern mi_cmd_argv_ftype mi_cmd_var_set_visualizer; +@@ -98,6 +98,7 @@ extern mi_cmd_argv_ftype mi_cmd_var_set_visualizer; extern mi_cmd_argv_ftype mi_cmd_var_show_attributes; extern mi_cmd_argv_ftype mi_cmd_var_show_format; extern mi_cmd_argv_ftype mi_cmd_var_update; ++extern mi_cmd_argv_ftype mi_cmd_enable_pretty_printing; + + /* Description of a single command. */ + diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c -index b905a9e..eaa5f12 100644 +index 6aa1d08..448d10a 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c -@@ -777,7 +777,7 @@ mi_cmd_data_evaluate_expression (char *command, char **argv, int argc) - get_user_print_options (&opts); - opts.deref_ref = 0; - val_print (value_type (val), value_contents (val), -- value_embedded_offset (val), VALUE_ADDRESS (val), -+ value_embedded_offset (val), value_address (val), - stb->stream, 0, &opts, current_language); - - ui_out_field_stream (uiout, "value", stb); -@@ -1101,6 +1101,10 @@ mi_cmd_list_features (char *command, char **argv, int argc) +@@ -1130,6 +1130,10 @@ mi_cmd_list_features (char *command, char **argv, int argc) ui_out_field_string (uiout, NULL, "frozen-varobjs"); ui_out_field_string (uiout, NULL, "pending-breakpoints"); ui_out_field_string (uiout, NULL, "thread-info"); @@ -23237,101 +10374,16 @@ index b905a9e..eaa5f12 100644 + ui_out_field_string (uiout, NULL, "python"); +#endif - do_cleanups (cleanup); - return; -@@ -1317,6 +1321,7 @@ mi_cmd_execute (struct mi_parse *parse) - struct cleanup *cleanup; + #if HAVE_PYTHON + ui_out_field_string (uiout, NULL, "python"); +@@ -1354,6 +1358,7 @@ mi_cmd_execute (struct mi_parse *parse) int i; + free_all_values (); + free_all_types (); + cleanup = make_cleanup (null_cleanup, NULL); - current_token = xstrdup (parse->token); - cleanup = make_cleanup (free_current_contents, ¤t_token); -diff --git a/gdb/minsyms.c b/gdb/minsyms.c -index bf776b3..e4b0f31 100644 ---- a/gdb/minsyms.c -+++ b/gdb/minsyms.c -@@ -48,6 +48,8 @@ - #include "value.h" - #include "cp-abi.h" - #include "target.h" -+#include "cp-support.h" -+#include "language.h" - - /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE. - At the end, copy them all into one newly allocated location on an objfile's -@@ -187,6 +189,9 @@ lookup_minimal_symbol (const char *name, const char *sfile, - unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; - unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE; - -+ int needtofreename = 0; -+ const char *modified_name; -+ - if (sfile != NULL) - { - char *p = strrchr (sfile, '/'); -@@ -194,6 +199,18 @@ lookup_minimal_symbol (const char *name, const char *sfile, - sfile = p + 1; - } - -+ /* For C++, canonicalize the input name. */ -+ modified_name = name; -+ if (current_language->la_language == language_cplus) -+ { -+ char *cname = cp_canonicalize_string (name); -+ if (cname) -+ { -+ modified_name = cname; -+ needtofreename = 1; -+ } -+ } -+ - for (objfile = object_files; - objfile != NULL && found_symbol == NULL; - objfile = objfile->next) -@@ -218,9 +235,16 @@ lookup_minimal_symbol (const char *name, const char *sfile, - int match; - - if (pass == 1) -- match = strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0; -+ { -+ match = strcmp (SYMBOL_LINKAGE_NAME (msymbol), -+ modified_name) == 0; -+ } - else -- match = SYMBOL_MATCHES_SEARCH_NAME (msymbol, name); -+ { -+ match = SYMBOL_MATCHES_SEARCH_NAME (msymbol, -+ modified_name); -+ } -+ - if (match) - { - switch (MSYMBOL_TYPE (msymbol)) -@@ -259,6 +283,10 @@ lookup_minimal_symbol (const char *name, const char *sfile, - } - } - } -+ -+ if (needtofreename) -+ xfree ((void *) modified_name); -+ - /* External symbols are best. */ - if (found_symbol) - return found_symbol; -diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c -index 6c8c4c0..7d283a4 100644 ---- a/gdb/mips-tdep.c -+++ b/gdb/mips-tdep.c -@@ -2757,7 +2757,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function, - if (len > regsize - && (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)) - { -- store_unsigned_integer (valbuf, regsize, VALUE_ADDRESS (arg)); -+ store_unsigned_integer (valbuf, regsize, value_address (arg)); - typecode = TYPE_CODE_PTR; - len = regsize; - val = valbuf; + if (parse->frame != -1 && parse->thread == -1) diff --git a/gdb/mipsread.c b/gdb/mipsread.c index a84003f..924c1c5 100644 --- a/gdb/mipsread.c @@ -23344,87 +10396,33 @@ index a84003f..924c1c5 100644 mipscoff_symfile_finish, /* sym_finish: finished with file, cleanup */ default_symfile_offsets, /* sym_offsets: dummy FIXME til implem sym reloc */ default_symfile_segments, /* sym_segments: Get segment information from -diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c -index f0cea27..02be43a 100644 ---- a/gdb/mn10300-tdep.c -+++ b/gdb/mn10300-tdep.c -@@ -1027,7 +1027,7 @@ mn10300_push_dummy_call (struct gdbarch *gdbarch, - /* Change to pointer-to-type. */ - arg_len = push_size; - store_unsigned_integer (valbuf, push_size, -- VALUE_ADDRESS (*args)); -+ value_address (*args)); - val = &valbuf[0]; - } - else -diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c -index a6c74a3..9b8d801 100644 ---- a/gdb/objc-lang.c -+++ b/gdb/objc-lang.c -@@ -280,7 +280,7 @@ objc_demangle (const char *mangled, int options) - for printing characters and strings is language specific. */ - - static void --objc_emit_char (int c, struct ui_file *stream, int quoter) -+objc_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) - { - - c &= 0xFF; /* Avoid sign bit follies. */ -@@ -326,10 +326,10 @@ objc_emit_char (int c, struct ui_file *stream, int quoter) - } - - static void --objc_printchar (int c, struct ui_file *stream) -+objc_printchar (int c, struct type *type, struct ui_file *stream) - { - fputs_filtered ("'", stream); -- objc_emit_char (c, stream, '\''); -+ objc_emit_char (c, type, stream, '\''); - fputs_filtered ("'", stream); - } - -@@ -340,14 +340,16 @@ objc_printchar (int c, struct ui_file *stream) - FORCE_ELLIPSES. */ - - static void --objc_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+objc_printstr (struct ui_file *stream, struct type *type, -+ const gdb_byte *string, unsigned int length, -+ int force_ellipses, - const struct value_print_options *options) - { - unsigned int i; - unsigned int things_printed = 0; - int in_quotes = 0; - int need_comma = 0; -+ int width = TYPE_LENGTH (type); - - /* If the string was not truncated due to `set print elements', and - the last byte of it is a null, we don't print that, in -@@ -395,7 +397,7 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("\", ", stream); - in_quotes = 0; - } -- objc_printchar (string[i], stream); -+ objc_printchar (string[i], type, stream); - fprintf_filtered (stream, " ", reps); - i = rep1 - 1; - things_printed += options->repeat_count_threshold; -@@ -411,7 +413,7 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("\"", stream); - in_quotes = 1; - } -- objc_emit_char (string[i], stream, '"'); -+ objc_emit_char (string[i], type, stream, '"'); - ++things_printed; - } - } diff --git a/gdb/objfiles.c b/gdb/objfiles.c -index bc77de8..079ebcf 100644 +index c983b11..2ac1bd1 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c -@@ -691,6 +691,20 @@ have_partial_symbols (void) +@@ -433,9 +433,8 @@ free_objfile (struct objfile *objfile) + objfile->separate_debug_objfile_backlink->separate_debug_objfile = NULL; + } + +- /* Remove any references to this objfile in the global value +- lists. */ +- preserve_values (objfile); ++ /* Remove any references to this objfile in the global value lists. */ ++ observer_notify_objfile_unloading (objfile); + + /* First do any symbol file specific actions required when we are + finished with a particular symbol file. Note that if the objfile +@@ -473,6 +472,9 @@ free_objfile (struct objfile *objfile) + if (objfile == rt_common_objfile) + rt_common_objfile = NULL; + ++ if (objfile == symfile_objfile) ++ symfile_objfile = NULL; ++ + /* Before the symbol table code was redone to make it easier to + selectively load and remove information particular to a specific + linkage unit, gdb used to do these things whenever the monolithic +@@ -723,6 +725,20 @@ have_partial_symbols (void) return 1; } } @@ -23445,8 +10443,30 @@ index bc77de8..079ebcf 100644 return 0; } +@@ -1020,3 +1036,21 @@ objfiles_changed (void) + { + objfiles_changed_p = 1; /* Rebuild section map next time we need it. */ + } ++ ++/* Return non-zero if A and B point to the same OBJFILE, ignoring any binary ++ vs. debuginfo variants of the pointers. If either A or B is NULL return ++ zero as not a match. */ ++ ++int ++matching_objfiles (struct objfile *a, struct objfile *b) ++{ ++ if (a == NULL || b == NULL) ++ return 0; ++ ++ if (a->separate_debug_objfile_backlink) ++ a = a->separate_debug_objfile_backlink; ++ if (b->separate_debug_objfile_backlink) ++ b = b->separate_debug_objfile_backlink; ++ ++ return a == b; ++} diff --git a/gdb/objfiles.h b/gdb/objfiles.h -index 60d3143..b6fdd92 100644 +index 1857260..e421232 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -212,6 +212,11 @@ struct objfile @@ -23477,7 +10497,16 @@ index 60d3143..b6fdd92 100644 /* The object file that the main symbol table was loaded from (e.g. the argument to the "symbol-file" or "file" command). */ -@@ -556,6 +570,13 @@ extern void *objfile_data (struct objfile *objfile, +@@ -499,6 +513,8 @@ extern struct obj_section *find_pc_section (CORE_ADDR pc); + + extern int in_plt_section (CORE_ADDR, char *); + ++extern int matching_objfiles (struct objfile *a, struct objfile *b); ++ + /* Keep a registry of per-objfile data-pointers required by other GDB + modules. */ + +@@ -558,6 +574,13 @@ extern void *objfile_data (struct objfile *objfile, ALL_OBJFILES (objfile) \ ALL_OBJFILE_PSYMTABS (objfile, p) @@ -23491,322 +10520,19 @@ index 60d3143..b6fdd92 100644 /* Traverse all minimal symbols in all objfiles. */ #define ALL_MSYMBOLS(objfile, m) \ -diff --git a/gdb/p-lang.c b/gdb/p-lang.c -index 41da3e0..e743a6f 100644 ---- a/gdb/p-lang.c -+++ b/gdb/p-lang.c -@@ -97,7 +97,8 @@ pascal_main_name (void) - but this does not happen for Free Pascal nor for GPC. */ - int - is_pascal_string_type (struct type *type,int *length_pos, -- int *length_size, int *string_pos, int *char_size, -+ int *length_size, int *string_pos, -+ struct type **char_type, - char **arrayname) - { - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) -@@ -114,8 +115,8 @@ is_pascal_string_type (struct type *type,int *length_pos, - *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)); - if (string_pos) - *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; -- if (char_size) -- *char_size = 1; -+ if (char_type) -+ *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 1)); - if (arrayname) - *arrayname = TYPE_FIELDS (type)[1].name; - return 2; -@@ -126,7 +127,6 @@ is_pascal_string_type (struct type *type,int *length_pos, - && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0 - && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0) - { -- struct type *char_type; - if (length_pos) - *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; - if (length_size) -@@ -134,13 +134,12 @@ is_pascal_string_type (struct type *type,int *length_pos, - if (string_pos) - *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT; - /* FIXME: how can I detect wide chars in GPC ?? */ -- char_type = TYPE_FIELD_TYPE (type,2); -- if (char_size && TYPE_CODE (char_type) == TYPE_CODE_ARRAY) -+ if (char_type) - { -- *char_size = TYPE_LENGTH (TYPE_TARGET_TYPE (char_type)); -+ *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2)); -+ if (TYPE_CODE (*char_type) == TYPE_CODE_ARRAY) -+ *char_type = TYPE_TARGET_TYPE (*char_type); - } -- else if (char_size) -- *char_size = 1; - if (arrayname) - *arrayname = TYPE_FIELDS (type)[2].name; - return 3; -@@ -182,14 +181,15 @@ pascal_one_char (int c, struct ui_file *stream, int *in_quotes) - } - } - --static void pascal_emit_char (int c, struct ui_file *stream, int quoter); -+static void pascal_emit_char (int c, struct type *type, -+ struct ui_file *stream, int quoter); - - /* Print the character C on STREAM as part of the contents of a literal - string whose delimiter is QUOTER. Note that that format for printing - characters and strings is language specific. */ - - static void --pascal_emit_char (int c, struct ui_file *stream, int quoter) -+pascal_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) - { - int in_quotes = 0; - pascal_one_char (c, stream, &in_quotes); -@@ -198,7 +198,7 @@ pascal_emit_char (int c, struct ui_file *stream, int quoter) - } - - void --pascal_printchar (int c, struct ui_file *stream) -+pascal_printchar (int c, struct type *type, struct ui_file *stream) - { - int in_quotes = 0; - pascal_one_char (c, stream, &in_quotes); -@@ -212,14 +212,16 @@ pascal_printchar (int c, struct ui_file *stream) - had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */ - - void --pascal_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+pascal_printstr (struct ui_file *stream, struct type *type, -+ const gdb_byte *string, unsigned int length, -+ int force_ellipses, - const struct value_print_options *options) - { - unsigned int i; - unsigned int things_printed = 0; - int in_quotes = 0; - int need_comma = 0; -+ int width = TYPE_LENGTH (type); - - /* If the string was not truncated due to `set print elements', and - the last byte of it is a null, we don't print that, in traditional C -@@ -273,7 +275,7 @@ pascal_printstr (struct ui_file *stream, const gdb_byte *string, - fputs_filtered ("', ", stream); - in_quotes = 0; - } -- pascal_printchar (current_char, stream); -+ pascal_printchar (current_char, type, stream); - fprintf_filtered (stream, " ", reps); - i = rep1 - 1; - things_printed += options->repeat_count_threshold; -diff --git a/gdb/p-lang.h b/gdb/p-lang.h -index 09a4569..2b2eb2d 100644 ---- a/gdb/p-lang.h -+++ b/gdb/p-lang.h -@@ -48,12 +48,13 @@ extern void pascal_type_print_method_args (char *, char *, - /* These are in p-lang.c: */ - - extern int -- is_pascal_string_type (struct type *, int *, int *, int *, int *, char **); -+ is_pascal_string_type (struct type *, int *, int *, int *, -+ struct type **, char **); - --extern void pascal_printchar (int, struct ui_file *); -+extern void pascal_printchar (int, struct type *, struct ui_file *); - --extern void pascal_printstr (struct ui_file *, const gdb_byte *, -- unsigned int, int, int, -+extern void pascal_printstr (struct ui_file *, struct type *, const gdb_byte *, -+ unsigned int, int, - const struct value_print_options *); - - extern struct type **const (pascal_builtin_types[]); -diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c -index 27ae619..29f0e6d 100644 ---- a/gdb/p-valprint.c -+++ b/gdb/p-valprint.c -@@ -61,7 +61,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - struct type *elttype; - unsigned eltlen; - int length_pos, length_size, string_pos; -- int char_size; -+ struct type *char_type; - LONGEST val; - CORE_ADDR addr; - -@@ -100,8 +100,9 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - len = temp_len; - } - -- LA_PRINT_STRING (stream, valaddr + embedded_offset, len, -- eltlen, 0, options); -+ LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type), -+ valaddr + embedded_offset, len, 0, -+ options); - i = len; - } - else -@@ -175,8 +176,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - && addr != 0) - { - /* no wide string yet */ -- i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream, -- options); -+ i = val_print_string (elttype, addr, -1, stream, options); - } - /* also for pointers to pascal strings */ - /* Note: this is Free Pascal specific: -@@ -184,7 +184,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - Pascal strings are mapped to records - with lowercase names PM */ - if (is_pascal_string_type (elttype, &length_pos, &length_size, -- &string_pos, &char_size, NULL) -+ &string_pos, &char_type, NULL) - && addr != 0) - { - ULONGEST string_length; -@@ -193,7 +193,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - read_memory (addr + length_pos, buffer, length_size); - string_length = extract_unsigned_integer (buffer, length_size); - xfree (buffer); -- i = val_print_string (addr + string_pos, string_length, char_size, stream, options); -+ i = val_print_string (char_type ,addr + string_pos, string_length, stream, options); - } - else if (pascal_object_is_vtbl_member (type)) - { -@@ -298,10 +298,10 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - else - { - if (is_pascal_string_type (type, &length_pos, &length_size, -- &string_pos, &char_size, NULL)) -+ &string_pos, &char_type, NULL)) - { - len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size); -- LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0, options); -+ LA_PRINT_STRING (stream, char_type, valaddr + embedded_offset + string_pos, len, 0, options); - } - else - pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, -@@ -426,7 +426,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, - else - fprintf_filtered (stream, "%d", (int) val); - fputs_filtered (" ", stream); -- LA_PRINT_CHAR ((unsigned char) val, stream); -+ LA_PRINT_CHAR ((unsigned char) val, type, stream); - } - break; - -@@ -931,7 +931,7 @@ pascal_object_print_static_field (struct value *val, - - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) - { -- CORE_ADDR *first_dont_print; -+ CORE_ADDR *first_dont_print, addr; - int i; - - first_dont_print -@@ -941,7 +941,7 @@ pascal_object_print_static_field (struct value *val, - - while (--i >= 0) - { -- if (VALUE_ADDRESS (val) == first_dont_print[i]) -+ if (value_address (val) == first_dont_print[i]) - { - fputs_filtered ("", - stream); -@@ -949,11 +949,12 @@ pascal_object_print_static_field (struct value *val, - } - } - -- obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val), -+ addr = value_address (val); -+ obstack_grow (&dont_print_statmem_obstack, (char *) &addr, - sizeof (CORE_ADDR)); - - CHECK_TYPEDEF (type); -- pascal_object_print_value_fields (type, value_contents (val), VALUE_ADDRESS (val), -+ pascal_object_print_value_fields (type, value_contents (val), value_address (val), - stream, recurse, options, NULL, 1); - return; - } diff --git a/gdb/parse.c b/gdb/parse.c -index eee1f8e..66aaf6a 100644 +index ef938e3..c243bd8 100644 --- a/gdb/parse.c +++ b/gdb/parse.c -@@ -306,7 +306,7 @@ write_exp_elt_intern (struct internalvar *expelt) - strings with embedded null bytes, as is required for some languages. - - Don't be fooled by the fact that the string is null byte terminated, -- this is strictly for the convenience of debugging gdb itself. Gdb -+ this is strictly for the convenience of debugging gdb itself. - Gdb does not depend up the string being null terminated, since the - actual length is recorded in expression elements at each end of the - string. The null byte is taken into consideration when computing how -@@ -352,6 +352,65 @@ write_exp_string (struct stoken str) - write_exp_elt_longcst ((LONGEST) len); - } - -+/* Add a vector of string constants to the end of the expression. -+ -+ This adds an OP_STRING operation, but encodes the contents -+ differently from write_exp_string. The language is expected to -+ handle evaluation of this expression itself. -+ -+ After the usual OP_STRING header, TYPE is written into the -+ expression as a long constant. The interpretation of this field is -+ up to the language evaluator. -+ -+ Next, each string in VEC is written. The length is written as a -+ long constant, followed by the contents of the string. */ -+ -+void -+write_exp_string_vector (int type, struct stoken_vector *vec) -+{ -+ int i, n_slots, len; -+ -+ /* Compute the size. We compute the size in number of slots to -+ avoid issues with string padding. */ -+ n_slots = 0; -+ for (i = 0; i < vec->len; ++i) -+ { -+ /* One slot for the length of this element, plus the number of -+ slots needed for this string. */ -+ n_slots += 1 + BYTES_TO_EXP_ELEM (vec->tokens[i].length); -+ } -+ -+ /* One more slot for the type of the string. */ -+ ++n_slots; -+ -+ /* Now compute a phony string length. */ -+ len = EXP_ELEM_TO_BYTES (n_slots) - 1; -+ -+ n_slots += 4; -+ if ((expout_ptr + n_slots) >= expout_size) -+ { -+ expout_size = max (expout_size * 2, expout_ptr + n_slots + 10); -+ expout = (struct expression *) -+ xrealloc ((char *) expout, (sizeof (struct expression) -+ + EXP_ELEM_TO_BYTES (expout_size))); -+ } -+ -+ write_exp_elt_opcode (OP_STRING); -+ write_exp_elt_longcst (len); -+ write_exp_elt_longcst (type); -+ -+ for (i = 0; i < vec->len; ++i) -+ { -+ write_exp_elt_longcst (vec->tokens[i].length); -+ memcpy (&expout->elts[expout_ptr], vec->tokens[i].ptr, -+ vec->tokens[i].length); -+ expout_ptr += BYTES_TO_EXP_ELEM (vec->tokens[i].length); -+ } -+ -+ write_exp_elt_longcst (len); -+ write_exp_elt_opcode (OP_STRING); -+} -+ - /* Add a bitstring constant to the end of the expression. - - Bitstring constants are stored by first writing an expression element -@@ -777,6 +836,15 @@ operator_length_standard (struct expression *expr, int endpos, +@@ -63,6 +63,7 @@ const struct exp_descriptor exp_descriptor_standard = + { + print_subexp_standard, + operator_length_standard, ++ operator_check_standard, + op_name_standard, + dump_subexp_body_standard, + evaluate_subexp_standard +@@ -837,6 +838,15 @@ operator_length_standard (struct expression *expr, int endpos, args = 1 + longest_to_int (expr->elts[endpos - 2].longconst); break; @@ -23822,245 +10548,218 @@ index eee1f8e..66aaf6a 100644 case OP_OBJC_MSGCALL: /* Objective C message (method) call */ oplen = 4; args = 1 + longest_to_int (expr->elts[endpos - 2].longconst); -diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h -index 2c4b755..cbda9c3 100644 ---- a/gdb/parser-defs.h -+++ b/gdb/parser-defs.h -@@ -69,6 +69,22 @@ struct stoken - int length; - }; - -+struct typed_stoken -+ { -+ /* A language-specific type field. */ -+ int type; -+ /* Pointer to first byte of char-string or first bit of bit-string */ -+ char *ptr; -+ /* Length of string in bytes for char-string or bits for bit-string */ -+ int length; -+ }; -+ -+struct stoken_vector -+ { -+ int len; -+ struct typed_stoken *tokens; -+ }; -+ - struct ttype - { - struct stoken stoken; -@@ -130,6 +146,8 @@ extern void write_exp_elt_intern (struct internalvar *); - - extern void write_exp_string (struct stoken); - -+void write_exp_string_vector (int type, struct stoken_vector *vec); -+ - extern void write_exp_bitstring (struct stoken); - - extern void write_exp_elt_block (struct block *); -diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c -index d08d4fc..c2bbdf9 100644 ---- a/gdb/ppc-linux-tdep.c -+++ b/gdb/ppc-linux-tdep.c -@@ -38,6 +38,7 @@ - #include "trad-frame.h" - #include "frame-unwind.h" - #include "tramp-frame.h" -+#include "linux-tdep.h" - - #include "features/rs6000/powerpc-32l.c" - #include "features/rs6000/powerpc-altivec32l.c" -@@ -53,6 +54,9 @@ - #include "features/rs6000/powerpc-isa205-vsx64l.c" - #include "features/rs6000/powerpc-e500l.c" - -+/* The syscall's XML filename for PPC and PPC64. */ -+#define XML_SYSCALL_FILENAME_PPC "syscalls/ppc-linux.xml" -+#define XML_SYSCALL_FILENAME_PPC64 "syscalls/ppc64-linux.xml" - - /* ppc_linux_memory_remove_breakpoints attempts to remove a breakpoint - in much the same fashion as memory_remove_breakpoint in mem-break.c, -@@ -1009,6 +1013,38 @@ ppc_linux_trap_reg_p (struct gdbarch *gdbarch) - && register_size (gdbarch, PPC_TRAP_REGNUM) > 0; +@@ -1355,6 +1365,150 @@ parser_fprintf (FILE *x, const char *y, ...) + va_end (args); } -+/* Return the current system call's number present in the -+ r0 register. When the function fails, it returns -1. */ -+static LONGEST -+ppc_linux_get_syscall_number (struct gdbarch *gdbarch, -+ ptid_t ptid) ++/* Implementation of the exp_descriptor method operator_check. */ ++ ++int ++operator_check_standard (struct expression *exp, int pos, ++ int (*type_func) (struct type *type, void *data), ++ int (*objfile_func) (struct objfile *objfile, ++ void *data), ++ void *data) +{ -+ struct regcache *regcache = get_thread_regcache (ptid); -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ struct cleanup *cleanbuf; -+ /* The content of a register */ -+ gdb_byte *buf; -+ /* The result */ -+ LONGEST ret; ++ const union exp_element *const elts = exp->elts; ++ struct type *type = NULL; ++ struct objfile *objfile = NULL; + -+ /* Make sure we're in a 32- or 64-bit machine */ -+ gdb_assert (tdep->wordsize == 4 || tdep->wordsize == 8); ++ /* Extended operators should have been already handled by exp_descriptor ++ iterate method of its specific language. */ ++ gdb_assert (elts[pos].opcode < OP_EXTENDED0); + -+ buf = (gdb_byte *) xmalloc (tdep->wordsize * sizeof (gdb_byte)); ++ /* Track the callers of write_exp_elt_type for this table. */ + -+ cleanbuf = make_cleanup (xfree, buf); ++ switch (elts[pos].opcode) ++ { ++ case BINOP_VAL: ++ case OP_COMPLEX: ++ case OP_DECFLOAT: ++ case OP_DOUBLE: ++ case OP_LONG: ++ case OP_SCOPE: ++ case OP_TYPE: ++ case UNOP_CAST: ++ case UNOP_MAX: ++ case UNOP_MEMVAL: ++ case UNOP_MIN: ++ type = elts[pos + 1].type; ++ break; + -+ /* Getting the system call number from the register. -+ When dealing with PowerPC architecture, this information -+ is stored at 0th register. */ -+ regcache_cooked_read (regcache, tdep->ppc_gp0_regnum, buf); ++ case UNOP_MEMVAL_TLS: ++ objfile = elts[pos + 1].objfile; ++ type = elts[pos + 2].type; ++ break; + -+ ret = extract_signed_integer (buf, tdep->wordsize); -+ do_cleanups (cleanbuf); ++ case OP_VAR_VALUE: ++ { ++ const struct block *const block = elts[pos + 1].block; ++ const struct symbol *const symbol = elts[pos + 2].symbol; ++ const struct obj_section *const section = SYMBOL_OBJ_SECTION (symbol); + -+ return ret; ++ /* Check objfile where the variable itself is placed. */ ++ if (section && objfile_func && (*objfile_func) (section->objfile, data)) ++ return 1; ++ ++ /* Check objfile where is placed the code touching the variable. */ ++ objfile = block_objfile (block); ++ ++ type = SYMBOL_TYPE (symbol); ++ } ++ break; ++ } ++ ++ /* Invoke callbacks for TYPE and OBJFILE if they were set as non-NULL. */ ++ ++ if (type && type_func && (*type_func) (type, data)) ++ return 1; ++ if (type && TYPE_OBJFILE (type) && objfile_func ++ && (*objfile_func) (TYPE_OBJFILE (type), data)) ++ return 1; ++ if (objfile && objfile_func && (*objfile_func) (objfile, data)) ++ return 1; ++ ++ return 0; +} + - static void - ppc_linux_write_pc (struct regcache *regcache, CORE_ADDR pc) ++/* Call TYPE_FUNC and OBJFILE_FUNC for any TYPE and OBJFILE found being ++ referenced by EXP. The functions are never called with NULL TYPE or NULL ++ OBJFILE. Functions get passed an arbitrary caller supplied DATA pointer. ++ If any of the functions returns non-zero value then (any other) non-zero ++ value is immediately returned to the caller. Otherwise zero is returned ++ after iterating through whole EXP. */ ++ ++static int ++exp_iterate (struct expression *exp, ++ int (*type_func) (struct type *type, void *data), ++ int (*objfile_func) (struct objfile *objfile, void *data), ++ void *data) ++{ ++ int endpos; ++ const union exp_element *const elts = exp->elts; ++ ++ for (endpos = exp->nelts; endpos > 0; ) ++ { ++ int pos, args, oplen = 0; ++ ++ exp->language_defn->la_exp_desc->operator_length (exp, endpos, ++ &oplen, &args); ++ gdb_assert (oplen > 0); ++ ++ pos = endpos - oplen; ++ if (exp->language_defn->la_exp_desc->operator_check (exp, pos, type_func, ++ objfile_func, data)) ++ return 1; ++ ++ endpos = pos; ++ } ++ ++ return 0; ++} ++ ++/* Helper for exp_uses_objfile. */ ++ ++static int ++exp_uses_objfile_iter (struct objfile *exp_objfile, void *objfile_voidp) ++{ ++ struct objfile *objfile = objfile_voidp; ++ ++ return exp_objfile == objfile; ++} ++ ++/* Return 1 if EXP uses OBJFILE (and will become dangling when OBJFILE ++ is unloaded), otherwise return 0. */ ++ ++int ++exp_uses_objfile (struct expression *exp, struct objfile *objfile) ++{ ++ return exp_iterate (exp, NULL, exp_uses_objfile_iter, objfile); ++} ++ ++/* Helper for exp_types_mark_used. */ ++ ++static int ++exp_types_mark_used_iter (struct type *type, void *unused) ++{ ++ type_mark_used (type); ++ ++ /* Continue the traversal. */ ++ return 0; ++} ++ ++/* Call type_mark_used for any TYPE contained in EXP. */ ++ ++void ++exp_types_mark_used (struct expression *exp) ++{ ++ exp_iterate (exp, exp_types_mark_used_iter, NULL, NULL); ++} ++ + void + _initialize_parse (void) { -@@ -1069,6 +1105,9 @@ ppc_linux_init_abi (struct gdbarch_info info, - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - struct tdesc_arch_data *tdesc_data = (void *) info.tdep_info; +diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h +index cbda9c3..a07e6f2 100644 +--- a/gdb/parser-defs.h ++++ b/gdb/parser-defs.h +@@ -189,6 +189,13 @@ extern void operator_length (struct expression *, int, int *, int *); -+ /* Initializing common methods. */ -+ linux_tdep_init (gdbarch); -+ - /* PPC GNU/Linux uses either 64-bit or 128-bit long doubles; where - 128-bit, they are IBM long double, not IEEE quad long double as - in the System V ABI PowerPC Processor Supplement. We can safely -@@ -1080,6 +1119,9 @@ ppc_linux_init_abi (struct gdbarch_info info, - /* Handle inferior calls during interrupted system calls. */ - set_gdbarch_write_pc (gdbarch, ppc_linux_write_pc); + extern void operator_length_standard (struct expression *, int, int *, int *); -+ /* Get the syscall number from the arch's register. */ -+ set_gdbarch_get_syscall_number (gdbarch, ppc_linux_get_syscall_number); ++extern int operator_check_standard (struct expression *exp, int pos, ++ int (*type_func) (struct type *type, ++ void *data), ++ int (*objfile_func) ++ (struct objfile *objfile, void *data), ++ void *data); + - if (tdep->wordsize == 4) - { - /* Until November 2001, gcc did not comply with the 32 bit SysV -@@ -1099,6 +1141,9 @@ ppc_linux_init_abi (struct gdbarch_info info, - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_ilp32_fetch_link_map_offsets); + extern char *op_name_standard (enum exp_opcode); -+ /* Setting the correct XML syscall filename. */ -+ set_gdbarch_xml_syscall_filename (gdbarch, XML_SYSCALL_FILENAME_PPC); -+ - /* Trampolines. */ - tramp_frame_prepend_unwinder (gdbarch, &ppc32_linux_sigaction_tramp_frame); - tramp_frame_prepend_unwinder (gdbarch, &ppc32_linux_sighandler_tramp_frame); -@@ -1116,6 +1161,9 @@ ppc_linux_init_abi (struct gdbarch_info info, - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_lp64_fetch_link_map_offsets); + extern struct type *follow_types (struct type *); +@@ -267,6 +274,20 @@ struct exp_descriptor + the number of subexpressions it takes. */ + void (*operator_length) (struct expression*, int, int*, int *); -+ /* Setting the correct XML syscall filename. */ -+ set_gdbarch_xml_syscall_filename (gdbarch, XML_SYSCALL_FILENAME_PPC64); ++ /* Call TYPE_FUNC and OBJFILE_FUNC for any TYPE and OBJFILE found being ++ referenced by the single operator of EXP at position POS. Operator ++ parameters are located at positive (POS + number) offsets in EXP. ++ The functions should never be called with NULL TYPE or NULL OBJFILE. ++ Functions should get passed an arbitrary caller supplied DATA pointer. ++ If any of the functions returns non-zero value then (any other) non-zero ++ value should be immediately returned to the caller. Otherwise zero ++ should be returned. */ ++ int (*operator_check) (struct expression *exp, int pos, ++ int (*type_func) (struct type *type, void *data), ++ int (*objfile_func) (struct objfile *objfile, ++ void *data), ++ void *data); + - /* Trampolines. */ - tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sigaction_tramp_frame); - tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sighandler_tramp_frame); + /* Name of this operator for dumping purposes. */ + char *(*op_name) (enum exp_opcode); + +@@ -299,4 +320,8 @@ extern void print_subexp_standard (struct expression *, int *, + + extern void parser_fprintf (FILE *, const char *, ...) ATTR_FORMAT (printf, 2 ,3); + ++extern int exp_uses_objfile (struct expression *exp, struct objfile *objfile); ++ ++extern void exp_types_mark_used (struct expression *exp); ++ + #endif /* PARSER_DEFS_H */ diff --git a/gdb/printcmd.c b/gdb/printcmd.c -index 375f82e..8c3f476 100644 +index 5d8b936..49c575d 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c -@@ -43,6 +43,7 @@ - #include "disasm.h" - #include "dfp.h" - #include "valprint.h" -+#include "charset.h" +@@ -46,7 +46,6 @@ + #include "exceptions.h" + #include "observer.h" + #include "solist.h" +-#include "solib.h" + #include "parser-defs.h" + #include "charset.h" - #ifdef TUI - #include "tui/tui.h" /* For tui_active et.al. */ -@@ -62,11 +63,15 @@ struct format_data - int count; - char format; - char size; -+ -+ /* True if the value should be printed raw -- that is, bypassing -+ python-based formatters. */ -+ unsigned char raw; - }; - - /* Last specified output format. */ - --static char last_format = 'x'; -+static char last_format = 0; - - /* Last specified examination size. 'b', 'h', 'w' or `q'. */ - -@@ -175,6 +180,7 @@ decode_format (char **string_ptr, int oformat, int osize) - val.format = '?'; - val.size = '?'; - val.count = 1; -+ val.raw = 0; - - if (*p >= '0' && *p <= '9') - val.count = atoi (p); -@@ -187,6 +193,11 @@ decode_format (char **string_ptr, int oformat, int osize) - { - if (*p == 'b' || *p == 'h' || *p == 'w' || *p == 'g') - val.size = *p++; -+ else if (*p == 'r') -+ { -+ val.raw = 1; -+ p++; -+ } - else if (*p >= 'a' && *p <= 'z') - val.format = *p++; - else -@@ -264,24 +275,27 @@ print_formatted (struct value *val, int size, - int len = TYPE_LENGTH (type); - - if (VALUE_LVAL (val) == lval_memory) -- next_address = VALUE_ADDRESS (val) + len; -+ next_address = value_address (val) + len; - - if (size) - { - switch (options->format) - { - case 's': -- /* FIXME: Need to handle wchar_t's here... */ -- next_address = VALUE_ADDRESS (val) -- + val_print_string (VALUE_ADDRESS (val), -1, 1, stream, -- options); -+ { -+ struct type *elttype = value_type (val); -+ next_address = (value_address (val) -+ + val_print_string (elttype, -+ value_address (val), -1, -+ stream, options)); -+ } - return; - - case 'i': - /* We often wrap here if there are long symbolic names. */ - wrap_here (" "); -- next_address = (VALUE_ADDRESS (val) -- + gdb_print_insn (VALUE_ADDRESS (val), stream, -+ next_address = (value_address (val) -+ + gdb_print_insn (value_address (val), stream, - &branch_delay_insns)); - return; - } -@@ -369,7 +383,7 @@ print_scalar_formatted (const void *valaddr, struct type *type, - print_hex_chars (stream, valaddr, len, byte_order); - return; - case 'c': -- print_char_chars (stream, valaddr, len, byte_order); -+ print_char_chars (stream, type, valaddr, len, byte_order); - return; - default: - break; -@@ -865,6 +879,7 @@ print_command_1 (char *exp, int inspect, int voidprint) - fmt.count = 1; - fmt.format = 0; - fmt.size = 0; -+ fmt.raw = 0; - } - - if (exp && *exp) -@@ -878,6 +893,11 @@ print_command_1 (char *exp, int inspect, int voidprint) +@@ -900,6 +899,11 @@ print_command_1 (char *exp, int inspect, int voidprint) else val = access_value_history (0); @@ -24072,192 +10771,126 @@ index 375f82e..8c3f476 100644 if (voidprint || (val && value_type (val) && TYPE_CODE (value_type (val)) != TYPE_CODE_VOID)) { -@@ -900,6 +920,7 @@ print_command_1 (char *exp, int inspect, int voidprint) - - get_formatted_print_options (&opts, format); - opts.inspect_it = inspect; -+ opts.raw = fmt.raw; - - print_formatted (val, fmt.size, &opts, gdb_stdout); - printf_filtered ("\n"); -@@ -950,6 +971,7 @@ output_command (char *exp, int from_tty) - struct value_print_options opts; - - fmt.size = 0; -+ fmt.raw = 0; - - if (exp && *exp == '/') - { -@@ -967,6 +989,7 @@ output_command (char *exp, int from_tty) - annotate_value_begin (value_type (val)); - - get_formatted_print_options (&opts, format); -+ opts.raw = fmt.raw; - print_formatted (val, fmt.size, &opts, gdb_stdout); - - annotate_value_end (); -@@ -1287,9 +1310,10 @@ x_command (char *exp, int from_tty) - struct cleanup *old_chain; - struct value *val; - -- fmt.format = last_format; -+ fmt.format = last_format ? last_format : 'x'; - fmt.size = last_size; - fmt.count = 1; -+ fmt.raw = 0; - - if (exp && *exp == '/') - { -@@ -1316,7 +1340,7 @@ x_command (char *exp, int from_tty) - if (/* last_format == 'i' && */ - TYPE_CODE (value_type (val)) == TYPE_CODE_FUNC - && VALUE_LVAL (val) == lval_memory) -- next_address = VALUE_ADDRESS (val); -+ next_address = value_address (val); - else - next_address = value_as_address (val); - do_cleanups (old_chain); -@@ -1393,6 +1417,7 @@ display_command (char *exp, int from_tty) - fmt.format = 0; - fmt.size = 0; - fmt.count = 0; -+ fmt.raw = 0; - } - - innermost_block = 0; -@@ -1585,6 +1610,7 @@ do_one_display (struct display *d) - annotate_display_expression (); - - get_formatted_print_options (&opts, d->format.format); -+ opts.raw = d->format.raw; - print_formatted (evaluate_expression (d->exp), - d->format.size, &opts, gdb_stdout); - printf_filtered ("\n"); -@@ -1865,7 +1891,8 @@ printf_command (char *arg, int from_tty) - - enum argclass - { -- int_arg, long_arg, long_long_arg, ptr_arg, string_arg, -+ int_arg, long_arg, long_long_arg, ptr_arg, -+ string_arg, wide_string_arg, wide_char_arg, - double_arg, long_double_arg, decfloat_arg - }; - enum argclass *argclass; -@@ -1997,8 +2024,8 @@ printf_command (char *arg, int from_tty) - break; - - case 'c': -- this_argclass = int_arg; -- if (lcount || seen_h || seen_big_l) -+ this_argclass = lcount == 0 ? int_arg : wide_char_arg; -+ if (lcount > 1 || seen_h || seen_big_l) - bad = 1; - if (seen_prec || seen_zero || seen_space || seen_plus) - bad = 1; -@@ -2013,8 +2040,8 @@ printf_command (char *arg, int from_tty) - break; - - case 's': -- this_argclass = string_arg; -- if (lcount || seen_h || seen_big_l) -+ this_argclass = lcount == 0 ? string_arg : wide_string_arg; -+ if (lcount > 1 || seen_h || seen_big_l) - bad = 1; - if (seen_zero || seen_space || seen_plus) - bad = 1; -@@ -2066,6 +2093,15 @@ printf_command (char *arg, int from_tty) - last_arg[length_before_ll + lcount]; - current_substring += length_before_ll + 4; - } -+ else if (this_argclass == wide_string_arg -+ || this_argclass == wide_char_arg) -+ { -+ /* Convert %ls or %lc to %s. */ -+ int length_before_ls = f - last_arg - 2; -+ strncpy (current_substring, last_arg, length_before_ls); -+ strcpy (current_substring + length_before_ls, "s"); -+ current_substring += length_before_ls + 2; -+ } - else - { - strncpy (current_substring, last_arg, f - last_arg); -@@ -2130,6 +2166,76 @@ printf_command (char *arg, int from_tty) - printf_filtered (current_substring, (char *) str); - } - break; -+ case wide_string_arg: -+ { -+ gdb_byte *str; -+ CORE_ADDR tem; -+ int j; -+ struct type *wctype = lookup_typename ("wchar_t", NULL, 0); -+ int wcwidth = TYPE_LENGTH (wctype); -+ gdb_byte *buf = alloca (wcwidth); -+ struct obstack output; -+ struct cleanup *inner_cleanup; +@@ -1396,6 +1400,22 @@ x_command (char *exp, int from_tty) + set_internalvar (lookup_internalvar ("__"), last_examine_value); + } + } + -+ tem = value_as_address (val_args[i]); ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ + -+ /* This is a %s argument. Find the length of the string. */ -+ for (j = 0;; j += wcwidth) -+ { -+ QUIT; -+ read_memory (tem + j, buf, wcwidth); -+ if (extract_unsigned_integer (buf, wcwidth) == 0) -+ break; -+ } ++static void ++print_types_mark_used (void) ++{ ++ struct display *d; + -+ /* Copy the string contents into a string inside GDB. */ -+ str = (gdb_byte *) alloca (j + wcwidth); -+ if (j != 0) -+ read_memory (tem, str, j); -+ memset (&str[j], 0, wcwidth); ++ if (last_examine_value) ++ type_mark_used (value_type (last_examine_value)); + -+ obstack_init (&output); -+ inner_cleanup = make_cleanup_obstack_free (&output); ++ for (d = display_chain; d; d = d->next) ++ if (d->exp) ++ exp_types_mark_used (d->exp); ++} + -+ convert_between_encodings (target_wide_charset (), -+ host_charset (), -+ str, j, wcwidth, -+ &output, translit_char); -+ obstack_grow_str0 (&output, ""); + + + /* Add an expression to the auto-display chain. +@@ -1798,50 +1818,6 @@ disable_display_command (char *args, int from_tty) + } + } + +-/* Return 1 if D uses SOLIB (and will become dangling when SOLIB +- is unloaded), otherwise return 0. */ +- +-static int +-display_uses_solib_p (const struct display *d, +- const struct so_list *solib) +-{ +- int endpos; +- struct expression *const exp = d->exp; +- const union exp_element *const elts = exp->elts; +- +- if (d->block != NULL +- && solib_contains_address_p (solib, d->block->startaddr)) +- return 1; +- +- for (endpos = exp->nelts; endpos > 0; ) +- { +- int i, args, oplen = 0; +- +- exp->language_defn->la_exp_desc->operator_length (exp, endpos, +- &oplen, &args); +- gdb_assert (oplen > 0); +- +- i = endpos - oplen; +- if (elts[i].opcode == OP_VAR_VALUE) +- { +- const struct block *const block = elts[i + 1].block; +- const struct symbol *const symbol = elts[i + 2].symbol; +- const struct obj_section *const section = +- SYMBOL_OBJ_SECTION (symbol); +- +- if (block != NULL +- && solib_contains_address_p (solib, block->startaddr)) +- return 1; +- +- if (section && section->objfile == solib->objfile) +- return 1; +- } +- endpos -= oplen; +- } +- +- return 0; +-} +- + /* display_chain items point to blocks and expressions. Some expressions in + turn may point to symbols. + Both symbols and blocks are obstack_alloc'd on objfile_stack, and are +@@ -1851,20 +1827,18 @@ display_uses_solib_p (const struct display *d, + an item by re-parsing .exp_string field in the new execution context. */ + + static void +-clear_dangling_display_expressions (struct so_list *solib) ++clear_dangling_display_expressions (struct objfile *objfile) + { + struct display *d; +- struct objfile *objfile = NULL; + +- for (d = display_chain; d; d = d->next) +- { +- if (d->exp && display_uses_solib_p (d, solib)) +- { +- xfree (d->exp); +- d->exp = NULL; +- d->block = NULL; +- } +- } ++ for (d = display_chain; d != NULL; d = d->next) ++ if (block_objfile (d->block) == objfile ++ || (d->exp && exp_uses_objfile (d->exp, objfile))) ++ { ++ xfree (d->exp); ++ d->exp = NULL; ++ d->block = NULL; ++ } + } + + +@@ -2593,7 +2567,7 @@ _initialize_printcmd (void) + + current_display_number = -1; + +- observer_attach_solib_unloaded (clear_dangling_display_expressions); ++ observer_attach_objfile_unloading (clear_dangling_display_expressions); + + add_info ("address", address_info, + _("Describe where symbol SYM is stored.")); +@@ -2749,4 +2723,6 @@ Show printing of source filename and line number with ."), NULL, + NULL, + show_print_symbol_filename, + &setprintlist, &showprintlist); + -+ printf_filtered (current_substring, obstack_base (&output)); -+ do_cleanups (inner_cleanup); -+ } -+ break; -+ case wide_char_arg: -+ { -+ struct type *wctype = lookup_typename ("wchar_t", NULL, 0); -+ struct type *valtype; -+ struct obstack output; -+ struct cleanup *inner_cleanup; -+ const gdb_byte *bytes; -+ -+ valtype = value_type (val_args[i]); -+ if (TYPE_LENGTH (valtype) != TYPE_LENGTH (wctype) -+ || TYPE_CODE (valtype) != TYPE_CODE_INT) -+ error (_("expected wchar_t argument for %%lc")); -+ -+ bytes = value_contents (val_args[i]); -+ -+ obstack_init (&output); -+ inner_cleanup = make_cleanup_obstack_free (&output); -+ -+ convert_between_encodings (target_wide_charset (), -+ host_charset (), -+ bytes, TYPE_LENGTH (valtype), -+ TYPE_LENGTH (valtype), -+ &output, translit_char); -+ obstack_grow_str0 (&output, ""); -+ -+ printf_filtered (current_substring, obstack_base (&output)); -+ do_cleanups (inner_cleanup); -+ } -+ break; - case double_arg: - { - struct type *type = value_type (val_args[i]); ++ observer_attach_mark_used (print_types_mark_used); + } diff --git a/gdb/python/lib/gdb/FrameIterator.py b/gdb/python/lib/gdb/FrameIterator.py new file mode 100644 index 0000000..5654546 @@ -24297,6 +10930,124 @@ index 0000000..5654546 + raise StopIteration + self.frame = result.older () + return result +diff --git a/gdb/python/lib/gdb/FrameWrapper.py b/gdb/python/lib/gdb/FrameWrapper.py +new file mode 100644 +index 0000000..39f8246 +--- /dev/null ++++ b/gdb/python/lib/gdb/FrameWrapper.py +@@ -0,0 +1,112 @@ ++# Wrapper API for frames. ++ ++# Copyright (C) 2008, 2009 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++import gdb ++ ++# FIXME: arguably all this should be on Frame somehow. ++class FrameWrapper: ++ def __init__ (self, frame): ++ self.frame = frame; ++ ++ def write_symbol (self, stream, sym, block): ++ if len (sym.linkage_name): ++ nsym, is_field_of_this = gdb.lookup_symbol (sym.linkage_name, block) ++ if nsym.addr_class != gdb.SYMBOL_LOC_REGISTER: ++ sym = nsym ++ ++ stream.write (sym.print_name + "=") ++ try: ++ val = self.frame.read_var (sym) ++ if val != None: ++ val = str (val) ++ # FIXME: would be nice to have a more precise exception here. ++ except RuntimeError, text: ++ val = text ++ if val == None: ++ stream.write ("???") ++ else: ++ stream.write (str (val)) ++ ++ def print_frame_locals (self, stream, func): ++ if not func: ++ return ++ ++ first = True ++ block = func.value ++ ++ for sym in block: ++ if sym.is_argument: ++ continue; ++ ++ self.write_symbol (stream, sym, block) ++ stream.write ('\n') ++ ++ def print_frame_args (self, stream, func): ++ if not func: ++ return ++ ++ first = True ++ block = func.value ++ ++ for sym in block: ++ if not sym.is_argument: ++ continue; ++ ++ if not first: ++ stream.write (", ") ++ ++ self.write_symbol (stream, sym, block) ++ first = False ++ ++ # FIXME: this should probably just be a method on gdb.Frame. ++ # But then we need stream wrappers. ++ def describe (self, stream, full): ++ if self.frame.type () == gdb.DUMMY_FRAME: ++ stream.write (" \n") ++ elif self.frame.type () == gdb.SIGTRAMP_FRAME: ++ stream.write (" \n") ++ else: ++ sal = self.frame.find_sal () ++ pc = self.frame.pc () ++ name = self.frame.name () ++ if not name: ++ name = "??" ++ if pc != sal.pc or not sal.symtab: ++ stream.write (" 0x%08x in" % pc) ++ stream.write (" " + name + " (") ++ ++ func = self.frame.function () ++ self.print_frame_args (stream, func) ++ ++ stream.write (")") ++ ++ if sal.symtab and sal.symtab.filename: ++ stream.write (" at " + sal.symtab.filename) ++ stream.write (":" + str (sal.line)) ++ ++ if not self.frame.name () or (not sal.symtab or not sal.symtab.filename): ++ lib = gdb.solib_address (pc) ++ if lib: ++ stream.write (" from " + lib) ++ ++ stream.write ("\n") ++ ++ if full: ++ self.print_frame_locals (stream, func) ++ ++ def __getattr__ (self, name): ++ return getattr (self.frame, name) diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py new file mode 100644 index 0000000..b375c68 @@ -24444,13 +11195,13 @@ index 0000000..96b6618 +AliasCommand() diff --git a/gdb/python/lib/gdb/command/backtrace.py b/gdb/python/lib/gdb/command/backtrace.py new file mode 100644 -index 0000000..f07696e +index 0000000..ec9a527 --- /dev/null +++ b/gdb/python/lib/gdb/command/backtrace.py -@@ -0,0 +1,197 @@ +@@ -0,0 +1,106 @@ +# New backtrace command. + -+# Copyright (C) 2008 Free Software Foundation, Inc. ++# Copyright (C) 2008, 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -24469,101 +11220,9 @@ index 0000000..f07696e +import gdb.backtrace +import itertools +from gdb.FrameIterator import FrameIterator ++from gdb.FrameWrapper import FrameWrapper +import sys + -+class FrameWrapper: -+ def __init__ (self, frame): -+ self.frame = frame; -+ -+ def write_symbol (self, stream, sym, block): -+ if len (sym.linkage_name): -+ nsym, is_field_of_this = gdb.lookup_symbol (sym.linkage_name, block) -+ if nsym.addr_class != gdb.SYMBOL_LOC_REGISTER: -+ sym = nsym -+ -+ stream.write (sym.print_name + "=") -+ try: -+ val = self.frame.read_var (sym) -+ if val != None: -+ val = str (val) -+ # FIXME: would be nice to have a more precise exception here. -+ except RuntimeError, text: -+ val = text -+ if val == None: -+ stream.write ("???") -+ else: -+ stream.write (str (val)) -+ -+ def print_frame_locals (self, stream, func): -+ if not func: -+ return -+ -+ first = True -+ block = func.value -+ -+ for sym in block: -+ if sym.is_argument: -+ continue; -+ -+ self.write_symbol (stream, sym, block) -+ stream.write ('\n') -+ -+ def print_frame_args (self, stream, func): -+ if not func: -+ return -+ -+ first = True -+ block = func.value -+ -+ for sym in block: -+ if not sym.is_argument: -+ continue; -+ -+ if not first: -+ stream.write (", ") -+ -+ self.write_symbol (stream, sym, block) -+ first = False -+ -+ # FIXME: this should probably just be a method on gdb.Frame. -+ # But then we need stream wrappers. -+ def describe (self, stream, full): -+ if self.frame.type () == gdb.DUMMY_FRAME: -+ stream.write (" \n") -+ elif self.frame.type () == gdb.SIGTRAMP_FRAME: -+ stream.write (" \n") -+ else: -+ sal = self.frame.find_sal () -+ pc = self.frame.pc () -+ name = self.frame.name () -+ if not name: -+ name = "??" -+ if pc != sal.pc or not sal.symtab: -+ stream.write (" 0x%08x in" % pc) -+ stream.write (" " + name + " (") -+ -+ func = gdb.find_pc_function (self.frame.addr_in_block ()) -+ self.print_frame_args (stream, func) -+ -+ stream.write (")") -+ -+ if sal.symtab and sal.symtab.filename: -+ stream.write (" at " + sal.symtab.filename) -+ stream.write (":" + str (sal.line)) -+ -+ if not self.frame.name () or (not sal.symtab or not sal.symtab.filename): -+ lib = gdb.solib_address (pc) -+ if lib: -+ stream.write (" from " + lib) -+ -+ stream.write ("\n") -+ -+ if full: -+ self.print_frame_locals (stream, func) -+ -+ def __getattr__ (self, name): -+ return getattr (self.frame, name) -+ +class ReverseBacktraceParameter (gdb.Parameter): + """The new-backtrace command can show backtraces in 'reverse' order. +This means that the innermost frame will be printed last. @@ -24622,8 +11281,9 @@ index 0000000..f07696e + + # FIXME: provide option to start at selected frame + # However, should still number as if starting from newest ++ newest_frame = gdb.selected_thread ().newest_frame () + iter = itertools.imap (FrameWrapper, -+ FrameIterator (gdb.newest_frame ())) ++ FrameIterator (newest_frame)) + if filter: + iter = gdb.backtrace.create_frame_filter (iter) + @@ -24834,7 +11494,7 @@ index 0000000..1fbc1e8 +RequireSubcommand("function") diff --git a/gdb/python/lib/gdb/command/save_breakpoints.py b/gdb/python/lib/gdb/command/save_breakpoints.py new file mode 100644 -index 0000000..90e07db +index 0000000..6143187 --- /dev/null +++ b/gdb/python/lib/gdb/command/save_breakpoints.py @@ -0,0 +1,65 @@ @@ -24890,7 +11550,7 @@ index 0000000..90e07db + print >> f, " if", bp.condition, + print >> f + if not bp.enabled: -+ print >> f, "disable %d" % bp.number ++ print >> f, "disable $bpnum" + # Note: we don't save the ignore count; there doesn't + # seem to be much point. + commands = bp.commands @@ -24903,6 +11563,141 @@ index 0000000..90e07db + +SavePrefixCommand () +SaveBreakpointsCommand () +diff --git a/gdb/python/lib/gdb/command/upto.py b/gdb/python/lib/gdb/command/upto.py +new file mode 100644 +index 0000000..faf54ed +--- /dev/null ++++ b/gdb/python/lib/gdb/command/upto.py +@@ -0,0 +1,129 @@ ++# upto command. ++ ++# Copyright (C) 2009 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++import gdb ++import re ++from gdb.FrameIterator import FrameIterator ++from gdb.FrameWrapper import FrameWrapper ++ ++class UptoPrefix (gdb.Command): ++ def __init__ (self): ++ super (UptoPrefix, self).__init__ ("upto", gdb.COMMAND_STACK, ++ prefix = True) ++ ++class UptoImplementation (gdb.Command): ++ def __init__ (self, subcommand): ++ super (UptoImplementation, self).__init__ ("upto " + subcommand, ++ gdb.COMMAND_STACK) ++ ++ def search (self): ++ saved = gdb.selected_frame () ++ iter = FrameIterator (saved) ++ found = False ++ try: ++ for frame in iter: ++ frame.select () ++ try: ++ if self.filter (frame): ++ wrapper = FrameWrapper (frame) ++ wrapper.describe (sys.stdout, False) ++ return ++ except: ++ pass ++ except: ++ pass ++ saved.select () ++ raise RuntimeError, 'Could not find a matching frame' ++ ++ def invoke (self, arg, from_tty): ++ self.rx = re.compile (arg) ++ self.search () ++ ++class UptoSymbolCommand (UptoImplementation): ++ """Select and print some calling stack frame, based on symbol. ++The argument is a regular expression. This command moves up the ++stack, stopping at the first frame whose symbol matches the regular ++expression.""" ++ ++ def __init__ (self): ++ super (UptoSymbolCommand, self).__init__ ("symbol") ++ ++ def filter (self, frame): ++ name = frame.name () ++ if name is not None: ++ if self.rx.search (name) is not None: ++ return True ++ return False ++ ++class UptoSourceCommand (UptoImplementation): ++ """Select and print some calling stack frame, based on source file. ++The argument is a regular expression. This command moves up the ++stack, stopping at the first frame whose source file name matches the ++regular expression.""" ++ ++ def __init__ (self): ++ super (UptoSourceCommand, self).__init__ ("source") ++ ++ def filter (self, frame): ++ name = frame.find_sal ().symtab.filename ++ if name is not None: ++ if self.rx.search (name) is not None: ++ return True ++ return False ++ ++class UptoObjectCommand (UptoImplementation): ++ """Select and print some calling stack frame, based on object file. ++The argument is a regular expression. This command moves up the ++stack, stopping at the first frame whose object file name matches the ++regular expression.""" ++ ++ def __init__ (self): ++ super (UptoObjectCommand, self).__init__ ("object") ++ ++ def filter (self, frame): ++ name = frame.find_sal ().symtab.objfile.filename ++ if name is not None: ++ if self.rx.search (name) is not None: ++ return True ++ return False ++ ++class UptoWhereCommand (UptoImplementation): ++ """Select and print some calling stack frame, based on expression. ++The argument is an expression. This command moves up the stack, ++parsing and evaluating the expression in each frame. This stops when ++the expression evaluates to a non-zero (true) value.""" ++ ++ def __init__ (self): ++ super (UptoWhereCommand, self).__init__ ("where") ++ ++ def filter (self, frame): ++ try: ++ if gdb.parse_and_eval (self.expression): ++ return True ++ except: ++ pass ++ return False ++ ++ def invoke (self, arg, from_tty): ++ self.expression = arg ++ self.search () ++ ++UptoPrefix () ++UptoSymbolCommand () ++UptoSourceCommand () ++UptoObjectCommand () ++UptoWhereCommand () diff --git a/gdb/python/lib/gdb/function/__init__.py b/gdb/python/lib/gdb/function/__init__.py new file mode 100644 index 0000000..8b13789 @@ -25027,690 +11822,6 @@ index 0000000..debb3bb + return wanted == found + +InScope () -diff --git a/gdb/python/lib/gdb/libstdcxx/__init__.py b/gdb/python/lib/gdb/libstdcxx/__init__.py -new file mode 100644 -index 0000000..8b13789 ---- /dev/null -+++ b/gdb/python/lib/gdb/libstdcxx/__init__.py -@@ -0,0 +1 @@ -+ -diff --git a/gdb/python/lib/gdb/libstdcxx/v6/__init__.py b/gdb/python/lib/gdb/libstdcxx/v6/__init__.py -new file mode 100644 -index 0000000..8b13789 ---- /dev/null -+++ b/gdb/python/lib/gdb/libstdcxx/v6/__init__.py -@@ -0,0 +1 @@ -+ -diff --git a/gdb/python/lib/gdb/libstdcxx/v6/hook.in b/gdb/python/lib/gdb/libstdcxx/v6/hook.in -new file mode 100644 -index 0000000..fe7c072 ---- /dev/null -+++ b/gdb/python/lib/gdb/libstdcxx/v6/hook.in -@@ -0,0 +1,27 @@ -+# -*- python -*- -+# Copyright (C) 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+import sys -+import gdb -+ -+# Update module path. -+dir = '@dir@' -+if not dir in sys.path: -+ sys.path.insert(0, dir) -+ -+# Load the pretty-printers. -+from libstdcxx.v6.printers import register_libstdcxx_printers -+register_libstdcxx_printers (gdb.current_objfile ()) -diff --git a/gdb/python/lib/gdb/libstdcxx/v6/printers.py b/gdb/python/lib/gdb/libstdcxx/v6/printers.py -new file mode 100644 -index 0000000..8c0efc5 ---- /dev/null -+++ b/gdb/python/lib/gdb/libstdcxx/v6/printers.py -@@ -0,0 +1,631 @@ -+# Pretty-printers for libstc++. -+ -+# Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+import gdb -+import itertools -+import re -+ -+class StdPointerPrinter: -+ "Print a smart pointer of some kind" -+ -+ def __init__ (self, typename, val): -+ self.typename = typename -+ self.val = val -+ -+ def to_string (self): -+ if self.val['_M_refcount']['_M_pi'] == 0: -+ return '%s (empty) %s' % (self.typename, self.val['_M_ptr']) -+ return '%s (count %d) %s' % (self.typename, -+ self.val['_M_refcount']['_M_pi']['_M_use_count'], -+ self.val['_M_ptr']) -+ -+class UniquePointerPrinter: -+ "Print a unique_ptr" -+ -+ def __init__ (self, val): -+ self.val = val -+ -+ def to_string (self): -+ return self.val['_M_t'] -+ -+class StdListPrinter: -+ "Print a std::list" -+ -+ class _iterator: -+ def __init__(self, nodetype, head): -+ self.nodetype = nodetype -+ self.base = head['_M_next'] -+ self.head = head.address -+ self.count = 0 -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ if self.base == self.head: -+ raise StopIteration -+ elt = self.base.cast(self.nodetype).dereference() -+ self.base = elt['_M_next'] -+ count = self.count -+ self.count = self.count + 1 -+ return ('[%d]' % count, elt['_M_data']) -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def children(self): -+ itype = self.val.type.template_argument(0) -+ nodetype = gdb.lookup_type('std::_List_node<%s>' % itype).pointer() -+ return self._iterator(nodetype, self.val['_M_impl']['_M_node']) -+ -+ def to_string(self): -+ if self.val['_M_impl']['_M_node'].address == self.val['_M_impl']['_M_node']['_M_next']: -+ return 'empty std::list' -+ return 'std::list' -+ -+class StdListIteratorPrinter: -+ "Print std::list::iterator" -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ itype = self.val.type.template_argument(0) -+ nodetype = gdb.lookup_type('std::_List_node<%s>' % itype).pointer() -+ return self.val['_M_node'].cast(nodetype).dereference()['_M_data'] -+ -+class StdSlistPrinter: -+ "Print a __gnu_cxx::slist" -+ -+ class _iterator: -+ def __init__(self, nodetype, head): -+ self.nodetype = nodetype -+ self.base = head['_M_head']['_M_next'] -+ self.count = 0 -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ if self.base == 0: -+ raise StopIteration -+ elt = self.base.cast(self.nodetype).dereference() -+ self.base = elt['_M_next'] -+ count = self.count -+ self.count = self.count + 1 -+ return ('[%d]' % count, elt['_M_data']) -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def children(self): -+ itype = self.val.type.template_argument(0) -+ nodetype = gdb.lookup_type('__gnu_cxx::_Slist_node<%s>' % itype).pointer() -+ return self._iterator(nodetype, self.val) -+ -+ def to_string(self): -+ if self.val['_M_head']['_M_next'] == 0: -+ return 'empty __gnu_cxx::slist' -+ return '__gnu_cxx::slist' -+ -+class StdSlistIteratorPrinter: -+ "Print __gnu_cxx::slist::iterator" -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ itype = self.val.type.template_argument(0) -+ nodetype = gdb.lookup_type('__gnu_cxx::_Slist_node<%s>' % itype).pointer() -+ return self.val['_M_node'].cast(nodetype).dereference()['_M_data'] -+ -+class StdVectorPrinter: -+ "Print a std::vector" -+ -+ class _iterator: -+ def __init__ (self, start, finish): -+ self.item = start -+ self.finish = finish -+ self.count = 0 -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ if self.item == self.finish: -+ raise StopIteration -+ count = self.count -+ self.count = self.count + 1 -+ elt = self.item.dereference() -+ self.item = self.item + 1 -+ return ('[%d]' % count, elt) -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def children(self): -+ return self._iterator(self.val['_M_impl']['_M_start'], -+ self.val['_M_impl']['_M_finish']) -+ -+ def to_string(self): -+ start = self.val['_M_impl']['_M_start'] -+ finish = self.val['_M_impl']['_M_finish'] -+ end = self.val['_M_impl']['_M_end_of_storage'] -+ return ('std::vector of length %d, capacity %d' -+ % (int (finish - start), int (end - start))) -+ -+ def display_hint(self): -+ return 'array' -+ -+class StdVectorIteratorPrinter: -+ "Print std::vector::iterator" -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return self.val['_M_current'].dereference() -+ -+class StdStackOrQueuePrinter: -+ "Print a std::stack or std::queue" -+ -+ def __init__ (self, typename, val): -+ self.typename = typename -+ self.visualizer = gdb.default_visualizer(val['c']) -+ -+ def children (self): -+ return self.visualizer.children() -+ -+ def to_string (self): -+ return '%s wrapping: %s' % (self.typename, -+ self.visualizer.to_string()) -+ -+ def display_hint (self): -+ if hasattr (self.visualizer, 'display_hint'): -+ return self.visualizer.display_hint () -+ return None -+ -+class RbtreeIterator: -+ def __init__(self, rbtree): -+ self.size = rbtree['_M_t']['_M_impl']['_M_node_count'] -+ self.node = rbtree['_M_t']['_M_impl']['_M_header']['_M_left'] -+ self.count = 0 -+ -+ def __iter__(self): -+ return self -+ -+ def __len__(self): -+ return int (self.size) -+ -+ def next(self): -+ if self.count == self.size: -+ raise StopIteration -+ result = self.node -+ self.count = self.count + 1 -+ if self.count < self.size: -+ # Compute the next node. -+ node = self.node -+ if node.dereference()['_M_right']: -+ node = node.dereference()['_M_right'] -+ while node.dereference()['_M_left']: -+ node = node.dereference()['_M_left'] -+ else: -+ parent = node.dereference()['_M_parent'] -+ while node == parent.dereference()['_M_right']: -+ node = parent -+ parent = parent.dereference()['_M_parent'] -+ if node.dereference()['_M_right'] != parent: -+ node = parent -+ self.node = node -+ return result -+ -+# This is a pretty printer for std::_Rb_tree_iterator (which is -+# std::map::iterator), and has nothing to do with the RbtreeIterator -+# class above. -+class StdRbtreeIteratorPrinter: -+ "Print std::map::iterator" -+ -+ def __init__ (self, val): -+ self.val = val -+ -+ def to_string (self): -+ valuetype = self.val.type.template_argument(0) -+ nodetype = gdb.lookup_type('std::_Rb_tree_node < %s >' % valuetype) -+ nodetype = nodetype.pointer() -+ return self.val.cast(nodetype).dereference()['_M_value_field'] -+ -+ -+class StdMapPrinter: -+ "Print a std::map or std::multimap" -+ -+ # Turn an RbtreeIterator into a pretty-print iterator. -+ class _iter: -+ def __init__(self, rbiter, type): -+ self.rbiter = rbiter -+ self.count = 0 -+ self.type = type -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ if self.count % 2 == 0: -+ n = self.rbiter.next() -+ n = n.cast(self.type).dereference()['_M_value_field'] -+ self.pair = n -+ item = n['first'] -+ else: -+ item = self.pair['second'] -+ result = ('[%d]' % self.count, item) -+ self.count = self.count + 1 -+ return result -+ -+ def __init__ (self, typename, val): -+ self.typename = typename -+ self.val = val -+ self.iter = RbtreeIterator (val) -+ -+ def to_string (self): -+ return '%s with %d elements' % (self.typename, len (self.iter)) -+ -+ def children (self): -+ keytype = self.val.type.template_argument(0).const() -+ valuetype = self.val.type.template_argument(1) -+ nodetype = gdb.lookup_type('std::_Rb_tree_node< std::pair< %s, %s > >' % (keytype, valuetype)) -+ nodetype = nodetype.pointer() -+ return self._iter (self.iter, nodetype) -+ -+ def display_hint (self): -+ return 'map' -+ -+class StdSetPrinter: -+ "Print a std::set or std::multiset" -+ -+ # Turn an RbtreeIterator into a pretty-print iterator. -+ class _iter: -+ def __init__(self, rbiter, type): -+ self.rbiter = rbiter -+ self.count = 0 -+ self.type = type -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ item = self.rbiter.next() -+ item = item.cast(self.type).dereference()['_M_value_field'] -+ # FIXME: this is weird ... what to do? -+ # Maybe a 'set' display hint? -+ result = ('[%d]' % self.count, item) -+ self.count = self.count + 1 -+ return result -+ -+ def __init__ (self, typename, val): -+ self.typename = typename -+ self.val = val -+ self.iter = RbtreeIterator (val) -+ -+ def to_string (self): -+ return '%s with %d elements' % (self.typename, len (self.iter)) -+ -+ def children (self): -+ keytype = self.val.type.template_argument(0) -+ nodetype = gdb.lookup_type('std::_Rb_tree_node< %s >' % keytype).pointer() -+ return self._iter (self.iter, nodetype) -+ -+class StdBitsetPrinter: -+ "Print a std::bitset" -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string (self): -+ # If template_argument handled values, we could print the -+ # size. Or we could use a regexp on the type. -+ return 'std::bitset' -+ -+ def children (self): -+ words = self.val['_M_w'] -+ wtype = words.type -+ -+ # The _M_w member can be either an unsigned long, or an -+ # array. This depends on the template specialization used. -+ # If it is a single long, convert to a single element list. -+ if wtype.code == gdb.TYPE_CODE_ARRAY: -+ tsize = wtype.target ().sizeof -+ else: -+ words = [words] -+ tsize = wtype.sizeof -+ -+ nwords = wtype.sizeof / tsize -+ result = [] -+ byte = 0 -+ while byte < nwords: -+ w = words[byte] -+ bit = 0 -+ while w != 0: -+ if (w & 1) != 0: -+ # Another spot where we could use 'set'? -+ result.append(('[%d]' % (byte * tsize * 8 + bit), 1)) -+ bit = bit + 1 -+ w = w >> 1 -+ byte = byte + 1 -+ return result -+ -+class StdDequePrinter: -+ "Print a std::deque" -+ -+ class _iter: -+ def __init__(self, node, start, end, last, buffer_size): -+ self.node = node -+ self.p = start -+ self.end = end -+ self.last = last -+ self.buffer_size = buffer_size -+ self.count = 0 -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ if self.p == self.last: -+ raise StopIteration -+ -+ result = ('[%d]' % self.count, self.p.dereference()) -+ self.count = self.count + 1 -+ -+ # Advance the 'cur' pointer. -+ self.p = self.p + 1 -+ if self.p == self.end: -+ # If we got to the end of this bucket, move to the -+ # next bucket. -+ self.node = self.node + 1 -+ self.p = self.node[0] -+ self.end = self.p + self.buffer_size -+ -+ return result -+ -+ def __init__(self, val): -+ self.val = val -+ self.elttype = val.type.template_argument(0) -+ size = self.elttype.sizeof -+ if size < 512: -+ self.buffer_size = int (512 / size) -+ else: -+ self.buffer_size = 1 -+ -+ def to_string(self): -+ start = self.val['_M_impl']['_M_start'] -+ end = self.val['_M_impl']['_M_finish'] -+ -+ delta_n = end['_M_node'] - start['_M_node'] - 1 -+ delta_s = start['_M_last'] - start['_M_cur'] -+ delta_e = end['_M_cur'] - end['_M_first'] -+ -+ size = self.buffer_size * delta_n + delta_s + delta_e -+ -+ return 'std::deque with %d elements' % long (size) -+ -+ def children(self): -+ start = self.val['_M_impl']['_M_start'] -+ end = self.val['_M_impl']['_M_finish'] -+ return self._iter(start['_M_node'], start['_M_cur'], start['_M_last'], -+ end['_M_cur'], self.buffer_size) -+ -+ def display_hint (self): -+ return 'array' -+ -+class StdDequeIteratorPrinter: -+ "Print std::deque::iterator" -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return self.val['_M_cur'].dereference() -+ -+class StdStringPrinter: -+ "Print a std::basic_string of some kind" -+ -+ def __init__(self, encoding, val): -+ self.encoding = encoding -+ self.val = val -+ -+ def to_string(self): -+ # Look up the target encoding as late as possible. -+ encoding = self.encoding -+ if encoding[0] is '@': -+ encoding = gdb.parameter(encoding[1:]) -+ return self.val['_M_dataplus']['_M_p'].string(encoding) -+ -+ def display_hint (self): -+ return 'string' -+ -+class Tr1HashtableIterator: -+ def __init__ (self, hash): -+ self.count = 0 -+ self.n_buckets = hash['_M_element_count'] -+ if self.n_buckets == 0: -+ self.node = False -+ else: -+ self.bucket = hash['_M_buckets'] -+ self.node = self.bucket[0] -+ self.update () -+ -+ def __iter__ (self): -+ return self -+ -+ def update (self): -+ # If we advanced off the end of the chain, move to the next -+ # bucket. -+ while self.node == 0: -+ self.bucket = self.bucket + 1 -+ self.node = self.bucket[0] -+ -+ # If we advanced off the end of the bucket array, then -+ # we're done. -+ if self.count == self.n_buckets: -+ self.node = False -+ else: -+ self.count = self.count + 1 -+ -+ def next (self): -+ if not self.node: -+ raise StopIteration -+ result = self.node.dereference()['_M_v'] -+ self.node = self.node.dereference()['_M_next'] -+ self.update () -+ return result -+ -+class Tr1UnorderedSetPrinter: -+ "Print a tr1::unordered_set" -+ -+ def __init__ (self, typename, val): -+ self.typename = typename -+ self.val = val -+ -+ def to_string (self): -+ return '%s with %d elements' % (self.typename, self.val['_M_element_count']) -+ -+ @staticmethod -+ def format_count (i): -+ return '[%d]' % i -+ -+ def children (self): -+ counter = itertools.imap (self.format_count, itertools.count()) -+ return itertools.izip (counter, Tr1HashtableIterator (self.val)) -+ -+class Tr1UnorderedMapPrinter: -+ "Print a tr1::unordered_map" -+ -+ def __init__ (self, typename, val): -+ self.typename = typename -+ self.val = val -+ -+ def to_string (self): -+ return '%s with %d elements' % (self.typename, self.val['_M_element_count']) -+ -+ @staticmethod -+ def flatten (list): -+ for elt in list: -+ for i in elt: -+ yield i -+ -+ @staticmethod -+ def format_one (elt): -+ return (elt['first'], elt['second']) -+ -+ @staticmethod -+ def format_count (i): -+ return '[%d]' % i -+ -+ def children (self): -+ counter = itertools.imap (self.format_count, itertools.count()) -+ # Map over the hash table and flatten the result. -+ data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.val))) -+ # Zip the two iterators together. -+ return itertools.izip (counter, data) -+ -+ def display_hint (self): -+ return 'map' -+ -+def register_libstdcxx_printers (obj): -+ "Register libstdc++ pretty-printers with objfile Obj." -+ -+ if obj == None: -+ obj = gdb -+ -+ obj.pretty_printers.append (lookup_function) -+ -+def lookup_function (val): -+ "Look-up and return a pretty-printer that can print val." -+ -+ # Get the type. -+ type = val.type; -+ -+ # If it points to a reference, get the reference. -+ if type.code == gdb.TYPE_CODE_REF: -+ type = type.target () -+ -+ # Get the unqualified type, stripped of typedefs. -+ type = type.unqualified ().strip_typedefs () -+ -+ # Get the type name. -+ typename = type.tag -+ if typename == None: -+ return None -+ -+ # Iterate over local dictionary of types to determine -+ # if a printer is registered for that type. Return an -+ # instantiation of the printer if found. -+ for function in pretty_printers_dict: -+ if function.search (typename): -+ return pretty_printers_dict[function] (val) -+ -+ # Cannot find a pretty printer. Return None. -+ return None -+ -+def build_libstdcxx_dictionary (): -+ # libstdc++ objects requiring pretty-printing. -+ # In order from: -+ # http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01847.html -+ pretty_printers_dict[re.compile('^std::basic_string$')] = lambda val: StdStringPrinter('@target-charset', val) -+ pretty_printers_dict[re.compile('^std::basic_string$')] = lambda val: StdStringPrinter('@target-wide-charset', val) -+ pretty_printers_dict[re.compile('^std::basic_string$')] = lambda val: StdStringPrinter('UTF-16', val) -+ pretty_printers_dict[re.compile('^std::basic_string$')] = lambda val: StdStringPrinter('UTF-32', val) -+ pretty_printers_dict[re.compile('^std::bitset<.*>$')] = StdBitsetPrinter -+ pretty_printers_dict[re.compile('^std::deque<.*>$')] = StdDequePrinter -+ pretty_printers_dict[re.compile('^std::list<.*>$')] = StdListPrinter -+ pretty_printers_dict[re.compile('^std::map<.*>$')] = lambda val: StdMapPrinter("std::map", val) -+ pretty_printers_dict[re.compile('^std::multimap<.*>$')] = lambda val: StdMapPrinter("std::multimap", val) -+ pretty_printers_dict[re.compile('^std::multiset<.*>$')] = lambda val: StdSetPrinter("std::multiset", val) -+ pretty_printers_dict[re.compile('^std::priority_queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::priority_queue", val) -+ pretty_printers_dict[re.compile('^std::queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::queue", val) -+ pretty_printers_dict[re.compile('^std::set<.*>$')] = lambda val: StdSetPrinter("std::set", val) -+ pretty_printers_dict[re.compile('^std::stack<.*>$')] = lambda val: StdStackOrQueuePrinter("std::stack", val) -+ pretty_printers_dict[re.compile('^std::unique_ptr<.*>$')] = UniquePointerPrinter -+ pretty_printers_dict[re.compile('^std::vector<.*>$')] = StdVectorPrinter -+ # vector -+ -+ # These are the C++0x printers. They also exist in the standard namespace. -+ # For array - the default GDB pretty-printer seems reasonable. -+ pretty_printers_dict[re.compile('^std::(tr1::)?shared_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::shared_ptr', val) -+ pretty_printers_dict[re.compile('^std::(tr1::)?weak_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::weak_ptr', val) -+ pretty_printers_dict[re.compile('^std::(tr1::)?unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::tr1::unordered_map', val) -+ pretty_printers_dict[re.compile('^std::(tr1::)?unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::tr1::unordered_set', val) -+ pretty_printers_dict[re.compile('^std::(tr1::)?unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::tr1::unordered_multimap', val) -+ pretty_printers_dict[re.compile('^std::(tr1::)?unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::tr1::unordered_multiset', val) -+ -+ -+ # Extensions. -+ pretty_printers_dict[re.compile('^__gnu_cxx::slist<.*>$')] = StdSlistPrinter -+ -+ if True: -+ # These shouldn't be necessary, if GDB "print *i" worked. -+ # But it often doesn't, so here they are. -+ pretty_printers_dict[re.compile('^std::_List_iterator<.*>$')] = lambda val: StdListIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^std::_List_const_iterator<.*>$')] = lambda val: StdListIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^std::_Rb_tree_iterator<.*>$')] = lambda val: StdRbtreeIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^std::_Rb_tree_const_iterator<.*>$')] = lambda val: StdRbtreeIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^std::_Deque_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^std::_Deque_const_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^__gnu_cxx::__normal_iterator<.*>$')] = lambda val: StdVectorIteratorPrinter(val) -+ pretty_printers_dict[re.compile('^__gnu_cxx::_Slist_iterator<.*>$')] = lambda val: StdSlistIteratorPrinter(val) -+ -+pretty_printers_dict = {} -+ -+build_libstdcxx_dictionary () diff --git a/gdb/python/python-block.c b/gdb/python/python-block.c new file mode 100644 index 0000000..8019e9d @@ -25984,7 +12095,7 @@ index 0000000..8019e9d +}; diff --git a/gdb/python/python-breakpoint.c b/gdb/python/python-breakpoint.c new file mode 100644 -index 0000000..ec80419 +index 0000000..afa9526 --- /dev/null +++ b/gdb/python/python-breakpoint.c @@ -0,0 +1,665 @@ @@ -26430,8 +12541,8 @@ index 0000000..ec80419 + + TRY_CATCH (except, RETURN_MASK_ALL) + { -+ set_breakpoint (spec, NULL, 0, 0, -1, 0, AUTO_BOOLEAN_TRUE, -+ 1 /*enabled*/); ++ set_breakpoint (python_gdbarch, spec, NULL, 0, 0, -1, 0, ++ AUTO_BOOLEAN_TRUE, 1); + } + if (except.reason < 0) + { @@ -26654,10 +12765,10 @@ index 0000000..ec80419 + breakpoint_object_getset /* tp_getset */ +}; diff --git a/gdb/python/python-cmd.c b/gdb/python/python-cmd.c -index 36cde34..e6e3ac0 100644 +index 528aca6..04b3fd1 100644 --- a/gdb/python/python-cmd.c +++ b/gdb/python/python-cmd.c -@@ -47,8 +47,7 @@ static struct cmdpy_completer completers[] = +@@ -49,8 +49,7 @@ static struct cmdpy_completer completers[] = #define N_COMPLETERS (sizeof (completers) / sizeof (completers[0])) @@ -26667,7 +12778,7 @@ index 36cde34..e6e3ac0 100644 struct cmdpy_object { PyObject_HEAD -@@ -68,7 +67,6 @@ typedef struct cmdpy_object cmdpy_object; +@@ -70,7 +69,6 @@ typedef struct cmdpy_object cmdpy_object; static PyTypeObject cmdpy_object_type; @@ -26675,7 +12786,7 @@ index 36cde34..e6e3ac0 100644 /* Constants used by this module. */ static PyObject *invoke_cst; static PyObject *complete_cst; -@@ -265,10 +263,13 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word) +@@ -263,10 +261,13 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word) *BASE_LIST is set to the final prefix command's list of *sub-commands. @@ -26691,7 +12802,7 @@ index 36cde34..e6e3ac0 100644 { struct cmd_list_element *elt; int len = strlen (text); -@@ -301,7 +302,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) +@@ -299,7 +300,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) ; if (i < 0) { @@ -26700,7 +12811,7 @@ index 36cde34..e6e3ac0 100644 return result; } -@@ -310,7 +311,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) +@@ -308,7 +309,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) prefix_text[i + 1] = '\0'; text = prefix_text; @@ -26709,54 +12820,7 @@ index 36cde34..e6e3ac0 100644 if (!elt || elt == (struct cmd_list_element *) -1) { PyErr_Format (PyExc_RuntimeError, _("could not find command prefix %s"), -@@ -336,16 +337,16 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) - - /* Object initializer; sets up gdb-side structures for command. - -- Use: __init__(NAME, CMDCLASS, [COMPLETERCLASS, [PREFIX]]). -+ Use: __init__(NAME, COMMAND_CLASS, [COMPLETER_CLASS, [PREFIX]]). - - NAME is the name of the command. It may consist of multiple words, - in which case the final word is the name of the new command, and - earlier words must be prefix commands. - -- CMDCLASS is the kind of command. It should be one of the COMMAND_* -+ COMMAND_CLASS is the kind of command. It should be one of the COMMAND_* - constants defined in the gdb module. - -- COMPLETERCLASS is the kind of completer. If not given, the -+ COMPLETER_CLASS is the kind of completer. If not given, the - "complete" method will be used. Otherwise, it should be one of the - COMPLETE_* constants defined in the gdb module. - -@@ -356,7 +357,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) - - */ - static int --cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) -+cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) - { - cmdpy_object *obj = (cmdpy_object *) self; - char *name; -@@ -366,6 +367,8 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) - volatile struct gdb_exception except; - struct cmd_list_element **cmd_list; - char *cmd_name, *pfx_name; -+ static char *keywords[] = { "name", "command_class", "completer_class", -+ "prefix", NULL }; - PyObject *is_prefix = NULL; - int cmp; - -@@ -378,7 +381,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) - return -1; - } - -- if (! PyArg_ParseTuple (args, "si|iO", &name, &cmdtype, -+ if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO", keywords, &name, &cmdtype, - &completetype, &is_prefix)) - return -1; - -@@ -399,7 +402,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) +@@ -399,7 +400,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) return -1; } @@ -26766,241 +12830,13 @@ index 36cde34..e6e3ac0 100644 return -1; diff --git a/gdb/python/python-frame.c b/gdb/python/python-frame.c -new file mode 100644 -index 0000000..dafe69a ---- /dev/null +index a97009f..3d2f61f 100644 +--- a/gdb/python/python-frame.c +++ b/gdb/python/python-frame.c -@@ -0,0 +1,713 @@ -+/* Python interface to stack frames -+ -+ Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include "defs.h" -+#include "charset.h" -+#include "block.h" -+#include "frame.h" -+#include "exceptions.h" -+#include "symtab.h" -+#include "stack.h" -+#include "value.h" -+#include "python-internal.h" -+ -+typedef struct { -+ PyObject_HEAD -+ struct frame_id frame_id; -+ struct gdbarch *gdbarch; -+ -+ /* Marks that the FRAME_ID member actually holds the ID of the frame next -+ to this, and not this frames' ID itself. This is a hack to permit Python -+ frame objects which represent invalid frames (i.e., the last frame_info -+ in a corrupt stack). The problem arises from the fact that this code -+ relies on FRAME_ID to uniquely identify a frame, which is not always true -+ for the last "frame" in a corrupt stack (it can have a null ID, or the same -+ ID as the previous frame). Whenever get_prev_frame returns NULL, we -+ record the frame_id of the next frame and set FRAME_ID_IS_NEXT to 1. */ -+ int frame_id_is_next; -+} frame_object; -+ -+/* Require a valid frame. This must be called inside a TRY_CATCH, or -+ another context in which a gdb exception is allowed. */ -+#define FRAPY_REQUIRE_VALID(frame_obj, frame) \ -+ do { \ -+ frame = frame_object_to_frame_info (frame_obj); \ -+ if (frame == NULL) \ -+ error ("Frame is invalid."); \ -+ } while (0) -+ -+static PyTypeObject frame_object_type; -+ -+/* Returns the frame_info object corresponding to the given Python Frame -+ object. If the frame doesn't exist anymore (the frame id doesn't -+ correspond to any frame in the inferior), returns NULL. */ -+ -+static struct frame_info * -+frame_object_to_frame_info (frame_object *frame_obj) -+{ -+ struct frame_info *frame; -+ -+ frame = frame_find_by_id (frame_obj->frame_id); -+ if (frame == NULL) -+ return NULL; -+ -+ if (frame_obj->frame_id_is_next) -+ frame = get_prev_frame (frame); -+ -+ return frame; -+} -+ -+/* Called by the Python interpreter to obtain string representation -+ of the object. */ -+ -+static PyObject * -+frapy_str (PyObject *self) -+{ -+ char *s; -+ long len; -+ PyObject *result; -+ struct ui_file *strfile; -+ -+ strfile = mem_fileopen (); -+ fprint_frame_id (strfile, ((frame_object *) self)->frame_id); -+ s = ui_file_xstrdup (strfile, &len); -+ result = PyString_FromString (s); -+ xfree (s); -+ -+ return result; -+} -+ -+/* Implementation of gdb.Frame.is_valid (self) -> Boolean. -+ Returns True if the frame corresponding to the frame_id of this -+ object still exists in the inferior. */ -+ -+static PyObject * -+frapy_is_valid (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ -+ frame = frame_object_to_frame_info ((frame_object *) self); -+ if (frame == NULL) -+ Py_RETURN_FALSE; -+ -+ Py_RETURN_TRUE; -+} -+ -+/* Implementation of gdb.Frame.equals (self, other) -> Boolean. */ -+ -+static PyObject * -+frapy_equal_p (PyObject *self, PyObject *args) -+{ -+ int equalp = 0; /* Initialize to appease gcc warning. */ -+ frame_object *self_frame = (frame_object *) self; -+ frame_object *other; -+ volatile struct gdb_exception except; -+ -+ if (!PyArg_ParseTuple (args, "O!", &frame_object_type, &other)) -+ return NULL; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ equalp = frame_id_eq (self_frame->frame_id, other->frame_id); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ if (equalp) -+ Py_RETURN_TRUE; -+ -+ Py_RETURN_FALSE; -+} -+ -+/* Implementation of gdb.Frame.name (self) -> String. -+ Returns the name of the function corresponding to this frame. */ -+ -+static PyObject * -+frapy_name (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ char *name; -+ enum language lang; -+ PyObject *result; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ find_frame_funname (frame, &name, &lang); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ if (name) -+ result = target_string_to_unicode (name, strlen (name)); -+ else -+ { -+ result = Py_None; -+ Py_INCREF (Py_None); -+ } -+ -+ return result; -+} -+ -+/* Implementation of gdb.Frame.type (self) -> Integer. -+ Returns the frame type, namely one of the gdb.*_FRAME constants. */ -+ -+static PyObject * -+frapy_type (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning. */ -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ type = get_frame_type (frame); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return PyInt_FromLong (type); -+} -+ -+/* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer. -+ Returns one of the gdb.FRAME_UNWIND_* constants. */ -+ -+static PyObject * -+frapy_unwind_stop_reason (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */ -+ volatile struct gdb_exception except; -+ enum unwind_stop_reason stop_reason; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ stop_reason = get_frame_unwind_stop_reason (frame); -+ -+ return PyInt_FromLong (stop_reason); -+} -+ -+/* Implementation of gdb.Frame.pc (self) -> Long. -+ Returns the frame's resume address. */ -+ -+static PyObject * -+frapy_pc (PyObject *self, PyObject *args) -+{ -+ CORE_ADDR pc = 0; /* Initialize to appease gcc warning. */ -+ struct frame_info *frame; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ pc = get_frame_pc (frame); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return PyLong_FromUnsignedLongLong (pc); -+} -+ +@@ -203,10 +203,59 @@ frapy_pc (PyObject *self, PyObject *args) + return PyLong_FromUnsignedLongLong (pc); + } + +/* Implementation of gdb.Frame.block (self) -> gdb.Block. + Returns the frame's code block. */ + @@ -27026,13 +12862,13 @@ index 0000000..dafe69a +} + + -+/* Implementation of gdb.Frame.addr_in_block (self) -> Long. -+ Returns an address which falls within the frame's code block. */ ++/* Implementation of gdb.Frame.function (self) -> gdb.Symbol. ++ Returns the symbol for the function corresponding to this frame. */ + +static PyObject * -+frapy_addr_in_block (PyObject *self, PyObject *args) ++frapy_function (PyObject *self, PyObject *args) +{ -+ CORE_ADDR pc = 0; /* Initialize to appease gcc warning. */ ++ struct symbol *sym = NULL; + struct frame_info *frame; + volatile struct gdb_exception except; + @@ -27040,107 +12876,38 @@ index 0000000..dafe69a + { + FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + -+ pc = get_frame_address_in_block (frame); ++ sym = find_pc_function (get_frame_address_in_block (frame)); + } + GDB_PY_HANDLE_EXCEPTION (except); + -+ return PyLong_FromUnsignedLongLong (pc); -+} -+ -+/* Convert a frame_info struct to a Python Frame object. -+ Sets a Python exception and returns NULL on error. */ -+ -+static frame_object * -+frame_info_to_frame_object (struct frame_info *frame) -+{ -+ frame_object *frame_obj; -+ -+ frame_obj = PyObject_New (frame_object, &frame_object_type); -+ if (frame_obj == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, "Could not allocate frame object."); -+ return NULL; -+ } -+ -+ /* Try to get the previous frame, to determine if this is the last frame -+ in a corrupt stack. If so, we need to store the frame_id of the next -+ frame and not of this one (which is possibly invalid). */ -+ if (get_prev_frame (frame) == NULL -+ && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON -+ && get_next_frame (frame) != NULL) -+ { -+ frame_obj->frame_id = get_frame_id (get_next_frame (frame)); -+ frame_obj->frame_id_is_next = 1; -+ } -+ else -+ { -+ frame_obj->frame_id = get_frame_id (frame); -+ frame_obj->frame_id_is_next = 0; -+ } -+ -+ frame_obj->gdbarch = get_frame_arch (frame); -+ -+ return frame_obj; -+} -+ -+/* Implementation of gdb.Frame.older (self) -> gdb.Frame. -+ Returns the frame immediately older (outer) to this frame, or None if -+ there isn't one. */ -+ -+static PyObject * -+frapy_older (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame, *prev; -+ volatile struct gdb_exception except; -+ PyObject *prev_obj = NULL; /* Initialize to appease gcc warning. */ -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ prev = get_prev_frame (frame); -+ if (prev) -+ prev_obj = (PyObject *) frame_info_to_frame_object (prev); -+ else -+ { -+ Py_INCREF (Py_None); -+ prev_obj = Py_None; -+ } -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return prev_obj; -+} -+ -+/* Implementation of gdb.Frame.newer (self) -> gdb.Frame. -+ Returns the frame immediately newer (inner) to this frame, or None if -+ there isn't one. */ -+ -+static PyObject * -+frapy_newer (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame, *next; -+ volatile struct gdb_exception except; -+ PyObject *next_obj = NULL; /* Initialize to appease gcc warning. */ -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ next = get_next_frame (frame); -+ if (next) -+ next_obj = (PyObject *) frame_info_to_frame_object (next); -+ else -+ { -+ Py_INCREF (Py_None); -+ next_obj = Py_None; -+ } -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return next_obj; ++ if (sym) ++ return symbol_to_symbol_object (sym); ++ ++ Py_RETURN_NONE; +} + + /* Convert a frame_info struct to a Python Frame object. + Sets a Python exception and returns NULL on error. */ + +-static frame_object * ++PyObject * + frame_info_to_frame_object (struct frame_info *frame) + { + frame_object *frame_obj; +@@ -236,7 +285,7 @@ frame_info_to_frame_object (struct frame_info *frame) + + frame_obj->gdbarch = get_frame_arch (frame); + +- return frame_obj; ++ return (PyObject *) frame_obj; + } + + /* Implementation of gdb.Frame.older (self) -> gdb.Frame. +@@ -297,7 +346,30 @@ frapy_newer (PyObject *self, PyObject *args) + return next_obj; + } + +-/* Implementation of gdb.Frame.read_var_value (self, variable) -> gdb.Value. +/* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line. + Returns the frame's symtab and line. */ + @@ -27165,511 +12932,91 @@ index 0000000..dafe69a +} + +/* Implementation of gdb.Frame.read_var (self, variable) -> gdb.Value. -+ Returns the value of the given variable in this frame. The argument can be -+ either a gdb.Symbol or a string. Returns None if GDB can't find the -+ specified variable. */ -+ -+static PyObject * -+frapy_read_var (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ PyObject *sym_obj; -+ struct symbol *var = NULL; /* gcc-4.3.2 false warning. */ -+ struct value *val = NULL; -+ volatile struct gdb_exception except; -+ -+ if (!PyArg_ParseTuple (args, "O", &sym_obj)) -+ return NULL; -+ + Returns the value of the given variable in this frame. The argument must be + a string. Returns None if GDB can't find the specified variable. */ + +@@ -313,7 +385,9 @@ frapy_read_var (PyObject *self, PyObject *args) + if (!PyArg_ParseTuple (args, "O", &sym_obj)) + return NULL; + +- if (gdbpy_is_string (sym_obj)) + if (PyObject_TypeCheck (sym_obj, &symbol_object_type)) + var = symbol_object_to_symbol (sym_obj); + else if (gdbpy_is_string (sym_obj)) -+ { -+ char *var_name; -+ struct block *block = NULL; -+ struct cleanup *cleanup; -+ volatile struct gdb_exception except; + { + char *var_name; + struct block *block = NULL; +@@ -366,6 +440,25 @@ frapy_read_var (PyObject *self, PyObject *args) + Py_RETURN_NONE; + } + ++/* Select this frame. */ + -+ var_name = python_string_to_target_string (sym_obj); -+ if (!var_name) -+ return NULL; -+ cleanup = make_cleanup (xfree, var_name); -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ block = block_for_pc (get_frame_address_in_block (frame)); -+ var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ if (!var) -+ { -+ PyErr_Format (PyExc_ValueError, -+ _("variable '%s' not found"), var_name); -+ do_cleanups (cleanup); -+ -+ return NULL; -+ } -+ -+ do_cleanups (cleanup); -+ } -+ else -+ { -+ PyErr_SetString (PyExc_TypeError, -+ _("argument must be a symbol or string")); -+ return NULL; -+ } ++static PyObject * ++frapy_select (PyObject *self, PyObject *args) ++{ ++ struct frame_info *fi; ++ frame_object *frame = (frame_object *) self; ++ volatile struct gdb_exception except; + + TRY_CATCH (except, RETURN_MASK_ALL) + { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ val = read_var_value (var, frame); ++ FRAPY_REQUIRE_VALID (frame, fi); ++ select_frame (fi); + } + GDB_PY_HANDLE_EXCEPTION (except); + -+ if (val) -+ return value_to_value_object (val); -+ + Py_RETURN_NONE; +} + -+/* Implementation of gdb.frames () -> (gdb.Frame, ...). -+ Returns a tuple of all frame objects. */ -+ -+PyObject * -+gdbpy_frames (PyObject *self, PyObject *args) -+{ -+ int result = 0; -+ struct frame_info *frame; -+ frame_object *frame_obj; -+ PyObject *list, *tuple; -+ volatile struct gdb_exception except; -+ -+ list = PyList_New (0); -+ if (list == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, "Could not allocate frames list."); -+ return NULL; -+ } -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ for (frame = get_current_frame (); frame; frame = get_prev_frame (frame)) -+ { -+ frame_obj = frame_info_to_frame_object (frame); -+ if (frame_obj == NULL) -+ { -+ Py_DECREF (list); -+ list = NULL; -+ break; -+ } -+ -+ PyList_Append (list, (PyObject *) frame_obj); -+ } -+ } -+ if (except.reason < 0) -+ { -+ Py_DECREF (list); -+ return PyErr_Format (except.reason == RETURN_QUIT -+ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, -+ "%s", except.message); -+ } -+ -+ if (list) -+ { -+ tuple = PyList_AsTuple (list); -+ Py_DECREF (list); -+ } -+ else -+ tuple = NULL; -+ -+ return tuple; -+} -+ -+/* Implementation of gdb.newest_frame () -> gdb.Frame. -+ Returns the newest frame object. */ -+ -+PyObject * -+gdbpy_newest_frame (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ frame_object *frame_obj = NULL; /* Initialize to appease gcc warning. */ -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ frame = get_current_frame (); -+ frame_obj = frame_info_to_frame_object (frame); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return (PyObject *) frame_obj; -+} -+ -+/* Implementation of gdb.selected_frame () -> gdb.Frame. -+ Returns the selected frame object. */ -+ -+PyObject * -+gdbpy_selected_frame (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ frame_object *frame_obj = NULL; /* Initialize to appease gcc warning. */ -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ frame = get_selected_frame ("No frame is currently selected."); -+ frame_obj = frame_info_to_frame_object (frame); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return (PyObject *) frame_obj; -+} -+ -+/* Implementation of gdb.stop_reason_string (Integer) -> String. -+ Return a string explaining the unwind stop reason. */ -+ -+PyObject * -+gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args) -+{ -+ int reason; -+ const char *str; -+ -+ if (!PyArg_ParseTuple (args, "i", &reason)) -+ return NULL; -+ -+ if (reason < 0 || reason > UNWIND_NO_SAVED_PC) -+ { -+ PyErr_SetString (PyExc_ValueError, "Invalid frame stop reason."); -+ return NULL; -+ } -+ -+ str = frame_stop_reason_string (reason); -+ return PyUnicode_Decode (str, strlen (str), host_charset (), NULL); -+} -+ -+/* Implements the equality comparison for Frame objects. -+ All other comparison operators will throw a TypeError Python exception, -+ as they aren't valid for frames. */ -+ -+static PyObject * -+frapy_richcompare (PyObject *self, PyObject *other, int op) -+{ -+ int result; -+ -+ if (!PyObject_TypeCheck (other, &frame_object_type) -+ || (op != Py_EQ && op != Py_NE)) -+ { -+ Py_INCREF (Py_NotImplemented); -+ return Py_NotImplemented; -+ } -+ -+ if (frame_id_eq (((frame_object *) self)->frame_id, -+ ((frame_object *) other)->frame_id)) -+ result = Py_EQ; -+ else -+ result = Py_NE; -+ -+ if (op == result) -+ Py_RETURN_TRUE; -+ Py_RETURN_FALSE; -+} -+ -+/* Sets up the Frame API in the gdb module. */ -+ -+void -+gdbpy_initialize_frames (void) -+{ -+ frame_object_type.tp_new = PyType_GenericNew; -+ if (PyType_Ready (&frame_object_type) < 0) -+ return; -+ -+ /* Note: These would probably be best exposed as class attributes of Frame, -+ but I don't know how to do it except by messing with the type's dictionary. -+ That seems too messy. */ -+ PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME); -+ PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME); -+ PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME", SIGTRAMP_FRAME); -+ PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME", SENTINEL_FRAME); -+ PyModule_AddIntConstant (gdb_module, -+ "FRAME_UNWIND_NO_REASON", UNWIND_NO_REASON); -+ PyModule_AddIntConstant (gdb_module, -+ "FRAME_UNWIND_NULL_ID", UNWIND_NULL_ID); -+ PyModule_AddIntConstant (gdb_module, -+ "FRAME_UNWIND_FIRST_ERROR", UNWIND_FIRST_ERROR); -+ PyModule_AddIntConstant (gdb_module, -+ "FRAME_UNWIND_INNER_ID", UNWIND_INNER_ID); -+ PyModule_AddIntConstant (gdb_module, -+ "FRAME_UNWIND_SAME_ID", UNWIND_SAME_ID); -+ PyModule_AddIntConstant (gdb_module, -+ "FRAME_UNWIND_NO_SAVED_PC", UNWIND_NO_SAVED_PC); -+ -+ Py_INCREF (&frame_object_type); -+ PyModule_AddObject (gdb_module, "Frame", (PyObject *) &frame_object_type); -+} -+ -+ -+ -+static PyMethodDef frame_object_methods[] = { -+ { "equals", frapy_equal_p, METH_VARARGS, -+ "equals (frame) -> Boolean.\n\ -+Compare this frame to the given frame." }, -+ { "is_valid", frapy_is_valid, METH_NOARGS, -+ "is_valid () -> Boolean.\n\ -+Return true if this frame is valid, false if not." }, -+ { "name", frapy_name, METH_NOARGS, -+ "name () -> String.\n\ -+Return the function name of the frame, or None if it can't be determined." }, -+ { "type", frapy_type, METH_NOARGS, -+ "type () -> Integer.\n\ -+Return the type of the frame." }, -+ { "unwind_stop_reason", frapy_unwind_stop_reason, METH_NOARGS, -+ "unwind_stop_reason () -> Integer.\n\ -+Return the reason why it's not possible to find frames older than this." }, -+ { "pc", frapy_pc, METH_NOARGS, -+ "pc () -> Long.\n\ -+Return the frame's resume address." }, + /* Implementation of gdb.selected_frame () -> gdb.Frame. + Returns the selected frame object. */ + +@@ -373,7 +466,7 @@ PyObject * + gdbpy_selected_frame (PyObject *self, PyObject *args) + { + struct frame_info *frame; +- frame_object *frame_obj = NULL; /* Initialize to appease gcc warning. */ ++ PyObject *frame_obj = NULL; /* Initialize to appease gcc warning. */ + volatile struct gdb_exception except; + + TRY_CATCH (except, RETURN_MASK_ALL) +@@ -383,7 +476,7 @@ gdbpy_selected_frame (PyObject *self, PyObject *args) + } + GDB_PY_HANDLE_EXCEPTION (except); + +- return (PyObject *) frame_obj; ++ return frame_obj; + } + + /* Implementation of gdb.stop_reason_string (Integer) -> String. +@@ -485,15 +578,26 @@ Return the reason why it's not possible to find frames older than this." }, + { "pc", frapy_pc, METH_NOARGS, + "pc () -> Long.\n\ + Return the frame's resume address." }, + { "block", frapy_block, METH_NOARGS, + "block () -> gdb.Block.\n\ +Return the frame's code block." }, -+ { "addr_in_block", frapy_addr_in_block, METH_NOARGS, -+ "addr_in_block () -> Long.\n\ -+Return an address which falls within the frame's code block." }, -+ { "older", frapy_older, METH_NOARGS, -+ "older () -> gdb.Frame.\n\ -+Return the frame immediately older (outer) to this frame." }, -+ { "newer", frapy_newer, METH_NOARGS, -+ "newer () -> gdb.Frame.\n\ -+Return the frame immetidaely newer (inner) to this frame." }, ++ { "function", frapy_function, METH_NOARGS, ++ "function () -> gdb.Symbol.\n\ ++Returns the symbol for the function corresponding to this frame." }, + { "older", frapy_older, METH_NOARGS, + "older () -> gdb.Frame.\n\ + Return the frame that called this frame." }, + { "newer", frapy_newer, METH_NOARGS, + "newer () -> gdb.Frame.\n\ + Return the frame called by this frame." }, + { "find_sal", frapy_find_sal, METH_NOARGS, + "find_sal () -> gdb.Symtab_and_line.\n\ +Return the frame's symtab and line." }, -+ { "read_var", frapy_read_var, METH_VARARGS, -+ "read_var (variable) -> gdb.Value.\n\ -+Return the value of the variable in this frame." }, -+ {NULL} /* Sentinel */ -+}; -+ -+static PyTypeObject frame_object_type = { -+ PyObject_HEAD_INIT (NULL) -+ 0, /* ob_size */ -+ "gdb.Frame", /* tp_name */ -+ sizeof (frame_object), /* tp_basicsize */ -+ 0, /* tp_itemsize */ -+ 0, /* tp_dealloc */ -+ 0, /* tp_print */ -+ 0, /* tp_getattr */ -+ 0, /* tp_setattr */ -+ 0, /* tp_compare */ -+ 0, /* tp_repr */ -+ 0, /* tp_as_number */ -+ 0, /* tp_as_sequence */ -+ 0, /* tp_as_mapping */ -+ 0, /* tp_hash */ -+ 0, /* tp_call */ -+ frapy_str, /* tp_str */ -+ 0, /* tp_getattro */ -+ 0, /* tp_setattro */ -+ 0, /* tp_as_buffer */ -+ Py_TPFLAGS_DEFAULT, /* tp_flags */ -+ "GDB frame object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ frame_object_methods /* tp_methods */ -+}; -diff --git a/gdb/python/python-function.c b/gdb/python/python-function.c -new file mode 100644 -index 0000000..4a85a33 ---- /dev/null -+++ b/gdb/python/python-function.c -@@ -0,0 +1,180 @@ -+/* Convenience functions implemented in Python. -+ -+ Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+ -+#include "defs.h" -+#include "value.h" -+#include "exceptions.h" -+#include "python-internal.h" -+#include "charset.h" -+#include "gdbcmd.h" -+#include "cli/cli-decode.h" -+#include "completer.h" -+#include "expression.h" -+ -+static PyTypeObject fnpy_object_type; -+ -+ -+ -+static PyObject * -+convert_values_to_python (int argc, struct value **argv) -+{ -+ int i; -+ PyObject *result = PyTuple_New (argc); -+ for (i = 0; i < argc; ++i) -+ { -+ PyObject *elt = value_to_value_object (argv[i]); -+ if (! elt) -+ { -+ Py_DECREF (result); -+ error (_("Could not convert value to Python object.")); -+ } -+ PyTuple_SetItem (result, i, elt); -+ } -+ return result; -+} -+ -+/* Call a Python function object's invoke method. */ -+ -+static struct value * -+fnpy_call (void *cookie, int argc, struct value **argv) -+{ -+ int i; -+ struct value *value = NULL; -+ PyObject *result, *callable, *args; -+ struct cleanup *cleanup; -+ PyGILState_STATE state; -+ -+ state = PyGILState_Ensure (); -+ cleanup = make_cleanup_py_restore_gil (&state); -+ -+ args = convert_values_to_python (argc, argv); -+ -+ callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke"); -+ if (! callable) -+ { -+ Py_DECREF (args); -+ error (_("No method named 'invoke' in object.")); -+ } -+ -+ result = PyObject_Call (callable, args, NULL); -+ Py_DECREF (callable); -+ Py_DECREF (args); -+ -+ if (!result) -+ { -+ gdbpy_print_stack (); -+ error (_("Error while executing Python code.")); -+ } -+ -+ value = convert_value_from_python (result); -+ if (value == NULL) -+ { -+ Py_DECREF (result); -+ gdbpy_print_stack (); -+ error (_("Error while executing Python code.")); -+ } -+ -+ Py_DECREF (result); -+ do_cleanups (cleanup); -+ -+ return value; -+} -+ -+/* Initializer for a Function object. It takes one argument, the name -+ of the function. */ -+ -+static int -+fnpy_init (PyObject *self, PyObject *args, PyObject *kwds) -+{ -+ char *name, *docstring = NULL; -+ if (! PyArg_ParseTuple (args, "s", &name)) -+ return -1; -+ Py_INCREF (self); -+ -+ if (PyObject_HasAttrString (self, "__doc__")) -+ { -+ PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__"); -+ if (ds_obj && gdbpy_is_string (ds_obj)) -+ /* Nothing ever frees this. */ -+ docstring = python_string_to_host_string (ds_obj); -+ } -+ if (! docstring) -+ docstring = _("This function is not documented."); -+ -+ add_internal_function (name, docstring, fnpy_call, self); -+ return 0; -+} -+ -+/* Initialize internal function support. */ -+ -+void -+gdbpy_initialize_functions (void) -+{ -+ if (PyType_Ready (&fnpy_object_type) < 0) -+ return; -+ -+ Py_INCREF (&fnpy_object_type); -+ PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type); -+} -+ -+ -+ -+static PyTypeObject fnpy_object_type = -+{ -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Function", /*tp_name*/ -+ sizeof (PyObject), /*tp_basicsize*/ -+ 0, /*tp_itemsize*/ -+ 0, /*tp_dealloc*/ -+ 0, /*tp_print*/ -+ 0, /*tp_getattr*/ -+ 0, /*tp_setattr*/ -+ 0, /*tp_compare*/ -+ 0, /*tp_repr*/ -+ 0, /*tp_as_number*/ -+ 0, /*tp_as_sequence*/ -+ 0, /*tp_as_mapping*/ -+ 0, /*tp_hash */ -+ 0, /*tp_call*/ -+ 0, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ -+ "GDB function object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ 0, /* tp_methods */ -+ 0, /* tp_members */ -+ 0, /* tp_getset */ -+ 0, /* tp_base */ -+ 0, /* tp_dict */ -+ 0, /* tp_descr_get */ -+ 0, /* tp_descr_set */ -+ 0, /* tp_dictoffset */ -+ fnpy_init, /* tp_init */ -+ 0, /* tp_alloc */ -+ PyType_GenericNew /* tp_new */ -+}; + { "read_var", frapy_read_var, METH_VARARGS, + "read_var (variable) -> gdb.Value.\n\ + Return the value of the variable in this frame." }, ++ { "select", frapy_select, METH_NOARGS, ++ "Select this frame as the user's current frame." }, + {NULL} /* Sentinel */ + }; + diff --git a/gdb/python/python-hooks.c b/gdb/python/python-hooks.c new file mode 100644 index 0000000..a3140bc @@ -27726,30 +13073,1234 @@ index 0000000..a3140bc + Py_DECREF (hooks); + return result; +} +diff --git a/gdb/python/python-inferior.c b/gdb/python/python-inferior.c +new file mode 100644 +index 0000000..5e90cc2 +--- /dev/null ++++ b/gdb/python/python-inferior.c +@@ -0,0 +1,926 @@ ++/* Python interface to inferiors. ++ ++ Copyright (C) 2009 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#include "defs.h" ++#include "exceptions.h" ++#include "gdbcore.h" ++#include "gdbthread.h" ++#include "inferior.h" ++#include "observer.h" ++#include "python-internal.h" ++#include "arch-utils.h" ++#include "language.h" ++ ++struct threadlist_entry { ++ thread_object *thread_obj; ++ struct threadlist_entry *next; ++}; ++ ++typedef struct ++{ ++ PyObject_HEAD ++ ++ /* The inferior we represent. */ ++ struct inferior *inferior; ++ ++ /* thread_object instances under this inferior. This list owns a reference ++ to each object it contains. */ ++ struct threadlist_entry *threads; ++ ++ /* Number of threads in the list. */ ++ int nthreads; ++} inferior_object; ++ ++static PyTypeObject inferior_object_type; ++ ++typedef struct { ++ PyObject_HEAD ++ void *buffer; ++ ++ /* These are kept just for mbpy_str. */ ++ CORE_ADDR addr; ++ CORE_ADDR length; ++} membuf_object; ++ ++static PyTypeObject membuf_object_type; ++ ++/* Require that INFERIOR be a valid inferior ID. */ ++#define INFPY_REQUIRE_VALID(Inferior) \ ++ do { \ ++ if (!Inferior->inferior) \ ++ { \ ++ PyErr_SetString (PyExc_RuntimeError, \ ++ "inferior no longer exists"); \ ++ return NULL; \ ++ } \ ++ } while (0) ++ ++struct inflist_entry { ++ inferior_object *inf_obj; ++ struct inflist_entry *next; ++}; ++ ++ ++ ++/* Inferior objects list. */ ++ ++/* List containing inferior_objects. This list owns a reference to each ++ object it contains. */ ++static struct inflist_entry *inferior_list; ++ ++static int ninferiors; ++ ++ ++/* An observer callback function that is called when an inferior has ++ been created. Creates a corresponding Python object for the inferior ++ and adds it to the list. */ ++static void ++add_inferior_object (int pid) ++{ ++ struct inferior *inf = find_inferior_pid (pid); ++ inferior_object *inf_obj; ++ struct inflist_entry *entry; ++ struct cleanup *cleanup; ++ ++ if (!inf) ++ { ++ warning (_("Can't create Python Inferior object.")); ++ return; ++ } ++ ++ cleanup = ensure_python_env (get_current_arch (), current_language); ++ ++ inf_obj = PyObject_New (inferior_object, &inferior_object_type); ++ if (!inf_obj) ++ { ++ warning (_("Can't create Python Inferior object.")); ++ gdbpy_print_stack (); ++ do_cleanups (cleanup); ++ return; ++ } ++ ++ inf_obj->inferior = inf; ++ inf_obj->threads = NULL; ++ inf_obj->nthreads = 0; ++ ++ entry = xmalloc (sizeof (struct inflist_entry)); ++ entry->inf_obj = inf_obj; ++ entry->next = inferior_list; ++ ++ inferior_list = entry; ++ ++ ninferiors++; ++ ++ do_cleanups (cleanup); ++} ++ ++/* An observer callback function that is called when an inferior has ++ been deleted. Removes the corresponding Python object from the ++ inferior list, and removes the list's reference to the object. */ ++static void ++delete_inferior_object (int pid) ++{ ++ PyGILState_STATE state; ++ struct inflist_entry **inf_entry, *inf_tmp; ++ struct threadlist_entry *th_entry, *th_tmp; ++ ++ /* Find inferior_object for the given PID. */ ++ for (inf_entry = &inferior_list; *inf_entry != NULL; ++ inf_entry = &(*inf_entry)->next) ++ if ((*inf_entry)->inf_obj->inferior->pid == pid) ++ break; ++ ++ if (!*inf_entry) ++ return; ++ ++ state = PyGILState_Ensure (); ++ ++ inf_tmp = *inf_entry; ++ inf_tmp->inf_obj->inferior = NULL; ++ ++ /* Deallocate threads list. */ ++ for (th_entry = inf_tmp->inf_obj->threads; th_entry != NULL;) ++ { ++ Py_DECREF (th_entry->thread_obj); ++ ++ th_tmp = th_entry; ++ th_entry = th_entry->next; ++ xfree (th_tmp); ++ } ++ ++ inf_tmp->inf_obj->nthreads = 0; ++ ++ *inf_entry = (*inf_entry)->next; ++ Py_DECREF (inf_tmp->inf_obj); ++ xfree (inf_tmp); ++ ++ ninferiors--; ++ ++ PyGILState_Release (state); ++} ++ ++/* Finds the Python Inferior object for the given pid. Returns a borrowed ++ reference. */ ++PyObject * ++find_inferior_object (int pid) ++{ ++ struct inflist_entry *p; ++ ++ for (p = inferior_list; p != NULL; p = p->next) ++ if (p->inf_obj->inferior->pid == pid) ++ return (PyObject *) p->inf_obj; ++ ++ return NULL; ++} ++ ++/* Finds the Python InferiorThread object for the given ptid. Returns a ++ borrowed reference. */ ++thread_object * ++find_thread_object (ptid_t ptid) ++{ ++ int pid; ++ struct inflist_entry *p; ++ struct threadlist_entry *q; ++ ++ pid = PIDGET (ptid); ++ for (p = inferior_list; p != NULL; p = p->next) ++ if (p->inf_obj->inferior->pid == pid) ++ for (q = p->inf_obj->threads; q != NULL; q = q->next) ++ if (ptid_equal (q->thread_obj->thread->ptid, ptid)) ++ return q->thread_obj; ++ ++ return NULL; ++} ++ ++ ++ ++/* Inferior object. */ ++ ++static void ++add_thread_object (struct thread_info *tp) ++{ ++ PyGILState_STATE state; ++ thread_object *thread_obj; ++ inferior_object *inf_obj; ++ struct threadlist_entry *entry; ++ ++ state = PyGILState_Ensure (); ++ ++ thread_obj = create_thread_object (tp); ++ if (!thread_obj) ++ { ++ warning (_("Can't create Python InferiorThread object.")); ++ gdbpy_print_stack (); ++ PyGILState_Release (state); ++ return; ++ } ++ ++ inf_obj = (inferior_object *) thread_obj->inf_obj; ++ ++ entry = xmalloc (sizeof (struct threadlist_entry)); ++ entry->thread_obj = thread_obj; ++ entry->next = inf_obj->threads; ++ ++ inf_obj->threads = entry; ++ inf_obj->nthreads++; ++ ++ PyGILState_Release (state); ++} ++ ++static void ++delete_thread_object (struct thread_info *tp, int ignore) ++{ ++ PyGILState_STATE state; ++ inferior_object *inf_obj; ++ thread_object *thread_obj; ++ struct threadlist_entry **entry, *tmp; ++ ++ inf_obj = (inferior_object *) find_inferior_object (PIDGET(tp->ptid)); ++ if (!inf_obj) ++ return; ++ ++ /* Find thread entry in its inferior's thread_list. */ ++ for (entry = &inf_obj->threads; *entry != NULL; entry = &(*entry)->next) ++ if ((*entry)->thread_obj->thread == tp) ++ break; ++ ++ if (!*entry) ++ return; ++ ++ state = PyGILState_Ensure (); ++ ++ tmp = *entry; ++ tmp->thread_obj->thread = NULL; ++ ++ *entry = (*entry)->next; ++ inf_obj->nthreads--; ++ ++ Py_DECREF (tmp->thread_obj); ++ xfree (tmp); ++ ++ ++ PyGILState_Release (state); ++} ++ ++static PyObject * ++infpy_threads (PyObject *self, PyObject *args) ++{ ++ int i; ++ struct threadlist_entry *entry; ++ inferior_object *inf_obj = (inferior_object *) self; ++ PyObject *tuple; ++ ++ INFPY_REQUIRE_VALID (inf_obj); ++ ++ ++ tuple = PyTuple_New (inf_obj->nthreads); ++ if (!tuple) ++ return NULL; ++ ++ /* The list is in reverse order of thread age (i.e., newest comes first), ++ is this a problem? */ ++ for (i = 0, entry = inf_obj->threads; i < inf_obj->nthreads; ++ i++, entry = entry->next) ++ { ++ Py_INCREF (entry->thread_obj); ++ PyTuple_SET_ITEM (tuple, i, (PyObject *) entry->thread_obj); ++ } ++ ++ return tuple; ++} ++ ++static PyObject * ++infpy_get_num (PyObject *self, void *closure) ++{ ++ inferior_object *inf = (inferior_object *) self; ++ ++ INFPY_REQUIRE_VALID (inf); ++ ++ return PyLong_FromLong (inf->inferior->num); ++} ++ ++static PyObject * ++infpy_get_pid (PyObject *self, void *closure) ++{ ++ inferior_object *inf = (inferior_object *) self; ++ ++ INFPY_REQUIRE_VALID (inf); ++ ++ return PyLong_FromLong (inf->inferior->pid); ++} ++ ++static PyObject * ++infpy_get_was_attached (PyObject *self, void *closure) ++{ ++ inferior_object *inf = (inferior_object *) self; ++ INFPY_REQUIRE_VALID (inf); ++ if (inf->inferior->attach_flag) ++ Py_RETURN_TRUE; ++ Py_RETURN_FALSE; ++} ++ ++ ++ ++/* Implementation of gdb.inferiors () -> (gdb.Inferior, ...). ++ Returns a list of all inferiors. */ ++ ++PyObject * ++gdbpy_inferiors (PyObject *unused, PyObject *unused2) ++{ ++ int i; ++ struct inflist_entry *entry; ++ PyObject *tuple; ++ ++ tuple = PyTuple_New (ninferiors); ++ if (!tuple) ++ return NULL; ++ ++ /* The list is in reverse order of inferior age (i.e., newest comes first), ++ is this a problem? */ ++ for (i = 0, entry = inferior_list; i < ninferiors; i++, entry = entry->next) ++ { ++ Py_INCREF (entry->inf_obj); ++ PyTuple_SET_ITEM (tuple, i, (PyObject *) entry->inf_obj); ++ } ++ ++ return tuple; ++} ++ ++ ++ ++/* Membuf and memory manipulation. */ ++ ++/* Implementation of gdb.read_memory (address, length). ++ Returns a Python buffer object with LENGTH bytes of the inferior's memory ++ at ADDRESS. Both arguments are integers. */ ++ ++static PyObject * ++infpy_read_memory (PyObject *self, PyObject *args) ++{ ++ int error = 0; ++ CORE_ADDR addr, length; ++ void *buffer = NULL; ++ membuf_object *membuf_obj; ++ PyObject *addr_obj, *length_obj; ++ struct cleanup *cleanups; ++ volatile struct gdb_exception except; ++ ++ if (! PyArg_ParseTuple (args, "OO", &addr_obj, &length_obj)) ++ return NULL; ++ ++ cleanups = make_cleanup (null_cleanup, NULL); ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ if (!get_addr_from_python (addr_obj, &addr) ++ || !get_addr_from_python (length_obj, &length)) ++ { ++ error = 1; ++ break; ++ } ++ ++ buffer = xmalloc (length); ++ make_cleanup (xfree, buffer); ++ ++ read_memory (addr, buffer, length); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ if (error) ++ { ++ do_cleanups (cleanups); ++ return NULL; ++ } ++ ++ membuf_obj = PyObject_New (membuf_object, &membuf_object_type); ++ if (membuf_obj == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, ++ "Could not allocate memory buffer object."); ++ do_cleanups (cleanups); ++ return NULL; ++ } ++ ++ discard_cleanups (cleanups); ++ ++ membuf_obj->buffer = buffer; ++ membuf_obj->addr = addr; ++ membuf_obj->length = length; ++ ++ return PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0, ++ Py_END_OF_BUFFER); ++} ++ ++/* Implementation of gdb.write_memory (address, buffer [, length]). ++ Writes the contents of BUFFER (a Python object supporting the read buffer ++ protocol) at ADDRESS in the inferior's memory. Write LENGTH bytes from ++ BUFFER, or its entire contents if the argument is not provided. The ++ function returns nothing. */ ++ ++static PyObject * ++infpy_write_memory (PyObject *self, PyObject *args) ++{ ++ int buf_len, error = 0; ++ const char *buffer; ++ CORE_ADDR addr, length; ++ PyObject *addr_obj, *length_obj = NULL; ++ volatile struct gdb_exception except; ++ ++ if (! PyArg_ParseTuple (args, "Os#|O", &addr_obj, &buffer, &buf_len, ++ &length_obj)) ++ return NULL; ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ if (!get_addr_from_python (addr_obj, &addr)) ++ { ++ error = 1; ++ break; ++ } ++ ++ if (!length_obj) ++ length = buf_len; ++ else if (!get_addr_from_python (length_obj, &length)) ++ { ++ error = 1; ++ break; ++ } ++ ++ write_memory (addr, buffer, length); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ if (error) ++ return NULL; ++ ++ Py_RETURN_NONE; ++} ++ ++/* Destructor of Membuf objects. */ ++ ++static void ++mbpy_dealloc (PyObject *self) ++{ ++ xfree (((membuf_object *) self)->buffer); ++ self->ob_type->tp_free (self); ++} ++ ++/* Return a description of the Membuf object. */ ++ ++static PyObject * ++mbpy_str (PyObject *self) ++{ ++ membuf_object *membuf_obj = (membuf_object *) self; ++ ++ return PyString_FromFormat ("memory buffer for address %s, %s bytes long", ++ paddress (python_gdbarch, membuf_obj->addr), ++ pulongest (membuf_obj->length)); ++} ++ ++static Py_ssize_t ++get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) ++{ ++ membuf_object *membuf_obj = (membuf_object *) self; ++ ++ if (segment) ++ { ++ PyErr_SetString (PyExc_SystemError, ++ "The memory buffer supports only one segment."); ++ return -1; ++ } ++ ++ *ptrptr = membuf_obj->buffer; ++ ++ return membuf_obj->length; ++} ++ ++static Py_ssize_t ++get_write_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) ++{ ++ return get_read_buffer (self, segment, ptrptr); ++} ++ ++static Py_ssize_t ++get_seg_count (PyObject *self, Py_ssize_t *lenp) ++{ ++ if (lenp) ++ *lenp = ((membuf_object *) self)->length; ++ ++ return 1; ++} ++ ++static Py_ssize_t ++get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr) ++{ ++ void *ptr = NULL; ++ Py_ssize_t ret; ++ ++ ret = get_read_buffer (self, segment, &ptr); ++ *ptrptr = (char *) ptr; ++ ++ return ret; ++} ++ ++/* Adds GDB value V to the pattern buffer in *PATTERN_BUF. If SIZE is not zero, ++ it specifies the number of bytes from V to copy to *PATTERN_BUF. The ++ function increases the size of *PATTERN_BUF as necessary, adjusting ++ *PATTERN_BUF_END and *PATTERN_BUF_SIZE in the process. */ ++ ++static void ++add_value_pattern (struct value *v, int size, char **pattern_buf, ++ char **pattern_buf_end, ULONGEST *pattern_buf_size) ++{ ++ int val_bytes; ++ ++ if (size) ++ { ++ LONGEST x = value_as_long (v); ++ ++ if (size == 1) ++ *(*pattern_buf_end)++ = x; ++ else ++ { ++ put_bits (x, *pattern_buf_end, size * 8, ++ gdbarch_byte_order (python_gdbarch) == BFD_ENDIAN_BIG); ++ *pattern_buf_end += size; ++ } ++ } ++ else ++ { ++ val_bytes = TYPE_LENGTH (value_type (v)); ++ ++ increase_pattern_buffer (pattern_buf, pattern_buf_end, ++ pattern_buf_size, val_bytes); ++ ++ memcpy (*pattern_buf_end, value_contents_raw (v), val_bytes); ++ *pattern_buf_end += val_bytes; ++ } ++} ++ ++/* This function does the actual work of constructing the pattern buffer from ++ OBJ. If OBJ is an object which implements the read buffer protocol (such ++ as a string, a byte array or gdb.Membuf), then its contents are directly ++ copied to *PATTERN_BUF. If it is a list, then this function is recursively ++ called for each of its elements. If OBJ is an object which can be converted ++ to a GDB value, then the contents of the value are copied to PATTERN_BUF. ++ If SIZE is different than zero, then it limits the number of bytes which ++ are copied to the buffer in case OBJ is converted to a GDB value. That ++ means that SIZE influences only Python scalars and gdb.Value objects. ++ The function increases the size of *PATTERN_BUF as necessary, adjusting ++ *PATTERN_BUF_END and *PATTERN_BUF_SIZE in the process. ++ ++ Returns 1 on success or 0 on failure, with a Python exception set. This ++ function can also throw GDB exceptions. */ ++ ++static int ++add_pattern_element (PyObject *obj, int size, char **pattern_buf, ++ char **pattern_buf_end, ULONGEST *pattern_buf_size) ++{ ++ if (PyObject_CheckReadBuffer (obj)) ++ { ++ /* Handle string, Unicode string, byte array, gdb.Membuf and any other ++ object implementing the buffer protocol. The SIZE parameter is ++ ignored in this case. */ ++ ++ Py_ssize_t val_bytes; ++ const void *buffer; ++ ++ if (PyObject_AsReadBuffer (obj, &buffer, &val_bytes) == -1) ++ return 0; ++ ++ increase_pattern_buffer (pattern_buf, pattern_buf_end, ++ pattern_buf_size, val_bytes); ++ ++ memcpy (*pattern_buf_end, buffer, val_bytes); ++ *pattern_buf_end += val_bytes; ++ } ++ else if (gdbpy_is_value_object (obj)) ++ add_value_pattern (value_object_to_value (obj), size, pattern_buf, ++ pattern_buf_end, pattern_buf_size); ++ else if (PySequence_Check (obj)) ++ { ++ /* Handle lists and tuples. */ ++ ++ Py_ssize_t i, num_objs; ++ ++ num_objs = PySequence_Size (obj); ++ for (i = 0; i < num_objs; i++) ++ if (!add_pattern_element (PySequence_GetItem (obj, i), size, ++ pattern_buf, pattern_buf_end, ++ pattern_buf_size)) ++ return 0; ++ } ++ else ++ { ++ /* See if we can convert from a Python object to a GDB value. */ ++ ++ struct value *v = convert_value_from_python (obj); ++ ++ if (v) ++ add_value_pattern (v, size, pattern_buf, pattern_buf_end, ++ pattern_buf_size); ++ else ++ return 0; ++ } ++ ++ return 1; ++} ++ ++/* Constructs the search pattern from OBJ, putting it in *PATTERN_BUFP, and its ++ size in *PATTERN_LENP. See the function add_pattern_element to learn how ++ the search pattern is obtained from OBJ. ++ ++ Returns 1 on success or 0 on failure, with a Python exception set. This ++ function can also throw GDB exceptions. */ ++ ++static int ++get_search_pattern (PyObject *obj, int size, char **pattern_bufp, ++ ULONGEST *pattern_lenp) ++{ ++ /* Buffer to hold the search pattern. */ ++ char *pattern_buf; ++ /* Current size of search pattern buffer. ++ We realloc space as needed. */ ++ ULONGEST pattern_buf_size; ++ /* Pointer to one past the last in-use part of pattern_buf. */ ++ char *pattern_buf_end; ++ struct cleanup *old_cleanups; ++ ++ allocate_pattern_buffer (&pattern_buf, &pattern_buf_end, &pattern_buf_size); ++ old_cleanups = make_cleanup (free_current_contents, &pattern_buf); ++ ++ if (!add_pattern_element (obj, size, &pattern_buf, &pattern_buf_end, ++ &pattern_buf_size)) ++ { ++ do_cleanups (old_cleanups); ++ ++ return 0; ++ } ++ ++ *pattern_bufp = pattern_buf; ++ *pattern_lenp = pattern_buf_end - pattern_buf; ++ ++ discard_cleanups (old_cleanups); ++ ++ return 1; ++} ++ ++/* Implementation of ++ gdb.search_memory (address, length, pattern [, size] [, max_count]). ++ The third argument may be either a pattern, or a list or tupple of patterns ++ to be searched. Size is the size in bytes of each search query value, either ++ 1, 2, 4 or 8. Returns a list of the addresses where matches were found. */ ++ ++static PyObject * ++infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) ++{ ++ int size = 0; ++ unsigned int found_count = 0; ++ long max_count = 0; ++ CORE_ADDR start_addr, length; ++ char *pattern_buf; ++ static char *keywords[] = { "address", "length", "pattern", "size", ++ "max_count", NULL }; ++ ULONGEST pattern_len, search_space_len; ++ PyObject *pattern, *list = NULL, *start_addr_obj, *length_obj; ++ volatile struct gdb_exception except; ++ ++ if (! PyArg_ParseTupleAndKeywords (args, kw, "OOO|il", keywords, ++ &start_addr_obj, &length_obj, &pattern, ++ &size, &max_count)) ++ return NULL; ++ ++ if (!max_count) ++ max_count = LONG_MAX; ++ ++ if (size != 0 && size != 1 && size != 2 && size != 4 && size != 8) ++ { ++ PyErr_SetString (PyExc_ValueError, "invalid pattern size"); ++ return NULL; ++ } ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ if (get_addr_from_python (start_addr_obj, &start_addr) ++ && get_addr_from_python (length_obj, &length)) ++ { ++ if (!length) ++ { ++ PyErr_SetString (PyExc_ValueError, "empty search range"); ++ break; ++ } ++ /* Watch for overflows. */ ++ else if (length > CORE_ADDR_MAX ++ || (start_addr + length - 1) < start_addr) ++ { ++ PyErr_SetString (PyExc_ValueError, "search range too large"); ++ break; ++ } ++ ++ search_space_len = length; ++ ++ if (get_search_pattern (pattern, size, &pattern_buf, &pattern_len)) ++ { ++ /* Any cleanups get automatically executed on an exception. */ ++ struct cleanup *cleanups = make_cleanup (xfree, pattern_buf); ++ ++ list = PyList_New (0); ++ ++ while (search_space_len >= pattern_len && found_count < max_count) ++ { ++ CORE_ADDR found_addr; ++ int found; ++ ++ found = search_memory (&start_addr, &search_space_len, ++ pattern_buf, pattern_len, &found_addr); ++ if (found <= 0) ++ break; ++ ++ PyList_Append (list, PyLong_FromUnsignedLong (found_addr)); ++ ++found_count; ++ } ++ ++ do_cleanups (cleanups); ++ } ++ } ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ return list; ++} ++ ++ ++ ++void ++gdbpy_initialize_inferior (void) ++{ ++ if (PyType_Ready (&inferior_object_type) < 0) ++ return; ++ ++ Py_INCREF (&inferior_object_type); ++ PyModule_AddObject (gdb_module, "Inferior", ++ (PyObject *) &inferior_object_type); ++ ++ inferior_list = NULL; ++ ninferiors = 0; ++ ++ observer_attach_new_inferior (add_inferior_object); ++ observer_attach_inferior_exit (delete_inferior_object); ++ observer_attach_new_thread (add_thread_object); ++ observer_attach_thread_exit (delete_thread_object); ++ ++ if (PyType_Ready (&membuf_object_type) < 0) ++ return; ++ ++ Py_INCREF (&membuf_object_type); ++ PyModule_AddObject (gdb_module, "Membuf", (PyObject *) &membuf_object_type); ++} ++ ++ ++ ++static PyGetSetDef inferior_object_getset[] = ++{ ++ { "num", infpy_get_num, NULL, "ID of inferior, as assigned by GDB.", NULL }, ++ { "pid", infpy_get_pid, NULL, "PID of inferior, as assigned by the OS.", ++ NULL }, ++ { "was_attached", infpy_get_was_attached, NULL, ++ "True if the inferior was created using 'attach'.", NULL }, ++ ++ { NULL } ++}; ++ ++static PyMethodDef inferior_object_methods[] = ++{ ++ { "threads", infpy_threads, METH_NOARGS, ++ "Return all the threads of this inferior." }, ++ ++ { "read_memory", infpy_read_memory, METH_VARARGS, ++ "read_memory (address, length) -> buffer\n\ ++Return a buffer object for reading from the inferior's memory." }, ++ { "write_memory", infpy_write_memory, METH_VARARGS, ++ "write_memory (address, buffer [, length])\n\ ++Write the given buffer object to the inferior's memory." }, ++ { "search_memory", (PyCFunction) infpy_search_memory, METH_VARARGS | METH_KEYWORDS, ++ "search_memory (address, length, pattern [, size] [, max_count]) -> list\n\ ++Return a list with the addresses where matches were found." }, ++ ++ { NULL } ++}; ++ ++static PyTypeObject inferior_object_type = ++{ ++ PyObject_HEAD_INIT (NULL) ++ 0, /* ob_size */ ++ "gdb.Inferior", /* tp_name */ ++ sizeof (inferior_object), /* tp_basicsize */ ++ 0, /* tp_itemsize */ ++ 0, /* tp_dealloc */ ++ 0, /* tp_print */ ++ 0, /* tp_getattr */ ++ 0, /* tp_setattr */ ++ 0, /* tp_compare */ ++ 0, /* tp_repr */ ++ 0, /* tp_as_number */ ++ 0, /* tp_as_sequence */ ++ 0, /* tp_as_mapping */ ++ 0, /* tp_hash */ ++ 0, /* tp_call */ ++ 0, /* tp_str */ ++ 0, /* tp_getattro */ ++ 0, /* tp_setattro */ ++ 0, /* tp_as_buffer */ ++ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */ ++ "GDB inferior object", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ inferior_object_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ inferior_object_getset, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ 0, /* tp_init */ ++ 0 /* tp_alloc */ ++}; ++ ++ ++ ++/* Python doesn't provide a decent way to get compatibility here. */ ++#if HAVE_LIBPYTHON2_4 ++#define CHARBUFFERPROC_NAME getcharbufferproc ++#else ++#define CHARBUFFERPROC_NAME charbufferproc ++#endif ++ ++static PyBufferProcs buffer_procs = { ++ get_read_buffer, ++ get_write_buffer, ++ get_seg_count, ++ /* The cast here works around a difference between Python 2.4 and ++ Python 2.5. */ ++ (CHARBUFFERPROC_NAME) get_char_buffer ++}; ++ ++static PyTypeObject membuf_object_type = { ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Membuf", /*tp_name*/ ++ sizeof (membuf_object), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ mbpy_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_compare*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ mbpy_str, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ &buffer_procs, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT, /*tp_flags*/ ++ "GDB memory buffer object", /*tp_doc*/ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ 0, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ 0, /* tp_init */ ++ 0, /* tp_alloc */ ++ PyType_GenericNew /* tp_new */ ++}; +diff --git a/gdb/python/python-infthread.c b/gdb/python/python-infthread.c +new file mode 100644 +index 0000000..21e4eab +--- /dev/null ++++ b/gdb/python/python-infthread.c +@@ -0,0 +1,285 @@ ++/* Python interface to inferior threads. ++ ++ Copyright (C) 2009 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#include "defs.h" ++#include "exceptions.h" ++#include "gdbthread.h" ++#include "inferior.h" ++#include "python-internal.h" ++ ++static PyTypeObject thread_object_type; ++ ++/* Require that INFERIOR be a valid inferior ID. */ ++#define THPY_REQUIRE_VALID(Thread) \ ++ do { \ ++ if (!Thread->thread) \ ++ { \ ++ PyErr_SetString (PyExc_RuntimeError, \ ++ "thread no longer exists"); \ ++ return NULL; \ ++ } \ ++ } while (0) ++ ++ ++ ++thread_object * ++create_thread_object (struct thread_info *tp) ++{ ++ thread_object *thread_obj; ++ ++ thread_obj = PyObject_New (thread_object, &thread_object_type); ++ if (!thread_obj) ++ return NULL; ++ ++ thread_obj->thread = tp; ++ thread_obj->inf_obj = find_inferior_object (PIDGET (tp->ptid)); ++ Py_INCREF (thread_obj->inf_obj); ++ ++ return thread_obj; ++} ++ ++ ++ ++static void ++thpy_dealloc (PyObject *self) ++{ ++ Py_DECREF (((thread_object *) self)->inf_obj); ++ self->ob_type->tp_free (self); ++} ++ ++static PyObject * ++thpy_get_num (PyObject *self, void *closure) ++{ ++ thread_object *thread_obj = (thread_object *) self; ++ ++ THPY_REQUIRE_VALID (thread_obj); ++ ++ return PyLong_FromLong (thread_obj->thread->num); ++} ++ ++ ++ ++/* Implementation of Inferior.frames () -> (gdb.Frame, ...). ++ Returns a tuple of all frame objects. */ ++PyObject * ++thpy_frames (PyObject *self, PyObject *args) ++{ ++ int result = 0; ++ struct frame_info *frame; ++ PyObject *frame_obj; ++ PyObject *list, *tuple; ++ thread_object *thread_obj = (thread_object *) self; ++ struct cleanup *cleanup; ++ volatile struct gdb_exception except; ++ ++ THPY_REQUIRE_VALID (thread_obj); ++ ++ list = PyList_New (0); ++ if (list == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, "Could not allocate frames list."); ++ return NULL; ++ } ++ ++ cleanup = make_cleanup_restore_current_thread (); ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ switch_to_thread (thread_obj->thread->ptid); ++ ++ for (frame = get_current_frame (); frame; frame = get_prev_frame (frame)) ++ { ++ frame_obj = frame_info_to_frame_object (frame); ++ if (frame_obj == NULL) ++ { ++ Py_DECREF (list); ++ list = NULL; ++ break; ++ } ++ ++ PyList_Append (list, frame_obj); ++ } ++ } ++ if (except.reason < 0) ++ { ++ Py_DECREF (list); ++ return PyErr_Format (except.reason == RETURN_QUIT ++ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, ++ "%s", except.message); ++ } ++ ++ do_cleanups (cleanup); ++ ++ if (list) ++ { ++ tuple = PyList_AsTuple (list); ++ Py_DECREF (list); ++ } ++ else ++ tuple = NULL; ++ ++ return tuple; ++} ++ ++/* Implementation of InferiorThread.newest_frame () -> gdb.Frame. ++ Returns the newest frame object. */ ++PyObject * ++thpy_newest_frame (PyObject *self, PyObject *args) ++{ ++ struct frame_info *frame; ++ PyObject *frame_obj = NULL; /* Initialize to appease gcc warning. */ ++ thread_object *thread_obj = (thread_object *) self; ++ struct cleanup *cleanup; ++ volatile struct gdb_exception except; ++ ++ THPY_REQUIRE_VALID (thread_obj); ++ ++ cleanup = make_cleanup_restore_current_thread (); ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ switch_to_thread (thread_obj->thread->ptid); ++ ++ frame = get_current_frame (); ++ frame_obj = frame_info_to_frame_object (frame); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ do_cleanups (cleanup); ++ ++ return frame_obj; ++} ++ ++/* Implementation of InferiorThread.switch (). ++ Makes this the GDB selected thread. */ ++static PyObject * ++thpy_switch (PyObject *self, PyObject *args) ++{ ++ thread_object *thread_obj = (thread_object *) self; ++ struct cleanup *cleanup; ++ volatile struct gdb_exception except; ++ ++ THPY_REQUIRE_VALID (thread_obj); ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ switch_to_thread (thread_obj->thread->ptid); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ Py_RETURN_NONE; ++} ++ ++ ++ ++/* Implementation of gdb.selected_thread () -> gdb.InferiorThread. ++ Returns the selected thread object. */ ++PyObject * ++gdbpy_selected_thread (PyObject *self, PyObject *args) ++{ ++ PyObject *thread_obj; ++ ++ thread_obj = (PyObject *) find_thread_object (inferior_ptid); ++ if (thread_obj) ++ { ++ Py_INCREF (thread_obj); ++ return thread_obj; ++ } ++ ++ Py_RETURN_NONE; ++} ++ ++ ++ ++void ++gdbpy_initialize_thread (void) ++{ ++ if (PyType_Ready (&thread_object_type) < 0) ++ return; ++ ++ Py_INCREF (&thread_object_type); ++ PyModule_AddObject (gdb_module, "InferiorThread", ++ (PyObject *) &thread_object_type); ++} ++ ++ ++ ++static PyGetSetDef thread_object_getset[] = ++{ ++ { "num", thpy_get_num, NULL, "ID of the thread, as assigned by GDB.", NULL }, ++ ++ { NULL } ++}; ++ ++static PyMethodDef thread_object_methods[] = ++{ ++ { "frames", thpy_frames, METH_NOARGS, ++ "frames () -> (gdb.Frame, ...)\n\ ++Return a tuple containing all frames in the thread." }, ++ { "newest_frame", thpy_newest_frame, METH_NOARGS, ++ "newest_frame () -> gdb.Frame\n\ ++Return the newest frame in the thread." }, ++ { "switch", thpy_switch, METH_NOARGS, ++ "switch ()\n\ ++Makes this the GDB selected thread." }, ++ ++ { NULL } ++}; ++ ++static PyTypeObject thread_object_type = ++{ ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.InferiorThread", /*tp_name*/ ++ sizeof (thread_object), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ thpy_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_compare*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ ++ "GDB thread object", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ thread_object_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ thread_object_getset, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ 0, /* tp_init */ ++ 0 /* tp_alloc */ ++}; diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h -index 02dbfc4..5e43267 100644 +index 67a78af..47662d9 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h -@@ -33,6 +33,7 @@ - - #if HAVE_LIBPYTHON2_4 - #include "python2.4/Python.h" -+#include "python2.4/frameobject.h" - /* Py_ssize_t is not defined until 2.5. - Logical type for Py_ssize_t is Py_intptr_t, but that fails in 64-bit - compilation due to several apparent mistakes in python2.4 API, so we -@@ -40,8 +41,10 @@ - typedef int Py_ssize_t; - #elif HAVE_LIBPYTHON2_5 - #include "python2.5/Python.h" -+#include "python2.5/frameobject.h" - #elif HAVE_LIBPYTHON2_6 - #include "python2.6/Python.h" -+#include "python2.6/frameobject.h" - #else - #error "Unable to find usable Python.h" - #endif -@@ -58,23 +61,70 @@ typedef int Py_ssize_t; +@@ -61,33 +61,76 @@ typedef int Py_ssize_t; #define PyEval_ReleaseLock() 0 #endif @@ -27759,58 +14310,76 @@ index 02dbfc4..5e43267 100644 +struct symbol; +struct symtab_and_line; struct value; + struct language_defn; extern PyObject *gdb_module; +extern PyTypeObject block_object_type; extern PyTypeObject value_object_type; +extern PyTypeObject symbol_object_type; ++ ++/* Used in python-inferior.c. */ ++typedef struct ++{ ++ PyObject_HEAD ++ ++ /* The thread we represent. */ ++ struct thread_info *thread; ++ ++ /* The Inferior object to which this thread belongs. */ ++ PyObject *inf_obj; ++} thread_object; PyObject *gdbpy_history (PyObject *self, PyObject *args); -- +PyObject *gdbpy_breakpoints (PyObject *, PyObject *); -+PyObject *gdbpy_frames (PyObject *, PyObject *); -+PyObject *gdbpy_newest_frame (PyObject *, PyObject *); -+PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *); + PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *); +PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); -+PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args); + PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args); +PyObject *gdbpy_block_for_pc (PyObject *self, PyObject *args); -+PyObject *gdbpy_read_memory (PyObject *self, PyObject *args); -+PyObject *gdbpy_write_memory (PyObject *self, PyObject *args); -+PyObject *gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw); -+ + PyObject *gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw); ++PyObject *gdbpy_inferiors (PyObject *unused, PyObject *unused2); ++PyObject *gdbpy_selected_thread (PyObject *self, PyObject *args); + +PyObject *symtab_and_line_to_sal_object (struct symtab_and_line sal); +PyObject *symtab_to_symtab_object (struct symtab *symtab); +PyObject *symbol_to_symbol_object (struct symbol *sym); +PyObject *block_to_block_object (struct block *block); PyObject *value_to_value_object (struct value *v); -+PyObject *type_to_type_object (struct type *); -+PyObject *objfile_to_objfile_object (struct objfile *); + PyObject *type_to_type_object (struct type *); + PyObject *objfile_to_objfile_object (struct objfile *); ++PyObject *frame_info_to_frame_object (struct frame_info *frame); ++thread_object *create_thread_object (struct thread_info *tp); ++thread_object *find_thread_object (ptid_t ptid); ++PyObject *find_inferior_object (int pid); + + PyObject *objfpy_get_printers (PyObject *, void *); -+PyObject *objfpy_get_printers (PyObject *, void *); -+ +struct block *block_object_to_block (PyObject *obj); +struct symbol *symbol_object_to_symbol (PyObject *obj); -+struct value *value_object_to_value (PyObject *self); + struct value *value_object_to_value (PyObject *self); struct value *convert_value_from_python (PyObject *obj); -+struct type *type_object_to_type (PyObject *obj); -+ -+PyObject *gdbpy_get_hook_function (const char *); + struct type *type_object_to_type (PyObject *obj); ++PyObject *gdbpy_get_hook_function (const char *); ++ void gdbpy_initialize_values (void); +void gdbpy_initialize_breakpoints (void); -+void gdbpy_initialize_frames (void); + void gdbpy_initialize_frames (void); +void gdbpy_initialize_symtabs (void); void gdbpy_initialize_commands (void); +void gdbpy_initialize_symbols (void); -+void gdbpy_initialize_types (void); + void gdbpy_initialize_types (void); +void gdbpy_initialize_blocks (void); -+void gdbpy_initialize_functions (void); -+void gdbpy_initialize_objfile (void); + void gdbpy_initialize_functions (void); + void gdbpy_initialize_objfile (void); +void gdbpy_initialize_parameters (void); -+void gdbpy_initialize_membuf (void); ++void gdbpy_initialize_thread (void); ++void gdbpy_initialize_inferior (void); struct cleanup *make_cleanup_py_decref (PyObject *py); - struct cleanup *make_cleanup_py_restore_gil (PyGILState_STATE *state); + +@@ -97,6 +140,12 @@ struct cleanup *ensure_python_env (struct gdbarch *gdbarch, + extern struct gdbarch *python_gdbarch; + extern const struct language_defn *python_language; +char *gdbpy_parse_command_name (char *text, + struct cmd_list_element ***base_list, @@ -27821,7 +14390,7 @@ index 02dbfc4..5e43267 100644 /* Use this after a TRY_EXCEPT to throw the appropriate Python exception. */ #define GDB_PY_HANDLE_EXCEPTION(Exception) \ -@@ -85,6 +135,19 @@ struct cleanup *make_cleanup_py_restore_gil (PyGILState_STATE *state); +@@ -107,6 +156,19 @@ extern const struct language_defn *python_language; "%s", Exception.message); \ } while (0) @@ -27841,34 +14410,36 @@ index 02dbfc4..5e43267 100644 void gdbpy_print_stack (void); -@@ -95,6 +158,21 @@ char *python_string_to_host_string (PyObject *obj); +@@ -118,17 +180,22 @@ char *python_string_to_host_string (PyObject *obj); PyObject *target_string_to_unicode (const gdb_byte *str, int length); int gdbpy_is_string (PyObject *obj); +int gdbpy_is_value_object (PyObject *obj); + -+/* Note that these are declared here, and not in python.h with the -+ other pretty-printer functions, because they refer to PyObject. */ -+char *apply_varobj_pretty_printer (PyObject *print_obj, -+ struct value **replacement); -+PyObject *gdbpy_get_varobj_pretty_printer (struct value *value); + /* Note that these are declared here, and not in python.h with the + other pretty-printer functions, because they refer to PyObject. */ + PyObject *apply_varobj_pretty_printer (PyObject *print_obj, + struct value **replacement); + PyObject *gdbpy_get_varobj_pretty_printer (struct value *value); +PyObject *gdbpy_instantiate_printer (PyObject *cons, PyObject *value); -+char *gdbpy_get_display_hint (PyObject *printer); -+ -+extern PyObject *gdbpy_children_cst; -+extern PyObject *gdbpy_to_string_cst; -+extern PyObject *gdbpy_display_hint_cst; - extern PyObject *gdbpy_doc_cst; + char *gdbpy_get_display_hint (PyObject *printer); + PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args); -+int get_addr_from_python (PyObject *obj, CORE_ADDR *addr); +-extern PyObject *gdbpy_doc_cst; + extern PyObject *gdbpy_children_cst; + extern PyObject *gdbpy_to_string_cst; + extern PyObject *gdbpy_display_hint_cst; ++extern PyObject *gdbpy_doc_cst; + ++int get_addr_from_python (PyObject *obj, CORE_ADDR *addr); + #endif /* GDB_PYTHON_INTERNAL_H */ diff --git a/gdb/python/python-membuf.c b/gdb/python/python-membuf.c new file mode 100644 -index 0000000..a4c7d74 +index 0000000..7bc294c --- /dev/null +++ b/gdb/python/python-membuf.c -@@ -0,0 +1,243 @@ +@@ -0,0 +1,268 @@ +/* Python interface to the inferior memory. + + Copyright (C) 2008, 2009 Free Software Foundation, Inc. @@ -27911,25 +14482,36 @@ index 0000000..a4c7d74 +PyObject * +gdbpy_read_memory (PyObject *self, PyObject *args) +{ ++ int error = 0; + CORE_ADDR addr, length; -+ void *buffer; ++ void *buffer = NULL; + membuf_object *membuf_obj; -+ struct cleanup *cleanups; ++ PyObject *addr_obj, *length_obj; ++ struct cleanup *cleanups = NULL; + volatile struct gdb_exception except; + -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ if (! PyArg_ParseTuple (args, "kk", &addr, &length)) ++ if (! PyArg_ParseTuple (args, "OO", &addr_obj, &length_obj)) + return NULL; + -+ buffer = xmalloc (length); -+ cleanups = make_cleanup (xfree, buffer); -+ + TRY_CATCH (except, RETURN_MASK_ALL) + { ++ if (!get_addr_from_python (addr_obj, &addr) ++ || !get_addr_from_python (length_obj, &length)) ++ { ++ error = 1; ++ break; ++ } ++ ++ buffer = xmalloc (length); ++ cleanups = make_cleanup (xfree, buffer); ++ + read_memory (addr, buffer, length); + } + GDB_PY_HANDLE_EXCEPTION (except); + ++ if (error) ++ return NULL; ++ + discard_cleanups (cleanups); + + membuf_obj = PyObject_New (membuf_object, &membuf_object_type); @@ -27942,11 +14524,11 @@ index 0000000..a4c7d74 + } + + membuf_obj->buffer = buffer; -+ + membuf_obj->addr = addr; + membuf_obj->length = length; + -+ return PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0, Py_END_OF_BUFFER); ++ return PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0, ++ Py_END_OF_BUFFER); +} + +/* Implementation of gdb.write_memory (address, buffer [, length]). @@ -27958,25 +14540,39 @@ index 0000000..a4c7d74 +PyObject * +gdbpy_write_memory (PyObject *self, PyObject *args) +{ -+ int buf_len; ++ int buf_len, error = 0; + const char *buffer; -+ long length = -1; -+ CORE_ADDR addr; ++ CORE_ADDR addr, length; ++ PyObject *addr_obj, *length_obj = NULL; + volatile struct gdb_exception except; + -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ if (! PyArg_ParseTuple (args, "ks#|l", &addr, &buffer, &buf_len, &length)) ++ if (! PyArg_ParseTuple (args, "Os#|O", &addr_obj, &buffer, &buf_len, ++ &length_obj)) + return NULL; + -+ if (length == -1) -+ length = buf_len; -+ + TRY_CATCH (except, RETURN_MASK_ALL) + { ++ if (!get_addr_from_python (addr_obj, &addr)) ++ { ++ error = 1; ++ break; ++ } ++ ++ if (!length_obj) ++ length = buf_len; ++ else if (!get_addr_from_python (length_obj, &length)) ++ { ++ error = 1; ++ break; ++ } ++ + write_memory (addr, buffer, length); + } + GDB_PY_HANDLE_EXCEPTION (except); + ++ if (error) ++ return NULL; ++ + Py_RETURN_NONE; +} + @@ -28112,237 +14708,6 @@ index 0000000..a4c7d74 + Py_INCREF (&membuf_object_type); + PyModule_AddObject (gdb_module, "Membuf", (PyObject *) &membuf_object_type); +} -diff --git a/gdb/python/python-objfile.c b/gdb/python/python-objfile.c -new file mode 100644 -index 0000000..f5db084 ---- /dev/null -+++ b/gdb/python/python-objfile.c -@@ -0,0 +1,225 @@ -+/* Python interface to objfiles. -+ -+ Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include "defs.h" -+#include "python-internal.h" -+#include "charset.h" -+#include "objfiles.h" -+ -+typedef struct -+{ -+ PyObject_HEAD -+ -+ /* The corresponding objfile. */ -+ struct objfile *objfile; -+ -+ /* The pretty-printer list of functions. */ -+ PyObject *printers; -+} objfile_object; -+ -+static PyTypeObject objfile_object_type; -+ -+static const struct objfile_data *objfpy_objfile_data_key; -+ -+ -+ -+/* An Objfile method which returns the objfile's file name, or None. */ -+static PyObject * -+objfpy_get_filename (PyObject *self, void *closure) -+{ -+ objfile_object *obj = (objfile_object *) self; -+ if (obj->objfile && obj->objfile->name) -+ return PyString_Decode (obj->objfile->name, strlen (obj->objfile->name), -+ host_charset (), NULL); -+ Py_RETURN_NONE; -+} -+ -+static void -+objfpy_dealloc (PyObject *o) -+{ -+ objfile_object *self = (objfile_object *) o; -+ Py_XDECREF (self->printers); -+ self->ob_type->tp_free ((PyObject *) self); -+} -+ -+static PyObject * -+objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords) -+{ -+ objfile_object *self = (objfile_object *) type->tp_alloc (type, 0); -+ if (self) -+ { -+ self->objfile = NULL; -+ -+ self->printers = PyList_New (0); -+ if (!self->printers) -+ { -+ Py_DECREF (self); -+ return NULL; -+ } -+ } -+ return (PyObject *) self; -+} -+ -+PyObject * -+objfpy_get_printers (PyObject *o, void *ignore) -+{ -+ objfile_object *self = (objfile_object *) o; -+ Py_INCREF (self->printers); -+ return self->printers; -+} -+ -+static int -+objfpy_set_printers (PyObject *o, PyObject *value, void *ignore) -+{ -+ objfile_object *self = (objfile_object *) o; -+ if (! value) -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "cannot delete the pretty_printers attribute"); -+ return -1; -+ } -+ -+ if (! PyList_Check (value)) -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "the pretty_printers attribute must be a list"); -+ return -1; -+ } -+ -+ Py_XDECREF (self->printers); -+ Py_INCREF (value); -+ self->printers = value; -+ -+ return 0; -+} -+ -+ -+ -+/* Clear the OBJFILE pointer in an Objfile object and remove the -+ reference. */ -+static void -+clean_up_objfile (struct objfile *objfile, void *datum) -+{ -+ PyGILState_STATE state; -+ objfile_object *object = datum; -+ -+ state = PyGILState_Ensure (); -+ object->objfile = NULL; -+ Py_DECREF ((PyObject *) object); -+ PyGILState_Release (state); -+} -+ -+/* Return the Python object of type Objfile representing OBJFILE. If -+ the object has already been created, return it. Otherwise, create -+ it. Return NULL and set the Python error on failure. */ -+PyObject * -+objfile_to_objfile_object (struct objfile *objfile) -+{ -+ objfile_object *object; -+ -+ object = objfile_data (objfile, objfpy_objfile_data_key); -+ if (!object) -+ { -+ object = PyObject_New (objfile_object, &objfile_object_type); -+ if (object) -+ { -+ PyObject *dict; -+ -+ object->objfile = objfile; -+ -+ object->printers = PyList_New (0); -+ if (!object->printers) -+ { -+ Py_DECREF (object); -+ return NULL; -+ } -+ -+ set_objfile_data (objfile, objfpy_objfile_data_key, object); -+ } -+ } -+ -+ return (PyObject *) object; -+} -+ -+void -+gdbpy_initialize_objfile (void) -+{ -+ objfpy_objfile_data_key -+ = register_objfile_data_with_cleanup (clean_up_objfile); -+ -+ if (PyType_Ready (&objfile_object_type) < 0) -+ return; -+ -+ Py_INCREF (&objfile_object_type); -+ PyModule_AddObject (gdb_module, "Objfile", (PyObject *) &objfile_object_type); -+} -+ -+ -+ -+static PyGetSetDef objfile_getset[] = -+{ -+ { "filename", objfpy_get_filename, NULL, -+ "The objfile's filename, or None.", NULL }, -+ { "pretty_printers", objfpy_get_printers, objfpy_set_printers, -+ "Pretty printers.", NULL }, -+ { NULL } -+}; -+ -+static PyTypeObject objfile_object_type = -+{ -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Objfile", /*tp_name*/ -+ sizeof (objfile_object), /*tp_basicsize*/ -+ 0, /*tp_itemsize*/ -+ objfpy_dealloc, /*tp_dealloc*/ -+ 0, /*tp_print*/ -+ 0, /*tp_getattr*/ -+ 0, /*tp_setattr*/ -+ 0, /*tp_compare*/ -+ 0, /*tp_repr*/ -+ 0, /*tp_as_number*/ -+ 0, /*tp_as_sequence*/ -+ 0, /*tp_as_mapping*/ -+ 0, /*tp_hash */ -+ 0, /*tp_call*/ -+ 0, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT, /*tp_flags*/ -+ "GDB objfile object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ 0, /* tp_methods */ -+ 0, /* tp_members */ -+ objfile_getset, /* tp_getset */ -+ 0, /* tp_base */ -+ 0, /* tp_dict */ -+ 0, /* tp_descr_get */ -+ 0, /* tp_descr_set */ -+ 0, /* tp_dictoffset */ -+ 0, /* tp_init */ -+ 0, /* tp_alloc */ -+ objfpy_new, /* tp_new */ -+}; diff --git a/gdb/python/python-param.c b/gdb/python/python-param.c new file mode 100644 index 0000000..1f591a8 @@ -28955,15 +15320,62 @@ index 0000000..1f591a8 + 0, /* tp_alloc */ + PyType_GenericNew /* tp_new */ +}; +diff --git a/gdb/python/python-prettyprint.c b/gdb/python/python-prettyprint.c +index 5d696c8..5be54b4 100644 +--- a/gdb/python/python-prettyprint.c ++++ b/gdb/python/python-prettyprint.c +@@ -121,6 +121,7 @@ find_pretty_printer (PyObject *value) + + return function; + } ++ + /* Pretty-print a single value, via the printer object PRINTER. + If the function returns a string, a PyObject containing the string + is returned. Otherwise, if the function returns a value, +@@ -141,10 +142,15 @@ pretty_print_one_value (PyObject *printer, struct value **out_value) + if (! gdbpy_is_string (result)) + { + *out_value = convert_value_from_python (result); +- if (PyErr_Occurred ()) +- *out_value = NULL; +- Py_DECREF (result); +- result = NULL; ++ if (PyErr_Occurred ()) ++ *out_value = NULL; ++ else ++ /* We must increment the value's refcount, because we ++ are about to decref RESULT, and this may result in ++ the value being destroyed. */ ++ release_value (*out_value); ++ Py_DECREF (result); ++ result = NULL; + } + } + } +@@ -556,14 +562,7 @@ gdbpy_get_varobj_pretty_printer (struct value *value) + { + PyObject *val_obj; + PyObject *pretty_printer = NULL; +- volatile struct gdb_exception except; + +- TRY_CATCH (except, RETURN_MASK_ALL) +- { +- value = value_copy (value); +- } +- GDB_PY_HANDLE_EXCEPTION (except); +- + val_obj = value_to_value_object (value); + if (! val_obj) + return NULL; diff --git a/gdb/python/python-symbol.c b/gdb/python/python-symbol.c new file mode 100644 -index 0000000..c7fda5c +index 0000000..03d43c1 --- /dev/null +++ b/gdb/python/python-symbol.c -@@ -0,0 +1,337 @@ +@@ -0,0 +1,336 @@ +/* Python interface to symbols. + -+ Copyright (C) 2008 Free Software Foundation, Inc. ++ Copyright (C) 2008, 2009 Free Software Foundation, Inc. + + This file is part of GDB. + @@ -29198,7 +15610,6 @@ index 0000000..c7fda5c +void +gdbpy_initialize_symbols (void) +{ -+ symbol_object_type.tp_new = PyType_GenericNew; + if (PyType_Ready (&symbol_object_type) < 0) + return; + @@ -29300,13 +15711,13 @@ index 0000000..c7fda5c +}; diff --git a/gdb/python/python-symtab.c b/gdb/python/python-symtab.c new file mode 100644 -index 0000000..a48c38c +index 0000000..830e586 --- /dev/null +++ b/gdb/python/python-symtab.c -@@ -0,0 +1,311 @@ +@@ -0,0 +1,322 @@ +/* Python interface to symbol tables. + -+ Copyright (C) 2008 Free Software Foundation, Inc. ++ Copyright (C) 2008, 2009 Free Software Foundation, Inc. + + This file is part of GDB. + @@ -29384,6 +15795,15 @@ index 0000000..a48c38c +} + +static PyObject * ++stpy_get_objfile (PyObject *self, void *closure) ++{ ++ symtab_object *self_symtab = (symtab_object *) self; ++ PyObject *result = objfile_to_objfile_object (self_symtab->symtab->objfile); ++ Py_INCREF (result); ++ return result; ++} ++ ++static PyObject * +stpy_fullname (PyObject *self, PyObject *args) +{ + char *fullname; @@ -29531,6 +15951,8 @@ index 0000000..a48c38c +static PyGetSetDef symtab_object_getset[] = { + { "filename", stpy_get_filename, NULL, + "The symbol table's source filename.", NULL }, ++ { "objfile", stpy_get_objfile, NULL, "The symtab's objfile.", ++ NULL }, + {NULL} /* Sentinel */ +}; + @@ -29616,455 +16038,106 @@ index 0000000..a48c38c + sal_object_getset /* tp_getset */ +}; diff --git a/gdb/python/python-type.c b/gdb/python/python-type.c -new file mode 100644 -index 0000000..fcf6b82 ---- /dev/null +index e185112..b55ce9a 100644 +--- a/gdb/python/python-type.c +++ b/gdb/python/python-type.c -@@ -0,0 +1,836 @@ -+/* Python interface to types. -+ -+ Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include "defs.h" -+#include "value.h" -+#include "exceptions.h" -+#include "python-internal.h" -+#include "charset.h" -+#include "gdbtypes.h" -+#include "cp-support.h" -+#include "demangle.h" -+#include "objfiles.h" +@@ -27,6 +27,8 @@ + #include "demangle.h" + #include "objfiles.h" + #include "language.h" ++#include "observer.h" +#include "gdb_assert.h" + + typedef struct pyty_type_object + { +@@ -35,11 +37,17 @@ typedef struct pyty_type_object + + /* If a Type object is associated with an objfile, it is kept on a + doubly-linked list, rooted in the objfile. This lets us copy the +- underlying struct type when the objfile is deleted. */ ++ underlying struct type when the objfile is deleted. + -+typedef struct pyty_type_object -+{ -+ PyObject_HEAD -+ struct type *type; ++ With NULL objfile Type still can be doubly-linked in the list ++ PYTY_OBJECTS_DISCARDABLE. */ + struct pyty_type_object *prev; + struct pyty_type_object *next; + } type_object; + ++/* First element of a doubly-linked list of TYPE_DISCARDABLE Types. */ ++static type_object *pyty_objects_discardable; + -+ /* If a Type object is associated with an objfile, it is kept on a -+ doubly-linked list, rooted in the objfile. This lets us copy the -+ underlying struct type when the objfile is deleted. */ -+ struct pyty_type_object *prev; -+ struct pyty_type_object *next; -+} type_object; -+ -+static PyTypeObject type_object_type; -+ -+/* A Field object. */ -+typedef struct pyty_field_object -+{ -+ PyObject_HEAD -+ -+ /* Dictionary holding our attributes. */ -+ PyObject *dict; -+} field_object; -+ -+static PyTypeObject field_object_type; -+ -+/* This is used to initialize various gdb.TYPE_ constants. */ -+struct pyty_code -+{ -+ /* The code. */ -+ enum type_code code; -+ /* The name. */ -+ const char *name; -+}; -+ -+#define ENTRY(X) { X, #X } -+ -+static struct pyty_code pyty_codes[] = -+{ -+ ENTRY (TYPE_CODE_PTR), -+ ENTRY (TYPE_CODE_ARRAY), -+ ENTRY (TYPE_CODE_STRUCT), -+ ENTRY (TYPE_CODE_UNION), -+ ENTRY (TYPE_CODE_ENUM), -+ ENTRY (TYPE_CODE_FLAGS), -+ ENTRY (TYPE_CODE_FUNC), -+ ENTRY (TYPE_CODE_INT), -+ ENTRY (TYPE_CODE_FLT), -+ ENTRY (TYPE_CODE_VOID), -+ ENTRY (TYPE_CODE_SET), -+ ENTRY (TYPE_CODE_RANGE), -+ ENTRY (TYPE_CODE_STRING), -+ ENTRY (TYPE_CODE_BITSTRING), -+ ENTRY (TYPE_CODE_ERROR), -+ ENTRY (TYPE_CODE_METHOD), -+ ENTRY (TYPE_CODE_METHODPTR), -+ ENTRY (TYPE_CODE_MEMBERPTR), -+ ENTRY (TYPE_CODE_REF), -+ ENTRY (TYPE_CODE_CHAR), -+ ENTRY (TYPE_CODE_BOOL), -+ ENTRY (TYPE_CODE_COMPLEX), -+ ENTRY (TYPE_CODE_TYPEDEF), -+ ENTRY (TYPE_CODE_NAMESPACE), -+ ENTRY (TYPE_CODE_DECFLOAT), -+ ENTRY (TYPE_CODE_INTERNAL_FUNCTION), -+ { TYPE_CODE_UNDEF, NULL } -+}; -+ -+ -+ -+static void -+field_dealloc (PyObject *obj) -+{ -+ field_object *f = (field_object *) obj; -+ Py_XDECREF (f->dict); -+ f->ob_type->tp_free (obj); -+} -+ -+static PyObject * -+field_new (void) -+{ -+ field_object *result = PyObject_New (field_object, &field_object_type); -+ if (result) -+ { -+ result->dict = PyDict_New (); -+ if (!result->dict) -+ { -+ Py_DECREF (result); -+ result = NULL; -+ } -+ } -+ return (PyObject *) result; -+} -+ -+ -+ -+/* Return the code for this type. */ -+static PyObject * -+typy_get_code (PyObject *self, void *closure) -+{ -+ struct type *type = ((type_object *) self)->type; -+ return PyInt_FromLong (TYPE_CODE (type)); -+} -+ -+/* Helper function for typy_fields which converts a single field to a -+ dictionary. Returns NULL on error. */ -+static PyObject * -+convert_field (struct type *type, int field) -+{ -+ PyObject *result = field_new (); -+ PyObject *arg; -+ -+ if (!result) -+ return NULL; -+ -+ if (!field_is_static (&TYPE_FIELD (type, field))) -+ { -+ arg = PyLong_FromLong (TYPE_FIELD_BITPOS (type, field)); -+ if (!arg) -+ goto fail; -+ -+ if (PyObject_SetAttrString (result, "bitpos", arg) < 0) -+ goto failarg; -+ } -+ -+ if (TYPE_FIELD_NAME (type, field)) -+ arg = PyString_FromString (TYPE_FIELD_NAME (type, field)); -+ else -+ { -+ arg = Py_None; -+ Py_INCREF (arg); -+ } -+ if (!arg) -+ goto fail; -+ if (PyObject_SetAttrString (result, "name", arg) < 0) -+ goto failarg; -+ -+ arg = TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False; + static PyTypeObject type_object_type; + + /* A Field object. */ +@@ -169,6 +177,11 @@ convert_field (struct type *type, int field) + if (PyObject_SetAttrString (result, "artificial", arg) < 0) + goto failarg; + ++ arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False; + Py_INCREF (arg); -+ if (PyObject_SetAttrString (result, "artificial", arg) < 0) ++ if (PyObject_SetAttrString (result, "is_base_class", arg) < 0) + goto failarg; + -+ arg = PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field)); -+ if (!arg) -+ goto fail; -+ if (PyObject_SetAttrString (result, "bitsize", arg) < 0) -+ goto failarg; -+ -+ /* A field can have a NULL type in some situations. */ -+ if (TYPE_FIELD_TYPE (type, field) == NULL) -+ { -+ arg = Py_None; -+ Py_INCREF (arg); -+ } -+ else -+ arg = type_to_type_object (TYPE_FIELD_TYPE (type, field)); -+ if (!arg) -+ goto fail; -+ if (PyObject_SetAttrString (result, "type", arg) < 0) -+ goto failarg; -+ -+ return result; -+ -+ failarg: -+ Py_DECREF (arg); -+ fail: -+ Py_DECREF (result); -+ return NULL; -+} -+ -+/* Return a sequence of all fields. Each field is a dictionary with -+ some pre-defined keys. */ -+static PyObject * -+typy_fields (PyObject *self, PyObject *args) -+{ -+ PyObject *result; -+ int i; -+ struct type *type = ((type_object *) self)->type; -+ -+ /* We would like to make a tuple here, make fields immutable, and -+ then memoize the result (and perhaps make Field.type() lazy). -+ However, that can lead to cycles. */ -+ result = PyList_New (0); -+ -+ for (i = 0; i < TYPE_NFIELDS (type); ++i) -+ { -+ PyObject *dict = convert_field (type, i); -+ if (!dict) -+ { -+ Py_DECREF (result); -+ return NULL; -+ } -+ if (PyList_Append (result, dict)) -+ { -+ Py_DECREF (dict); -+ Py_DECREF (result); -+ return NULL; -+ } -+ } -+ -+ return result; -+} -+ -+/* Return the type's tag, or None. */ -+static PyObject * -+typy_get_tag (PyObject *self, void *closure) -+{ -+ struct type *type = ((type_object *) self)->type; -+ if (!TYPE_TAG_NAME (type)) -+ Py_RETURN_NONE; -+ return PyString_FromString (TYPE_TAG_NAME (type)); -+} -+ -+/* Return the type, stripped of typedefs. */ -+static PyObject * -+typy_strip_typedefs (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ -+ return type_to_type_object (check_typedef (type)); -+} -+ -+/* Return a Type object which represents a pointer to SELF. */ -+static PyObject * -+typy_pointer (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ type = lookup_pointer_type (type); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return type_to_type_object (type); -+} -+ -+/* Return a Type object which represents a reference to SELF. */ -+static PyObject * -+typy_reference (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ type = lookup_reference_type (type); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return type_to_type_object (type); -+} -+ -+/* Return a Type object which represents the target type of SELF. */ -+static PyObject * -+typy_target (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ -+ if (!TYPE_TARGET_TYPE (type)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "type does not have a target"); -+ return NULL; -+ } -+ -+ return type_to_type_object (TYPE_TARGET_TYPE (type)); -+} -+ -+/* Return a const-qualified type variant. */ -+static PyObject * -+typy_const (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ type = make_cv_type (1, 0, type, NULL); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return type_to_type_object (type); -+} -+ -+/* Return a volatile-qualified type variant. */ -+static PyObject * -+typy_volatile (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ type = make_cv_type (0, 1, type, NULL); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return type_to_type_object (type); -+} -+ -+/* Return an unqualified type variant. */ -+static PyObject * -+typy_unqualified (PyObject *self, PyObject *args) -+{ -+ struct type *type = ((type_object *) self)->type; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ type = make_cv_type (0, 0, type, NULL); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return type_to_type_object (type); -+} -+ -+/* Return the size of the type represented by SELF, in bytes. */ -+static PyObject * -+typy_get_sizeof (PyObject *self, void *closure) -+{ -+ struct type *type = ((type_object *) self)->type; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ check_typedef (type); -+ } -+ /* Ignore exceptions. */ -+ -+ return PyLong_FromLong (TYPE_LENGTH (type)); -+} -+ -+static struct type * + arg = PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field)); + if (!arg) + goto fail; +@@ -361,7 +374,7 @@ typy_get_sizeof (PyObject *self, void *closure) + } + + static struct type * +-typy_lookup_typename (char *type_name) +typy_lookup_typename (char *type_name, struct block *block) -+{ -+ struct type *type = NULL; -+ volatile struct gdb_exception except; -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ if (!strncmp (type_name, "struct ", 7)) -+ type = lookup_struct (type_name + 7, block); -+ else if (!strncmp (type_name, "union ", 6)) -+ type = lookup_union (type_name + 6, block); -+ else if (!strncmp (type_name, "enum ", 5)) -+ type = lookup_enum (type_name + 5, block); -+ else -+ type = lookup_typename (type_name, block, 0); -+ } -+ if (except.reason < 0) -+ { -+ PyErr_Format (except.reason == RETURN_QUIT -+ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, -+ "%s", except.message); -+ return NULL; -+ } -+ -+ return type; -+} -+ -+static struct type * + { + struct type *type = NULL; + volatile struct gdb_exception except; +@@ -375,7 +388,7 @@ typy_lookup_typename (char *type_name) + type = lookup_enum (type_name + 5, NULL); + else + type = lookup_typename (python_language, python_gdbarch, +- type_name, NULL, 0); ++ type_name, block, 0); + } + if (except.reason < 0) + { +@@ -389,7 +402,8 @@ typy_lookup_typename (char *type_name) + } + + static struct type * +-typy_lookup_type (struct demangle_component *demangled) +typy_lookup_type (struct demangle_component *demangled, + struct block *block) -+{ -+ struct type *type; -+ char *type_name; -+ enum demangle_component_type demangled_type; -+ -+ /* Save the type: typy_lookup_type() may (indirectly) overwrite -+ memory pointed by demangled. */ -+ demangled_type = demangled->type; -+ -+ if (demangled_type == DEMANGLE_COMPONENT_POINTER -+ || demangled_type == DEMANGLE_COMPONENT_REFERENCE -+ || demangled_type == DEMANGLE_COMPONENT_CONST -+ || demangled_type == DEMANGLE_COMPONENT_VOLATILE) -+ { + { + struct type *type; + char *type_name; +@@ -404,7 +418,7 @@ typy_lookup_type (struct demangle_component *demangled) + || demangled_type == DEMANGLE_COMPONENT_CONST + || demangled_type == DEMANGLE_COMPONENT_VOLATILE) + { +- type = typy_lookup_type (demangled->u.s_binary.left); + type = typy_lookup_type (demangled->u.s_binary.left, block); -+ if (! type) -+ return NULL; -+ -+ switch (demangled_type) -+ { -+ case DEMANGLE_COMPONENT_REFERENCE: -+ return lookup_reference_type (type); -+ case DEMANGLE_COMPONENT_POINTER: -+ return lookup_pointer_type (type); -+ case DEMANGLE_COMPONENT_CONST: -+ return make_cv_type (1, 0, type, NULL); -+ case DEMANGLE_COMPONENT_VOLATILE: -+ return make_cv_type (0, 1, type, NULL); -+ } -+ } -+ -+ type_name = cp_comp_to_string (demangled, 10); + if (! type) + return NULL; + +@@ -422,7 +436,7 @@ typy_lookup_type (struct demangle_component *demangled) + } + + type_name = cp_comp_to_string (demangled, 10); +- type = typy_lookup_typename (type_name); + type = typy_lookup_typename (type_name, block); -+ xfree (type_name); -+ -+ return type; -+} -+ -+static PyObject * -+typy_template_argument (PyObject *self, PyObject *args) -+{ -+ int i, argno, n_pointers; -+ struct type *type = ((type_object *) self)->type; -+ struct demangle_component *demangled; -+ const char *err; -+ struct type *argtype; + xfree (type_name); + + return type; +@@ -436,10 +450,23 @@ typy_template_argument (PyObject *self, PyObject *args) + struct demangle_component *demangled; + const char *err; + struct type *argtype; + struct block *block = NULL; + PyObject *block_obj = NULL; -+ + +- if (! PyArg_ParseTuple (args, "i", &argno)) + if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj)) -+ return NULL; -+ + return NULL; + + if (block_obj) + { + block = block_object_to_block (block_obj); @@ -30076,209 +16149,179 @@ index 0000000..fcf6b82 + } + } + -+ type = check_typedef (type); -+ if (TYPE_CODE (type) == TYPE_CODE_REF) -+ type = check_typedef (TYPE_TARGET_TYPE (type)); -+ -+ if (TYPE_NAME (type) == NULL) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "null type name"); -+ return NULL; -+ } -+ -+ /* Note -- this is not thread-safe. */ -+ demangled = cp_demangled_name_to_comp (TYPE_NAME (type), &err); -+ if (! demangled) -+ { -+ PyErr_SetString (PyExc_RuntimeError, err); -+ return NULL; -+ } -+ -+ /* Strip off component names. */ -+ while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME -+ || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME) -+ demangled = demangled->u.s_binary.right; -+ -+ if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "type is not a template"); -+ return NULL; -+ } -+ -+ /* Skip from the template to the arguments. */ -+ demangled = demangled->u.s_binary.right; -+ -+ for (i = 0; demangled && i < argno; ++i) -+ demangled = demangled->u.s_binary.right; -+ -+ if (! demangled) -+ { -+ PyErr_Format (PyExc_RuntimeError, "no argument %d in template", -+ argno); -+ return NULL; -+ } -+ + type = check_typedef (type); + if (TYPE_CODE (type) == TYPE_CODE_REF) + type = check_typedef (TYPE_TARGET_TYPE (type)); +@@ -482,7 +509,7 @@ typy_template_argument (PyObject *self, PyObject *args) + return NULL; + } + +- argtype = typy_lookup_type (demangled->u.s_binary.left); + argtype = typy_lookup_type (demangled->u.s_binary.left, block); -+ if (! argtype) -+ return NULL; -+ -+ return type_to_type_object (argtype); -+} -+ -+static PyObject * -+typy_str (PyObject *self) -+{ -+ volatile struct gdb_exception except; -+ char *thetype = NULL; -+ PyObject *result; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ struct cleanup *old_chain; -+ struct ui_file *stb; -+ long length; -+ -+ stb = mem_fileopen (); -+ old_chain = make_cleanup_ui_file_delete (stb); -+ -+ type_print (type_object_to_type (self), "", stb, -1); -+ -+ thetype = ui_file_xstrdup (stb, &length); -+ do_cleanups (old_chain); -+ } -+ if (except.reason < 0) -+ { -+ xfree (thetype); -+ GDB_PY_HANDLE_EXCEPTION (except); -+ } -+ -+ result = PyUnicode_Decode (thetype, strlen (thetype), host_charset (), NULL); -+ xfree (thetype); -+ -+ return result; -+} -+ -+ -+ -+static const struct objfile_data *typy_objfile_data_key; -+ + if (! argtype) + return NULL; + +@@ -524,8 +551,59 @@ typy_str (PyObject *self) + + + ++/* Key associated with each objfile pointing to the first element of ++ a doubly-linked list of Types associated with this objfile. */ + static const struct objfile_data *typy_objfile_data_key; + ++/* Link TYPE_OBJ to its appropriate list. Either to its objfile associated one ++ or at least to the global list for TYPE_DISCARDABLE Types. Permanent types ++ do not get linked anywhere. */ +static void -+clean_up_objfile_types (struct objfile *objfile, void *datum) ++typy_link (type_object *type_obj) +{ -+ type_object *obj = datum; -+ htab_t copied_types; -+ struct cleanup *cleanup; -+ PyGILState_STATE state; ++ type_obj->prev = NULL; + -+ /* This prevents another thread from freeing the objects we're -+ operating on. */ -+ state = PyGILState_Ensure (); -+ cleanup = make_cleanup_py_restore_gil (&state); -+ -+ copied_types = create_copied_types_hash (objfile); -+ -+ while (obj) ++ if (type_obj->type && TYPE_OBJFILE (type_obj->type)) + { -+ type_object *next = obj->next; ++ struct objfile *objfile = TYPE_OBJFILE (type_obj->type); + -+ htab_empty (copied_types); -+ -+ /* No need to decref the old type here, since we know it has no -+ reference count. */ -+ gdb_assert (objfile == TYPE_OBJFILE (obj->type)); -+ obj->type = copy_type_recursive (obj->type, copied_types); -+ type_incref (obj->type); -+ -+ obj->next = NULL; -+ obj->prev = NULL; -+ -+ obj = next; ++ type_obj->next = objfile_data (objfile, typy_objfile_data_key); ++ if (type_obj->next) ++ type_obj->next->prev = type_obj; ++ set_objfile_data (objfile, typy_objfile_data_key, type_obj); + } -+ -+ htab_delete (copied_types); -+ -+ do_cleanups (cleanup); -+} -+ -+static void -+set_type (type_object *obj, struct type *type) -+{ -+ obj->type = type; -+ type_incref (type); -+ obj->prev = NULL; -+ if (type && !OBJFILE_IS_VIRTUAL (TYPE_OBJFILE (type))) ++ else if (type_obj->type && TYPE_DISCARDABLE (type_obj->type)) + { -+ struct objfile *objfile = TYPE_OBJFILE (type); -+ -+ obj->next = objfile_data (objfile, typy_objfile_data_key); -+ if (obj->next) -+ obj->next->prev = obj; -+ set_objfile_data (objfile, typy_objfile_data_key, obj); ++ type_obj->next = pyty_objects_discardable; ++ if (type_obj->next) ++ type_obj->next->prev = type_obj; ++ pyty_objects_discardable = type_obj; + } + else -+ obj->next = NULL; ++ type_obj->next = NULL; +} + ++/* Unlink TYPE_OBJ from its current list. Permanent types are not linked ++ anywhere and this function has no effect on them. */ +static void -+typy_dealloc (PyObject *obj) ++typy_unlink (type_object *type_obj) +{ -+ type_object *type = (type_object *) obj; -+ -+ if (type->type) -+ type_decref (type->type); -+ -+ if (type->prev) -+ type->prev->next = type->next; -+ else if (type->type && !OBJFILE_IS_VIRTUAL (TYPE_OBJFILE (type->type))) ++ if (type_obj->prev) ++ type_obj->prev->next = type_obj->next; ++ else if (type_obj->type && TYPE_OBJFILE (type_obj->type)) + { + /* Must reset head of list. */ -+ struct objfile *objfile = TYPE_OBJFILE (type->type); -+ if (objfile) -+ set_objfile_data (objfile, typy_objfile_data_key, type->next); ++ struct objfile *objfile = TYPE_OBJFILE (type_obj->type); ++ ++ set_objfile_data (objfile, typy_objfile_data_key, type_obj->next); + } -+ if (type->next) -+ type->next->prev = type->prev; ++ else if (pyty_objects_discardable == type_obj) ++ pyty_objects_discardable = type_obj->next; + -+ type->ob_type->tp_free (type); ++ if (type_obj->next) ++ type_obj->next->prev = type_obj->prev; +} + -+/* Create a new Type referring to TYPE. */ -+PyObject * -+type_to_type_object (struct type *type) -+{ + static void + clean_up_objfile_types (struct objfile *objfile, void *datum) + { +@@ -543,12 +621,13 @@ clean_up_objfile_types (struct objfile *objfile, void *datum) + { + type_object *next = obj->next; + +- htab_empty (copied_types); ++ gdb_assert (TYPE_OBJFILE (obj->type) == objfile); ++ typy_unlink (obj); + +- obj->type = copy_type_recursive (objfile, obj->type, copied_types); ++ obj->type = copy_type_recursive (obj->type, copied_types); + +- obj->next = NULL; +- obj->prev = NULL; ++ gdb_assert (TYPE_OBJFILE (obj->type) == NULL); ++ typy_link (obj); + + obj = next; + } +@@ -559,41 +638,25 @@ clean_up_objfile_types (struct objfile *objfile, void *datum) + } + + static void +-set_type (type_object *obj, struct type *type) ++typy_dealloc (PyObject *obj) + { +- obj->type = type; +- obj->prev = NULL; +- if (type && TYPE_OBJFILE (type)) +- { +- struct objfile *objfile = TYPE_OBJFILE (type); ++ type_object *type_obj = (type_object *) obj; + +- obj->next = objfile_data (objfile, typy_objfile_data_key); +- if (obj->next) +- obj->next->prev = obj; +- set_objfile_data (objfile, typy_objfile_data_key, obj); +- } +- else +- obj->next = NULL; ++ typy_unlink (type_obj); ++ ++ type_obj->ob_type->tp_free (obj); + } + ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ + static void +-typy_dealloc (PyObject *obj) ++typy_types_mark_used (void) + { +- type_object *type = (type_object *) obj; +- +- if (type->prev) +- type->prev->next = type->next; +- else if (type->type && TYPE_OBJFILE (type->type)) +- { +- /* Must reset head of list. */ +- struct objfile *objfile = TYPE_OBJFILE (type->type); +- if (objfile) +- set_objfile_data (objfile, typy_objfile_data_key, type->next); +- } +- if (type->next) +- type->next->prev = type->prev; + type_object *type_obj; -+ -+ type_obj = PyObject_New (type_object, &type_object_type); -+ if (type_obj) -+ set_type (type_obj, type); -+ -+ return (PyObject *) type_obj; -+} -+ -+struct type * -+type_object_to_type (PyObject *obj) -+{ -+ if (! PyObject_TypeCheck (obj, &type_object_type)) -+ return NULL; -+ return ((type_object *) obj)->type; -+} -+ -+ -+ -+/* Implementation of gdb.lookup_type. */ -+PyObject * -+gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw) -+{ + +- type->ob_type->tp_free (type); ++ for (type_obj = pyty_objects_discardable; ++ type_obj != NULL; ++ type_obj = type_obj->next) ++ type_mark_used (type_obj->type); + } + + /* Create a new Type referring to TYPE. */ +@@ -604,7 +667,10 @@ type_to_type_object (struct type *type) + + type_obj = PyObject_New (type_object, &type_object_type); + if (type_obj) +- set_type (type_obj, type); ++ { ++ type_obj->type = type; ++ typy_link (type_obj); ++ } + + return (PyObject *) type_obj; + } +@@ -623,14 +689,28 @@ type_object_to_type (PyObject *obj) + PyObject * + gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw) + { +- static char *keywords[] = { "name", NULL }; + static char *keywords[] = { "name", "block", NULL }; -+ char *type_name = NULL; -+ struct type *type = NULL; + char *type_name = NULL; + struct type *type = NULL; + PyObject *block_obj = NULL; + struct block *block = NULL; -+ + +- if (! PyArg_ParseTupleAndKeywords (args, kw, "s", keywords, &type_name)) + if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords, + &type_name, &block_obj)) -+ return NULL; -+ + return NULL; + +- type = typy_lookup_typename (type_name); + if (block_obj) + { + block = block_object_to_block (block_obj); @@ -30291,174 +16334,20 @@ index 0000000..fcf6b82 + } + + type = typy_lookup_typename (type_name, block); -+ if (! type) -+ return NULL; + if (! type) + return NULL; + +@@ -664,6 +744,8 @@ gdbpy_initialize_types (void) + + Py_INCREF (&field_object_type); + PyModule_AddObject (gdb_module, "Field", (PyObject *) &field_object_type); + -+ return (PyObject *) type_to_type_object (type); -+} -+ -+void -+gdbpy_initialize_types (void) -+{ -+ int i; -+ -+ typy_objfile_data_key -+ = register_objfile_data_with_cleanup (clean_up_objfile_types); -+ -+ if (PyType_Ready (&type_object_type) < 0) -+ return; -+ if (PyType_Ready (&field_object_type) < 0) -+ return; -+ -+ for (i = 0; pyty_codes[i].name; ++i) -+ { -+ if (PyModule_AddIntConstant (gdb_module, -+ /* Cast needed for Python 2.4. */ -+ (char *) pyty_codes[i].name, -+ pyty_codes[i].code) < 0) -+ return; -+ } -+ -+ Py_INCREF (&type_object_type); -+ PyModule_AddObject (gdb_module, "Type", (PyObject *) &type_object_type); -+ -+ Py_INCREF (&field_object_type); -+ PyModule_AddObject (gdb_module, "Field", (PyObject *) &field_object_type); -+} -+ -+ -+ -+static PyGetSetDef type_object_getset[] = -+{ -+ { "code", typy_get_code, NULL, -+ "The code for this type.", NULL }, -+ { "sizeof", typy_get_sizeof, NULL, -+ "The size of this type, in bytes.", NULL }, -+ { "tag", typy_get_tag, NULL, -+ "The tag name for this type, or None.", NULL }, -+ { NULL } -+}; -+ -+static PyMethodDef type_object_methods[] = -+{ -+ { "const", typy_const, METH_NOARGS, -+ "const () -> Type\n\ -+Return a const variant of this type." }, -+ { "fields", typy_fields, METH_NOARGS, -+ "field () -> list\n\ -+Return a sequence holding all the fields of this type.\n\ -+Each field is a dictionary." }, -+ { "pointer", typy_pointer, METH_NOARGS, -+ "pointer () -> Type\n\ -+Return a type of pointer to this type." }, -+ { "reference", typy_reference, METH_NOARGS, -+ "reference () -> Type\n\ -+Return a type of reference to this type." }, -+ { "strip_typedefs", typy_strip_typedefs, METH_NOARGS, -+ "strip_typedefs () -> Type\n\ -+Return a type formed by stripping this type of all typedefs."}, -+ { "target", typy_target, METH_NOARGS, -+ "target () -> Type\n\ -+Return the target type of this type." }, -+ { "template_argument", typy_template_argument, METH_VARARGS, -+ "template_argument (arg) -> Type\n\ -+Return the type of a template argument." }, -+ { "unqualified", typy_unqualified, METH_NOARGS, -+ "unqualified () -> Type\n\ -+Return a variant of this type without const or volatile attributes." }, -+ { "volatile", typy_volatile, METH_NOARGS, -+ "volatile () -> Type\n\ -+Return a volatile variant of this type" }, -+ { NULL } -+}; -+ -+static PyTypeObject type_object_type = -+{ -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Type", /*tp_name*/ -+ sizeof (type_object), /*tp_basicsize*/ -+ 0, /*tp_itemsize*/ -+ typy_dealloc, /*tp_dealloc*/ -+ 0, /*tp_print*/ -+ 0, /*tp_getattr*/ -+ 0, /*tp_setattr*/ -+ 0, /*tp_compare*/ -+ 0, /*tp_repr*/ -+ 0, /*tp_as_number*/ -+ 0, /*tp_as_sequence*/ -+ 0, /*tp_as_mapping*/ -+ 0, /*tp_hash */ -+ 0, /*tp_call*/ -+ typy_str, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ -+ "GDB type object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ type_object_methods, /* tp_methods */ -+ 0, /* tp_members */ -+ type_object_getset, /* tp_getset */ -+ 0, /* tp_base */ -+ 0, /* tp_dict */ -+ 0, /* tp_descr_get */ -+ 0, /* tp_descr_set */ -+ 0, /* tp_dictoffset */ -+ 0, /* tp_init */ -+ 0, /* tp_alloc */ -+ 0, /* tp_new */ -+}; -+ -+static PyTypeObject field_object_type = -+{ -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Field", /*tp_name*/ -+ sizeof (field_object), /*tp_basicsize*/ -+ 0, /*tp_itemsize*/ -+ field_dealloc, /*tp_dealloc*/ -+ 0, /*tp_print*/ -+ 0, /*tp_getattr*/ -+ 0, /*tp_setattr*/ -+ 0, /*tp_compare*/ -+ 0, /*tp_repr*/ -+ 0, /*tp_as_number*/ -+ 0, /*tp_as_sequence*/ -+ 0, /*tp_as_mapping*/ -+ 0, /*tp_hash */ -+ 0, /*tp_call*/ -+ 0, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ -+ "GDB field object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ 0, /* tp_methods */ -+ 0, /* tp_members */ -+ 0, /* tp_getset */ -+ 0, /* tp_base */ -+ 0, /* tp_dict */ -+ 0, /* tp_descr_get */ -+ 0, /* tp_descr_set */ -+ offsetof (field_object, dict), /* tp_dictoffset */ -+ 0, /* tp_init */ -+ 0, /* tp_alloc */ -+ 0, /* tp_new */ -+}; ++ observer_attach_mark_used (typy_types_mark_used); + } + + diff --git a/gdb/python/python-utils.c b/gdb/python/python-utils.c -index ddac2f5..f9c9486 100644 +index 49c0437..84a476e 100644 --- a/gdb/python/python-utils.c +++ b/gdb/python/python-utils.c @@ -19,6 +19,7 @@ @@ -30469,18 +16358,7 @@ index ddac2f5..f9c9486 100644 #include "python-internal.h" -@@ -99,8 +100,8 @@ python_string_to_unicode (PyObject *obj) - } - - /* Returns a newly allocated string with the contents of the given unicode -- string object converted to CHARSET. If an error occurs during the -- conversion, NULL will be returned and a python exception will be set. -+ string object converted to a named charset. If an error occurs during -+ the conversion, NULL will be returned and a python exception will be set. - - The caller is responsible for xfree'ing the string. */ - static char * -@@ -191,3 +192,48 @@ gdbpy_is_string (PyObject *obj) +@@ -219,3 +220,48 @@ gdbpy_is_string (PyObject *obj) { return PyString_Check (obj) || PyUnicode_Check (obj); } @@ -30530,238 +16408,104 @@ index ddac2f5..f9c9486 100644 + return 1; +} diff --git a/gdb/python/python-value.c b/gdb/python/python-value.c -index bc077b6..e26880a 100644 +index dd3c919..fb9dab2 100644 --- a/gdb/python/python-value.c +++ b/gdb/python/python-value.c -@@ -52,6 +52,10 @@ struct value *values_in_python = NULL; +@@ -25,6 +25,7 @@ + #include "language.h" + #include "dfp.h" + #include "valprint.h" ++#include "observer.h" + + /* List of all values which are currently exposed to Python. It is + maintained so that when an objfile is discarded, preserve_values +@@ -33,7 +34,7 @@ + generic code. */ + /* This variable is unnecessarily initialized to NULL in order to + work around a linker bug on MacOS. */ +-struct value *values_in_python = NULL; ++static struct value_object *values_in_python = NULL; + + #ifdef HAVE_PYTHON + +@@ -52,17 +53,23 @@ struct value *values_in_python = NULL; /* Python's long type corresponds to C's long long type. */ - #define builtin_type_pylong builtin_type (current_gdbarch)->builtin_long_long + #define builtin_type_pylong builtin_type (python_gdbarch)->builtin_long_long +/* Python's long type corresponds to C's long long type. Unsigned version. */ +#define builtin_type_upylong builtin_type \ -+ (current_gdbarch)->builtin_unsigned_long_long ++ (python_gdbarch)->builtin_unsigned_long_long + #define builtin_type_pybool \ - language_bool_type (current_language, current_gdbarch) + language_bool_type (python_language, python_gdbarch) -@@ -59,6 +63,8 @@ typedef struct { + #define builtin_type_pychar \ + language_string_char_type (python_language, python_gdbarch) + +-typedef struct { ++typedef struct value_object { PyObject_HEAD struct value *value; - int owned_by_gdb; -+ PyObject *address; -+ PyObject *type; + PyObject *address; + PyObject *type; ++ struct value_object *next; ++ struct value_object *prev; } value_object; /* Called by the Python interpreter when deallocating a value object. */ -@@ -71,6 +77,18 @@ valpy_dealloc (PyObject *obj) +@@ -71,7 +78,12 @@ valpy_dealloc (PyObject *obj) + { + value_object *self = (value_object *) obj; - if (!self->owned_by_gdb) - value_free (self->value); -+ -+ if (self->address) -+ /* Use braces to appease gcc warning. *sigh* */ -+ { -+ Py_DECREF (self->address); -+ } -+ -+ if (self->type) -+ { -+ Py_DECREF (self->type); -+ } -+ - self->ob_type->tp_free (self); - } +- value_remove_from_list (&values_in_python, self->value); ++ if (self == values_in_python) ++ values_in_python = self->next; ++ if (self->prev) ++ self->prev->next = self->next; ++ if (self->next) ++ self->next->prev = self->prev; -@@ -105,6 +123,8 @@ valpy_new (PyTypeObject *subtype, PyObject *args, PyObject *keywords) + value_free (self->value); - value_obj->value = value; - value_obj->owned_by_gdb = 0; -+ value_obj->address = NULL; -+ value_obj->type = NULL; +@@ -122,7 +134,17 @@ valpy_new (PyTypeObject *subtype, PyObject *args, PyObject *keywords) + value_obj->address = NULL; + value_obj->type = NULL; release_value (value); - value_prepend_to_list (&values_in_python, value); - -@@ -129,24 +149,55 @@ valpy_dereference (PyObject *self, PyObject *args) - - /* Return "&value". */ - static PyObject * --valpy_address (PyObject *self, PyObject *args) -+valpy_get_address (PyObject *self, void *closure) - { - struct value *res_val = NULL; /* Initialize to appease gcc warning. */ -+ value_object *val_obj = (value_object *) self; - volatile struct gdb_exception except; - -- TRY_CATCH (except, RETURN_MASK_ALL) -+ if (!val_obj->address) - { -- res_val = value_addr (((value_object *) self)->value); -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ res_val = value_addr (val_obj->value); -+ } -+ if (except.reason < 0) -+ { -+ val_obj->address = Py_None; -+ Py_INCREF (Py_None); -+ } -+ else -+ val_obj->address = value_to_value_object (res_val); - } -- GDB_PY_HANDLE_EXCEPTION (except); - -- return value_to_value_object (res_val); -+ Py_INCREF (val_obj->address); +- value_prepend_to_list (&values_in_python, value); + -+ return val_obj->address; ++ /* New FSF GDB reference counting no longer considers release_value as one ++ incref. FIXME: We are now leaking here if VALUE was already ++ release_value-d before. */ ++ value_incref (value); ++ ++ value_obj->next = values_in_python; ++ values_in_python = value_obj; ++ if (value_obj->next) ++ value_obj->next->prev = value_obj; ++ value_obj->prev = NULL; + + return (PyObject *) value_obj; } - --/* Return Unicode string with value contents (assumed to be encoded in the -- target's charset). */ -+/* Return type of the value. */ - static PyObject * --valpy_string (PyObject *self, PyObject *args) -+valpy_get_type (PyObject *self, void *closure) -+{ -+ value_object *obj = (value_object *) self; -+ if (!obj->type) -+ { -+ obj->type = type_to_type_object (value_type (obj->value)); -+ if (!obj->type) -+ { -+ obj->type = Py_None; -+ Py_INCREF (obj->type); -+ } -+ } -+ Py_INCREF (obj->type); -+ return obj->type; -+} -+ -+/* Implementation of gdb.Value.string ([encoding] [, errors]) -> string -+ Return Unicode string with value contents. If ENCODING is not given, -+ the string is assumed to be encoded in the target's charset. */ -+static PyObject * -+valpy_string (PyObject *self, PyObject *args, PyObject *kw) - { - int length, ret = 0; - gdb_byte *buffer; -@@ -157,8 +208,10 @@ valpy_string (PyObject *self, PyObject *args) - const char *errors = NULL; - const char *user_encoding = NULL; - const char *la_encoding = NULL; -+ static char *keywords[] = { "encoding", "errors" }; - -- if (!PyArg_ParseTuple (args, "|ss", &user_encoding, &errors)) -+ if (!PyArg_ParseTupleAndKeywords (args, kw, "|ss", keywords, -+ &user_encoding, &errors)) - return NULL; - - TRY_CATCH (except, RETURN_MASK_ALL) -@@ -174,6 +227,34 @@ valpy_string (PyObject *self, PyObject *args) - return unicode; - } - -+/* Cast a value to a given type. */ -+static PyObject * -+valpy_cast (PyObject *self, PyObject *args) -+{ -+ PyObject *type_obj; -+ struct type *type; -+ struct value *res_val = NULL; /* Initialize to appease gcc warning. */ -+ volatile struct gdb_exception except; -+ -+ if (! PyArg_ParseTuple (args, "O", &type_obj)) -+ return NULL; -+ -+ type = type_object_to_type (type_obj); -+ if (! type) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "argument must be a Type"); -+ return NULL; -+ } -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ res_val = value_cast (type, ((value_object *) self)->value); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return value_to_value_object (res_val); -+} -+ - static Py_ssize_t - valpy_length (PyObject *self) - { -@@ -269,6 +350,18 @@ valpy_str (PyObject *self) - return result; - } - -+/* Implements gdb.Value.is_optimized_out. */ -+static PyObject * -+valpy_get_is_optimized_out (PyObject *self, void *closure) -+{ -+ struct value *value = ((value_object *) self)->value; -+ -+ if (value_optimized_out (value)) -+ Py_RETURN_TRUE; -+ -+ Py_RETURN_FALSE; -+} -+ - enum valpy_opcode - { - VALPY_ADD, -@@ -306,11 +399,11 @@ valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other) - a gdb.Value object and need to convert it from python as well. */ - arg1 = convert_value_from_python (self); - if (arg1 == NULL) -- return NULL; -+ break; - - arg2 = convert_value_from_python (other); - if (arg2 == NULL) -- return NULL; -+ break; - - switch (opcode) - { -@@ -387,7 +480,7 @@ valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other) - } - GDB_PY_HANDLE_EXCEPTION (except); - -- return value_to_value_object (res_val); -+ return res_val ? value_to_value_object (res_val) : NULL; - } - - static PyObject * -@@ -711,6 +804,8 @@ value_to_value_object (struct value *val) - { - val_obj->value = val; - val_obj->owned_by_gdb = 0; -+ val_obj->address = NULL; -+ val_obj->type = NULL; +@@ -803,7 +825,17 @@ value_to_value_object (struct value *val) + val_obj->address = NULL; + val_obj->type = NULL; release_value (val); - value_prepend_to_list (&values_in_python, val); - } -@@ -718,6 +813,17 @@ value_to_value_object (struct value *val) - return (PyObject *) val_obj; - } - -+/* Returns value structure corresponding to the given value object. */ -+struct value * -+value_object_to_value (PyObject *self) -+{ -+ value_object *real; -+ if (! PyObject_TypeCheck (self, &value_object_type)) -+ return NULL; -+ real = (value_object *) self; -+ return real->value; -+} +- value_prepend_to_list (&values_in_python, val); + - /* Try to convert a Python value to a gdb value. If the value cannot - be converted, set a Python exception and return NULL. */ ++ /* New FSF GDB reference counting no longer considers release_value as one ++ incref. FIXME: We are now leaking here if VALUE was already ++ release_value-d before. */ ++ value_incref (val); ++ ++ val_obj->next = values_in_python; ++ values_in_python = val_obj; ++ if (val_obj->next) ++ val_obj->next->prev = val_obj; ++ val_obj->prev = NULL; + } -@@ -751,7 +857,34 @@ convert_value_from_python (PyObject *obj) + return (PyObject *) val_obj; +@@ -853,7 +885,34 @@ convert_value_from_python (PyObject *obj) { LONGEST l = PyLong_AsLongLong (obj); @@ -30797,19 +16541,30 @@ index bc077b6..e26880a 100644 value = value_from_longest (builtin_type_pylong, l); } else if (PyFloat_Check (obj)) -@@ -774,7 +907,7 @@ convert_value_from_python (PyObject *obj) - } - } - else if (PyObject_TypeCheck (obj, &value_object_type)) -- value = ((value_object *) obj)->value; -+ value = value_copy (((value_object *) obj)->value); - else - PyErr_Format (PyExc_TypeError, _("Could not convert Python object: %s"), - PyString_AsString (PyObject_Str (obj))); -@@ -810,6 +943,14 @@ gdbpy_history (PyObject *self, PyObject *args) +@@ -912,6 +971,34 @@ gdbpy_history (PyObject *self, PyObject *args) return value_to_value_object (res_val); } ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ ++ ++static void ++python_types_mark_used (void) ++{ ++ value_object *val_obj; ++ ++ for (val_obj = values_in_python; val_obj != NULL; val_obj = val_obj->next) ++ type_mark_used (value_type (val_obj->value)); ++} ++ ++void ++preserve_python_values (struct objfile *objfile, htab_t copied_types) ++{ ++ value_object *val_obj; ++ ++ for (val_obj = values_in_python; val_obj != NULL; val_obj = val_obj->next) ++ preserve_one_value (val_obj->value, objfile, copied_types); ++} ++ +/* Returns 1 in OBJ is a gdb.Value object, 0 otherwise. */ + +int @@ -30821,72 +16576,29 @@ index bc077b6..e26880a 100644 void gdbpy_initialize_values (void) { -@@ -822,11 +963,24 @@ gdbpy_initialize_values (void) +@@ -922,6 +1009,8 @@ gdbpy_initialize_values (void) + PyModule_AddObject (gdb_module, "Value", (PyObject *) &value_object_type); + values_in_python = NULL; ++ ++ observer_attach_mark_used (python_types_mark_used); } -+ -+ -+static PyGetSetDef value_object_getset[] = { -+ { "address", valpy_get_address, NULL, "The address of the value.", -+ NULL }, -+ { "is_optimized_out", valpy_get_is_optimized_out, NULL, -+ "Boolean telling whether the value is optimized out (i.e., not available).", -+ NULL }, -+ { "type", valpy_get_type, NULL, "Type of the value.", NULL }, -+ {NULL} /* Sentinel */ -+}; -+ - static PyMethodDef value_object_methods[] = { -- { "address", valpy_address, METH_NOARGS, "Return the address of the value." }, -+ { "cast", valpy_cast, METH_VARARGS, "Cast the value to the supplied type." }, - { "dereference", valpy_dereference, METH_NOARGS, "Dereferences the value." }, -- { "string", valpy_string, METH_VARARGS, -- "Return Unicode string representation of the value." }, -+ { "string", (PyCFunction) valpy_string, METH_VARARGS | METH_KEYWORDS, -+ "string ([encoding] [, errors]) -> string\n\ -+Return Unicode string representation of the value." }, - {NULL} /* Sentinel */ - }; - -@@ -893,7 +1047,7 @@ PyTypeObject value_object_type = { - 0, /* tp_iternext */ - value_object_methods, /* tp_methods */ - 0, /* tp_members */ -- 0, /* tp_getset */ -+ value_object_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ + diff --git a/gdb/python/python.c b/gdb/python/python.c -index b3a27d6..995835b 100644 +index 254bd28..7cd2b3a 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c -@@ -22,6 +22,12 @@ - #include "ui-out.h" - #include "cli/cli-script.h" - #include "gdbcmd.h" -+#include "objfiles.h" -+#include "observer.h" -+#include "gdb_regex.h" -+#include "language.h" -+#include "valprint.h" +@@ -27,6 +27,8 @@ + #include "observer.h" + #include "value.h" + #include "language.h" +#include "event-loop.h" ++#include "valprint.h" #include -@@ -29,6 +35,10 @@ - false otherwise. */ - static int gdbpy_should_print_stack = 1; - -+/* This is true if we should auto-load python code when an objfile is -+ opened, false otherwise. */ -+static int gdbpy_auto_load = 1; -+ - #ifdef HAVE_PYTHON - - #include "python.h" -@@ -36,16 +46,29 @@ static int gdbpy_should_print_stack = 1; +@@ -45,11 +47,18 @@ static int gdbpy_auto_load = 1; #include "cli/cli-decode.h" #include "charset.h" #include "top.h" @@ -30902,21 +16614,10 @@ index b3a27d6..995835b 100644 #include "target.h" #include "gdbthread.h" +#include "event-top.h" -+ -+static PyMethodDef GdbMethods[]; static PyMethodDef GdbMethods[]; - PyObject *gdb_module; - -+/* Some string constants we may wish to use. */ -+PyObject *gdbpy_to_string_cst; -+PyObject *gdbpy_children_cst; -+PyObject *gdbpy_display_hint_cst; - PyObject *gdbpy_doc_cst; - - /* Given a command_line, return a command string suitable for passing -@@ -143,10 +166,10 @@ python_command (char *arg, int from_tty) +@@ -197,10 +206,10 @@ python_command (char *arg, int from_tty) NULL (and set a Python exception) on error. Helper function for get_parameter. */ @@ -30930,7 +16631,7 @@ index b3a27d6..995835b 100644 { case var_string: case var_string_noescape: -@@ -154,7 +177,7 @@ parameter_to_python (struct cmd_list_element *cmd) +@@ -208,7 +217,7 @@ parameter_to_python (struct cmd_list_element *cmd) case var_filename: case var_enum: { @@ -30939,7 +16640,7 @@ index b3a27d6..995835b 100644 if (! str) str = ""; return PyString_Decode (str, strlen (str), host_charset (), NULL); -@@ -162,7 +185,7 @@ parameter_to_python (struct cmd_list_element *cmd) +@@ -216,7 +225,7 @@ parameter_to_python (struct cmd_list_element *cmd) case var_boolean: { @@ -30948,7 +16649,7 @@ index b3a27d6..995835b 100644 Py_RETURN_TRUE; else Py_RETURN_FALSE; -@@ -170,7 +193,7 @@ parameter_to_python (struct cmd_list_element *cmd) +@@ -224,7 +233,7 @@ parameter_to_python (struct cmd_list_element *cmd) case var_auto_boolean: { @@ -30957,7 +16658,7 @@ index b3a27d6..995835b 100644 if (ab == AUTO_BOOLEAN_TRUE) Py_RETURN_TRUE; else if (ab == AUTO_BOOLEAN_FALSE) -@@ -180,15 +203,15 @@ parameter_to_python (struct cmd_list_element *cmd) +@@ -234,15 +243,15 @@ parameter_to_python (struct cmd_list_element *cmd) } case var_integer: @@ -30976,46 +16677,16 @@ index b3a27d6..995835b 100644 if (val == UINT_MAX) Py_RETURN_NONE; return PyLong_FromUnsignedLong (val); -@@ -202,10 +225,11 @@ parameter_to_python (struct cmd_list_element *cmd) - value. */ - - static PyObject * --get_parameter (PyObject *self, PyObject *args) -+gdbpy_parameter (PyObject *self, PyObject *args) - { - struct cmd_list_element *alias, *prefix, *cmd; - char *arg, *newarg; -+ int found = -1; - volatile struct gdb_exception except; - - if (! PyArg_ParseTuple (args, "s", &arg)) -@@ -215,19 +239,17 @@ get_parameter (PyObject *self, PyObject *args) - - TRY_CATCH (except, RETURN_MASK_ALL) - { -- if (! lookup_cmd_composition (newarg, &alias, &prefix, &cmd)) -- { -- xfree (newarg); -- return PyErr_Format (PyExc_RuntimeError, -- "could not find variable `%s'", arg); -- } -+ found = lookup_cmd_composition (newarg, &alias, &prefix, &cmd); - } - xfree (newarg); - GDB_PY_HANDLE_EXCEPTION (except); -+ if (!found) -+ return PyErr_Format (PyExc_RuntimeError, -+ "could not find parameter `%s'", arg); +@@ -280,7 +289,7 @@ gdbpy_parameter (PyObject *self, PyObject *args) if (! cmd->var) -- return PyErr_Format (PyExc_RuntimeError, "`%s' is not a variable", arg); + return PyErr_Format (PyExc_RuntimeError, "`%s' is not a parameter", arg); - return parameter_to_python (cmd); -+ return PyErr_Format (PyExc_RuntimeError, "`%s' is not a parameter", arg); + return gdbpy_parameter_value (cmd->var_type, cmd->var); } /* A Python function which evaluates a string using the gdb CLI. */ -@@ -266,6 +288,570 @@ execute_gdb_command (PyObject *self, PyObject *args) +@@ -319,6 +328,233 @@ execute_gdb_command (PyObject *self, PyObject *args) Py_RETURN_NONE; } @@ -31032,7 +16703,7 @@ index b3a27d6..995835b 100644 + if (!PyArg_ParseTuple (args, "K", &pc)) + return NULL; + -+ soname = solib_address (pc); ++ soname = solib_name_from_address (pc); + if (soname) + str_obj = PyString_Decode (soname, strlen (soname), host_charset (), NULL); + else @@ -31044,260 +16715,6 @@ index b3a27d6..995835b 100644 + return str_obj; +} + -+static PyObject * -+gdbpy_find_pc_function (PyObject *self, PyObject *args) -+{ -+ unsigned long long pc; -+ struct symbol *sym; -+ PyObject *sym_obj; -+ -+ if (!PyArg_ParseTuple (args, "K", &pc)) -+ return NULL; -+ -+ sym = find_pc_function (pc); -+ if (sym) -+ return symbol_to_symbol_object (sym); -+ -+ Py_RETURN_NONE; -+} -+ -+/* Adds GDB value V to the pattern buffer in *PATTERN_BUF. If SIZE is not zero, -+ it specifies the number of bytes from V to copy to *PATTERN_BUF. The -+ function increases the size of *PATTERN_BUF as necessary, adjusting -+ *PATTERN_BUF_END and *PATTERN_BUF_SIZE in the process. */ -+ -+static void -+add_value_pattern (struct value *v, int size, char **pattern_buf, -+ char **pattern_buf_end, ULONGEST *pattern_buf_size) -+{ -+ int val_bytes; -+ -+ if (size) -+ { -+ LONGEST x = value_as_long (v); -+ -+ if (size == 1) -+ *(*pattern_buf_end)++ = x; -+ else -+ { -+ put_bits (x, *pattern_buf_end, size * 8, -+ gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG); -+ *pattern_buf_end += size; -+ } -+ } -+ else -+ { -+ val_bytes = TYPE_LENGTH (value_type (v)); -+ -+ increase_pattern_buffer (pattern_buf, pattern_buf_end, -+ pattern_buf_size, val_bytes); -+ -+ memcpy (*pattern_buf_end, value_contents_raw (v), val_bytes); -+ *pattern_buf_end += val_bytes; -+ } -+} -+ -+/* This function does the actual work of constructing the pattern buffer from -+ OBJ. If OBJ is an object which implements the read buffer protocol (such -+ as a string, a byte array or gdb.Membuf), then its contents are directly -+ copied to *PATTERN_BUF. If it is a list, then this function is recursively -+ called for each of its elements. If OBJ is an object which can be converted -+ to a GDB value, then the contents of the value are copied to PATTERN_BUF. -+ If SIZE is different than zero, then it limits the number of bytes which -+ are copied to the buffer in case OBJ is converted to a GDB value. That -+ means that SIZE influences only Python scalars and gdb.Value objects. -+ The function increases the size of *PATTERN_BUF as necessary, adjusting -+ *PATTERN_BUF_END and *PATTERN_BUF_SIZE in the process. -+ -+ Returns 1 on success or 0 on failure, with a Python exception set. This -+ function can also throw GDB exceptions. */ -+ -+static int -+add_pattern_element (PyObject *obj, int size, char **pattern_buf, -+ char **pattern_buf_end, ULONGEST *pattern_buf_size) -+{ -+ if (PyObject_CheckReadBuffer (obj)) -+ { -+ /* Handle string, Unicode string, byte array, gdb.Membuf and any other -+ object implementing the buffer protocol. The SIZE parameter is -+ ignored in this case. */ -+ -+ Py_ssize_t val_bytes; -+ const void *buffer; -+ -+ if (PyObject_AsReadBuffer (obj, &buffer, &val_bytes) == -1) -+ return 0; -+ -+ increase_pattern_buffer (pattern_buf, pattern_buf_end, -+ pattern_buf_size, val_bytes); -+ -+ memcpy (*pattern_buf_end, buffer, val_bytes); -+ *pattern_buf_end += val_bytes; -+ } -+ else if (gdbpy_is_value_object (obj)) -+ add_value_pattern (value_object_to_value (obj), size, pattern_buf, -+ pattern_buf_end, pattern_buf_size); -+ else if (PySequence_Check (obj)) -+ { -+ /* Handle lists and tuples. */ -+ -+ Py_ssize_t i, num_objs; -+ -+ num_objs = PySequence_Size (obj); -+ for (i = 0; i < num_objs; i++) -+ if (!add_pattern_element (PySequence_GetItem (obj, i), size, -+ pattern_buf, pattern_buf_end, -+ pattern_buf_size)) -+ return 0; -+ } -+ else -+ { -+ /* See if we can convert from a Python object to a GDB value. */ -+ -+ struct value *v = convert_value_from_python (obj); -+ -+ if (v) -+ add_value_pattern (v, size, pattern_buf, pattern_buf_end, -+ pattern_buf_size); -+ else -+ return 0; -+ } -+ -+ return 1; -+} -+ -+/* Constructs the search pattern from OBJ, putting it in *PATTERN_BUFP, and its -+ size in *PATTERN_LENP. See the function add_pattern_element to learn how -+ the search pattern is obtained from OBJ. -+ -+ Returns 1 on success or 0 on failure, with a Python exception set. This -+ function can also throw GDB exceptions. */ -+ -+static int -+get_search_pattern (PyObject *obj, int size, char **pattern_bufp, -+ ULONGEST *pattern_lenp) -+{ -+ /* Buffer to hold the search pattern. */ -+ char *pattern_buf; -+ /* Current size of search pattern buffer. -+ We realloc space as needed. */ -+ ULONGEST pattern_buf_size; -+ /* Pointer to one past the last in-use part of pattern_buf. */ -+ char *pattern_buf_end; -+ struct cleanup *old_cleanups; -+ -+ allocate_pattern_buffer (&pattern_buf, &pattern_buf_end, &pattern_buf_size); -+ old_cleanups = make_cleanup (free_current_contents, &pattern_buf); -+ -+ if (!add_pattern_element (obj, size, &pattern_buf, &pattern_buf_end, -+ &pattern_buf_size)) -+ { -+ do_cleanups (old_cleanups); -+ -+ return 0; -+ } -+ -+ *pattern_bufp = pattern_buf; -+ *pattern_lenp = pattern_buf_end - pattern_buf; -+ -+ discard_cleanups (old_cleanups); -+ -+ return 1; -+} -+ -+/* Implementation of -+ gdb.search_memory (address, length, pattern [, size] [, max_count]). -+ The third argument may be either a pattern, or a list or tupple of patterns -+ to be searched. Size is the size in bytes of each search query value, either -+ 1, 2, 4 or 8. Returns a list of the addresses where matches were found. */ -+ -+PyObject * -+gdbpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) -+{ -+ int size = 0; -+ long length; -+ unsigned int found_count = 0; -+ long max_count = 0; -+ CORE_ADDR start_addr; -+ char *pattern_buf; -+ static char *keywords[] = { "address", "length", "pattern", "size", -+ "max_count", NULL }; -+ ULONGEST pattern_len, search_space_len; -+ PyObject *pattern, *list = NULL, *start_addr_obj; -+ volatile struct gdb_exception except; -+ -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ if (! PyArg_ParseTupleAndKeywords (args, kw, "OlO|il", keywords, -+ &start_addr_obj, &length, &pattern, -+ &size, &max_count)) -+ return NULL; -+ -+ if (!max_count) -+ max_count = LONG_MAX; -+ -+ if (!length) -+ { -+ PyErr_SetString (PyExc_ValueError, "empty search range"); -+ return NULL; -+ } -+ else if (length < 0) -+ { -+ PyErr_SetString (PyExc_ValueError, "invalid search range"); -+ return NULL; -+ } -+ else -+ { -+ /* Watch for overflows. */ -+ if (length > CORE_ADDR_MAX -+ || (start_addr + length - 1) < start_addr) -+ { -+ PyErr_SetString (PyExc_ValueError, "search range too large"); -+ return NULL; -+ } -+ -+ search_space_len = length; -+ } -+ -+ if (size != 0 && size != 1 && size != 2 && size != 4 && size != 8) -+ { -+ PyErr_SetString (PyExc_ValueError, "invalid pattern size"); -+ return NULL; -+ } -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ if (get_addr_from_python (start_addr_obj, &start_addr)) -+ { -+ if (get_search_pattern (pattern, size, &pattern_buf, &pattern_len)) -+ { -+ /* Any cleanups get automatically executed on an exception. */ -+ struct cleanup *cleanups = make_cleanup (xfree, pattern_buf); -+ -+ list = PyList_New (0); -+ -+ while (search_space_len >= pattern_len && found_count < max_count) -+ { -+ CORE_ADDR found_addr; -+ int found; -+ -+ found = search_memory (&start_addr, &search_space_len, -+ pattern_buf, pattern_len, &found_addr); -+ if (found <= 0) -+ break; -+ -+ PyList_Append (list, PyLong_FromUnsignedLong (found_addr)); -+ ++found_count; -+ } -+ -+ do_cleanups (cleanups); -+ } -+ } -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return list; -+} -+ +/* A Python function which is a wrapper for decode_line_1. */ + +static PyObject * @@ -31499,99 +16916,14 @@ index b3a27d6..995835b 100644 + add_file_handler (gdbpy_event_fds[0], gdbpy_run_events, NULL); + } +} -+ -+ -+ -+/* Threads. */ -+ -+/* Callback function for use with iterate_over_threads. This function -+ just counts the number of threads. */ -+ -+static int -+count_callback (struct thread_info *info, void *user_data) -+{ -+ int *count = (int *) user_data; -+ ++*count; -+ return 0; -+} -+ -+/* Structure for storing some state when iterating over threads. */ -+ -+struct set_thread_info -+{ -+ PyObject *tuple; -+ int index; -+}; -+ -+/* Callback function for use with iterate_over_threads. This function -+ stores the thread ID into a Python tuple. */ -+ -+static int -+update_tuple_callback (struct thread_info *info, void *user_data) -+{ -+ struct set_thread_info *tinfo = (struct set_thread_info *) user_data; -+ PyTuple_SetItem (tinfo->tuple, tinfo->index, PyInt_FromLong (info->num)); -+ ++tinfo->index; -+ return 0; -+} -+ -+/* Python function which yields a tuple holding all valid thread IDs. */ -+ -+static PyObject * -+gdbpy_threads (PyObject *unused1, PyObject *unused2) -+{ -+ int thread_count = 0; -+ struct set_thread_info info; -+ PyObject *result; -+ -+ prune_threads (); -+ target_find_new_threads (); -+ -+ iterate_over_threads (count_callback, &thread_count); -+ -+ if (!thread_count) -+ Py_RETURN_NONE; -+ -+ result = PyTuple_New (thread_count); -+ info.tuple = result; -+ info.index = 0; -+ iterate_over_threads (update_tuple_callback, &info); -+ return result; -+} -+ -+/* Python function that returns the current thread's ID. */ -+ -+static PyObject * -+gdbpy_current_thread (PyObject *unused1, PyObject *unused2) -+{ -+ if (PIDGET (inferior_ptid) == 0) -+ Py_RETURN_NONE; -+ return PyInt_FromLong (pid_to_thread_id (inferior_ptid)); -+} -+ -+/* Python function for switching to a given thread. */ -+ -+static PyObject * -+gdbpy_switch_to_thread (PyObject *self, PyObject *args) -+{ -+ int id; -+ if (! PyArg_ParseTuple (args, "i", &id)) -+ return NULL; -+ if (! valid_thread_id (id)) -+ return PyErr_Format (PyExc_RuntimeError, "invalid thread id"); -+ switch_to_thread (thread_id_to_pid (id)); -+ Py_RETURN_NONE; -+} + /* Printing. */ -@@ -302,6 +888,769 @@ gdbpy_print_stack (void) - PyErr_Clear (); - } +@@ -357,6 +593,69 @@ gdbpy_print_stack (void) + + -+ -+ +/* Script interface. */ + +/* True if 'gdb -P' was used, false otherwise. */ @@ -31655,127 +16987,13 @@ index b3a27d6..995835b 100644 + + + -+/* The "current" objfile. This is set when gdb detects that a new -+ objfile has been loaded. It is only set for the duration of a call -+ to gdbpy_new_objfile; it is NULL at other times. */ -+static struct objfile *gdbpy_current_objfile; -+ -+/* The file name we attempt to read. */ -+#define GDBPY_AUTO_FILENAME "-gdb.py" -+ -+/* This is a new_objfile observer callback which loads python code -+ based on the path to the objfile. */ -+static void -+gdbpy_new_objfile (struct objfile *objfile) -+{ -+ char *realname; -+ char *filename, *debugfile; -+ int len; -+ FILE *input; -+ PyGILState_STATE state; -+ struct cleanup *cleanups; -+ -+ if (!gdbpy_auto_load || !objfile || !objfile->name) -+ return; -+ -+ state = PyGILState_Ensure (); -+ -+ gdbpy_current_objfile = objfile; -+ -+ realname = gdb_realpath (objfile->name); -+ len = strlen (realname); -+ filename = xmalloc (len + sizeof (GDBPY_AUTO_FILENAME)); -+ memcpy (filename, realname, len); -+ strcpy (filename + len, GDBPY_AUTO_FILENAME); -+ -+ input = fopen (filename, "r"); -+ debugfile = filename; -+ -+ cleanups = make_cleanup (xfree, filename); -+ make_cleanup (xfree, realname); -+ -+ if (!input && debug_file_directory) -+ { -+ /* Also try the same file in the separate debug info directory. */ -+ debugfile = xmalloc (strlen (filename) -+ + strlen (debug_file_directory) + 1); -+ strcpy (debugfile, debug_file_directory); -+ /* FILENAME is absolute, so we don't need a "/" here. */ -+ strcat (debugfile, filename); -+ -+ make_cleanup (xfree, debugfile); -+ input = fopen (debugfile, "r"); -+ } -+ -+ if (!input && gdb_datadir) -+ { -+ /* Also try the same file in a subdirectory of gdb's data -+ directory. */ -+ debugfile = xmalloc (strlen (gdb_datadir) + strlen (filename) -+ + strlen ("/auto-load") + 1); -+ strcpy (debugfile, gdb_datadir); -+ strcat (debugfile, "/auto-load"); -+ /* FILENAME is absolute, so we don't need a "/" here. */ -+ strcat (debugfile, filename); -+ -+ make_cleanup (xfree, debugfile); -+ input = fopen (debugfile, "r"); -+ } -+ -+ if (input) -+ { -+ /* We don't want to throw an exception here -- but the user -+ would like to know that something went wrong. */ -+ if (PyRun_SimpleFile (input, debugfile)) -+ gdbpy_print_stack (); -+ fclose (input); -+ } -+ -+ do_cleanups (cleanups); -+ gdbpy_current_objfile = NULL; -+ -+ PyGILState_Release (state); -+} -+ -+/* Return the current Objfile, or None if there isn't one. */ -+static PyObject * -+gdbpy_get_current_objfile (PyObject *unused1, PyObject *unused2) -+{ -+ PyObject *result; -+ -+ if (! gdbpy_current_objfile) -+ Py_RETURN_NONE; -+ -+ result = objfile_to_objfile_object (gdbpy_current_objfile); -+ if (result) -+ Py_INCREF (result); -+ return result; -+} -+ -+/* Return a sequence holding all the Objfiles. */ -+static PyObject * -+gdbpy_objfiles (PyObject *unused1, PyObject *unused2) -+{ -+ struct objfile *objf; -+ PyObject *list; -+ -+ list = PyList_New (0); -+ if (!list) -+ return NULL; -+ -+ ALL_OBJFILES (objf) -+ { -+ PyObject *item = objfile_to_objfile_object (objf); -+ if (!item || PyList_Append (list, item) == -1) -+ { -+ Py_DECREF (list); -+ return NULL; -+ } -+ } -+ -+ return list; -+} -+ + /* The "current" objfile. This is set when gdb detects that a new + objfile has been loaded. It is only set for the duration of a call + to gdbpy_new_objfile; it is NULL at other times. */ +@@ -475,6 +774,144 @@ gdbpy_objfiles (PyObject *unused1, PyObject *unused2) + return list; + } + + + +/* Helper function for find_pretty_printer which iterates over a @@ -31913,464 +17131,14 @@ index b3a27d6..995835b 100644 + result = PyObject_CallFunctionObjArgs (cons, value, NULL); + return result; +} -+ -+/* Return the display hint for the object printer, PRINTER. Return -+ NULL if there is no display_hint method, or if the method did not -+ return a string. On error, print stack trace and return NULL. On -+ success, return an xmalloc()d string. */ -+char * -+gdbpy_get_display_hint (PyObject *printer) -+{ -+ PyObject *hint; -+ char *result = NULL; -+ -+ if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst)) -+ return NULL; -+ -+ hint = PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, NULL); -+ if (gdbpy_is_string (hint)) -+ result = python_string_to_host_string (hint); -+ if (hint) -+ Py_DECREF (hint); -+ else -+ gdbpy_print_stack (); -+ -+ return result; -+} -+ -+/* Helper for apply_val_pretty_printer which calls to_string and -+ formats the result. */ -+static void -+print_string_repr (PyObject *printer, const char *hint, -+ struct ui_file *stream, int recurse, -+ const struct value_print_options *options, -+ const struct language_defn *language) -+{ -+ char *output; -+ struct value *replacement = NULL; -+ -+ output = pretty_print_one_value (printer, &replacement); -+ if (output) -+ { -+ if (hint && !strcmp (hint, "string")) -+ { -+ struct type *string_char_type; -+ -+ /* OUTPUT is already in the hosts's charset. */ -+ string_char_type = language_string_char_type (language, -+ current_gdbarch); -+ LA_PRINT_STRING (stream, string_char_type, (gdb_byte *) output, -+ strlen (output), 0, options); -+ } -+ else -+ fputs_filtered (output, stream); -+ xfree (output); -+ } -+ else if (replacement) -+ common_val_print (replacement, stream, recurse, options, language); -+ else -+ gdbpy_print_stack (); -+} -+ -+static void -+py_restore_tstate (void *p) -+{ -+ PyFrameObject *frame = p; -+ PyThreadState *tstate = PyThreadState_GET (); -+ tstate->frame = frame; -+} -+ -+/* Create a dummy PyFrameObject, needed to work around -+ a Python-2.4 bug with generators. */ -+static PyObject * -+push_dummy_python_frame () -+{ -+ PyObject *empty_string, *null_tuple, *globals; -+ PyCodeObject *code; -+ PyFrameObject *frame; -+ PyThreadState *tstate; -+ -+ empty_string = PyString_FromString (""); -+ if (!empty_string) -+ return NULL; -+ -+ null_tuple = PyTuple_New (0); -+ if (!null_tuple) -+ { -+ Py_DECREF (empty_string); -+ return NULL; -+ } -+ -+ code = PyCode_New (0, /* argcount */ -+ 0, /* nlocals */ -+ 0, /* stacksize */ -+ 0, /* flags */ -+ empty_string, /* code */ -+ null_tuple, /* consts */ -+ null_tuple, /* names */ -+ null_tuple, /* varnames */ -+#if PYTHON_API_VERSION >= 1010 -+ null_tuple, /* freevars */ -+ null_tuple, /* cellvars */ -+#endif -+ empty_string, /* filename */ -+ empty_string, /* name */ -+ 1, /* firstlineno */ -+ empty_string /* lnotab */ -+ ); -+ -+ Py_DECREF (empty_string); -+ Py_DECREF (null_tuple); -+ -+ if (!code) -+ return NULL; -+ -+ globals = PyDict_New (); -+ if (!globals) -+ { -+ Py_DECREF (code); -+ return NULL; -+ } -+ -+ tstate = PyThreadState_GET (); -+ -+ frame = PyFrame_New (tstate, code, globals, NULL); -+ -+ Py_DECREF (globals); -+ Py_DECREF (code); -+ -+ if (!frame) -+ return NULL; -+ -+ tstate->frame = frame; -+ make_cleanup (py_restore_tstate, frame->f_back); -+ return (PyObject *) frame; -+} -+ -+/* Helper for apply_val_pretty_printer that formats children of the -+ printer, if any exist. */ -+static void -+print_children (PyObject *printer, const char *hint, -+ struct ui_file *stream, int recurse, -+ const struct value_print_options *options, -+ const struct language_defn *language) -+{ -+ int is_map, is_array, done_flag, pretty; -+ unsigned int i; -+ PyObject *children, *iter, *frame; -+ struct cleanup *cleanups; -+ -+ if (! PyObject_HasAttr (printer, gdbpy_children_cst)) -+ return; -+ -+ /* If we are printing a map or an array, we want some special -+ formatting. */ -+ is_map = hint && ! strcmp (hint, "map"); -+ is_array = hint && ! strcmp (hint, "array"); -+ -+ children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, -+ NULL); -+ if (! children) -+ { -+ gdbpy_print_stack (); -+ return; -+ } -+ -+ cleanups = make_cleanup_py_decref (children); -+ -+ iter = PyObject_GetIter (children); -+ if (!iter) -+ { -+ gdbpy_print_stack (); -+ goto done; -+ } -+ make_cleanup_py_decref (iter); -+ -+ /* Use the prettyprint_arrays option if we are printing an array, -+ and the pretty option otherwise. */ -+ pretty = is_array ? options->prettyprint_arrays : options->pretty; -+ -+ /* Manufacture a dummy Python frame to work around Python 2.4 bug, -+ where it insists on having a non-NULL tstate->frame when -+ a generator is called. */ -+ frame = push_dummy_python_frame (); -+ if (!frame) -+ { -+ gdbpy_print_stack (); -+ goto done; -+ } -+ make_cleanup_py_decref (frame); -+ -+ done_flag = 0; -+ for (i = 0; i < options->print_max; ++i) -+ { -+ PyObject *py_v, *item = PyIter_Next (iter); -+ char *name; -+ struct cleanup *inner_cleanup; -+ -+ if (! item) -+ { -+ if (PyErr_Occurred ()) -+ gdbpy_print_stack (); -+ /* Set a flag so we can know whether we printed all the -+ available elements. */ -+ else -+ done_flag = 1; -+ break; -+ } -+ -+ if (! PyArg_ParseTuple (item, "sO", &name, &py_v)) -+ { -+ gdbpy_print_stack (); -+ Py_DECREF (item); -+ continue; -+ } -+ inner_cleanup = make_cleanup_py_decref (item); -+ -+ /* Print initial "{". For other elements, there are three -+ cases: -+ 1. Maps. Print a "," after each value element. -+ 2. Arrays. Always print a ",". -+ 3. Other. Always print a ",". */ -+ if (i == 0) -+ fputs_filtered (" = {", stream); -+ else if (! is_map || i % 2 == 0) -+ fputs_filtered (pretty ? "," : ", ", stream); -+ -+ /* In summary mode, we just want to print "= {...}" if there is -+ a value. */ -+ if (options->summary) -+ { -+ /* This increment tricks the post-loop logic to print what -+ we want. */ -+ ++i; -+ /* Likewise. */ -+ pretty = 0; -+ break; -+ } -+ -+ if (! is_map || i % 2 == 0) -+ { -+ if (pretty) -+ { -+ fputs_filtered ("\n", stream); -+ print_spaces_filtered (2 + 2 * recurse, stream); -+ } -+ else -+ wrap_here (n_spaces (2 + 2 *recurse)); -+ } -+ -+ if (is_map && i % 2 == 0) -+ fputs_filtered ("[", stream); -+ else if (is_array) -+ { -+ /* We print the index, not whatever the child method -+ returned as the name. */ -+ if (options->print_array_indexes) -+ fprintf_filtered (stream, "[%d] = ", i); -+ } -+ else if (! is_map) -+ { -+ fputs_filtered (name, stream); -+ fputs_filtered (" = ", stream); -+ } -+ -+ if (gdbpy_is_string (py_v)) -+ { -+ char *text = python_string_to_host_string (py_v); -+ if (! text) -+ gdbpy_print_stack (); -+ else -+ { -+ fputs_filtered (text, stream); -+ xfree (text); -+ } -+ } -+ else -+ { -+ struct value *value = convert_value_from_python (py_v); -+ -+ if (value == NULL) -+ { -+ gdbpy_print_stack (); -+ error (_("Error while executing Python code.")); -+ } -+ else -+ common_val_print (value, stream, recurse + 1, options, language); -+ } -+ -+ if (is_map && i % 2 == 0) -+ fputs_filtered ("] = ", stream); -+ -+ do_cleanups (inner_cleanup); -+ } -+ -+ if (i) -+ { -+ if (!done_flag) -+ { -+ if (pretty) -+ { -+ fputs_filtered ("\n", stream); -+ print_spaces_filtered (2 + 2 * recurse, stream); -+ } -+ fputs_filtered ("...", stream); -+ } -+ if (pretty) -+ { -+ fputs_filtered ("\n", stream); -+ print_spaces_filtered (2 * recurse, stream); -+ } -+ fputs_filtered ("}", stream); -+ } -+ -+ done: -+ do_cleanups (cleanups); -+} -+ -+int -+apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, -+ int embedded_offset, CORE_ADDR address, -+ struct ui_file *stream, int recurse, -+ const struct value_print_options *options, -+ const struct language_defn *language) -+{ -+ PyObject *printer = NULL; -+ PyObject *val_obj = NULL; -+ struct value *value; -+ char *hint = NULL; -+ struct cleanup *cleanups; -+ int result = 0; -+ PyGILState_STATE state; -+ -+ state = PyGILState_Ensure (); -+ cleanups = make_cleanup_py_restore_gil (&state); -+ -+ /* Instantiate the printer. */ -+ if (valaddr) -+ valaddr += embedded_offset; -+ value = value_from_contents_and_address (type, valaddr, address); -+ -+ val_obj = value_to_value_object (value); -+ if (! val_obj) -+ goto done; -+ -+ /* Find the constructor. */ -+ printer = find_pretty_printer (val_obj); -+ Py_DECREF (val_obj); -+ make_cleanup_py_decref (printer); -+ if (! printer || printer == Py_None) -+ goto done; -+ -+ /* If we are printing a map, we want some special formatting. */ -+ hint = gdbpy_get_display_hint (printer); -+ make_cleanup (free_current_contents, &hint); -+ -+ /* Print the section */ -+ print_string_repr (printer, hint, stream, recurse, options, language); -+ print_children (printer, hint, stream, recurse, options, language); -+ result = 1; -+ -+ -+ done: -+ if (PyErr_Occurred ()) -+ gdbpy_print_stack (); -+ do_cleanups (cleanups); -+ return result; -+} -+ -+/* Apply a pretty-printer for the varobj code. PRINTER_OBJ is the -+ print object. It must have a 'to_string' method (but this is -+ checked by varobj, not here) which takes no arguments and -+ returns a string. This function returns an xmalloc()d string if -+ the printer returns a string. The printer may return a replacement -+ value instead; in this case *REPLACEMENT is set to the replacement -+ value, and this function returns NULL. On error, *REPLACEMENT is -+ set to NULL and this function also returns NULL. */ -+char * -+apply_varobj_pretty_printer (PyObject *printer_obj, -+ struct value **replacement) -+{ -+ char *result; -+ PyGILState_STATE state = PyGILState_Ensure (); -+ -+ *replacement = NULL; -+ result = pretty_print_one_value (printer_obj, replacement); -+ if (result == NULL); -+ gdbpy_print_stack (); -+ PyGILState_Release (state); -+ -+ return result; -+} -+ -+/* Find a pretty-printer object for the varobj module. Returns a new -+ reference to the object if successful; returns NULL if not. VALUE -+ is the value for which a printer tests to determine if it -+ can pretty-print the value. */ -+PyObject * -+gdbpy_get_varobj_pretty_printer (struct value *value) -+{ -+ PyObject *val_obj; -+ PyObject *pretty_printer = NULL; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ value = value_copy (value); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ val_obj = value_to_value_object (value); -+ if (! val_obj) -+ return NULL; -+ -+ pretty_printer = find_pretty_printer (val_obj); -+ Py_DECREF (val_obj); -+ return pretty_printer; -+} -+ -+/* A Python function which wraps find_pretty_printer and instantiates -+ the resulting class. This accepts a Value argument and returns a -+ pretty printer instance, or None. This function is useful as an -+ argument to the MI command -var-set-visualizer. */ -+static PyObject * -+gdbpy_default_visualizer (PyObject *self, PyObject *args) -+{ -+ PyObject *val_obj; -+ PyObject *cons, *printer = NULL; -+ struct value *value; -+ -+ if (! PyArg_ParseTuple (args, "O", &val_obj)) -+ return NULL; -+ value = value_object_to_value (val_obj); -+ if (! value) -+ { -+ PyErr_SetString (PyExc_TypeError, "argument must be a gdb.Value"); -+ return NULL; -+ } -+ -+ cons = find_pretty_printer (val_obj); -+ return cons; -+} + #else /* HAVE_PYTHON */ /* Dummy implementation of the gdb "python" command. */ -@@ -328,6 +1677,24 @@ eval_python_from_control_command (struct command_line *cmd) +@@ -501,6 +938,13 @@ eval_python_from_control_command (struct command_line *cmd) error (_("Python scripting is not supported in this copy of GDB.")); } -+int -+apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, -+ int embedded_offset, CORE_ADDR address, -+ struct ui_file *stream, int format, -+ int deref_ref, int recurse, -+ enum val_prettyprint pretty, -+ const struct language_defn *language) -+{ -+ return 0; -+} -+ +void +source_python_script (FILE *stream) +{ @@ -32381,33 +17149,7 @@ index b3a27d6..995835b 100644 #endif /* HAVE_PYTHON */ -@@ -355,9 +1722,6 @@ show_python (char *args, int from_tty) - - /* Initialize the Python code. */ - --/* Provide a prototype to silence -Wmissing-prototypes. */ --extern initialize_file_ftype _initialize_python; -- - void - _initialize_python (void) - { -@@ -400,6 +1764,15 @@ Enables or disables printing of Python stack traces."), - &set_python_list, - &show_python_list); - -+ add_setshow_boolean_cmd ("auto-load", class_maintenance, -+ &gdbpy_auto_load, _("\ -+Enable or disable auto-loading of Python code when an object is opened."), _("\ -+Show whether Python code will be auto-loaded when an object is opened."), _("\ -+Enables or disables auto-loading of Python code when an object is opened."), -+ NULL, NULL, -+ &set_python_list, -+ &show_python_list); -+ - #ifdef HAVE_PYTHON - Py_Initialize (); - PyEval_InitThreads (); -@@ -410,11 +1783,36 @@ Enables or disables printing of Python stack traces."), +@@ -592,13 +1036,27 @@ Enables or disables auto-loading of Python code when an object is opened."), PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version); PyModule_AddStringConstant (gdb_module, "HOST_CONFIG", (char*) host_name); PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG", (char*) target_name); @@ -32420,31 +17162,22 @@ index b3a27d6..995835b 100644 gdbpy_initialize_values (); + gdbpy_initialize_breakpoints (); -+ gdbpy_initialize_frames (); + gdbpy_initialize_frames (); + gdbpy_initialize_symtabs (); gdbpy_initialize_commands (); + gdbpy_initialize_symbols (); + gdbpy_initialize_blocks (); -+ gdbpy_initialize_functions (); -+ gdbpy_initialize_types (); + gdbpy_initialize_functions (); + gdbpy_initialize_types (); + gdbpy_initialize_parameters (); -+ gdbpy_initialize_objfile (); + gdbpy_initialize_objfile (); ++ gdbpy_initialize_thread (); ++ gdbpy_initialize_inferior (); + gdbpy_initialize_events (); -+ gdbpy_initialize_membuf (); PyRun_SimpleString ("import gdb"); -+ PyRun_SimpleString ("gdb.pretty_printers = []"); -+ -+ observer_attach_new_objfile (gdbpy_new_objfile); -+ -+ gdbpy_to_string_cst = PyString_FromString ("to_string"); -+ gdbpy_children_cst = PyString_FromString ("children"); -+ gdbpy_display_hint_cst = PyString_FromString ("display_hint"); -+ gdbpy_doc_cst = PyString_FromString ("__doc__"); - - gdbpy_doc_cst = PyString_FromString ("__doc__"); - -@@ -442,6 +1840,15 @@ class GdbOutputFile:\n\ + PyRun_SimpleString ("gdb.pretty_printers = []"); +@@ -634,6 +1092,15 @@ class GdbOutputFile:\n\ \n\ sys.stderr = GdbOutputFile()\n\ sys.stdout = GdbOutputFile()\n\ @@ -32460,45 +17193,25 @@ index b3a27d6..995835b 100644 "); /* Release the GIL while gdb runs. */ -@@ -461,9 +1868,84 @@ static PyMethodDef GdbMethods[] = +@@ -653,9 +1120,14 @@ static PyMethodDef GdbMethods[] = "Get a value from history" }, { "execute", execute_gdb_command, METH_VARARGS, "Execute a gdb command" }, -- { "get_parameter", get_parameter, METH_VARARGS, + { "cli", gdbpy_cli, METH_NOARGS, + "Enter the gdb CLI" }, -+ { "parameter", gdbpy_parameter, METH_VARARGS, + { "parameter", gdbpy_parameter, METH_VARARGS, "Return a gdb parameter's value" }, + { "breakpoints", gdbpy_breakpoints, METH_NOARGS, + "Return a tuple of all breakpoint objects" }, + -+ { "default_visualizer", gdbpy_default_visualizer, METH_VARARGS, -+ "Find the default visualizer for a Value." }, -+ -+ { "current_objfile", gdbpy_get_current_objfile, METH_NOARGS, -+ "Return the current Objfile being loaded, or None." }, -+ { "objfiles", gdbpy_objfiles, METH_NOARGS, -+ "Return a sequence of all loaded objfiles." }, -+ -+ { "frames", gdbpy_frames, METH_NOARGS, -+ "frames () -> (gdb.Frame, ...).\n\ -+Return a tuple of all frame objects." }, -+ { "newest_frame", gdbpy_newest_frame, METH_NOARGS, -+ "newest_frame () -> gdb.Frame.\n\ -+Return the newest frame object." }, -+ { "selected_frame", gdbpy_selected_frame, METH_NOARGS, -+ "selected_frame () -> gdb.Frame.\n\ -+Return the selected frame object." }, -+ { "frame_stop_reason_string", gdbpy_frame_stop_reason_string, METH_VARARGS, -+ "stop_reason_string (Integer) -> String.\n\ -+Return a string explaining unwind stop reason." }, -+ -+ { "lookup_type", (PyCFunction) gdbpy_lookup_type, -+ METH_VARARGS | METH_KEYWORDS, -+ "lookup_type (name [, block]) -> type\n\ -+Return a Type corresponding to the given name." }, -+ + { "default_visualizer", gdbpy_default_visualizer, METH_VARARGS, + "Find the default visualizer for a Value." }, + +@@ -676,6 +1148,37 @@ Return a string explaining unwind stop reason." }, + "lookup_type (name [, block]) -> type\n\ + Return a Type corresponding to the given name." }, + + { "lookup_symbol", (PyCFunction) gdbpy_lookup_symbol, + METH_VARARGS | METH_KEYWORDS, + "lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)\n\ @@ -32509,9 +17222,6 @@ index b3a27d6..995835b 100644 + "solib_address (Long) -> String.\n\ +Return the name of the shared library holding a given address, or None." }, + -+ { "find_pc_function", gdbpy_find_pc_function, METH_VARARGS, -+ "Return the function containing the given pc value, or None." }, -+ + { "block_for_pc", gdbpy_block_for_pc, METH_VARARGS, + "Return the block containing the given pc value, or None." }, + @@ -32520,37 +17230,32 @@ index b3a27d6..995835b 100644 +Return a tuple holding the file name (or None) and line number (or None).\n\ +Note: may later change to return an object." }, + -+ { "threads", gdbpy_threads, METH_NOARGS, -+ "Return a tuple holding all the valid thread IDs." }, -+ { "current_thread", gdbpy_current_thread, METH_NOARGS, -+ "Return the thread ID of the current thread." }, -+ { "switch_to_thread", gdbpy_switch_to_thread, METH_VARARGS, -+ "Switch to a thread, given the thread ID." }, ++ { "selected_thread", gdbpy_selected_thread, METH_NOARGS, ++ "selected_thread () -> gdb.InferiorThread.\n\ ++Return the selected thread object." }, ++ { "inferiors", gdbpy_inferiors, METH_NOARGS, ++ "inferiors () -> (gdb.Inferior, ...).\n\ ++Return a tuple containing all inferiors." }, + + { "parse_and_eval", gdbpy_parse_and_eval, METH_VARARGS, + "Parse a string as an expression, evaluate it, and return the result." }, + + { "post_event", gdbpy_post_event, METH_VARARGS, + "Post an event into gdb's event loop." }, -+ -+ { "read_memory", gdbpy_read_memory, METH_VARARGS, -+ "read_memory (address, length) -> buffer\n\ -+Return a buffer object for reading from the inferior's memory." }, -+ { "write_memory", gdbpy_write_memory, METH_VARARGS, -+ "write_memory (address, buffer [, length])\n\ -+Write the given buffer object to the inferior's memory." }, -+ { "search_memory", (PyCFunction) gdbpy_search_memory, METH_VARARGS | METH_KEYWORDS, -+ "search_memory (address, length, pattern [, size] [, max_count]) -> list\n\ -+Return a list with the addresses where matches were found." }, + { "write", gdbpy_write, METH_VARARGS, "Write a string using gdb's filtered stream." }, { "flush", gdbpy_flush, METH_NOARGS, diff --git a/gdb/python/python.h b/gdb/python/python.h -index e63c447..767af86 100644 +index 33b0437..b761a65 100644 --- a/gdb/python/python.h +++ b/gdb/python/python.h -@@ -26,4 +26,14 @@ extern struct value *values_in_python; +@@ -22,10 +22,14 @@ + + #include "value.h" + +-extern struct value *values_in_python; ++void preserve_python_values (struct objfile *objfile, htab_t copied_types); void eval_python_from_control_command (struct command_line *); @@ -32558,64 +17263,159 @@ index e63c447..767af86 100644 + +void run_python_script (int argc, char **argv); + -+int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, -+ int embedded_offset, CORE_ADDR address, -+ struct ui_file *stream, int recurse, -+ const struct value_print_options *options, -+ const struct language_defn *language); -+ - #endif /* GDB_PYTHON_H */ + int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, + int embedded_offset, CORE_ADDR address, + struct ui_file *stream, int recurse, diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c -index 345befd..e2568c8 100644 +index de34894..07518b0 100644 --- a/gdb/scm-lang.c +++ b/gdb/scm-lang.c -@@ -43,14 +43,14 @@ static int in_eval_c (void); - struct type *builtin_type_scm; - - void --scm_printchar (int c, struct ui_file *stream) -+scm_printchar (int c, struct type *type, struct ui_file *stream) +@@ -233,6 +233,7 @@ const struct exp_descriptor exp_descriptor_scm = { - fprintf_filtered (stream, "#\\%c", c); - } - - static void --scm_printstr (struct ui_file *stream, const gdb_byte *string, -- unsigned int length, int width, int force_ellipses, -+scm_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, -+ unsigned int length, int force_ellipses, - const struct value_print_options *options) - { - fprintf_filtered (stream, "\"%s\"", string); -diff --git a/gdb/scm-lang.h b/gdb/scm-lang.h -index 6bf88f5..1798b2f 100644 ---- a/gdb/scm-lang.h -+++ b/gdb/scm-lang.h -@@ -59,7 +59,7 @@ extern void scm_scmval_print (LONGEST, struct ui_file *, int, - - extern int is_scmvalue_type (struct type *); - --extern void scm_printchar (int, struct ui_file *); -+extern void scm_printchar (int, struct type *, struct ui_file *); - - extern struct value *scm_evaluate_string (char *, int); - + print_subexp_standard, + operator_length_standard, ++ operator_check_standard, + op_name_standard, + dump_subexp_body_standard, + evaluate_exp diff --git a/gdb/scm-valprint.c b/gdb/scm-valprint.c -index f0a7642..a32add5 100644 +index cc3319a..d0d4702 100644 --- a/gdb/scm-valprint.c +++ b/gdb/scm-valprint.c -@@ -187,7 +187,8 @@ taloop: - if (SCM_ICHRP (svalue)) +@@ -62,9 +62,9 @@ scm_inferior_print (struct type *type, LONGEST value, struct ui_file *stream, + { + /* XXX: Should we cache these symbols? */ + gdb_output_sym = +- lookup_symbol_global ("gdb_output", NULL, NULL, VAR_DOMAIN); ++ lookup_symbol_global ("gdb_output", NULL, VAR_DOMAIN); + gdb_output_len_sym = +- lookup_symbol_global ("gdb_output_length", NULL, NULL, VAR_DOMAIN); ++ lookup_symbol_global ("gdb_output_length", NULL, VAR_DOMAIN); + + if ((gdb_output_sym == NULL) || (gdb_output_len_sym == NULL)) + ret = -1; +diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c +index 97cc29c..f655956 100644 +--- a/gdb/solib-darwin.c ++++ b/gdb/solib-darwin.c +@@ -401,7 +401,6 @@ darwin_relocate_section_addresses (struct so_list *so, + static struct symbol * + darwin_lookup_lib_symbol (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain) + { + return NULL; +diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c +index 19e3212..9f06fa9 100644 +--- a/gdb/solib-spu.c ++++ b/gdb/solib-spu.c +@@ -334,16 +334,13 @@ spu_bfd_open (char *pathname) + static struct symbol * + spu_lookup_lib_symbol (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain) + { + if (bfd_get_arch (objfile->obfd) == bfd_arch_spu) +- return lookup_global_symbol_from_objfile (objfile, name, linkage_name, +- domain); ++ return lookup_global_symbol_from_objfile (objfile, name, domain); + + if (svr4_so_ops.lookup_lib_global_symbol != NULL) +- return svr4_so_ops.lookup_lib_global_symbol (objfile, name, linkage_name, +- domain); ++ return svr4_so_ops.lookup_lib_global_symbol (objfile, name, domain); + return NULL; + } + +diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c +index 6cfaa85..68aadc0 100644 +--- a/gdb/solib-svr4.c ++++ b/gdb/solib-svr4.c +@@ -1908,15 +1908,13 @@ struct target_so_ops svr4_so_ops; + static struct symbol * + elf_lookup_lib_symbol (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain) + { + if (objfile->obfd == NULL + || scan_dyntag (DT_SYMBOLIC, objfile->obfd, NULL) != 1) + return NULL; + +- return lookup_global_symbol_from_objfile +- (objfile, name, linkage_name, domain); ++ return lookup_global_symbol_from_objfile (objfile, name, domain); + } + + extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */ +diff --git a/gdb/solib.c b/gdb/solib.c +index 157aaba..4c1b0fb 100644 +--- a/gdb/solib.c ++++ b/gdb/solib.c +@@ -1072,13 +1072,12 @@ show_auto_solib_add (struct ui_file *file, int from_tty, + struct symbol * + solib_global_lookup (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain) + { + struct target_so_ops *ops = solib_ops (target_gdbarch); + + if (ops->lookup_lib_global_symbol != NULL) +- return ops->lookup_lib_global_symbol (objfile, name, linkage_name, domain); ++ return ops->lookup_lib_global_symbol (objfile, name, domain); + return NULL; + } + +diff --git a/gdb/solist.h b/gdb/solist.h +index 63a6ba0..005e8f7 100644 +--- a/gdb/solist.h ++++ b/gdb/solist.h +@@ -114,7 +114,6 @@ struct target_so_ops + /* Hook for looking up global symbols in a library-specific way. */ + struct symbol * (*lookup_lib_global_symbol) (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain); + + /* Given two so_list objects, one from the GDB thread list +@@ -146,7 +145,6 @@ extern struct target_so_ops *current_target_so_ops; + /* Handler for library-specific global symbol lookup in solib.c. */ + struct symbol *solib_global_lookup (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain); + + #endif +diff --git a/gdb/somread.c b/gdb/somread.c +index 36a2b28..4d5bda9 100644 +--- a/gdb/somread.c ++++ b/gdb/somread.c +@@ -435,6 +435,7 @@ static struct sym_fns som_sym_fns = + som_new_init, /* sym_new_init: init anything gbl to entire symtab */ + som_symfile_init, /* sym_init: read initial info, setup for sym_read() */ + som_symfile_read, /* sym_read: read a symbol file into symtab */ ++ NULL, /* sym_read_psymbols */ + som_symfile_finish, /* sym_finish: finished with file, cleanup */ + som_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */ + default_symfile_segments, /* sym_segments: Get segment information from +diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c +index 7e7ab9c..a014b7a 100644 +--- a/gdb/spu-tdep.c ++++ b/gdb/spu-tdep.c +@@ -1839,7 +1839,7 @@ spu_catch_start (struct objfile *objfile) + struct symbol *sym; + struct symtab_and_line sal; + +- sym = lookup_block_symbol (block, "main", NULL, VAR_DOMAIN); ++ sym = lookup_block_symbol (block, "main", VAR_DOMAIN); + if (sym) { - svalue = SCM_ICHR (svalue); -- scm_printchar (svalue, stream); -+ scm_printchar (svalue, builtin_type (current_gdbarch)->builtin_char, -+ stream); - break; - } - else if (SCM_IFLAGP (svalue) + fixup_symbol_section (sym, objfile); diff --git a/gdb/stabsread.c b/gdb/stabsread.c -index 2d7eb15..3b8eb29 100644 +index e62bb15..ad6568e 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -322,7 +322,7 @@ dbx_alloc_type (int typenums[2], struct objfile *objfile) @@ -32626,7 +17426,7 @@ index 2d7eb15..3b8eb29 100644 + return (alloc_type (objfile, NULL)); } - type_addr = dbx_lookup_type (typenums); + type_addr = dbx_lookup_type (typenums, objfile); @@ -332,7 +332,7 @@ dbx_alloc_type (int typenums[2], struct objfile *objfile) We will fill it in later if we find out how. */ if (*type_addr == 0) @@ -32636,198 +17436,11 @@ index 2d7eb15..3b8eb29 100644 } return (*type_addr); -@@ -589,6 +589,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type, - int deftype; - int synonym = 0; - int i; -+ char *new_name = NULL; - - /* We would like to eliminate nameless symbols, but keep their types. - E.g. stab entry ":t10=*2" should produce a type 10, which is a pointer -@@ -683,9 +684,24 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type, - { - normal: - SYMBOL_LANGUAGE (sym) = current_subfile->language; -- SYMBOL_SET_NAMES (sym, string, p - string, objfile); -+ if (current_subfile->language == language_cplus) -+ { -+ char *name = alloca (p - string + 1); -+ memcpy (name, string, p - string); -+ name[p - string] = '\0'; -+ new_name = cp_canonicalize_string (name); -+ } -+ -+ if (new_name != NULL) -+ { -+ SYMBOL_SET_NAMES (sym, new_name, strlen (new_name), objfile); -+ xfree (new_name); -+ } -+ else -+ SYMBOL_SET_NAMES (sym, string, p - string, objfile); -+ - if (SYMBOL_LANGUAGE (sym) == language_cplus) -- cp_scan_for_anonymous_namespaces (sym); -+ cp_scan_for_anonymous_namespaces (sym); - } - p++; - -@@ -1519,18 +1535,35 @@ again: - if (*p != ':') - return error_type (pp, objfile); - } -- to = type_name = -- (char *) obstack_alloc (&objfile->objfile_obstack, p - *pp + 1); -- -- /* Copy the name. */ -- from = *pp + 1; -- while (from < p) -- *to++ = *from++; -- *to = '\0'; -+ type_name = NULL; -+ if (current_subfile->language == language_cplus) -+ { -+ char *new_name, *name = alloca (p - *pp + 1); -+ memcpy (name, *pp, p - *pp); -+ name[p - *pp] = '\0'; -+ new_name = cp_canonicalize_string (name); -+ if (new_name != NULL) -+ { -+ type_name = obsavestring (new_name, strlen (new_name), -+ &objfile->objfile_obstack); -+ xfree (new_name); -+ } -+ } -+ if (type_name == NULL) -+ { -+ to = type_name = -+ (char *) obstack_alloc (&objfile->objfile_obstack, p - *pp + 1); -+ -+ /* Copy the name. */ -+ from = *pp + 1; -+ while (from < p) -+ *to++ = *from++; -+ *to = '\0'; -+ } - - /* Set the pointer ahead of the name which we just read, and - the colon. */ -- *pp = from + 1; -+ *pp = p + 1; - } - - /* If this type has already been declared, then reuse the same diff --git a/gdb/stack.c b/gdb/stack.c -index 3bcf758..094a4ce 100644 +index 1c37801..594eb16 100644 --- a/gdb/stack.c +++ b/gdb/stack.c -@@ -380,6 +380,7 @@ print_frame_args (struct symbol *func, struct frame_info *frame, - - get_raw_print_options (&opts); - opts.deref_ref = 0; -+ opts.summary = 1; - common_val_print (val, stb->stream, 2, - &opts, language); - ui_out_field_stream (uiout, "value", stb); -@@ -579,20 +580,16 @@ print_frame_info (struct frame_info *frame, int print_level, - gdb_flush (gdb_stdout); - } - --static void --print_frame (struct frame_info *frame, int print_level, -- enum print_what print_what, int print_args, -- struct symtab_and_line sal) -+/* Attempt to obtain the FUNNAME and FUNLANG of the function corresponding -+ to FRAME. */ -+void -+find_frame_funname (struct frame_info *frame, char **funname, -+ enum language *funlang) - { - struct symbol *func; -- char *funname = NULL; -- enum language funlang = language_unknown; -- struct ui_stream *stb; -- struct cleanup *old_chain, *list_chain; -- struct value_print_options opts; - -- stb = ui_out_stream_new (uiout); -- old_chain = make_cleanup_ui_out_stream_delete (stb); -+ *funname = NULL; -+ *funlang = language_unknown; - - func = find_pc_function (get_frame_address_in_block (frame)); - if (func) -@@ -625,24 +622,24 @@ print_frame (struct frame_info *frame, int print_level, - /* We also don't know anything about the function besides - its address and name. */ - func = 0; -- funname = SYMBOL_PRINT_NAME (msymbol); -- funlang = SYMBOL_LANGUAGE (msymbol); -+ *funname = SYMBOL_PRINT_NAME (msymbol); -+ *funlang = SYMBOL_LANGUAGE (msymbol); - } - else - { -- funname = SYMBOL_PRINT_NAME (func); -- funlang = SYMBOL_LANGUAGE (func); -- if (funlang == language_cplus) -+ *funname = SYMBOL_PRINT_NAME (func); -+ *funlang = SYMBOL_LANGUAGE (func); -+ if (*funlang == language_cplus) - { - /* It seems appropriate to use SYMBOL_PRINT_NAME() here, - to display the demangled name that we already have - stored in the symbol table, but we stored a version - with DMGL_PARAMS turned on, and here we don't want to - display parameters. So remove the parameters. */ -- char *func_only = cp_remove_params (funname); -+ char *func_only = cp_remove_params (*funname); - if (func_only) - { -- funname = func_only; -+ *funname = func_only; - make_cleanup (xfree, func_only); - } - } -@@ -655,10 +652,27 @@ print_frame (struct frame_info *frame, int print_level, - - if (msymbol != NULL) - { -- funname = SYMBOL_PRINT_NAME (msymbol); -- funlang = SYMBOL_LANGUAGE (msymbol); -+ *funname = SYMBOL_PRINT_NAME (msymbol); -+ *funlang = SYMBOL_LANGUAGE (msymbol); - } - } -+} -+ -+static void -+print_frame (struct frame_info *frame, int print_level, -+ enum print_what print_what, int print_args, -+ struct symtab_and_line sal) -+{ -+ char *funname = NULL; -+ enum language funlang = language_unknown; -+ struct ui_stream *stb; -+ struct cleanup *old_chain, *list_chain; -+ struct value_print_options opts; -+ -+ stb = ui_out_stream_new (uiout); -+ old_chain = make_cleanup_ui_out_stream_delete (stb); -+ -+ find_frame_funname (frame, &funname, &funlang); - - annotate_frame_begin (print_level ? frame_relative_level (frame) : 0, - get_frame_pc (frame)); -@@ -694,7 +708,7 @@ print_frame (struct frame_info *frame, int print_level, - struct print_args_args args; - struct cleanup *args_list_chain; - args.frame = frame; -- args.func = func; -+ args.func = find_pc_function (get_frame_address_in_block (frame)); - args.stream = gdb_stdout; - args_list_chain = make_cleanup_ui_out_list_begin_end (uiout, "args"); - catch_errors (print_args_stub, &args, "", RETURN_MASK_ERROR); -@@ -1208,24 +1222,24 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty) +@@ -1308,24 +1308,24 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty) else count = -1; @@ -32870,7 +17483,7 @@ index 3bcf758..094a4ce 100644 for (i = 0, fi = trailing; fi && count--; i++, fi = get_prev_frame (fi)) { -@@ -1373,6 +1387,8 @@ print_block_frame_locals (struct block *b, struct frame_info *frame, +@@ -1473,6 +1473,8 @@ print_block_frame_locals (struct block *b, struct frame_info *frame, case LOC_COMPUTED: if (SYMBOL_IS_ARGUMENT (sym)) break; @@ -32879,58 +17492,27 @@ index 3bcf758..094a4ce 100644 values_printed = 1; print_variable_and_value (NULL, sym, frame, stream, 4 * num_tabs); break; -@@ -1796,18 +1812,27 @@ return_command (char *retval_exp, int from_tty) - message. */ - if (retval_exp) - { -+ struct expression *retval_expr = parse_expression (retval_exp); -+ struct cleanup *old_chain = make_cleanup (xfree, retval_expr); - struct type *return_type = NULL; - - /* Compute the return value. Should the computation fail, this - call throws an error. */ -- return_value = parse_and_eval (retval_exp); -+ return_value = evaluate_expression (retval_expr); - - /* Cast return value to the return type of the function. Should - the cast fail, this call throws an error. */ - if (thisfun != NULL) - return_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (thisfun)); - if (return_type == NULL) -- return_type = builtin_type (get_frame_arch (thisframe))->builtin_int; -+ { -+ if (retval_expr->elts[0].opcode != UNOP_CAST) -+ error (_("Return value type not available for selected " -+ "stack frame.\n" -+ "Please use an explicit cast of the value to return.")); -+ return_type = value_type (return_value); -+ } -+ do_cleanups (old_chain); - CHECK_TYPEDEF (return_type); - return_value = value_cast (return_type, return_value); - -diff --git a/gdb/stack.h b/gdb/stack.h -index 973a57f..56b1d91 100644 ---- a/gdb/stack.h -+++ b/gdb/stack.h -@@ -22,4 +22,9 @@ - - void select_frame_command (char *level_exp, int from_tty); - -+/* Attempt to obtain the FUNNAME and FUNLANG of the function corresponding -+ to FRAME. */ -+void find_frame_funname (struct frame_info *frame, char **funname, -+ enum language *funlang); -+ - #endif /* #ifndef STACK_H */ diff --git a/gdb/symfile.c b/gdb/symfile.c -index 63b5c1d..b047e94 100644 +index 36480c1..4dea8d7 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c -@@ -929,6 +929,17 @@ new_symfile_objfile (struct objfile *objfile, int mainline, int verbo) - clear_complaints (&symfile_complaints, 0, verbo); - } +@@ -52,7 +52,6 @@ + #include "observer.h" + #include "exec.h" + #include "parser-defs.h" +-#include "varobj.h" + #include "elf-bfd.h" + #include "solib.h" + #include "remote.h" +@@ -926,6 +925,20 @@ new_symfile_objfile (struct objfile *objfile, int add_flags) + /* We're done reading the symbol file; finish off complaints. */ + clear_complaints (&symfile_complaints, 0, add_flags & SYMFILE_VERBOSE); ++ ++ /* We have finished unloading of OBJFILE. */ ++ observer_notify_objfile_unloaded (); ++} ++ +/* A helper function which returns true if OBJFILE has any debug + symbols, and false otherwise. */ +static int @@ -32940,30 +17522,29 @@ index 63b5c1d..b047e94 100644 + || (objfile->separate_debug_objfile + && (objfile->separate_debug_objfile->psymtabs + || objfile->separate_debug_objfile->quick_addrmap))); -+} -+ - /* Process a symbol file, as either the main file or as a dynamically - loaded file. + } -@@ -965,13 +976,15 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, + /* Process a symbol file, as either the main file or as a dynamically +@@ -965,13 +978,16 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, /* Give user a chance to burp if we'd be interactively wiping out any existing symbols. */ - if ((have_full_symbols () || have_partial_symbols ()) -- && mainline -+ if (mainline +- && (add_flags & SYMFILE_MAINLINE) ++ if ((add_flags & SYMFILE_MAINLINE) ++ && (have_full_symbols () || have_partial_symbols ()) && from_tty + && (have_full_symbols () || have_partial_symbols ()) && !query (_("Load new symbol table from \"%s\"? "), name)) error (_("Not confirmed.")); objfile = allocate_objfile (abfd, flags); -+ if (mainline) ++ if (add_flags & SYMFILE_MAINLINE) + objfile->flags |= OBJF_MAIN; discard_cleanups (my_cleanups); if (addrs) -@@ -1007,6 +1020,8 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, +@@ -1007,6 +1023,8 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, if ((flags & OBJF_READNOW) || readnow_symbol_files) { @@ -32972,7 +17553,7 @@ index 63b5c1d..b047e94 100644 if ((from_tty || info_verbose) && print_symbol_loading) { printf_unfiltered (_("expanding to full symbols...")); -@@ -1025,7 +1040,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, +@@ -1025,7 +1043,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, /* If the file has its own symbol tables it has no separate debug info. `.dynsym'/`.symtab' go to MSYMBOLS, `.debug_info' goes to SYMTABS/PSYMTABS. `.gnu_debuglink' may no longer be present with `.note.gnu.build-id'. */ @@ -32981,7 +17562,7 @@ index 63b5c1d..b047e94 100644 debugfile = find_separate_debug_file (objfile); if (debugfile) { -@@ -1049,8 +1064,10 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, +@@ -1049,8 +1067,11 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, xfree (debugfile); } @@ -32990,11 +17571,21 @@ index 63b5c1d..b047e94 100644 + /* has_any_debug_symbols is not fully compatible with the former calls which + would just be needlessly expensive here. */ + if ((from_tty || info_verbose) && print_symbol_loading -+ && !has_any_debug_symbols (objfile) && mainline) ++ && (add_flags & SYMFILE_MAINLINE) ++ && !has_any_debug_symbols (objfile)) { wrap_here (""); printf_unfiltered (_("(no debugging symbols found)")); -@@ -2423,13 +2440,15 @@ reread_symbols (void) +@@ -2337,7 +2358,7 @@ reread_symbols (void) + + /* Remove any references to this objfile in the global + value lists. */ +- preserve_values (objfile); ++ observer_notify_objfile_unloading (objfile); + + /* Nuke all the state that we will re-read. Much of the following + code which sets things to NULL really is necessary to tell +@@ -2425,13 +2446,15 @@ reread_symbols (void) zero is OK since dbxread.c also does what it needs to do if objfile->global_psymbols.size is 0. */ (*objfile->sf->sym_read) (objfile, 0); @@ -33011,7 +17602,17 @@ index 63b5c1d..b047e94 100644 /* We're done reading the symbol file; finish off complaints. */ clear_complaints (&symfile_complaints, 0, 1); -@@ -2726,7 +2745,7 @@ allocate_symtab (char *filename, struct objfile *objfile) +@@ -2440,6 +2463,9 @@ reread_symbols (void) + + reinit_frame_cache (); + ++ /* We have finished reloading of OBJFILE. */ ++ observer_notify_objfile_unloaded (); ++ + /* Discard cleanups as symbol reading was successful. */ + discard_cleanups (old_cleanups); + +@@ -2729,7 +2755,7 @@ allocate_symtab (char *filename, struct objfile *objfile) } struct partial_symtab * @@ -33020,7 +17621,18 @@ index 63b5c1d..b047e94 100644 { struct partial_symtab *psymtab; -@@ -3040,7 +3059,8 @@ again2: +@@ -2820,10 +2846,6 @@ clear_symtab_users (void) + between expressions and which ought to be reset each time. */ + expression_context_block = NULL; + innermost_block = NULL; +- +- /* Varobj may refer to old symbols, perform a cleanup. */ +- varobj_invalidate (); +- + } + + static void +@@ -3043,7 +3065,8 @@ again2: struct partial_symtab * start_psymtab_common (struct objfile *objfile, @@ -33031,7 +17643,7 @@ index 63b5c1d..b047e94 100644 struct partial_symbol **static_syms) { diff --git a/gdb/symfile.h b/gdb/symfile.h -index 88f8326..50671c1 100644 +index bba242c..58bd2d8 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -140,6 +140,12 @@ struct sym_fns @@ -33047,7 +17659,7 @@ index 88f8326..50671c1 100644 /* Called when we are finished with an objfile. Should do all cleanup that is specific to the object file format for the particular objfile. */ -@@ -250,7 +256,7 @@ extern void free_section_addr_info (struct section_addr_info *); +@@ -266,7 +272,7 @@ extern void free_section_addr_info (struct section_addr_info *); extern struct partial_symtab *start_psymtab_common (struct objfile *, struct section_offsets *, @@ -33056,7 +17668,7 @@ index 88f8326..50671c1 100644 struct partial_symbol **, struct partial_symbol **); -@@ -300,7 +306,7 @@ extern int auto_solib_limit; +@@ -316,7 +322,7 @@ extern int auto_solib_limit; extern void set_initial_language (void); @@ -33065,7 +17677,7 @@ index 88f8326..50671c1 100644 extern void discard_psymtab (struct partial_symtab *); -@@ -369,7 +375,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data); +@@ -385,7 +391,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data); /* From dwarf2read.c */ extern int dwarf2_has_info (struct objfile *); @@ -33074,8 +17686,30 @@ index 88f8326..50671c1 100644 extern void dwarf2_build_psymtabs (struct objfile *, int); extern void dwarf2_build_frame_info (struct objfile *); +diff --git a/gdb/symmisc.c b/gdb/symmisc.c +index eb35369..dfd8c8c 100644 +--- a/gdb/symmisc.c ++++ b/gdb/symmisc.c +@@ -1128,7 +1128,7 @@ maintenance_check_symtabs (char *ignore, int from_tty) + while (length--) + { + sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym), +- NULL, SYMBOL_DOMAIN (*psym)); ++ SYMBOL_DOMAIN (*psym)); + if (!sym) + { + printf_filtered ("Static symbol `"); +@@ -1145,7 +1145,7 @@ maintenance_check_symtabs (char *ignore, int from_tty) + while (length--) + { + sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym), +- NULL, SYMBOL_DOMAIN (*psym)); ++ SYMBOL_DOMAIN (*psym)); + if (!sym) + { + printf_filtered ("Global symbol `"); diff --git a/gdb/symtab.c b/gdb/symtab.c -index d2ba1f3..44c9a58 100644 +index c88156a..567fa07 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -42,6 +42,7 @@ @@ -33086,15 +17720,39 @@ index d2ba1f3..44c9a58 100644 #include "hashtab.h" -@@ -55,6 +56,7 @@ - #include "gdb_stat.h" - #include - #include "cp-abi.h" -+#include "cp-support.h" - #include "observer.h" - #include "gdb_assert.h" - #include "solist.h" -@@ -273,7 +275,7 @@ lookup_partial_symtab (const char *name) +@@ -85,7 +86,6 @@ static int find_line_common (struct linetable *, int, int *); + char *operator_chars (char *p, char **end); + + static struct symbol *lookup_symbol_aux (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain, + enum language language, +@@ -93,20 +93,19 @@ static struct symbol *lookup_symbol_aux (const char *name, + + static + struct symbol *lookup_symbol_aux_local (const char *name, +- const char *linkage_name, + const struct block *block, +- const domain_enum domain); ++ const domain_enum domain, ++ enum language language, ++ int *is_a_field_of_this); + + static + struct symbol *lookup_symbol_aux_symtabs (int block_index, + const char *name, +- const char *linkage_name, + const domain_enum domain); + + static + struct symbol *lookup_symbol_aux_psymtabs (int block_index, + const char *name, +- const char *linkage_name, + const domain_enum domain); + + static int file_matches (char *, char **, int); +@@ -271,7 +270,7 @@ lookup_partial_symtab (const char *name) make_cleanup (xfree, real_path); } @@ -33103,33 +17761,16 @@ index d2ba1f3..44c9a58 100644 { if (FILENAME_CMP (name, pst->filename) == 0) { -@@ -416,7 +418,8 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol, - gsymbol->language = language; - if (gsymbol->language == language_cplus - || gsymbol->language == language_java -- || gsymbol->language == language_objc) -+ || gsymbol->language == language_objc -+ || gsymbol->language == language_fortran) +@@ -474,7 +473,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, + || gsymbol->language == language_auto) { - gsymbol->language_specific.cplus_specific.demangled_name = NULL; - } -@@ -635,6 +638,7 @@ symbol_natural_name (const struct general_symbol_info *gsymbol) - case language_cplus: - case language_java: - case language_objc: -+ case language_fortran: - if (gsymbol->language_specific.cplus_specific.demangled_name != NULL) - return gsymbol->language_specific.cplus_specific.demangled_name; - break; -@@ -660,6 +664,7 @@ symbol_demangled_name (const struct general_symbol_info *gsymbol) - case language_cplus: - case language_java: - case language_objc: -+ case language_fortran: - if (gsymbol->language_specific.cplus_specific.demangled_name != NULL) - return gsymbol->language_specific.cplus_specific.demangled_name; - break; -@@ -870,7 +875,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section) + demangled = +- cplus_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); ++ cplus_demangle (mangled, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE); + if (demangled != NULL) + { + gsymbol->language = language_cplus; +@@ -868,7 +867,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section) than the later used TEXTLOW/TEXTHIGH one. */ ALL_OBJFILES (objfile) @@ -33144,7 +17785,7 @@ index d2ba1f3..44c9a58 100644 { struct partial_symtab *pst; -@@ -903,6 +914,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section) +@@ -901,6 +906,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section) return pst; } } @@ -33152,7 +17793,7 @@ index d2ba1f3..44c9a58 100644 /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs which still have no corresponding full SYMTABs read. But it is not -@@ -1170,6 +1182,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile) +@@ -1168,6 +1174,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile) return psym; } @@ -33175,9 +17816,13 @@ index d2ba1f3..44c9a58 100644 /* Find the definition for a specified symbol name NAME in domain DOMAIN, visible from lexical block BLOCK. Returns the struct symbol pointer, or zero if no symbol is found. -@@ -1200,6 +1228,11 @@ lookup_symbol_in_language (const char *name, const struct block *block, - int needtofreename = 0; +@@ -1194,10 +1216,14 @@ lookup_symbol_in_language (const char *name, const struct block *block, + { + char *demangled_name = NULL; + const char *modified_name = NULL; +- const char *mangled_name = NULL; struct symbol *returnval; + struct cleanup *cleanup = make_cleanup (null_cleanup, 0); + if(strncmp(name, "::", 2) == 0){/* this must be a global name */ + name = name+2; @@ -33187,51 +17832,142 @@ index d2ba1f3..44c9a58 100644 modified_name = name; /* If we are using C++ or Java, demangle the name before doing a lookup, so -@@ -1213,6 +1246,17 @@ lookup_symbol_in_language (const char *name, const struct block *block, +@@ -1207,7 +1233,6 @@ lookup_symbol_in_language (const char *name, const struct block *block, + demangled_name = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); + if (demangled_name) + { +- mangled_name = name; modified_name = demangled_name; - needtofreename = 1; + make_cleanup (xfree, demangled_name); } -+ else -+ { -+ /* If we were given a non-mangled name, canonicalize it -+ according to the language (so far only for C++). */ -+ demangled_name = cp_canonicalize_string (name); -+ if (demangled_name) -+ { -+ modified_name = demangled_name; -+ needtofreename = 1; -+ } -+ } +@@ -1229,7 +1254,6 @@ lookup_symbol_in_language (const char *name, const struct block *block, + DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA); + if (demangled_name) + { +- mangled_name = name; + modified_name = demangled_name; + make_cleanup (xfree, demangled_name); + } +@@ -1248,8 +1272,8 @@ lookup_symbol_in_language (const char *name, const struct block *block, + modified_name = copy; } - else if (lang == language_java) - { -@@ -1296,13 +1340,15 @@ lookup_symbol_aux (const char *name, const char *linkage_name, - && block != NULL) - { - struct symbol *sym = NULL; -+ const struct block *function_block = block; -+ - /* 'this' is only defined in the function's block, so find the - enclosing function block. */ -- for (; block && !BLOCK_FUNCTION (block); -- block = BLOCK_SUPERBLOCK (block)); -+ for (; function_block && !BLOCK_FUNCTION (function_block); -+ function_block = BLOCK_SUPERBLOCK (function_block)); +- returnval = lookup_symbol_aux (modified_name, mangled_name, block, +- domain, lang, is_a_field_of_this); ++ returnval = lookup_symbol_aux (modified_name, block, domain, lang, ++ is_a_field_of_this); + do_cleanups (cleanup); + + return returnval; +@@ -1273,9 +1297,9 @@ lookup_symbol (const char *name, const struct block *block, + well. */ + + static struct symbol * +-lookup_symbol_aux (const char *name, const char *linkage_name, +- const struct block *block, const domain_enum domain, +- enum language language, int *is_a_field_of_this) ++lookup_symbol_aux (const char *name, const struct block *block, ++ const domain_enum domain, enum language language, ++ int *is_a_field_of_this) + { + struct symbol *sym; + const struct language_defn *langdef; +@@ -1291,55 +1315,19 @@ lookup_symbol_aux (const char *name, const char *linkage_name, + /* Search specified block and its superiors. Don't search + STATIC_BLOCK or GLOBAL_BLOCK. */ + +- sym = lookup_symbol_aux_local (name, linkage_name, block, domain); ++ sym = lookup_symbol_aux_local (name, block, domain, language, is_a_field_of_this); + if (sym != NULL) + return sym; + +- /* If requested to do so by the caller and if appropriate for LANGUAGE, +- check to see if NAME is a field of `this'. */ +- +- langdef = language_def (language); +- +- if (langdef->la_name_of_this != NULL && is_a_field_of_this != NULL +- && block != NULL) +- { +- struct symbol *sym = NULL; +- /* 'this' is only defined in the function's block, so find the +- enclosing function block. */ +- for (; block && !BLOCK_FUNCTION (block); +- block = BLOCK_SUPERBLOCK (block)); +- - if (block && !dict_empty (BLOCK_DICT (block))) - sym = lookup_block_symbol (block, langdef->la_name_of_this, -+ if (function_block && !dict_empty (BLOCK_DICT (function_block))) -+ sym = lookup_block_symbol (function_block, langdef->la_name_of_this, - NULL, VAR_DOMAIN); - if (sym) - { -@@ -1361,22 +1407,24 @@ lookup_symbol_aux_local (const char *name, const char *linkage_name, - const domain_enum domain) +- NULL, VAR_DOMAIN); +- if (sym) +- { +- struct type *t = sym->type; +- +- /* I'm not really sure that type of this can ever +- be typedefed; just be safe. */ +- CHECK_TYPEDEF (t); +- if (TYPE_CODE (t) == TYPE_CODE_PTR +- || TYPE_CODE (t) == TYPE_CODE_REF) +- t = TYPE_TARGET_TYPE (t); +- +- if (TYPE_CODE (t) != TYPE_CODE_STRUCT +- && TYPE_CODE (t) != TYPE_CODE_UNION) +- error (_("Internal error: `%s' is not an aggregate"), +- langdef->la_name_of_this); +- +- if (check_field (t, name)) +- { +- *is_a_field_of_this = 1; +- return NULL; +- } +- } +- } ++ /* this symbol was found to be a member variable ++ do not perform the global search. */ ++ if (is_a_field_of_this && *is_a_field_of_this) ++ return NULL; + + /* Now do whatever is appropriate for LANGUAGE to look + up static and global variables. */ +- +- sym = langdef->la_lookup_symbol_nonlocal (name, linkage_name, block, domain); ++ langdef = language_def (language); ++ sym = langdef->la_lookup_symbol_nonlocal (name, block, domain); + if (sym != NULL) + return sym; + +@@ -1349,11 +1337,11 @@ lookup_symbol_aux (const char *name, const char *linkage_name, + desired name as a file-level static, then do psymtab-to-symtab + conversion on the fly and return the found symbol. */ + +- sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, linkage_name, domain); ++ sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain); + if (sym != NULL) + return sym; + +- sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, linkage_name, domain); ++ sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, domain); + if (sym != NULL) + return sym; + +@@ -1364,30 +1352,79 @@ lookup_symbol_aux (const char *name, const char *linkage_name, + Don't search STATIC_BLOCK or GLOBAL_BLOCK. */ + + static struct symbol * +-lookup_symbol_aux_local (const char *name, const char *linkage_name, +- const struct block *block, +- const domain_enum domain) ++lookup_symbol_aux_local (const char *name, const struct block *block, ++ const domain_enum domain, enum language language, ++ int *is_a_field_of_this) { struct symbol *sym; - const struct block *static_block = block_static_block (block); + const struct block *global_block = block_global_block (block); + const struct block *block_iterator = block; ++ const struct language_defn *langdef; ++ ++ langdef = language_def (language); ++ /* Check if either no block is specified or it's a global block. */ @@ -33243,20 +17979,102 @@ index d2ba1f3..44c9a58 100644 + while (block_iterator != global_block) { - sym = lookup_symbol_aux_block (name, linkage_name, block, domain); -+ sym = lookup_symbol_aux_block (name, linkage_name, block_iterator, domain); ++ ++ sym = lookup_symbol_aux_block (name, block_iterator, domain); ++ if (sym != NULL) return sym; +- +- if (BLOCK_FUNCTION (block) != NULL && block_inlined_p (block)) +- break; - block = BLOCK_SUPERBLOCK (block); + ++ if (language == language_cplus ) ++ { ++ sym = lookup_namespace_scope(name, block,domain, ++ block_scope (block_iterator), 0, 1); ++ ++ if (sym != NULL) ++ return sym; ++ } ++ ++ if (langdef->la_name_of_this != NULL && is_a_field_of_this != NULL ++ && BLOCK_FUNCTION (block_iterator)) ++ { ++ if (!dict_empty (BLOCK_DICT (block_iterator))) ++ { ++ sym = lookup_block_symbol (block_iterator, ++ langdef->la_name_of_this, ++ VAR_DOMAIN); ++ ++ ++ if (sym) ++ { ++ struct type *t = sym->type; ++ ++ /* I'm not really sure that type of this can ever ++ be typedefed; just be safe. */ ++ CHECK_TYPEDEF (t); ++ if (TYPE_CODE (t) == TYPE_CODE_PTR ++ || TYPE_CODE (t) == TYPE_CODE_REF) ++ t = TYPE_TARGET_TYPE (t); ++ ++ if (TYPE_CODE (t) != TYPE_CODE_STRUCT ++ && TYPE_CODE (t) != TYPE_CODE_UNION) ++ error (_("Internal error: `%s' is not an aggregate"), ++ langdef->la_name_of_this); ++ ++ if (check_field (t, name)) ++ { ++ *is_a_field_of_this = 1; ++ return NULL; ++ } ++ } ++ } ++ } ++ + block_iterator = BLOCK_SUPERBLOCK (block_iterator); } -- /* We've reached the static block without finding a result. */ +- /* We've reached the edge of the function without finding a result. */ + /* We've reached the global block without finding a result. */ return NULL; } -@@ -1450,6 +1498,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile, +@@ -1416,13 +1453,12 @@ lookup_objfile_from_block (const struct block *block) + block_found appropriately. */ + + struct symbol * +-lookup_symbol_aux_block (const char *name, const char *linkage_name, +- const struct block *block, ++lookup_symbol_aux_block (const char *name, const struct block *block, + const domain_enum domain) + { + struct symbol *sym; + +- sym = lookup_block_symbol (block, name, linkage_name, domain); ++ sym = lookup_block_symbol (block, name, domain); + if (sym) + { + block_found = block; +@@ -1438,7 +1474,6 @@ lookup_symbol_aux_block (const char *name, const char *linkage_name, + struct symbol * + lookup_global_symbol_from_objfile (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain) + { + struct symbol *sym; +@@ -1452,7 +1487,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile, + { + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); +- sym = lookup_block_symbol (block, name, linkage_name, domain); ++ sym = lookup_block_symbol (block, name, domain); + if (sym) + { + block_found = block; +@@ -1461,23 +1496,23 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile, } /* Now go through psymtabs. */ @@ -33264,7 +18082,54 @@ index d2ba1f3..44c9a58 100644 ALL_OBJFILE_PSYMTABS (objfile, ps) { if (!ps->readin -@@ -1520,7 +1569,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name, +- && lookup_partial_symbol (ps, name, linkage_name, +- 1, domain)) ++ && lookup_partial_symbol (ps, name, 1, domain)) + { + s = PSYMTAB_TO_SYMTAB (ps); + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); +- sym = lookup_block_symbol (block, name, linkage_name, domain); ++ sym = lookup_block_symbol (block, name, domain); + return fixup_symbol_section (sym, (struct objfile *)objfile); + } + } + + if (objfile->separate_debug_objfile) + return lookup_global_symbol_from_objfile (objfile->separate_debug_objfile, +- name, linkage_name, domain); ++ name, domain); + + return NULL; + } +@@ -1488,8 +1523,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile, + static symbols. */ + + static struct symbol * +-lookup_symbol_aux_symtabs (int block_index, +- const char *name, const char *linkage_name, ++lookup_symbol_aux_symtabs (int block_index, const char *name, + const domain_enum domain) + { + struct symbol *sym; +@@ -1502,7 +1536,7 @@ lookup_symbol_aux_symtabs (int block_index, + { + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, block_index); +- sym = lookup_block_symbol (block, name, linkage_name, domain); ++ sym = lookup_block_symbol (block, name, domain); + if (sym) + { + block_found = block; +@@ -1520,7 +1554,6 @@ lookup_symbol_aux_symtabs (int block_index, + + static struct symbol * + lookup_symbol_aux_psymtabs (int block_index, const char *name, +- const char *linkage_name, + const domain_enum domain) + { + struct symbol *sym; +@@ -1531,16 +1564,15 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name, struct symtab *s; const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); @@ -33272,8 +18137,148 @@ index d2ba1f3..44c9a58 100644 + ALL_PSYMTABS_REQUIRED (objfile, ps) { if (!ps->readin - && lookup_partial_symbol (ps, name, linkage_name, -@@ -1805,7 +1854,11 @@ basic_lookup_transparent_type (const char *name) +- && lookup_partial_symbol (ps, name, linkage_name, +- psymtab_index, domain)) ++ && lookup_partial_symbol (ps, name, psymtab_index, domain)) + { + s = PSYMTAB_TO_SYMTAB (ps); + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, block_index); +- sym = lookup_block_symbol (block, name, linkage_name, domain); ++ sym = lookup_block_symbol (block, name, domain); + if (!sym) + { + /* This shouldn't be necessary, but as a last resort try +@@ -1557,7 +1589,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name, + block = BLOCKVECTOR_BLOCK (bv, + block_index == GLOBAL_BLOCK ? + STATIC_BLOCK : GLOBAL_BLOCK); +- sym = lookup_block_symbol (block, name, linkage_name, domain); ++ sym = lookup_block_symbol (block, name, domain); + if (!sym) + error (_("Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n%s may be an inlined function, or may be a template function\n(if a template, try specifying an instantiation: %s)."), + block_index == GLOBAL_BLOCK ? "global" : "static", +@@ -1576,7 +1608,6 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name, + + struct symbol * + basic_lookup_symbol_nonlocal (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain) + { +@@ -1610,11 +1641,11 @@ basic_lookup_symbol_nonlocal (const char *name, + than that one, so I don't think we should worry about that for + now. */ + +- sym = lookup_symbol_static (name, linkage_name, block, domain); ++ sym = lookup_symbol_static (name, block, domain); + if (sym != NULL) + return sym; + +- return lookup_symbol_global (name, linkage_name, block, domain); ++ return lookup_symbol_global (name, block, domain); + } + + /* Lookup a symbol in the static block associated to BLOCK, if there +@@ -1622,14 +1653,13 @@ basic_lookup_symbol_nonlocal (const char *name, + + struct symbol * + lookup_symbol_static (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain) + { + const struct block *static_block = block_static_block (block); + + if (static_block != NULL) +- return lookup_symbol_aux_block (name, linkage_name, static_block, domain); ++ return lookup_symbol_aux_block (name, static_block, domain); + else + return NULL; + } +@@ -1639,7 +1669,6 @@ lookup_symbol_static (const char *name, + + struct symbol * + lookup_symbol_global (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain) + { +@@ -1649,15 +1678,15 @@ lookup_symbol_global (const char *name, + /* Call library-specific lookup procedure. */ + objfile = lookup_objfile_from_block (block); + if (objfile != NULL) +- sym = solib_global_lookup (objfile, name, linkage_name, domain); ++ sym = solib_global_lookup (objfile, name, domain); + if (sym != NULL) + return sym; + +- sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name, domain); ++ sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain); + if (sym != NULL) + return sym; + +- return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name, domain); ++ return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, domain); + } + + int +@@ -1681,14 +1710,11 @@ symbol_matches_domain (enum language symbol_language, + } + + /* Look, in partial_symtab PST, for symbol whose natural name is NAME. +- If LINKAGE_NAME is non-NULL, check in addition that the symbol's +- linkage name matches it. Check the global symbols if GLOBAL, the +- static symbols if not */ ++ Check the global symbols if GLOBAL, the static symbols if not. */ + + struct partial_symbol * + lookup_partial_symbol (struct partial_symtab *pst, const char *name, +- const char *linkage_name, int global, +- domain_enum domain) ++ int global, domain_enum domain) + { + struct partial_symbol *temp; + struct partial_symbol **start, **psym; +@@ -1740,9 +1766,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, + internal_error (__FILE__, __LINE__, _("failed internal consistency check")); + + while (top <= real_top +- && (linkage_name != NULL +- ? strcmp (SYMBOL_LINKAGE_NAME (*top), linkage_name) == 0 +- : SYMBOL_MATCHES_SEARCH_NAME (*top,name))) ++ && SYMBOL_MATCHES_SEARCH_NAME (*top, name)) + { + if (symbol_matches_domain (SYMBOL_LANGUAGE (*top), + SYMBOL_DOMAIN (*top), domain)) +@@ -1759,15 +1783,9 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name, + for (psym = start; psym < start + length; psym++) + { + if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym), +- SYMBOL_DOMAIN (*psym), domain)) +- { +- if (linkage_name != NULL +- ? strcmp (SYMBOL_LINKAGE_NAME (*psym), linkage_name) == 0 +- : SYMBOL_MATCHES_SEARCH_NAME (*psym, name)) +- { +- return (*psym); +- } +- } ++ SYMBOL_DOMAIN (*psym), domain) ++ && SYMBOL_MATCHES_SEARCH_NAME (*psym, name)) ++ return (*psym); + } + } + +@@ -1809,22 +1827,25 @@ basic_lookup_transparent_type (const char *name) + { + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); +- sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN); ++ sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) + { + return SYMBOL_TYPE (sym); } } @@ -33284,9 +18289,36 @@ index d2ba1f3..44c9a58 100644 + call but that would behave nondeterministically. */ + ALL_PSYMTABS_REQUIRED (objfile, ps) { - if (!ps->readin && lookup_partial_symbol (ps, name, NULL, - 1, STRUCT_DOMAIN)) -@@ -1853,7 +1906,12 @@ basic_lookup_transparent_type (const char *name) +- if (!ps->readin && lookup_partial_symbol (ps, name, NULL, +- 1, STRUCT_DOMAIN)) ++ if (!ps->readin && lookup_partial_symbol (ps, name, 1, STRUCT_DOMAIN)) + { + s = PSYMTAB_TO_SYMTAB (ps); + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); +- sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN); ++ sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (!sym) + { + /* This shouldn't be necessary, but as a last resort +@@ -1833,7 +1854,7 @@ basic_lookup_transparent_type (const char *name) + * the psymtab gets it wrong in some cases. + */ + block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); +- sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN); ++ sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (!sym) + error (_("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\ + %s may be an inlined function, or may be a template function\n\ +@@ -1857,21 +1878,26 @@ basic_lookup_transparent_type (const char *name) + { + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); +- sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN); ++ sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) + { + return SYMBOL_TYPE (sym); } } @@ -33298,9 +18330,27 @@ index d2ba1f3..44c9a58 100644 + call but that would behave nondeterministically. */ + ALL_PSYMTABS_REQUIRED (objfile, ps) { - if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN)) +- if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN)) ++ if (!ps->readin && lookup_partial_symbol (ps, name, 0, STRUCT_DOMAIN)) { -@@ -1894,7 +1952,21 @@ find_main_psymtab (void) + s = PSYMTAB_TO_SYMTAB (ps); + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); +- sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN); ++ sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (!sym) + { + /* This shouldn't be necessary, but as a last resort +@@ -1880,7 +1906,7 @@ basic_lookup_transparent_type (const char *name) + * the psymtab gets it wrong in some cases. + */ + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); +- sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN); ++ sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (!sym) + error (_("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\ + %s may be an inlined function, or may be a template function\n\ +@@ -1905,9 +1931,23 @@ find_main_psymtab (void) struct partial_symtab *pst; struct objfile *objfile; @@ -33312,7 +18362,7 @@ index d2ba1f3..44c9a58 100644 + require_partial_symbols (objfile); + ALL_OBJFILE_PSYMTABS (objfile, pst) + { -+ if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN)) ++ if (lookup_partial_symbol (pst, main_name (), 1, VAR_DOMAIN)) + { + return pst; + } @@ -33321,9 +18371,49 @@ index d2ba1f3..44c9a58 100644 + + ALL_PSYMTABS_REQUIRED (objfile, pst) { - if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN)) +- if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN)) ++ if (lookup_partial_symbol (pst, main_name (), 1, VAR_DOMAIN)) { -@@ -3085,7 +3157,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[], + return (pst); + } +@@ -1925,14 +1965,10 @@ find_main_psymtab (void) + search on the symbols. Each symbol which is marked as being a ObjC/C++ + symbol (language_cplus or language_objc set) has both the encoded and + non-encoded names tested for a match. +- +- If LINKAGE_NAME is non-NULL, verify that any symbol we find has this +- particular mangled name. + */ + + struct symbol * + lookup_block_symbol (const struct block *block, const char *name, +- const char *linkage_name, + const domain_enum domain) + { + struct dict_iterator iter; +@@ -1945,9 +1981,7 @@ lookup_block_symbol (const struct block *block, const char *name, + sym = dict_iter_name_next (name, &iter)) + { + if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), +- SYMBOL_DOMAIN (sym), domain) +- && (linkage_name != NULL +- ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1)) ++ SYMBOL_DOMAIN (sym), domain)) + return sym; + } + return NULL; +@@ -1967,9 +2001,7 @@ lookup_block_symbol (const struct block *block, const char *name, + sym = dict_iter_name_next (name, &iter)) + { + if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), +- SYMBOL_DOMAIN (sym), domain) +- && (linkage_name != NULL +- ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1)) ++ SYMBOL_DOMAIN (sym), domain)) + { + sym_found = sym; + if (!SYMBOL_IS_ARGUMENT (sym)) +@@ -3172,7 +3204,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[], matching the regexp. That way we don't have to reproduce all of the machinery below. */ @@ -33333,7 +18423,7 @@ index d2ba1f3..44c9a58 100644 struct partial_symbol **bound, **gbound, **sbound; int keep_going = 1; diff --git a/gdb/symtab.h b/gdb/symtab.h -index 8b086f3..6ad6179 100644 +index 740d4e0..13e521a 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -171,9 +171,6 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *); @@ -33346,7 +18436,7 @@ index 8b086f3..6ad6179 100644 /* Initializes the language dependent portion of a symbol depending upon the language for the symbol. */ #define SYMBOL_INIT_LANGUAGE_SPECIFIC(symbol,language) \ -@@ -394,7 +391,13 @@ typedef enum domain_enum_tag +@@ -394,7 +391,10 @@ typedef enum domain_enum_tag FUNCTIONS_DOMAIN, /* All defined types */ @@ -33354,29 +18444,57 @@ index 8b086f3..6ad6179 100644 + TYPES_DOMAIN, + + /* Fortran common blocks. Their naming must be separate from VAR_DOMAIN. */ -+ COMMON_BLOCK_DOMAIN, -+ -+ /* Fortran module. Their naming must be separate. */ -+ MODULE_DOMAIN ++ COMMON_BLOCK_DOMAIN } domain_enum; -@@ -472,7 +475,13 @@ enum address_class - in another object file or runtime common storage. - The linker might even remove the minimal symbol if the global - symbol is never referenced, in which case the symbol remains -- unresolved. */ -+ unresolved. -+ -+ GDB would normally find the symbol in the minimal symbol table if it will -+ not find it in the full symbol table. But a reference to an external -+ symbol in a local block shadowing other definition requires full symbol -+ without possibly having its address available for LOC_STATIC. Testcase -+ is provided as `gdb.dwarf2/dw2-unresolved.exp'. */ +@@ -990,7 +990,6 @@ extern struct symbol *lookup_symbol (const char *, const struct block *, + that can't think of anything better to do. */ - LOC_UNRESOLVED, + extern struct symbol *basic_lookup_symbol_nonlocal (const char *, +- const char *, + const struct block *, + const domain_enum); -@@ -1027,6 +1036,8 @@ extern void clear_pc_function_cache (void); +@@ -1001,7 +1000,6 @@ extern struct symbol *basic_lookup_symbol_nonlocal (const char *, + is one; do nothing if BLOCK is NULL or a global block. */ + + extern struct symbol *lookup_symbol_static (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain); + +@@ -1009,7 +1007,6 @@ extern struct symbol *lookup_symbol_static (const char *name, + necessary). */ + + extern struct symbol *lookup_symbol_global (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain); + +@@ -1018,21 +1015,18 @@ extern struct symbol *lookup_symbol_global (const char *name, + will fix up the symbol if necessary. */ + + extern struct symbol *lookup_symbol_aux_block (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain); + + /* Lookup a partial symbol. */ + + extern struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, +- const char *, + const char *, int, + domain_enum); + + /* lookup a symbol by name, within a specified block */ + + extern struct symbol *lookup_block_symbol (const struct block *, const char *, +- const char *, + const domain_enum); + + /* lookup a [struct, union, enum] by name, within a specified block */ +@@ -1062,6 +1056,8 @@ extern void clear_pc_function_cache (void); /* from symtab.c: */ @@ -33385,1101 +18503,19 @@ index 8b086f3..6ad6179 100644 /* lookup partial symbol table by filename */ extern struct partial_symtab *lookup_partial_symtab (const char *); -diff --git a/gdb/syscalls/gdb-syscalls.dtd b/gdb/syscalls/gdb-syscalls.dtd -new file mode 100644 -index 0000000..0d40ab4 ---- /dev/null -+++ b/gdb/syscalls/gdb-syscalls.dtd -@@ -0,0 +1,21 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/syscalls/i386-linux.xml b/gdb/syscalls/i386-linux.xml -new file mode 100644 -index 0000000..6f2beee ---- /dev/null -+++ b/gdb/syscalls/i386-linux.xml -@@ -0,0 +1,334 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/syscalls/ppc-linux.xml b/gdb/syscalls/ppc-linux.xml -new file mode 100644 -index 0000000..f09fabd ---- /dev/null -+++ b/gdb/syscalls/ppc-linux.xml -@@ -0,0 +1,304 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/syscalls/ppc64-linux.xml b/gdb/syscalls/ppc64-linux.xml -new file mode 100644 -index 0000000..7ee929c ---- /dev/null -+++ b/gdb/syscalls/ppc64-linux.xml -@@ -0,0 +1,289 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/target.c b/gdb/target.c -index b89d551..831070c 100644 ---- a/gdb/target.c -+++ b/gdb/target.c -@@ -443,6 +443,8 @@ update_current_target (void) - /* Do not inherit to_follow_fork. */ - INHERIT (to_insert_exec_catchpoint, t); - INHERIT (to_remove_exec_catchpoint, t); -+ INHERIT (to_passed_by_entrypoint, t); -+ INHERIT (to_set_syscall_catchpoint, t); - INHERIT (to_has_exited, t); - /* Do not inherit to_mourn_inferiour. */ - INHERIT (to_can_run, t); -@@ -586,9 +588,15 @@ update_current_target (void) - de_fault (to_insert_exec_catchpoint, - (void (*) (int)) - tcomplain); -+ de_fault (to_passed_by_entrypoint, -+ (int (*) (void)) -+ tcomplain); - de_fault (to_remove_exec_catchpoint, - (int (*) (int)) - tcomplain); -+ de_fault (to_set_syscall_catchpoint, -+ (int (*) (int, int, int, int, int *)) -+ tcomplain); - de_fault (to_has_exited, - (int (*) (int, int, int *)) - return_zero); -@@ -2677,9 +2685,9 @@ target_waitstatus_to_string (const struct target_waitstatus *ws) - case TARGET_WAITKIND_EXECD: - return xstrprintf ("%sexecd", kind_str); - case TARGET_WAITKIND_SYSCALL_ENTRY: -- return xstrprintf ("%ssyscall-entry", kind_str); -+ return xstrprintf ("%sentered syscall", kind_str); - case TARGET_WAITKIND_SYSCALL_RETURN: -- return xstrprintf ("%ssyscall-return", kind_str); -+ return xstrprintf ("%sexited syscall", kind_str); - case TARGET_WAITKIND_SPURIOUS: - return xstrprintf ("%sspurious", kind_str); - case TARGET_WAITKIND_IGNORE: +@@ -1356,7 +1352,6 @@ extern /*const */ char *main_name (void); + /* Check global symbols in objfile. */ + struct symbol *lookup_global_symbol_from_objfile (const struct objfile *objfile, + const char *name, +- const char *linkage_name, + const domain_enum domain); + + extern struct symtabs_and_lines diff --git a/gdb/target.h b/gdb/target.h -index 7f4cd8f..8dcc3d6 100644 +index 2c743e9..ef29610 100644 --- a/gdb/target.h +++ b/gdb/target.h -@@ -140,18 +140,34 @@ struct target_waitstatus - { - enum target_waitkind kind; - -- /* Forked child pid, execd pathname, exit status or signal number. */ -+ /* Forked child pid, execd pathname, exit status, signal number or -+ syscall name. */ - union - { - int integer; - enum target_signal sig; - ptid_t related_pid; - char *execd_pathname; -- int syscall_id; -+ int syscall_number; - } - value; - }; - -+/* The structure below stores information about a system call. -+ It is basically used in the "catch syscall" command, and in -+ every function that gives information about a system call. -+ -+ It's also good to mention that its fields represent everything -+ that we currently know about a syscall in GDB. */ -+struct syscall -+ { -+ /* The syscall number. */ -+ int number; -+ -+ /* The syscall name. */ -+ const char *name; -+ }; -+ - /* Return a pretty printed form of target_waitstatus. - Space for the result is malloc'd, caller must free. */ - extern char *target_waitstatus_to_string (const struct target_waitstatus *); -@@ -392,6 +408,8 @@ struct target_ops - int (*to_follow_fork) (struct target_ops *, int); - void (*to_insert_exec_catchpoint) (int); - int (*to_remove_exec_catchpoint) (int); -+ int (*to_passed_by_entrypoint) (void); -+ int (*to_set_syscall_catchpoint) (int, int, int, int, int *); - int (*to_has_exited) (int, int, int *); - void (*to_mourn_inferior) (struct target_ops *); - int (*to_can_run) (void); -@@ -723,6 +741,8 @@ extern int inferior_has_vforked (ptid_t pid, ptid_t *child_pid); - - extern int inferior_has_execd (ptid_t pid, char **execd_pathname); - -+extern int inferior_has_called_syscall (ptid_t pid, int *syscall_number); -+ - /* From exec.c */ - - extern void print_section_info (struct target_ops *, bfd *); -@@ -881,6 +901,21 @@ int target_follow_fork (int follow_child); - #define target_remove_exec_catchpoint(pid) \ - (*current_target.to_remove_exec_catchpoint) (pid) - -+/* Has the inferior already passed through its entrypoint? */ -+#define target_passed_by_entrypoint() \ -+ (*current_target.to_passed_by_entrypoint) () -+ -+/* Syscall catch. NEEDED is nonzero if any syscall catch (of any -+ kind) is requested. ANY_COUNT is nonzero if a generic -+ (filter-less) syscall catch is being requested. TABLE is an array -+ of ints, indexed by syscall number. An element in this array is -+ nonzero if that syscall should be caught. TABLE_SIZE is the number -+ of elements in TABLE. */ -+ -+#define target_set_syscall_catchpoint(pid, needed, any_count, table_size, table) \ -+ (*current_target.to_set_syscall_catchpoint) (pid, needed, any_count, \ -+ table_size, table) -+ - /* Returns TRUE if PID has exited. And, also sets EXIT_STATUS to the - exit code of PID, if any. */ - -@@ -1146,6 +1181,20 @@ extern int target_search_memory (CORE_ADDR start_addr, +@@ -1157,6 +1157,20 @@ extern int target_search_memory (CORE_ADDR start_addr, ULONGEST pattern_len, CORE_ADDR *found_addrp); @@ -34500,131 +18536,135 @@ index 7f4cd8f..8dcc3d6 100644 /* Command logging facility. */ #define target_log_command(p) \ +@@ -1276,6 +1290,14 @@ extern struct target_ops *find_target_beneath (struct target_ops *); + + extern char *target_get_osdata (const char *type); + ++/* Read OS data object of type TYPE from the target, and return it in ++ XML format. The result is NUL-terminated and returned as a string, ++ allocated using xmalloc. If an error occurs or the transfer is ++ unsupported, NULL is returned. Empty objects are returned as ++ allocated but empty strings. */ ++ ++extern char *target_get_osdata (const char *type); ++ + + /* Stuff that should be shared among the various remote targets. */ + diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog -index e3aaeab..e886869 100644 +index d1e38f3..c7511cc 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog -@@ -1,3 +1,7 @@ -+2009-03-05 Pedro Alves -+ -+ * gdb.arch/i386-permbkpt.S, gdb.arch/i386-permbkpt.exp: New. -+ - 2009-02-18 Jan Kratochvil +@@ -1252,6 +1252,103 @@ + gdb_start_cmd. + Use runto_main before any test that requires execution. - * gdb.base/macscp.exp (objfile): Move it to ${objdir}/${subdir}/. -diff --git a/gdb/testsuite/configure.ac b/gdb/testsuite/configure.ac -index 3d8fae4..5fb9067 100644 ---- a/gdb/testsuite/configure.ac -+++ b/gdb/testsuite/configure.ac -@@ -1,7 +1,7 @@ - # -*- Autoconf -*- - # Process this file with autoconf to produce a configure script. ++2008-10-23 Tom Tromey ++ ++ * gdb.python/python-prettyprint.exp (run_lang_tests): Test ++ printing a reference. ++ * gdb.python/python-prettyprint.c (main): Add reference. ++ ++2008-10-23 Tom Tromey ++ ++ * gdb.python/python-prettyprint.exp (run_lang_tests): Test ++ printing 'cstring'. ++ * gdb.python/python-prettyprint.c (main): New local 'cstring'. ++ ++2008-10-22 Tom Tromey ++ ++ * lib/mi-support.exp (mi_list_varobj_children_range): New proc. ++ (mi_list_varobj_children): Use it. ++ * gdb.python/python-mi.exp: Add -var-set-visualizer tests, ++ -var-set-child-range tests. ++ ++2008-10-22 Tom Tromey ++ ++ * gdb.python/python-prettyprint.py (ContainerPrinter.to_string): ++ Rename from 'header'. ++ ++2008-10-22 Tom Tromey ++ ++ * gdb.python/python-prettyprint.py: Add MI pretty printer. ++ * gdb.python/python-mi.exp: New file. ++ * lib/mi-support.exp (mi_child_regexp): New proc. ++ (mi_list_varobj_children): Use it. ++ (mi_varobj_update_dynamic): New proc. ++ (mi_get_features): New proc. ++ ++2008-10-21 Paul Pluzhnikov ++ ++ * gdb.python/python-prettyprint.exp, ++ gdb.python/python-prettyprint.c, ++ gdb.python/python-prettyprint.py: More C++ tests. ++ ++2008-10-21 Tom Tromey ++ ++ * gdb.python/python-prettyprint.exp (run_lang_tests): Don't expect ++ quotes. ++ ++2008-10-20 Tom Tromey ++ ++ * gdb.python/python-prettyprint.exp: Fixed comment. ++ ++2008-10-20 Tom Tromey ++ ++ * gdb.python/Makefile.in (EXECUTABLES): Add python-prettyprint. ++ ++2008-10-20 Tom Tromey ++ ++ * gdb.python/python-prettyprint.exp (run_lang_tests): Add tests. ++ * gdb.python/python-prettyprint.c (string_repr, container): New ++ types. ++ (array): New global. ++ (zzz_type): New typedef. ++ (make_string, make_container, add_item): New functions. ++ (main): Add variables. ++ * gdb.python/python-prettyprint.py (string_print): New function. ++ (ContainerPrinter): New class. ++ ++2008-10-20 Tom Tromey ++ ++ * gdb.python/python-prettyprint.exp (run_lang_tests): Use python's ++ execfile to read .py file. ++ * gdb.python/python-prettyprint.py: Remove 'python' command. ++ ++2008-10-17 Paul Pluzhnikov ++ ++ * gdb.python/python-prettyprint.exp, ++ gdb.python/python-prettyprint.c, ++ gdb.python/python-prettyprint.py: Add C++ tests. ++ ++2008-10-17 Paul Pluzhnikov ++ ++ * gdb.python/python-prettyprint.exp, ++ gdb.python/python-prettyprint.c, ++ gdb.python/python-prettyprint.py: New test for pretty ++ printing. ++ ++2008-10-16 Tom Tromey ++ ++ * gdb.python/Makefile.in: New file. ++ * configure: Rebuild. ++ * configure.ac: Add gdb.python/Makefile. ++ ++2008-10-14 Paul Pluzhnikov ++ ++ * gdb.python/python-value.c: Prevent gcc from optimizing argv[] out. ++ ++2008-10-14 Paul Pluzhnikov ++ ++ * Makefile.in: Add gdb.python to ALL_SUBDIRS ++ + 2008-10-23 Pedro Alves --# Copyright 2002, 2003, 2004, 2005 -+# Copyright 2002, 2003, 2004, 2005, 2008 - # Free Software Foundation, Inc. - # - # This program is free software; you can redistribute it and/or modify -diff --git a/gdb/testsuite/gdb.arch/i386-permbkpt.S b/gdb/testsuite/gdb.arch/i386-permbkpt.S -new file mode 100644 -index 0000000..02a31d6 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/i386-permbkpt.S -@@ -0,0 +1,30 @@ -+/* Copyright 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ -+ This file is part of the gdb testsuite. */ -+ -+#define CONCAT1(a, b) CONCAT2(a, b) -+#define CONCAT2(a, b) a ## b -+ -+#ifdef SYMBOL_PREFIX -+# define SYMBOL(str) CONCAT1(SYMBOL_PREFIX, str) -+#else -+# define SYMBOL(str) str -+#endif -+ -+ .global SYMBOL(main) -+SYMBOL(main): -+ int3 -+ ret -diff --git a/gdb/testsuite/gdb.arch/i386-permbkpt.exp b/gdb/testsuite/gdb.arch/i386-permbkpt.exp -new file mode 100644 -index 0000000..f1930e5 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/i386-permbkpt.exp -@@ -0,0 +1,52 @@ -+# Copyright (C) 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+ -+# This file is part of the gdb testsuite. -+ -+if $tracelevel { -+ strace $tracelevel -+} -+ -+# Test inserting breakpoints over permanent breakpoints on i386 and amd64. -+ -+if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } then { -+ verbose "Skipping i386 test for multi break at permanent breakpoint location." -+ return -+} -+ -+set testfile "i386-permbkpt" -+set srcfile ${testfile}.S -+set binfile ${objdir}/${subdir}/${testfile} -+ -+# Some targets have leading underscores on assembly symbols. -+# TODO: detect this automatically -+set additional_flags "" -+if { [istarget "*-*-cygwin*"] || [istarget "*-*-mingw*"] } then { -+ set additional_flags "additional_flags=-DSYMBOL_PREFIX=_" -+} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { -+ untested i386-permbkpt.exp -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+gdb_test "break main" "" "First permanent break" -+gdb_test "break main" "" "Second permanent break" + * lib/mi-support.exp (mi_expect_interrupt): Expect signal 0 diff --git a/gdb/testsuite/gdb.arch/powerpc-power7.exp b/gdb/testsuite/gdb.arch/powerpc-power7.exp new file mode 100644 -index 0000000..d9c48f9 +index 0000000..ae301db --- /dev/null +++ b/gdb/testsuite/gdb.arch/powerpc-power7.exp -@@ -0,0 +1,166 @@ +@@ -0,0 +1,175 @@ +# Copyright 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -34674,14 +18714,23 @@ index 0000000..d9c48f9 + } +} + -+proc func_check {offset instr} { ++proc instr_to_patt {offset instr} { ++ # 0x0000000000000018 : stxvd2x vs43,r4,r5 ++ return ".*\r\n[string map {0x 0x0*} $offset] :\[ \t\]*[string map [list { } "\[ \t\]+" . {\.}] $instr]\[ \t\]*\r\n.*" ++} ++ ++# KFAIL strings would not exist if -Many would print the same as -Mpower7. ++# That means the power7 form should be the preferred one. ++# http://sourceware.org/ml/gdb-patches/2009-03/threads.html#00020 ++ ++proc func_check {offset instr {kfail ""}} { + global func + -+ # 0x0000000000000018 : stxvd2x vs43,r4,r5 -+ set patt ".*\r\n[string map {0x 0x0*} $offset] :\[ \t\]*[string map [list { } "\[ \t\]+" . {\.}] $instr]\[ \t\]*\r\n.*" + set test "Found $offset: $instr" -+ if [regexp -nocase -line $patt $func] { ++ if [regexp -nocase -line [instr_to_patt $offset $instr] $func] { + pass $test ++ } elseif {$kfail != "" && [regexp -nocase -line [instr_to_patt $offset $kfail] $func]} { ++ kfail gdb/NNNN $test + } else { + fail $test + } @@ -34725,8 +18774,8 @@ index 0000000..d9c48f9 +func_check 0x8c "rvwinkle" +func_check 0x90 "prtyw r3,r4" +func_check 0x94 "prtyd r13,r14" -+func_check 0x98 "mfcfar r10" -+func_check 0x9c "mtcfar r11" ++func_check 0x98 "mfcfar r10" "mfspr r10,28" ++func_check 0x9c "mtcfar r11" "mtspr 28,r11" +func_check 0xa0 "cmpb r3,r4,r5" +func_check 0xa4 "lwzcix r10,r11,r12" +func_check 0xa8 "dadd f16,f17,f18" @@ -34770,8 +18819,8 @@ index 0000000..d9c48f9 +func_check 0x140 "ftdiv cr7,f10,f11" +func_check 0x144 "ftsqrt cr0,f10" +func_check 0x148 "ftsqrt cr7,f10" -+func_check 0x14c "dcbtt r8,r9" -+func_check 0x150 "dcbtstt r8,r9" ++func_check 0x14c "dcbtt r8,r9" "dcbt 16,r8,r9" ++func_check 0x150 "dcbtstt r8,r9" "dcbtst 16,r8,r9" +func_check 0x154 "dcffix f10,f12" +func_check 0x158 "dcffix. f20,f22" +func_check 0x15c "lbarx r10,r11,r12" @@ -35484,19 +19533,6 @@ index 0000000..534120a +gdb_test "whatis array" "type = array_t" "second: whatis array" + +gdb_test "ptype array" "type = char \\\[78\\\]" "second: ptype array" -diff --git a/gdb/testsuite/gdb.base/Makefile.in b/gdb/testsuite/gdb.base/Makefile.in -index 9f382db..12db521 100644 ---- a/gdb/testsuite/gdb.base/Makefile.in -+++ b/gdb/testsuite/gdb.base/Makefile.in -@@ -12,7 +12,7 @@ EXECUTABLES = all-types annota1 bitfields break \ - scope section_command setshow setvar shmain sigall signals \ - solib solib_sl so-impl-ld so-indr-cl \ - step-line step-test structs structs2 \ -- twice-tmp varargs vforked-prog watchpoint whatis -+ twice-tmp varargs vforked-prog watchpoint whatis catch-syscall - - MISCELLANEOUS = coremmap.data ../foobar.baz \ - shr1.sl shr2.sl solib_sl.sl solib1.sl solib2.sl diff --git a/gdb/testsuite/gdb.base/arrayidx.c b/gdb/testsuite/gdb.base/arrayidx.c index 98d4d35..f98a656 100644 --- a/gdb/testsuite/gdb.base/arrayidx.c @@ -35533,954 +19569,11 @@ index 71ce4aa..af0e5f8 100644 + unsupported "$test (no GCC)" + } +} -diff --git a/gdb/testsuite/gdb.base/call-rt-st.exp b/gdb/testsuite/gdb.base/call-rt-st.exp -index 3359c70..f73dd7f 100644 ---- a/gdb/testsuite/gdb.base/call-rt-st.exp -+++ b/gdb/testsuite/gdb.base/call-rt-st.exp -@@ -186,7 +186,7 @@ if {![gdb_skip_float_test "print print_two_floats(*f3)"] && \ - - if ![gdb_skip_stdio_test "print print_bit_flags_char(*cflags)"] { - print_struct_call "print_bit_flags_char(*cflags)" \ -- ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1 '\\\\001', beta = 0 '\\\\0', gamma = 1 '\\\\001', delta = 0 '\\\\0', epsilon = 1 '\\\\001', omega = 0 '\\\\0'\\}" -+ ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1 '\\\\1', beta = 0 '\\\\0', gamma = 1 '\\\\1', delta = 0 '\\\\0', epsilon = 1 '\\\\1', omega = 0 '\\\\0'\\}" - } - - if ![gdb_skip_stdio_test "print print_bit_flags_short(*sflags)"] { -diff --git a/gdb/testsuite/gdb.base/callfuncs.exp b/gdb/testsuite/gdb.base/callfuncs.exp -index 6d8aa45..be6a872 100644 ---- a/gdb/testsuite/gdb.base/callfuncs.exp -+++ b/gdb/testsuite/gdb.base/callfuncs.exp -@@ -437,7 +437,7 @@ gdb_test "print t_small_values(1,3,5,7,9,11,13,15,17,19)" \ - "The program being debugged stopped while.*" \ - "stop at nested call level 4" - gdb_test "backtrace" \ -- "\#0 t_small_values \\(arg1=1 '.001', arg2=3, arg3=5, arg4=7 '.a', arg5=9, arg6=11 '.v', arg7=13, arg8=15, arg9=17, arg10=19\\).*\#2 sum10 \\(i0=2, i1=4, i2=6, i3=8, i4=10, i5=12, i6=14, i7=16, i8=18, i9=20\\).*\#3 .*\#4 add \\(a=4, b=5\\).*\#5 .*\#6 add \\(a=2, b=3\\).*\#7 .*\#8 main.*" \ -+ "\#0 t_small_values \\(arg1=1 '.1', arg2=3, arg3=5, arg4=7 '.a', arg5=9, arg6=11 '.v', arg7=13, arg8=15, arg9=17, arg10=19\\).*\#2 sum10 \\(i0=2, i1=4, i2=6, i3=8, i4=10, i5=12, i6=14, i7=16, i8=18, i9=20\\).*\#3 .*\#4 add \\(a=4, b=5\\).*\#5 .*\#6 add \\(a=2, b=3\\).*\#7 .*\#8 main.*" \ - "backtrace at nested call level 4" - gdb_test "finish" "Value returned is .* = 100" \ - "Finish from nested call level 4" -diff --git a/gdb/testsuite/gdb.base/catch-syscall.c b/gdb/testsuite/gdb.base/catch-syscall.c -new file mode 100644 -index 0000000..64850de ---- /dev/null -+++ b/gdb/testsuite/gdb.base/catch-syscall.c -@@ -0,0 +1,25 @@ -+/* This file is used to test the 'catch syscall' feature on GDB. -+ -+ Please, if you are going to edit this file DO NOT change the syscalls -+ being called (nor the order of them). If you really must do this, then -+ take a look at catch-syscall.exp and modify there too. -+ -+ Written by Sergio Durigan Junior -+ September, 2008 */ -+ -+#include -+#include -+#include -+ -+int -+main (void) -+{ -+ /* A close() with a wrong argument. We are only -+ interested in the syscall. */ -+ close (-1); -+ -+ chroot ("."); -+ -+ /* The last syscall. Do not change this. */ -+ _exit (0); -+} -diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp -new file mode 100644 -index 0000000..a9f6937 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/catch-syscall.exp -@@ -0,0 +1,386 @@ -+# Copyright 1997, 1999, 2007, 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+ -+# This program tests the 'catch syscall' functionality. -+# -+# It was written by Sergio Durigan Junior -+# on September/2008. -+ -+if { [is_remote target] || ![isnative] } then { -+ continue -+} -+ -+set prms_id 0 -+set bug_id 0 -+ -+global srcfile -+set testfile "catch-syscall" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+ -+# All (but the last) syscalls from the example code -+# They are ordered according to the file, so do not change this. -+set all_syscalls { "close" "chroot" } -+# The last syscall (exit()) does not return, so -+# we cannot expect the catchpoint to be triggered -+# twice. It is a special case. -+set last_syscall "exit_group" -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested catch-syscall.exp -+ return -1 -+} -+ -+# Until "catch syscall" is implemented on other targets... -+if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then { -+ continue -+} -+ -+# This shall be updated whenever 'catch syscall' is implemented -+# on some architecture. -+#if { ![istarget "x86_64-*-linux*"] && ![istarget "i\[34567\]86-*-linux*"] -+if { ![istarget "i\[34567\]86-*-linux*"] -+ && ![istarget "powerpc-*-linux*"] && ![istarget "powerpc64-*-linux*"] } { -+ continue -+} -+ -+# Internal procedure used to check if, before any syscall is caught, -+# the command 'info breakpoints' correctly lists the catchpoints AND -+# says that nothing was caught yet. -+proc check_init_info_breakpoints {} { -+ global gdb_prompt -+ -+ # Verifying that the catchpoint appears in the 'info breakpoints' -+ # command, but with "". -+ set thistest "catch syscall appears in 'info breakpoints'" -+ gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall \"\".*" $thistest -+} -+ -+# This procedure checks if, after a syscall catchpoint is hit, the -+# command 'info breakpoints' correctly lists the syscall name. -+proc check_info_breakpoints { syscall } { -+ global gdb_prompt -+ -+ set thistest "syscall $syscall appears in 'info breakpoints'" -+ gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall (.)?${syscall}(.)?.*" $thistest -+} -+ -+# This procedure checks if there was a call to a syscall. -+proc check_call_to_syscall { syscall } { -+ global gdb_prompt -+ -+ set thistest "program has called $syscall" -+ gdb_test "continue" "Catchpoint .*(call to syscall .?${syscall}.?).*" $thistest -+ -+ # Checking if the syscall is reported to be caught in -+ # 'info breakpoints'. -+ check_info_breakpoints "$syscall" -+} -+ -+# This procedure checks if the syscall returned. -+proc check_return_from_syscall { syscall } { -+ global gdb_prompt -+ -+ set thistest "syscall $syscall has returned" -+ gdb_test "continue" "Catchpoint .*(returned from syscall (.)?${syscall}(.)?).*" $thistest -+ -+ # Checking if the syscall is reported to be caught in -+ # 'info breakpoints'. -+ check_info_breakpoints "$syscall" -+} -+ -+# Internal procedure that performs two 'continue' commands and checks if -+# a syscall call AND return occur. -+proc check_continue { syscall } { -+ global gdb_prompt -+ -+ # Testing if the 'continue' stops at the -+ # specified syscall_name. If it does, then it should -+ # first print that the infeior has called the syscall, -+ # and after print that the syscall has returned. -+ -+ # Testing if the inferiorr has called the syscall. -+ check_call_to_syscall $syscall -+ # And now, that the syscall has returned. -+ check_return_from_syscall $syscall -+} -+ -+# Inserts a syscall catchpoint with an argument. -+proc insert_catch_syscall_with_arg { syscall } { -+ global gdb_prompt -+ -+ # Trying to set the syscall -+ set thistest "catch syscall with arguments ($syscall)" -+ gdb_test "catch syscall $syscall" "Catchpoint .*(syscall\[(\]s\[)\] (.)?${syscall}(.)?).*" $thistest -+} -+ -+proc check_for_program_end {} { -+ global gdb_prompt -+ -+ # Deleting the catchpoints -+ delete_breakpoints -+ -+ set thistest "successful program end" -+ gdb_test "continue" "Program exited normally.*" $thistest -+ -+} -+ -+proc test_catch_syscall_without_args {} { -+ global gdb_prompt all_syscalls last_syscall -+ -+ # Trying to set the syscall -+ set thistest "setting catch syscall without arguments" -+ gdb_test "catch syscall" "Catchpoint .*(syscall).*" $thistest -+ -+ check_init_info_breakpoints -+ -+ # We have to check every syscall -+ foreach name $all_syscalls { -+ check_continue $name -+ } -+ -+ # At last but not least, we check if the inferior -+ # has called the last (exit) syscall. -+ check_call_to_syscall $last_syscall -+ -+ # Now let's see if the inferior correctly finishes. -+ check_for_program_end -+} -+ -+proc test_catch_syscall_with_args {} { -+ global gdb_prompt -+ set syscall_name "close" -+ -+ insert_catch_syscall_with_arg $syscall_name -+ check_init_info_breakpoints -+ -+ # Can we continue until we catch the syscall? -+ check_continue $syscall_name -+ -+ # Now let's see if the inferior correctly finishes. -+ check_for_program_end -+} -+ -+proc test_catch_syscall_with_wrong_args {} { -+ global gdb_prompt -+ # mlock is not called from the source -+ set syscall_name "mlock" -+ -+ insert_catch_syscall_with_arg $syscall_name -+ check_init_info_breakpoints -+ -+ # Now, we must verify if the program stops with a continue. -+ # If it doesn't, everything is right (since we don't have -+ # a syscall named "mlock" in it). Otherwise, this is a failure. -+ set thistest "catch syscall with unused syscall ($syscall_name)" -+ gdb_test "continue" "Program exited normally.*" $thistest -+} -+ -+proc test_catch_syscall_restarting_inferior {} { -+ global gdb_prompt -+ set syscall_name "chroot" -+ -+ insert_catch_syscall_with_arg $syscall_name -+ check_init_info_breakpoints -+ -+ # Let's first reach the call of the syscall. -+ check_call_to_syscall $syscall_name -+ -+ # Now, restart the program -+ rerun_to_main -+ -+ # And check for call/return -+ check_continue $syscall_name -+ -+ # Can we finish? -+ check_for_program_end -+} -+ -+proc do_syscall_tests {} { -+ global gdb_prompt srcdir -+ -+ # First, we need to set GDB datadir. -+ send_gdb "maintenance set gdb_datadir $srcdir/..\n" -+ gdb_expect 10 { -+ -re "$gdb_prompt $" { -+ verbose "Setting GDB datadir to $srcdir/..." 2 -+ } -+ timeout { -+ error "Couldn't set GDB datadir." -+ } -+ } -+ -+ # Verify that the 'catch syscall' help is available -+ set thistest "help catch syscall" -+ gdb_test "help catch syscall" "Catch system calls.*" $thistest -+ -+ # Try to set a catchpoint to a nonsense syscall -+ set thistest "catch syscall to a nonsense syscall is prohibited" -+ gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .*" $thistest -+ -+ # Testing the 'catch syscall' command without arguments. -+ # This test should catch any syscalls. -+ if [runto_main] then { test_catch_syscall_without_args } -+ -+ # Testing the 'catch syscall' command with arguments. -+ # This test should only catch the specified syscall. -+ if [runto_main] then { test_catch_syscall_with_args } -+ -+ # Testing the 'catch syscall' command with WRONG arguments. -+ # This test should not trigger any catchpoints. -+ if [runto_main] then { test_catch_syscall_with_wrong_args } -+ -+ # Testing the 'catch' syscall command during a restart of -+ # the inferior. -+ if [runto_main] then { test_catch_syscall_restarting_inferior } -+} -+ -+proc test_catch_syscall_fail_noxml {} { -+ global gdb_prompt -+ -+ # Sanitizing. -+ delete_breakpoints -+ -+ # Testing to see if we receive a warning when calling "catch syscall" -+ # without XML support. -+ set thistest "Catch syscall displays a warning when there is no XML support" -+ gdb_test "catch syscall" "warning: Could not open .*warning: Could not load the syscall XML file .*GDB will not be able to display syscall names.*Catchpoint .*(syscall).*" $thistest -+ -+ # Since the catchpoint was set, we must check if it's present at -+ # "info breakpoints" -+ check_init_info_breakpoints -+ -+ # Sanitizing. -+ delete_breakpoints -+} -+ -+proc test_catch_syscall_without_args_noxml {} { -+ # We will need the syscall names even not using it -+ # because we need to know know many syscalls are in -+ # the example file. -+ global gdb_prompt all_syscalls last_syscall -+ -+ delete_breakpoints -+ -+ set thistest "Catch syscall without arguments and without XML support" -+ gdb_test "catch syscall" "Catchpoint .*(syscall).*" -+ -+ # Now, we should be able to set a catchpoint, -+ # and GDB shall not display the warning anymore. -+ foreach name $all_syscalls { -+ # Unfortunately, we don't know the syscall number -+ # that will be caught because this information is -+ # arch-dependent. Thus, we try to catch anything -+ # similar to a number. -+ check_continue "\[0-9\]*" -+ } -+ -+ # At last but not least, we check if the inferior -+ # has called the last (exit) syscall. -+ check_call_to_syscall "\[0-9\]*" -+ -+ delete_breakpoints -+} -+ -+proc test_catch_syscall_with_args_noxml {} { -+ global gdb_prompt -+ -+ # The number of the "close" syscall. This is our -+ # options for a "long-estabilished" syscall in all -+ # Linux architectures, but unfortunately x86_64 and -+ # a few other platforms don't "follow the convention". -+ # Because of this, we need this ugly check :-(. -+ set close_number "" -+ if { [istarget "x86_64-*-linux*"] } { -+ set close_number "3" -+ } else { -+ set close_number "6" -+ } -+ -+ delete_breakpoints -+ -+ insert_catch_syscall_with_arg $close_number -+ check_init_info_breakpoints -+ -+ check_continue $close_number -+ -+ delete_breakpoints -+} -+ -+proc test_catch_syscall_with_wrong_args_noxml {} { -+ global gdb_prompt -+ -+ delete_breakpoints -+ -+ # Even without XML support, GDB should not accept unknown -+ # syscall names for the catchpoint. -+ set thistest "Catch a nonsense syscall without XML support" -+ gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .nonsense_syscall.*" $thistest -+ -+ delete_breakpoints -+} -+ -+proc do_syscall_tests_without_xml {} { -+ global gdb_prompt srcdir -+ -+ # In this case, we don't need to set GDB's datadir because -+ # we want GDB to display only numbers, not names. So, let's -+ # begin with the tests. -+ -+ # The first test is to see if GDB displays a warning when we -+ # try to catch syscalls without the XML support. -+ test_catch_syscall_fail_noxml -+ -+ # Now, let's test if we can catch syscalls without XML support. -+ # We should succeed, but GDB is not supposed to print syscall names. -+ if [runto_main] then { test_catch_syscall_without_args_noxml } -+ -+ # The only valid argument "catch syscall" should accept is the -+ # syscall number, and not the name (since it can't translate a -+ # name to a number). -+ # -+ # It's worth mentioning that we only try to catch the syscall -+ # close(). This is because the syscall number is an arch-dependent -+ # information, so we can't assume that we know every syscall number -+ # in this system. Therefore, we have decided to use a "long-estabilished" -+ # system call, and close() just sounded the right choice :-). -+ if [runto_main] then { test_catch_syscall_with_args_noxml } -+ -+ # Now, we'll try to provide a syscall name (valid or not) to the command, -+ # and expect it to fail. -+ if [runto_main] then { test_catch_syscall_with_wrong_args_noxml } -+} -+ -+# Start with a fresh gdb -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+# Execute the tests, using XML support -+do_syscall_tests -+ -+# Restart gdb -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+# Execute the tests, without XML support. In this case, GDB will -+# only display syscall numbers, and not syscall names. -+do_syscall_tests_without_xml -diff --git a/gdb/testsuite/gdb.base/charset.c b/gdb/testsuite/gdb.base/charset.c -index b640702..55a50ce 100644 ---- a/gdb/testsuite/gdb.base/charset.c -+++ b/gdb/testsuite/gdb.base/charset.c -@@ -20,11 +20,6 @@ - Please email any bugs, comments, and/or additions to this file to: - bug-gdb@gnu.org */ - --#include --#include --#include -- -- - /* X_string is a null-terminated string in the X charset whose - elements are as follows. X should be the name the `set charset' - command uses for the character set, in lower-case, with any -@@ -54,6 +49,21 @@ char iso_8859_1_string[NUM_CHARS]; - char ebcdic_us_string[NUM_CHARS]; - char ibm1047_string[NUM_CHARS]; - -+/* We make a phony wchar_t and then pretend that this platform uses -+ UCS-4 (or UCS-2, depending on the size -- same difference for the -+ purposes of this test). */ -+typedef unsigned int wchar_t; -+wchar_t ucs_4_string[NUM_CHARS]; -+ -+/* We also define a couple phony types for testing the u'' and U'' -+ support. It is ok if these have the wrong size on some platforms -+ -- the test case will skip the tests in that case. */ -+typedef unsigned short char16_t; -+typedef unsigned int char32_t; -+ -+/* Make sure to use the typedefs. */ -+char16_t uvar; -+char32_t Uvar; - - void - init_string (char string[], -@@ -62,7 +72,10 @@ init_string (char string[], - char line_feed, char carriage_return, char horizontal_tab, - char vertical_tab, char cent, char misc_ctrl) - { -- memset (string, x, NUM_CHARS); -+ int i; -+ -+ for (i = 0; i < NUM_CHARS; ++i) -+ string[i] = x; - string[0] = alert; - string[1] = backspace; - string[2] = form_feed; -@@ -85,13 +98,21 @@ fill_run (char string[], int start, int len, int first) - } - - -+void -+init_ucs4 () -+{ -+ int i; -+ -+ for (i = 0; i < NUM_CHARS; ++i) -+ ucs_4_string[i] = iso_8859_1_string[i] & 0xff; -+} -+ - int main () - { - #ifdef usestubs - set_debug_traps(); - breakpoint(); - #endif -- (void) malloc (1); - /* Initialize ascii_string. */ - init_string (ascii_string, - 120, -@@ -146,5 +167,7 @@ int main () - /* The digits, at least, are contiguous. */ - fill_run (ibm1047_string, 59, 10, 240); - -- puts ("All set!"); /* all strings initialized */ -+ init_ucs4 (); -+ -+ return 0; /* all strings initialized */ - } -diff --git a/gdb/testsuite/gdb.base/charset.exp b/gdb/testsuite/gdb.base/charset.exp -index fa26521..93f66c0 100644 ---- a/gdb/testsuite/gdb.base/charset.exp -+++ b/gdb/testsuite/gdb.base/charset.exp -@@ -47,13 +47,7 @@ proc parse_show_charset_output {testname} { - global gdb_prompt - - gdb_expect { -- -re "The current host and target character set is `(.*)'\\.\[\r\n\]+$gdb_prompt $" { -- set host_charset $expect_out(1,string) -- set target_charset $expect_out(1,string) -- set retlist [list $host_charset $target_charset] -- pass $testname -- } -- -re "The current host character set is `(.*)'\\.\[\r\n\]+The current target character set is `(.*)'\\.\[\r\n\]+$gdb_prompt $" { -+ -re "The host character set is \"(.*)\"\\.\[\r\n\]+The target character set is \"(.*)\"\\.\[\r\n\]+The target wide character set is \"(.*)\"\\.\[\r\n\]+$gdb_prompt $" { - set host_charset $expect_out(1,string) - set target_charset $expect_out(2,string) - set retlist [list $host_charset $target_charset] -@@ -81,79 +75,35 @@ proc parse_show_charset_output {testname} { - } - - --# Try the various `show charset' commands. These are all aliases of each --# other; `show target-charset' and `show host-charset' actually print --# both the host and target charsets. -+# Try the various `show charset' commands. - - send_gdb "show charset\n" - set show_charset [parse_show_charset_output "show charset"] - - send_gdb "show target-charset\n" --set show_target_charset [parse_show_charset_output "show target-charset"] -+set show_target_charset \ -+ [lindex [parse_show_charset_output "show target-charset"] 0] - --if {[lsearch $show_charset $show_target_charset] >= 0} { -+if {[lsearch -exact $show_charset $show_target_charset] >= 0} { - pass "check `show target-charset' against `show charset'" - } else { - fail "check `show target-charset' against `show charset'" - } - - send_gdb "show host-charset\n" --set show_host_charset [parse_show_charset_output "show host-charset"] -+set show_host_charset \ -+ [lindex [parse_show_charset_output "show host-charset"] 0] - --if {[lsearch $show_charset $show_host_charset] >= 0} { -+if {[lsearch -exact $show_charset $show_host_charset] >= 0} { - pass "check `show host-charset' against `show charset'" - } else { - fail "check `show host-charset' against `show charset'" - } - -- --# Get the list of supported (host) charsets as possible completions. --send_gdb "set charset \t\t" -- --# Check that we can at least use ASCII as a host character set. --sleep 1 --gdb_expect { -- -re "^set charset .*\r\nASCII.*\r\n$gdb_prompt set charset " { -- # We got the output that we wanted, including ASCII as possible -- # charset. Send a newline to get us back to the prompt. This will -- # also generate an error message. Let's not check here that the error -- # message makes sense, we do that below, as a separate testcase. -- send_gdb "\n" -- gdb_expect { -- -re ".*Requires an argument.*$gdb_prompt $" { -- pass "get valid character sets" -- } -- -re ".*$gdb_prompt $" { -- send_gdb "\n" -- gdb_expect { -- -re ".*$gdb_prompt $" { -- fail "get valid character sets" -- } -- } -- } -- timeout { -- fail "(timeout) get valid character sets" -- } -- } -- } -- -re ".*$gdb_prompt $" { -- # We got some output that ended with a regular prompt -- fail "get valid character sets" -- } -- -re ".*$gdb_prompt set charset.*$" { -- # We got some other output, send a cntrl-c to gdb to get us back -- # to the prompt. -- send_gdb "\003" -- fail "get valid character sets" -- } -- timeout { -- fail "get valid character sets (timeout)" -- } --} -- - # Try a malformed `set charset'. -+# Also check that we can at least use ASCII as a host character set. - gdb_test "set charset" \ -- "Requires an argument. Valid arguments are.*" \ -+ "Requires an argument. Valid arguments are.* ASCII,.*" \ - "try malformed `set charset'" - - # Try using `set host-charset' on an invalid character set. -@@ -244,8 +194,10 @@ gdb_expect { - } - } - --# Make sure that GDB supports every host/target charset combination. --foreach host_charset [all_charset_names] { -+# We don't want to test all the charset names here, since that would -+# be too many combinations. We we pick a subset. -+set charset_subset {ASCII ISO-8859-1 EBCDIC-US IBM1047} -+foreach host_charset $charset_subset { - if {[valid_host_charset $host_charset]} { - - set testname "try `set host-charset $host_charset'" -@@ -279,7 +231,7 @@ foreach host_charset [all_charset_names] { - - # Now try setting every possible target character set, - # given that host charset. -- foreach target_charset [all_charset_names] { -+ foreach target_charset $charset_subset { - set testname "try `set target-charset $target_charset'" - send_gdb "set target-charset $target_charset\n" - gdb_expect { -@@ -404,23 +356,42 @@ gdb_expect { - } - - -+# We only try the wide character tests on machines where the wchar_t -+# typedef in the test case has the right size. -+set wchar_size [get_sizeof wchar_t 99] -+set wchar_ok 0 -+if {$wchar_size == 2} { -+ lappend charset_subset UCS-2 -+ set wchar_ok 1 -+} elseif {$wchar_size == 4} { -+ lappend charset_subset UCS-4 -+ set wchar_ok 1 -+} -+ - gdb_test "set host-charset ASCII" "" --foreach target_charset [all_charset_names] { -- send_gdb "set target-charset $target_charset\n" -+foreach target_charset $charset_subset { -+ if {$target_charset == "UCS-4" || $target_charset == "UCS-2"} { -+ set param target-wide-charset -+ set L L -+ } else { -+ set param target-charset -+ set L "" -+ } -+ send_gdb "set $param $target_charset\n" - gdb_expect { - -re "$gdb_prompt $" { -- pass "set target-charset $target_charset" -+ pass "set $param $target_charset" - } - timeout { -- fail "set target-charset $target_charset (timeout)" -+ fail "set $param $target_charset (timeout)" - } - } - - # Try printing the null character. There seems to be a bug in - # gdb_test that requires us to use gdb_expect here. -- send_gdb "print '\\0'\n" -+ send_gdb "print $L'\\0'\n" - gdb_expect { -- -re "\\\$${decimal} = 0 '\\\\0'\[\r\n\]+$gdb_prompt $" { -+ -re "\\\$${decimal} = 0 $L'\\\\0'\[\r\n\]+$gdb_prompt $" { - pass "print the null character in ${target_charset}" - } - -re "$gdb_prompt $" { -@@ -435,8 +406,14 @@ foreach target_charset [all_charset_names] { - # a string in $target_charset. The variable's name is the - # character set's name, in lower-case, with all non-identifier - # characters replaced with '_', with "_string" stuck on the end. -- set var_name [string tolower "${target_charset}_string"] -- regsub -all -- "\[^a-z0-9_\]" $var_name "_" var_name -+ if {$target_charset == "UCS-2"} { -+ # We still use the ucs_4_string variable -- but the size is -+ # correct for UCS-2. -+ set var_name ucs_4_string -+ } else { -+ set var_name [string tolower "${target_charset}_string"] -+ regsub -all -- "\[^a-z0-9_\]" $var_name "_" var_name -+ } - - # Compute a regexp matching the results we expect. This is static, - # but it's easier than writing it out. -@@ -444,12 +421,12 @@ foreach target_charset [all_charset_names] { - set uppercase "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - set lowercase "abcdefghijklmnopqrstuvwxyz" - set digits "0123456789" -- set octal_escape "\\\\\[0-9\]\[0-9\]\[0-9\]" -+ set octal_escape "\\\\\[0-9\]+" - - send_gdb "print $var_name\n" - # ${escapes}${uppercase}${lowercase}${digits}${octal}${octal} - gdb_expect { -- -re ".* = \"(\\\\a|x)(\\\\b|x)(\\\\f|x)(\\\\n|x)(\\\\r|x)(\\\\t|x)(\\\\v|x)${uppercase}${lowercase}${digits}(\\\\\[0-9\]\[0-9\]\[0-9\]|x)(\\\\\[0-9\]\[0-9\]\[0-9\]|x).*\"\[\r\n\]+$gdb_prompt $" { -+ -re ".* = $L\"(\\\\a|x)(\\\\b|x)(\\\\f|x)(\\\\n|x)(\\\\r|x)(\\\\t|x)(\\\\v|x)${uppercase}${lowercase}${digits}(${octal_escape}|x)+\"\[\r\n\]+$gdb_prompt $" { - pass "print string in $target_charset" - } - -re "$gdb_prompt $" { -@@ -461,22 +438,22 @@ foreach target_charset [all_charset_names] { - } - - # Try entering a character literal, and see if it comes back unchanged. -- gdb_test "print 'A'" \ -- " = \[0-9-\]+ 'A'" \ -+ gdb_test "print $L'A'" \ -+ " = \[0-9-\]+ $L'A'" \ - "parse character literal in ${target_charset}" - - # Check that the character literal was encoded correctly. -- gdb_test "print 'A' == $var_name\[7\]" \ -+ gdb_test "print $L'A' == $var_name\[7\]" \ - " = 1" \ - "check value of parsed character literal in ${target_charset}" - - # Try entering a string literal, and see if it comes back unchanged. -- gdb_test "print \"abcdefABCDEF012345\"" \ -- " = \"abcdefABCDEF012345\"" \ -+ gdb_test "print $L\"abcdefABCDEF012345\"" \ -+ " = $L\"abcdefABCDEF012345\"" \ - "parse string literal in ${target_charset}" - - # Check that the string literal was encoded correctly. -- gdb_test "print \"q\"\[0\] == $var_name\[49\]" \ -+ gdb_test "print $L\"q\"\[0\] == $var_name\[49\]" \ - " = 1" \ - "check value of parsed string literal in ${target_charset}" - -@@ -509,7 +486,7 @@ foreach target_charset [all_charset_names] { - send_gdb "print $var_name\[$i\]\n" - set have_escape 1 - gdb_expect { -- -re "= \[0-9-\]+ '\\\\${escape}'\[\r\n\]+$gdb_prompt $" { -+ -re "= \[0-9-\]+ $L'\\\\${escape}'\[\r\n\]+$gdb_prompt $" { - pass "try printing '\\${escape}' in ${target_charset}" - } - -re "= \[0-9-\]+ 'x'\[\r\n\]+$gdb_prompt $" { -@@ -527,12 +504,12 @@ foreach target_charset [all_charset_names] { - if {$have_escape} { - - # Try parsing a backslash escape in a character literal. -- gdb_test "print '\\${escape}' == $var_name\[$i\]" \ -+ gdb_test "print $L'\\${escape}' == $var_name\[$i\]" \ - " = 1" \ - "check value of '\\${escape}' in ${target_charset}" - - # Try parsing a backslash escape in a string literal. -- gdb_test "print \"\\${escape}\"\[0\] == $var_name\[$i\]" \ -+ gdb_test "print $L\"\\${escape}\"\[0\] == $var_name\[$i\]" \ - " = 1" \ - "check value of \"\\${escape}\" in ${target_charset}" - } -@@ -540,10 +517,73 @@ foreach target_charset [all_charset_names] { - - # Try printing a character escape that doesn't exist. We should - # get the unescaped character, in the target character set. -- gdb_test "print '\\q'" " = \[0-9-\]+ 'q'" \ -+ gdb_test "print $L'\\q'" " = \[0-9-\]+ $L'q'" \ - "print escape that doesn't exist in $target_charset" -- gdb_test "print '\\q' == $var_name\[49\]" " = 1" \ -+ gdb_test "print $L'\\q' == $var_name\[49\]" " = 1" \ - "check value of escape that doesn't exist in $target_charset" - } - -+# Reset the target charset. -+gdb_test "set target-charset UTF-8" "" -+ -+# \242 is not a valid UTF-8 character. -+gdb_test "print \"\\242\"" " = \"\\\\242\"" \ -+ "non-representable target character" -+ -+gdb_test "print '\\x'" "\\\\x escape without a following hex digit." -+gdb_test "print '\\u'" "\\\\u escape without a following hex digit." -+gdb_test "print '\\9'" " = \[0-9\]+ '9'" -+ -+# Tests for wide- or unicode- strings. L is the prefix letter to use, -+# either "L" (for wide strings), "u" (for UCS-2), or "U" (for UCS-4). -+# NAME is used in the test names and should be related to the prefix -+# letter in some easy-to-undestand way. -+proc test_wide_or_unicode {L name} { -+ gdb_test "print $L\"ab\" $L\"c\"" " = $L\"abc\"" \ -+ "basic $name string concatenation" -+ gdb_test "print $L\"ab\" \"c\"" " = $L\"abc\"" \ -+ "narrow and $name string concatenation" -+ gdb_test "print \"ab\" $L\"c\"" " = $L\"abc\"" \ -+ "$name and narrow string concatenation" -+ gdb_test "print $L\"\\xe\" $L\"c\"" " = $L\"\\\\16c\"" \ -+ "$name string concatenation with escape" -+ gdb_test "print $L\"\" \"abcdef\" \"g\"" \ -+ "$L\"abcdefg\"" \ -+ "concatenate three strings with empty $name string" -+ -+ gdb_test "print $L'a'" "= \[0-9\]+ $L'a'" \ -+ "basic $name character" -+} -+ -+if {$wchar_ok} { -+ test_wide_or_unicode L wide -+} -+ -+set ucs2_ok [expr {[get_sizeof char16_t 99] == 2}] -+if {$ucs2_ok} { -+ test_wide_or_unicode u UCS-2 -+} -+ -+set ucs4_ok [expr {[get_sizeof char32_t 99] == 4}] -+if {$ucs4_ok} { -+ test_wide_or_unicode U UCS-4 -+} -+ -+# Test an invalid string combination. -+proc test_combination {L1 name1 L2 name2} { -+ gdb_test "print $L1\"abc\" $L2\"def\"" \ -+ "Undefined string concatenation." \ -+ "undefined concatenation of $name1 and $name2" -+} -+ -+if {$wchar_ok && $ucs2_ok} { -+ test_combination L wide u UCS-2 -+} -+if {$wchar_ok && $ucs4_ok} { -+ test_combination L wide U UCS-4 -+} -+if {$ucs2_ok && $ucs4_ok} { -+ test_combination u UCS-2 U UCS-4 -+} -+ - gdb_exit -diff --git a/gdb/testsuite/gdb.base/constvars.exp b/gdb/testsuite/gdb.base/constvars.exp -index d53a826..6d1bd12 100644 ---- a/gdb/testsuite/gdb.base/constvars.exp -+++ b/gdb/testsuite/gdb.base/constvars.exp -@@ -161,7 +161,7 @@ proc do_constvar_tests {} { - gdb_test "print laconic" " = 65 'A'" - local_compiler_xfail_check - gdb_test "ptype laconic" "type = const char" -- gdb_test "print laggard" " = 1 '.001'" -+ gdb_test "print laggard" " = 1 '.1'" - local_compiler_xfail_check - gdb_test "ptype laggard" "type = const unsigned char" - gdb_test "print lagoon" " = 2" -@@ -209,7 +209,7 @@ proc do_constvar_tests {} { - gdb_test "print *lewd" " = 65 'A'" - local_compiler_xfail_check - gdb_test "ptype lewd" "type = const char \\* const" -- gdb_test "print *lexicographer" " = 1 '.001'" -+ gdb_test "print *lexicographer" " = 1 '.1'" - local_compiler_xfail_check - gdb_test "ptype lexicographer" "type = const unsigned char \\* const" - gdb_test "print *lexicon" " = 2" -@@ -233,7 +233,7 @@ proc do_constvar_tests {} { - gdb_test "print *languish" " = 65 'A'" - local_compiler_xfail_check - gdb_test "ptype languish" "type = const char \\*" -- gdb_test "print *languor" " = 1 '.001'" -+ gdb_test "print *languor" " = 1 '.1'" - local_compiler_xfail_check - gdb_test "ptype languor" "type = const unsigned char \\*" - gdb_test "print *lank" " = 2" -diff --git a/gdb/testsuite/gdb.base/display.exp b/gdb/testsuite/gdb.base/display.exp -index d62e8bf..aa65373 100644 ---- a/gdb/testsuite/gdb.base/display.exp -+++ b/gdb/testsuite/gdb.base/display.exp -@@ -180,8 +180,12 @@ gdb_test "printf \"%p\\n\", 1" "0x1" - - # play with "print", too - # --gdb_test "print/r j" ".*Undefined output format.*" --gdb_test "print j" ".*" "debug test output" -+gdb_test "print/z j" ".*Undefined output format.*" -+gdb_test "print/d j" " = 0\[\\r\\n\]+" "debug test output 1" -+gdb_test "print/r j" " = 0\[\\r\\n\]+" "debug test output 1a" -+gdb_test "print/x j" " = 0x0\[\\r\\n\]+" "debug test output 2" -+gdb_test "print/r j" " = 0x0\[\\r\\n\]+" "debug test output 2a" -+gdb_test "print j" " = 0\[\\r\\n\]+" "debug test output 3" - - # x/0 j doesn't produce any output and terminates PA64 process when testing - if [istarget "hppa2.0w-hp-hpux11*"] { -diff --git a/gdb/testsuite/gdb.base/ending-run.exp b/gdb/testsuite/gdb.base/ending-run.exp -index 42b4577..cf33602 100644 ---- a/gdb/testsuite/gdb.base/ending-run.exp -+++ b/gdb/testsuite/gdb.base/ending-run.exp -@@ -69,7 +69,7 @@ gdb_expect { - gdb_test "b ending-run.c:1" ".*Breakpoint.*4.*" - gdb_test "b ending-run.c:14" ".*Note.*also.*Breakpoint.*5.*" "b ending-run.c:14, two" - gdb_test "cle ending-run.c:14" \ -- ".*Deleted breakpoints 4 5.*" "Cleared 2 by line" -+ ".*Deleted breakpoint 5.*" "Cleared 2 by line" - - send_gdb "inf line ending-run.c:14\n" - gdb_expect { -@@ -77,7 +77,7 @@ gdb_expect { - set line_nine $expect_out(1,string) - gdb_test "b ending-run.c:14" ".*Breakpoint 6.*ending-run.c, line 14.*" - gdb_test "b *$line_nine" ".*Note.*also.*Breakpoint 7.*" "Breakpoint 7 at *ending-run.c:14" -- gdb_test "cle" ".*Deleted breakpoints 6 7.*" "Clear 2 by default" -+ gdb_test "cle" ".*Deleted breakpoints 4 6 7.*" "Clear 2 by default" - } - -re ".*$gdb_prompt $" { - fail "need to fix test for new compile outcome" diff --git a/gdb/testsuite/gdb.base/help.exp b/gdb/testsuite/gdb.base/help.exp -index 4618a2c..40830c3 100644 +index 5fc680b..d271c81 100644 --- a/gdb/testsuite/gdb.base/help.exp +++ b/gdb/testsuite/gdb.base/help.exp -@@ -603,7 +603,7 @@ gdb_test "help stepi" "Step one instruction exactly\.\[\r\n\]+Argument N means d +@@ -605,7 +605,7 @@ gdb_test "help stepi" "Step one instruction exactly\.\[\r\n\]+Argument N means d gdb_test "help signal" "Continue program giving it signal.*" "help signal" # test help source # vxgdb reads .vxgdbinit @@ -36641,68 +19734,11 @@ index 0000000..0c75b84 + fail $test + } +} -diff --git a/gdb/testsuite/gdb.base/long_long.exp b/gdb/testsuite/gdb.base/long_long.exp -index d0ad5ba..5189324 100644 ---- a/gdb/testsuite/gdb.base/long_long.exp -+++ b/gdb/testsuite/gdb.base/long_long.exp -@@ -210,7 +210,7 @@ gdb_test_char "p/o *(char *)c" "01" - gdb_test_char "p/t *(char *)c" "1" - gdb_test_char "p/a *(char *)c" "0x1( <.*>)?" - gdb_test_char "p/f *(char *)c" "1" --gdb_test_char "p/c *(char *)c" "1 '.001'" -+gdb_test_char "p/c *(char *)c" "1 '.1'" - - gdb_test_short "p/x *(short *)s" "" "0x123" "" - gdb_test_short "p/d *(short *)s" "" "291" "" -@@ -257,7 +257,7 @@ gdb_test "x/u w" "19088743" - gdb_test "x/o w" "0110642547" - gdb_test "x/t w" "00000001001000110100010101100111" - gdb_test_xptr "x/a" { b "" } { h "" } { w "0x1234567" } { g "0x123456789abcdef" } --gdb_test "x/c b" "1 '.001'" -+gdb_test "x/c b" "1 '.1'" - if { $sizeof_double == 8 || $sizeof_long_double == 8 } { - gdb_test "x/f &val.oct" "-5.9822653797615723e-120" - } else { -@@ -273,7 +273,7 @@ gdb_test "x/2u g" "81985529216486895.*12046818088235383159" - gdb_test "x/2o g" "04432126361152746757.*01234567123456701234567" - gdb_test "x/2t g" "0000000100100011010001010110011110001001101010111100110111101111.*1010011100101110111001010011100101110111000001010011100101110111" - gdb_test_xptr "x/2a" { b "" } { h "" } { w "0x1234567.*0xa72ee539" } { g "0x123456789abcdef.*0xa72ee53977053977" } --gdb_test "x/2c b" "1 '.001'.*-89 '.'" -+gdb_test "x/2c b" "1 '.1'.*-89 '.\[0-9\]*'" - if { $sizeof_double == 8 || $sizeof_long_double == 8 } { - gdb_test "x/2f &val.oct" "-5.9822653797615723e-120.*-5.9041889495880968e-100" - } else { -@@ -288,7 +288,7 @@ gdb_test "x/2bu b" "1.*167" - gdb_test "x/2bo b" "01.*0247" - gdb_test "x/2bt b" "00000001.*10100111" - gdb_test_ptr "x/2ba b" "" "" "0x1.*0xffffffa7" "0x1.*0xffffffffffffffa7" --gdb_test "x/2bc b" "1 '.001'.*-89 '.'" -+gdb_test "x/2bc b" "1 '.1'.*-89 '.\[0-9\]*'" - gdb_test "x/2bf b" "1.*-89" - - gdb_test "x/2hx h" "0x0123.*0xa72e" -@@ -315,7 +315,7 @@ gdb_test "x/2gu g" "81985529216486895.*12046818088235383159" - gdb_test "x/2go g" "04432126361152746757.*01234567123456701234567" - gdb_test "x/2gt g" "0000000100100011010001010110011110001001101010111100110111101111.*1010011100101110111001010011100101110111000001010011100101110111" - gdb_test_ptr "x/2ga g" "" "" "0x89abcdef.*0x77053977" "0x123456789abcdef.*0xa72ee53977053977" --gdb_test "x/2gc g" "-17 '.'.*119 'w'" -+gdb_test "x/2gc g" "-17 '.\[0-9\]*'.*119 'w'" - gdb_test "x/2gf g" "3.5127005640885037e-303.*-5.9822653797615723e-120" - - gdb_exit diff --git a/gdb/testsuite/gdb.base/macscp.exp b/gdb/testsuite/gdb.base/macscp.exp -index 7086e90..dd196d7 100644 +index 55c4d31..df25d3c 100644 --- a/gdb/testsuite/gdb.base/macscp.exp +++ b/gdb/testsuite/gdb.base/macscp.exp -@@ -26,13 +26,21 @@ set testfile "macscp" - set objfile ${objdir}/${subdir}/${testfile}.o - set binfile ${objdir}/${subdir}/${testfile} - --set options { debug } -+set options { debug additional_flags=-DFROM_COMMANDLINE=ARG} - - get_compiler_info ${binfile} - if [test_compiler_info gcc*] { +@@ -33,6 +33,14 @@ if [test_compiler_info gcc*] { lappend options additional_flags=-g3 } @@ -36710,470 +19746,31 @@ index 7086e90..dd196d7 100644 +if {[find_gcc] == "gcc" && [file executable "/usr/bin/gcc"]} { + set result [catch "exec which gcc" output] + if {$result == 0 && [string first "/ccache/" $output] >= -1} { -+ lappend options "compiler=/usr/bin/gcc" ++ lappend options "compiler=/usr/bin/gcc" + } +} + # Generate the intermediate object file. This is required by Darwin to # have access to the .debug_macinfo section. if {[gdb_compile "${srcdir}/${subdir}/macscp1.c" "${objfile}" \ -@@ -79,11 +87,15 @@ proc info_macro {macro} { +diff --git a/gdb/testsuite/gdb.base/radix.exp b/gdb/testsuite/gdb.base/radix.exp +index 750fd23..dfdb929 100644 +--- a/gdb/testsuite/gdb.base/radix.exp ++++ b/gdb/testsuite/gdb.base/radix.exp +@@ -162,13 +162,6 @@ gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12\." \ + "Reset radices" - if {$debug_me} {exp_internal 1} - gdb_expect { -- -re "Defined at \[^\r\n\]*(${filepat}):${decimal}\[\r\n\]" { -+ -re "Defined at \[^\r\n\]*(${filepat}):(${decimal})\[\r\n\]" { - # `location' and `definition' should be empty when we see - # this message. - if {[llength $location] == 0 && [llength $definition] == 0} { - set location $expect_out(1,string) -+ # Definitions from gcc command-line get suffixed by the lineno. -+ if {$expect_out(2,string) == "0" } { -+ set location "$location:$expect_out(2,string)" -+ } - exp_continue - } else { - # Exit this expect loop, with a result indicating failure. -@@ -198,6 +210,8 @@ proc list_and_check_macro {func macro expected} { - } - - -+list_and_check_macro main FROM_COMMANDLINE "macscp1.c:0 ARG" -+ - if {[list_and_check_macro main WHERE {macscp1.c {before macscp1_3}}]} { - return 0 - } -diff --git a/gdb/testsuite/gdb.base/multi-forks.exp b/gdb/testsuite/gdb.base/multi-forks.exp -index ac56fb0..f853180 100644 ---- a/gdb/testsuite/gdb.base/multi-forks.exp -+++ b/gdb/testsuite/gdb.base/multi-forks.exp -@@ -51,7 +51,62 @@ global gdb_prompt - - # This is a test of gdb's ability to follow the parent, child or both - # parent and child of multiple Unix fork() system calls. --# -+ -+set exit_bp_loc [gdb_get_line_number "Set exit breakpoint here."] -+ -+# Insert a breakpoint at the location provided by the exit_bp_loc global -+# and resume the execution until hitting that breakpoint. We also make -+# sure to consume all the expected output from all processes as well, -+# to make sure it doesn't cause trouble during a subsequent test. -+ -+proc continue_to_exit_bp_loc {} { -+ global exit_bp_loc decimal gdb_prompt -+ -+ gdb_breakpoint $exit_bp_loc -+ -+ send_gdb "continue\n" -+ -+ # The output from the child processes can be interleaved arbitrarily -+ # with the output from GDB and the parent process. If we don't -+ # consume it all now, it can confuse later interactions. -+ set seen_done 0 -+ set seen_break 0 -+ set seen_prompt 0 -+ set seen_timeout 0 -+ while { ($seen_done < 16 || ! $seen_prompt) && ! $seen_timeout } { -+ # We don't know what order the interesting things will arrive in. -+ # Using a pattern of the form 'x|y|z' instead of -re x ... -re y -+ # ... -re z ensures that expect always chooses the match that -+ # occurs leftmost in the input, and not the pattern appearing -+ # first in the script that occurs anywhere in the input, so that -+ # we don't skip anything. -+ gdb_expect { -+ -re "($decimal done)|(Breakpoint)|($gdb_prompt)" { -+ if {[info exists expect_out(1,string)]} { -+ incr seen_done -+ } elseif {[info exists expect_out(2,string)]} { -+ set seen_break 1 -+ } elseif {[info exists expect_out(3,string)]} { -+ set seen_prompt 1 -+ } -+ array unset expect_out -+ } -+ timeout { set seen_timeout 1 } -+ } -+ } -+ -+ if { $seen_timeout } { -+ fail "run to exit 2 (timeout)" -+ } elseif { ! $seen_prompt } { -+ fail "run to exit 2 (no prompt)" -+ } elseif { ! $seen_break } { -+ fail "run to exit 2 (no breakpoint hit)" -+ } elseif { $seen_done != 16 } { -+ fail "run to exit 2 (missing done messages)" -+ } else { -+ pass "run to exit 2" -+ } -+} - - # The inferior program builds a tree of processes by executing a loop - # four times, calling fork at each iteration. Thus, at each -@@ -66,69 +121,17 @@ global gdb_prompt - # The result should be that each of the 4 forks returns zero. - - runto_main --set exit_bp_loc [gdb_get_line_number "Set exit breakpoint here."] --gdb_test "break $exit_bp_loc" "Breakpoint.* at .*" "Break at exit" --gdb_test "set follow child" "" "" +-gdb_test "set input-radix 0" \ +- "Nonsense input radix ``decimal 0''; input radix unchanged\\." \ +- "Reject input-radix 0" +-gdb_test "show input-radix" \ +- "Default input radix for entering numbers is 10\\." \ +- "Input radix unchanged after rejecting 0" - --send_gdb "continue\n" --gdb_expect { -- -re ".*Break.* main .*$gdb_prompt.*$" {} -- -re ".*$gdb_prompt $" {fail "run to exit 1"} -- default {fail "run to exit 1 (timeout)"} --} -+gdb_test "set follow child" -+continue_to_exit_bp_loc - - gdb_test "print pids" "\\$.* = \\{0, 0, 0, 0\\}.*" "follow child, print pids" - - # Now set gdb to follow the parent. - # Result should be that none of the 4 forks returns zero. - --delete_breakpoints - runto_main --gdb_test "break $exit_bp_loc" "Breakpoint.* at .*" "Break at exit" - gdb_test "set follow parent" "" "" -- --send_gdb "continue\n" -- --# The output from the child processes can be interleaved arbitrarily --# with the output from GDB and the parent process. If we don't --# consume it all now, it can confuse later interactions. --set seen_done 0 --set seen_break 0 --set seen_prompt 0 --set seen_timeout 0 --while { ($seen_done < 16 || ! $seen_prompt) && ! $seen_timeout } { -- # We don't know what order the interesting things will arrive in. -- # Using a pattern of the form 'x|y|z' instead of -re x ... -re y -- # ... -re z ensures that expect always chooses the match that -- # occurs leftmost in the input, and not the pattern appearing -- # first in the script that occurs anywhere in the input, so that -- # we don't skip anything. -- gdb_expect { -- -re "($decimal done)|(Breakpoint)|($gdb_prompt)" { -- if {[info exists expect_out(1,string)]} { -- incr seen_done -- } elseif {[info exists expect_out(2,string)]} { -- set seen_break 1 -- } elseif {[info exists expect_out(3,string)]} { -- set seen_prompt 1 -- } -- array unset expect_out -- } -- timeout { set seen_timeout 1 } -- } --} -- --if { $seen_timeout } { -- fail "run to exit 2 (timeout)" --} elseif { ! $seen_prompt } { -- fail "run to exit 2 (no prompt)" --} elseif { ! $seen_break } { -- fail "run to exit 2 (no breakpoint hit)" --} elseif { $seen_done != 16 } { -- fail "run to exit 2 (missing done messages)" --} else { -- pass "run to exit 2" --} -+continue_to_exit_bp_loc - - gdb_test "print pids\[0\]==0 || pids\[1\]==0 || pids\[2\]==0 || pids\[3\]==0" \ - " = 0" "follow parent, print pids" -@@ -138,7 +141,7 @@ gdb_test "print pids\[0\]==0 || pids\[1\]==0 || pids\[2\]==0 || pids\[3\]==0" \ - # - - runto_main --gdb_test "break $exit_bp_loc" "Breakpoint.* at .*" "" -+gdb_breakpoint $exit_bp_loc - - gdb_test "help set detach-on-fork" "whether gdb will detach the child.*" \ - "help set detach" -diff --git a/gdb/testsuite/gdb.base/pointers.exp b/gdb/testsuite/gdb.base/pointers.exp -index 91838a2..2d0a70e 100644 ---- a/gdb/testsuite/gdb.base/pointers.exp -+++ b/gdb/testsuite/gdb.base/pointers.exp -@@ -389,7 +389,7 @@ gdb_expect { - - send_gdb "print *pUC\n" - gdb_expect { -- -re ".\[0-9\]* = 21 \'.025\'.*$gdb_prompt $" { -+ -re ".\[0-9\]* = 21 \'.25\'.*$gdb_prompt $" { - pass "print value of *pUC" - } - -re ".*$gdb_prompt $" { fail "print value of *pUC" } -diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp -index 1e17da4..b6f8a1f 100644 ---- a/gdb/testsuite/gdb.base/printcmds.exp -+++ b/gdb/testsuite/gdb.base/printcmds.exp -@@ -137,12 +137,12 @@ proc test_print_all_chars {} { - global gdb_prompt - - gdb_test "p ctable1\[0\]" " = 0 '\\\\0'" -- gdb_test "p ctable1\[1\]" " = 1 '\\\\001'" -- gdb_test "p ctable1\[2\]" " = 2 '\\\\002'" -- gdb_test "p ctable1\[3\]" " = 3 '\\\\003'" -- gdb_test "p ctable1\[4\]" " = 4 '\\\\004'" -- gdb_test "p ctable1\[5\]" " = 5 '\\\\005'" -- gdb_test "p ctable1\[6\]" " = 6 '\\\\006'" -+ gdb_test "p ctable1\[1\]" " = 1 '\\\\1'" -+ gdb_test "p ctable1\[2\]" " = 2 '\\\\2'" -+ gdb_test "p ctable1\[3\]" " = 3 '\\\\3'" -+ gdb_test "p ctable1\[4\]" " = 4 '\\\\4'" -+ gdb_test "p ctable1\[5\]" " = 5 '\\\\5'" -+ gdb_test "p ctable1\[6\]" " = 6 '\\\\6'" - gdb_test "p ctable1\[7\]" " = 7 '\\\\a'" - gdb_test "p ctable1\[8\]" " = 8 '\\\\b'" - gdb_test "p ctable1\[9\]" " = 9 '\\\\t'" -@@ -150,24 +150,24 @@ proc test_print_all_chars {} { - gdb_test "p ctable1\[11\]" " = 11 '\\\\v'" - gdb_test "p ctable1\[12\]" " = 12 '\\\\f'" - gdb_test "p ctable1\[13\]" " = 13 '\\\\r'" -- gdb_test "p ctable1\[14\]" " = 14 '\\\\016'" -- gdb_test "p ctable1\[15\]" " = 15 '\\\\017'" -- gdb_test "p ctable1\[16\]" " = 16 '\\\\020'" -- gdb_test "p ctable1\[17\]" " = 17 '\\\\021'" -- gdb_test "p ctable1\[18\]" " = 18 '\\\\022'" -- gdb_test "p ctable1\[19\]" " = 19 '\\\\023'" -- gdb_test "p ctable1\[20\]" " = 20 '\\\\024'" -- gdb_test "p ctable1\[21\]" " = 21 '\\\\025'" -- gdb_test "p ctable1\[22\]" " = 22 '\\\\026'" -- gdb_test "p ctable1\[23\]" " = 23 '\\\\027'" -- gdb_test "p ctable1\[24\]" " = 24 '\\\\030'" -- gdb_test "p ctable1\[25\]" " = 25 '\\\\031'" -- gdb_test "p ctable1\[26\]" " = 26 '\\\\032'" -- gdb_test "p ctable1\[27\]" " = 27 '\\\\033'" -- gdb_test "p ctable1\[28\]" " = 28 '\\\\034'" -- gdb_test "p ctable1\[29\]" " = 29 '\\\\035'" -- gdb_test "p ctable1\[30\]" " = 30 '\\\\036'" -- gdb_test "p ctable1\[31\]" " = 31 '\\\\037'" -+ gdb_test "p ctable1\[14\]" " = 14 '\\\\16'" -+ gdb_test "p ctable1\[15\]" " = 15 '\\\\17'" -+ gdb_test "p ctable1\[16\]" " = 16 '\\\\20'" -+ gdb_test "p ctable1\[17\]" " = 17 '\\\\21'" -+ gdb_test "p ctable1\[18\]" " = 18 '\\\\22'" -+ gdb_test "p ctable1\[19\]" " = 19 '\\\\23'" -+ gdb_test "p ctable1\[20\]" " = 20 '\\\\24'" -+ gdb_test "p ctable1\[21\]" " = 21 '\\\\25'" -+ gdb_test "p ctable1\[22\]" " = 22 '\\\\26'" -+ gdb_test "p ctable1\[23\]" " = 23 '\\\\27'" -+ gdb_test "p ctable1\[24\]" " = 24 '\\\\30'" -+ gdb_test "p ctable1\[25\]" " = 25 '\\\\31'" -+ gdb_test "p ctable1\[26\]" " = 26 '\\\\32'" -+ gdb_test "p ctable1\[27\]" " = 27 '\\\\33'" -+ gdb_test "p ctable1\[28\]" " = 28 '\\\\34'" -+ gdb_test "p ctable1\[29\]" " = 29 '\\\\35'" -+ gdb_test "p ctable1\[30\]" " = 30 '\\\\36'" -+ gdb_test "p ctable1\[31\]" " = 31 '\\\\37'" - gdb_test "p ctable1\[32\]" " = 32 ' '" - gdb_test "p ctable1\[33\]" " = 33 '!'" - gdb_test "p ctable1\[34\]" " = 34 '\"'" -@@ -475,13 +475,13 @@ proc test_print_strings {} { - gdb_test "p &ctable1\[0\]" \ - " = \\(unsigned char \\*\\) \"\"" - gdb_test "p &ctable1\[1\]" \ -- " = \\(unsigned char \\*\\) \"\\\\001\\\\002\\\\003\\\\004\\\\005\\\\006\\\\a\\\\b\"..." -+ " = \\(unsigned char \\*\\) \"\\\\1\\\\2\\\\3\\\\4\\\\5\\\\6\\\\a\\\\b\"..." - gdb_test "p &ctable1\[1*8\]" \ -- " = \\(unsigned char \\*\\) \"\\\\b\\\\t\\\\n\\\\v\\\\f\\\\r\\\\016\\\\017\"..." -+ " = \\(unsigned char \\*\\) \"\\\\b\\\\t\\\\n\\\\v\\\\f\\\\r\\\\16\\\\17\"..." - gdb_test "p &ctable1\[2*8\]" \ -- " = \\(unsigned char \\*\\) \"\\\\020\\\\021\\\\022\\\\023\\\\024\\\\025\\\\026\\\\027\"..." -+ " = \\(unsigned char \\*\\) \"\\\\20\\\\21\\\\22\\\\23\\\\24\\\\25\\\\26\\\\27\"..." - gdb_test "p &ctable1\[3*8\]" \ -- " = \\(unsigned char \\*\\) \"\\\\030\\\\031\\\\032\\\\033\\\\034\\\\035\\\\036\\\\037\"..." -+ " = \\(unsigned char \\*\\) \"\\\\30\\\\31\\\\32\\\\33\\\\34\\\\35\\\\36\\\\37\"..." - gdb_test "p &ctable1\[4*8\]" \ - " = \\(unsigned char \\*\\) \" !\\\\\"#\\\$%&'\"..." - gdb_test "p &ctable1\[5*8\]" \ -@@ -622,7 +622,7 @@ proc test_print_string_constants {} { - set timeout 60; - - gdb_test "p \"a string\"" " = \"a string\"" -- gdb_test "p \"embedded \\000 null\"" " = \"embedded \\\\000 null\"" -+ gdb_test "p \"embedded \\000 null\"" " = \"embedded \\\\0 null\"" - gdb_test "p \"abcd\"\[2\]" " = 99 'c'" - gdb_test "p sizeof (\"abcdef\")" " = 7" - gdb_test "ptype \"foo\"" " = char \\\[4\\\]" -diff --git a/gdb/testsuite/gdb.base/return-nodebug.c b/gdb/testsuite/gdb.base/return-nodebug.c -new file mode 100644 -index 0000000..e1211b3 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/return-nodebug.c -@@ -0,0 +1,49 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+ -+static TYPE -+init (void) -+{ -+ return 0; -+} -+ -+static TYPE -+func (void) -+{ -+ return 31; -+} -+ -+static void -+marker (void) -+{ -+} -+ -+int -+main (void) -+{ -+ /* Preinitialize registers to 0 to avoid false PASS by leftover garbage. */ -+ init (); -+ -+ printf ("result=" FORMAT "\n", CAST func ()); -+ -+ /* Cannot `next' with no debug info. */ -+ marker (); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/return-nodebug.exp b/gdb/testsuite/gdb.base/return-nodebug.exp -new file mode 100644 -index 0000000..7d43776 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/return-nodebug.exp -@@ -0,0 +1,61 @@ -+# Copyright (C) 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+proc do_test {type} { -+ set typenospace [string map {{ } -} $type] -+ -+ global pf_prefix -+ set old_prefix $pf_prefix -+ lappend pf_prefix "$typenospace:" -+ -+ if {[runto "func"]} { -+ # Verify that we do not crash when using "return" from a function with -+ # no debugging info. Such function has no `struct symbol'. It may -+ # still have an associated `struct minimal_symbol'. -+ -+ gdb_test "return -1" \ -+ "Return value type not available for selected stack frame\\.\r\nPlease use an explicit cast of the value to return\\." \ -+ "return from function with no debug info without a cast" -+ -+ # Cast of the result to the proper width must be done explicitely. -+ gdb_test "return ($type) -1" "#0 .* main \\(.*" \ -+ "return from function with no debug info with a cast" \ -+ "Make selected stack frame return now\\? \\(y or n\\) " "y" -+ -+ # And if it returned the full width of the result. -+ gdb_test "adv marker" "\r\nresult=-1\r\n.* in marker \\(.*" \ -+ "full width of the returned result" -+ } -+ -+ set pf_prefix $old_prefix -+} -+ -+foreach case {{{signed char} %d (int)} \ -+ {{short} %d (int)} \ -+ {{int} %d} \ -+ {{long} %ld} \ -+ {{long long} %lld}} { -+ set type [lindex $case 0] -+ set format [lindex $case 1] -+ set cast [lindex $case 2] -+ -+ set typeesc [string map {{ } {\ }} $type] -+ set typenospace [string map {{ } -} $type] -+ -+ if {[prepare_for_testing return-nodebug.exp "return-nodebug-$typenospace" "return-nodebug.c" \ -+ [list "additional_flags=-DFORMAT=\"$format\" -DTYPE=$typeesc -DCAST=$cast"]] == 0} { -+ do_test $type -+ } -+} -diff --git a/gdb/testsuite/gdb.base/setvar.exp b/gdb/testsuite/gdb.base/setvar.exp -index 2350a33..3be8424 100644 ---- a/gdb/testsuite/gdb.base/setvar.exp -+++ b/gdb/testsuite/gdb.base/setvar.exp -@@ -121,7 +121,7 @@ proc test_set { args } { - # - - test_set "set variable v_char=0" "print v_char" ".\[0-9\]* = 0 \'.0\'" "set variable char=0" --test_set "set variable v_char=1" "print v_char" ".\[0-9\]* = 1 \'.001\'" "set variable char=1" -+test_set "set variable v_char=1" "print v_char" ".\[0-9\]* = 1 \'.1\'" "set variable char=1" - test_set "set variable v_char=7" "print v_char" ".\[0-9\]* = 7 \'.a\'" "set variable char=7 (Bel)" - test_set "set variable v_char=32" "print v_char" ".\[0-9\]* = 32 \' \'" "set variable char=32 (SPC)" - test_set "set variable v_char=65" "print v_char" ".\[0-9\]* = 65 \'A\'" "set variable char=65 ('A')" -@@ -132,7 +132,7 @@ test_set "set variable v_char=127" "print v_char" ".\[0-9\]* = 127 \'.177\'" - # test "set variable" for type "signed char" - # - test_set "set variable v_char=0" "print v_signed_char" ".\[0-9\]* = 0 \'.0\'" "set variable signed char=0" --test_set "set variable v_signed_char=1" "print v_signed_char" ".\[0-9\]* = 1 \'.001\'" "set variable signed char=1" -+test_set "set variable v_signed_char=1" "print v_signed_char" ".\[0-9\]* = 1 \'.1\'" "set variable signed char=1" - test_set "set variable v_signed_char=7" "print v_signed_char" ".\[0-9\]* = 7 \'.a\'" "set variable signed char=7 (Bel)" - test_set "set variable v_signed_char=32" "print v_signed_char" ".\[0-9\]* = 32 \' \'" "set variable signed char=32 (SPC)" - test_set "set variable v_signed_char=65" "print v_signed_char" ".\[0-9\]* = 65 \'A\'" "set variable signed char=65 ('A')" -@@ -151,7 +151,7 @@ gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \ - # test "set variable" for type "unsigned char" - # - test_set "set variable v_unsigned_char=0" "print v_unsigned_char" ".\[0-9\]* = 0 \'.0\'" "set variable unsigned char=0" --test_set "set variable v_unsigned_char=1" "print v_unsigned_char" ".\[0-9\]* = 1 \'.001\'" "set variable unsigned char=1" -+test_set "set variable v_unsigned_char=1" "print v_unsigned_char" ".\[0-9\]* = 1 \'.1\'" "set variable unsigned char=1" - test_set "set variable v_unsigned_char=7" "print v_unsigned_char" ".\[0-9\]* = 7 \'.a\'" "set variable unsigned char=7 (Bel)" - test_set "set variable v_unsigned_char=32" "print v_unsigned_char" ".\[0-9\]* = 32 \' \'" "set variable unsigned char=32 (SPC)" - test_set "set variable v_unsigned_char=65" "print v_unsigned_char" ".\[0-9\]* = 65 \'A\'" "set variable unsigned char=65 ('A')" -diff --git a/gdb/testsuite/gdb.base/store.exp b/gdb/testsuite/gdb.base/store.exp -index 963bb19..feab6bd 100644 ---- a/gdb/testsuite/gdb.base/store.exp -+++ b/gdb/testsuite/gdb.base/store.exp -@@ -74,7 +74,7 @@ proc check_set { t l r new add } { - "${prefix}; print incremented l, expecting ${add}" - } - --check_set "charest" "-1 .*" "-2 .*" "4 ..004." "2 ..002." -+check_set "charest" "-1 .*" "-2 .*" "4 ..4." "2 ..2." - check_set "short" "-1" "-2" "4" "2" - check_set "int" "-1" "-2" "4" "2" - check_set "long" "-1" "-2" "4" "2" -@@ -102,7 +102,7 @@ proc up_set { t l r new } { - "${prefix}; print new l, expecting ${new}" - } - --up_set "charest" "-1 .*" "-2 .*" "4 ..004." -+up_set "charest" "-1 .*" "-2 .*" "4 ..4." - up_set "short" "-1" "-2" "4" - up_set "int" "-1" "-2" "4" - up_set "long" "-1" "-2" "4" + gdb_test "set input-radix 1" \ + "Nonsense input radix ``decimal 1''; input radix unchanged\\." \ + "Reject input-radix 1" diff --git a/gdb/testsuite/gdb.base/valgrind-attach.c b/gdb/testsuite/gdb.base/valgrind-attach.c new file mode 100644 index 0000000..84b57db @@ -37613,100 +20210,29 @@ index 0000000..5da7378 +gdb_test "p temp1" " = '1' " "second: print temp1" +gdb_test "p temp2" " = '2' " "second: print temp2" +gdb_test "p temp3" " = '3' " "second: print temp3" -diff --git a/gdb/testsuite/gdb.cp/abstract-origin.cc b/gdb/testsuite/gdb.cp/abstract-origin.cc -new file mode 100644 -index 0000000..e2de3fb ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/abstract-origin.cc -@@ -0,0 +1,42 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ */ -+ -+extern void f (int *); -+ -+class A -+{ -+public: -+ A(int i); -+}; -+ -+A::A(int i) -+{ -+ static int *problem = new int(i); -+ f (problem); /* break-here */ -+} -+ -+void f (int *) -+{ -+} -+ -+int -+main (void) -+{ -+ A a(42); -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.cp/abstract-origin.exp b/gdb/testsuite/gdb.cp/abstract-origin.exp -new file mode 100644 -index 0000000..92cc23c ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/abstract-origin.exp -@@ -0,0 +1,40 @@ -+# Copyright 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile abstract-origin -+set srcfile ${testfile}.cc -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+ -+# Get things started. -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+if ![runto_main] { -+ untested abstract-origin -+ return -1 -+} -+ -+gdb_breakpoint [gdb_get_line_number "break-here"] -+gdb_continue_to_breakpoint "break-here" -+ -+# The Bug was: No symbol "problem" in current context. -+gdb_test "p problem" " = \\(int \\*\\) 0x.*" +diff --git a/gdb/testsuite/gdb.cp/cp-relocate.exp b/gdb/testsuite/gdb.cp/cp-relocate.exp +index 4095ccf..03c07d5 100644 +--- a/gdb/testsuite/gdb.cp/cp-relocate.exp ++++ b/gdb/testsuite/gdb.cp/cp-relocate.exp +@@ -30,7 +30,7 @@ proc get_func_address { func } { + global gdb_prompt hex + + set rfunc [string_to_regexp $func] +- gdb_test_multiple "print '${func}'" "get address of ${func}" { ++ gdb_test_multiple "print ${func}" "get address of ${func}" { + -re "\\\$\[0-9\]+ = \\{.*\\} (0|($hex) <${rfunc}>)\[\r\n\]+${gdb_prompt} $" { + # $1 = {int ()} 0x24 + # But if the function is at zero, the name may be omitted. +@@ -130,7 +130,7 @@ gdb_test "add-symbol-file ${binfile} 0 -s ${func1_sec} 0x10000 -s ${func2_sec} 0 + "y" + + # Make sure the function addresses were updated. +-gdb_test "break *'$func1_name'" \ ++gdb_test "break *$func1_name" \ + "Breakpoint $decimal at 0x1....: file .*" +-gdb_test "break *'$func2_name'" \ ++gdb_test "break *$func2_name" \ + "Breakpoint $decimal at 0x2....: file .*" diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.cc b/gdb/testsuite/gdb.cp/cplusfuncs.cc index 7f033d6..1a50a32 100644 --- a/gdb/testsuite/gdb.cp/cplusfuncs.cc @@ -38013,191 +20539,19 @@ index 5e08768..8c8e038 100644 } proc do_tests {} { -diff --git a/gdb/testsuite/gdb.cp/expand-sals.cc b/gdb/testsuite/gdb.cp/expand-sals.cc -new file mode 100644 -index 0000000..6169a05 ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/expand-sals.cc -@@ -0,0 +1,53 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright (C) 2009 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+int -+func () -+{ -+ return 42; /* func-line */ -+} -+ -+volatile int global_x; -+ -+class A -+{ -+public: -+ A () -+ { -+ global_x = func (); /* caller-line */ -+ } -+}; -+ -+/* class B is here just to make the `func' calling line above having multiple -+ instances - multiple locations. Template cannot be used as its instances -+ would have different function names which get discarded by GDB -+ expand_line_sal_maybe. */ -+ -+class B : public A -+{ -+}; -+ -+int -+main (void) -+{ -+ A a; -+ B b; -+ -+ return 0; /* exit-line */ -+} diff --git a/gdb/testsuite/gdb.cp/expand-sals.exp b/gdb/testsuite/gdb.cp/expand-sals.exp -new file mode 100644 -index 0000000..6e04cbf ---- /dev/null +index 3c302c3..cd0496d 100644 +--- a/gdb/testsuite/gdb.cp/expand-sals.exp +++ b/gdb/testsuite/gdb.cp/expand-sals.exp -@@ -0,0 +1,100 @@ -+# Copyright 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+if { [skip_cplus_tests] } { continue } -+ -+set srcfile expand-sals.cc -+if { [prepare_for_testing expand-sals.exp expand-sals $srcfile {debug c++}] } { -+ return -1 -+} -+if ![runto_main] { -+ return -1 -+} -+ -+gdb_breakpoint [gdb_get_line_number "exit-line"] -+ -+gdb_breakpoint [gdb_get_line_number "func-line"] -+gdb_continue_to_breakpoint "func" ".*func-line.*" -+ -+gdb_test "up" "caller-line.*" -+ -+# PC should not be at the boundary of source lines to make the original bug -+# exploitable. -+ -+set test "p/x \$pc" -+set pc {} -+gdb_test_multiple $test $test { -+ -re "\\$\[0-9\]+ = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" { -+ set pc $expect_out(1,string) -+ pass $test -+ } -+} -+ -+set test "info line" -+set end {} -+gdb_test_multiple $test $test { -+ -re "Line \[0-9\]+ of .* starts at address 0x\[0-9a-f\]+.* and ends at (0x\[0-9a-f\]+).*\\.\r\n$gdb_prompt $" { -+ set end $expect_out(1,string) -+ pass $test -+ } -+} -+ -+set test "caller line has trailing code" -+if {$pc != $end} { -+ pass $test -+} else { -+ fail $test -+} -+ -+# Original problem was an internal error here. Still sanity multiple locations -+# were found at this code place as otherwise this test would not test anything. -+set test "break" -+gdb_test_multiple $test $test { -+ -re "Breakpoint \[0-9\]+ at .*, line \[0-9\]+\\. \\(\[2-9\] locations\\)\r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re "Breakpoint \[0-9\]+ at .*, line \[0-9\]+\\.\r\n$gdb_prompt $" { -+ # It just could not be decided if GDB is OK by this testcase. -+ setup_xfail *-*-* -+ fail $test -+ return 0 -+ } -+} -+ -+gdb_continue_to_breakpoint "caller" ".*caller-line.*" -+ -+# Test GDB caught this return call and not the next one through B::B() -+gdb_test "bt" \ -+ "#0 \[^\r\n\]* (A::)?A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \ -+ "bt from A" -+ -+gdb_continue_to_breakpoint "next caller instance" ".*caller-line.*" -+ -+# Test that GDB caught now already A through B::B() in the other instance. -+# As discussed in GDB expand_line_sal_maybe it would more match the original -+# instance behavior to catch here the `func' breakpoint and catch the -+# multiple-locations breakpoint only during the call return. This is not the -+# case, expecting here to catch the breakpoint before the call happens. -+ -+gdb_test "bt" \ -+ "#0 \[^\r\n\]* (A::)?A \[^\r\n\]*\r\n#1 \[^\r\n\]* (B::)?B \[^\r\n\]*\r\n#2 \[^\r\n\]* main \[^\r\n\]*" \ -+ "bt from B before the call" -+ -+gdb_continue_to_breakpoint "next caller func" ".*func-line.*" -+ -+# Verify GDB really could not catch the originally intended point of the return -+# from func. -+ -+gdb_continue_to_breakpoint "uncaught return" ".*exit-line.*" -diff --git a/gdb/testsuite/gdb.cp/gdb1355.exp b/gdb/testsuite/gdb.cp/gdb1355.exp -index 77687a6..66d16cf 100644 ---- a/gdb/testsuite/gdb.cp/gdb1355.exp -+++ b/gdb/testsuite/gdb.cp/gdb1355.exp -@@ -68,11 +68,11 @@ set s_tail ".*" +@@ -48,7 +48,7 @@ gdb_continue_to_breakpoint "caller" ".*caller-line.*" - set f_i "${ws}int m_int;" - set f_c "${ws}char m_char;" --set f_li "${ws}long int m_long_int;" -+set f_li "${ws}long m_long_int;" - set f_ui "${ws}unsigned int m_unsigned_int;" --set f_lui "${ws}long unsigned int m_long_unsigned_int;" --set f_si "${ws}short int m_short_int;" --set f_sui "${ws}short unsigned int m_short_unsigned_int;" -+set f_lui "${ws}unsigned long m_long_unsigned_int;" -+set f_si "${ws}short m_short_int;" -+set f_sui "${ws}unsigned short m_short_unsigned_int;" - set f_uc "${ws}unsigned char m_unsigned_char;" - set f_f "${ws}float m_float;" - set f_d "${ws}double m_double;" + # Test GDB caught this return call and not the next one through B::B() + gdb_test "bt" \ +- "#0 \[^\r\n\]* A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \ ++ "#0 \[^\r\n\]* (A::)?A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \ + "bt from A" + + gdb_continue_to_breakpoint "next caller func" ".*func-line.*" diff --git a/gdb/testsuite/gdb.cp/member-ptr.cc b/gdb/testsuite/gdb.cp/member-ptr.cc index 1dff70a..648b2af 100644 --- a/gdb/testsuite/gdb.cp/member-ptr.cc @@ -38260,7 +20614,7 @@ index 1dff70a..648b2af 100644 pmi = &A::jj; diff --git a/gdb/testsuite/gdb.cp/member-ptr.exp b/gdb/testsuite/gdb.cp/member-ptr.exp -index b69d4ad..476711f 100644 +index b69d4ad..83dd0d5 100644 --- a/gdb/testsuite/gdb.cp/member-ptr.exp +++ b/gdb/testsuite/gdb.cp/member-ptr.exp @@ -390,6 +390,33 @@ gdb_test_multiple "print ((int) pmi) == ((char *) &a.j - (char *) & a)" $name { @@ -38297,6 +20651,15 @@ index b69d4ad..476711f 100644 # ========================== # pointer to member function # ========================== +@@ -420,7 +447,7 @@ gdb_test_multiple "ptype pmf" $name { + + set name "print pmf" + gdb_test_multiple "print pmf" $name { +- -re "$vhn = $hex \r\n$gdb_prompt $" { ++ -re "$vhn = \\(int \\(A::\\*\\)\\(A \\*, int\\)\\) $hex \r\n$gdb_prompt $" { + pass $name + } + -re "$vhn = .*not supported with HP aCC.*\r\n$gdb_prompt $" { @@ -608,6 +635,9 @@ gdb_test_multiple "print (a.*pmf)(3)" $name { } } @@ -38307,6 +20670,13 @@ index b69d4ad..476711f 100644 # Print out a pointer to data member which requires looking into # a base class. gdb_test "print diamond_pmi" "$vhn = &Base::x" +@@ -658,5 +688,5 @@ gdb_test "print null_pmi = &A::j" "$vhn = &A::j" + gdb_test "print null_pmi = 0" "$vhn = NULL" + + gdb_test "print null_pmf" "$vhn = NULL" +-gdb_test "print null_pmf = &A::foo" "$vhn = $hex " ++gdb_test "print null_pmf = &A::foo" "$vhn = \\(int \\(A::\\*\\)\\(A \\*, int\\)\\) $hex " + gdb_test "print null_pmf = 0" "$vhn = NULL" diff --git a/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc b/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc new file mode 100644 index 0000000..6b180d6 @@ -38388,149 +20758,54 @@ index 0000000..e4bb9f8 +gdb_test "print x" "\\$\[0-9\].* = 11" +gdb_test "print xx" "\\$\[0-9\].* = 22" +gdb_test "print xxx" "\\$\[0-9\].* = 33" -diff --git a/gdb/testsuite/gdb.cp/namespace-using.cc b/gdb/testsuite/gdb.cp/namespace-using.cc +diff --git a/gdb/testsuite/gdb.cp/namespace-nested-imports.cc b/gdb/testsuite/gdb.cp/namespace-nested-imports.cc new file mode 100644 -index 0000000..97af850 +index 0000000..9723f87 --- /dev/null -+++ b/gdb/testsuite/gdb.cp/namespace-using.cc -@@ -0,0 +1,131 @@ -+//-------------------------- -+namespace M{ -+ int x = 911; -+} -+ -+namespace N{ -+ int x = 912; -+} -+ -+int marker10(){ -+ using namespace M; -+ int y = x+1; // marker10 stop -+ using namespace N; -+ return y; -+} -+//-------------------------- -+namespace J { -+ int jx = 44; -+} -+ -+namespace K{ -+ int marker9(){ -+ //x; -+ return marker10(); -+ } -+} -+ -+namespace L{ -+ using namespace J; -+ int marker8(){ -+ jx; -+ return K::marker9(); -+ } -+} -+//-------------------------- -+ -+//-------------------------- -+namespace G{ -+ namespace H { -+ int ghx = 6; -+ } -+} -+ -+namespace I{ -+ -+ int marker7(){ -+ using namespace G::H; -+ ghx; -+ return L::marker8(); -+ } -+} -+//-------------------------- -+ -+//-------------------------- -+namespace E{ -+ namespace F{ -+ int efx = 5; -+ } -+} -+using namespace E::F; -+int marker6(){ -+ efx; -+ return I::marker7(); -+} -+//-------------------------- -+ ++++ b/gdb/testsuite/gdb.cp/namespace-nested-imports.cc +@@ -0,0 +1,36 @@ +namespace A +{ -+ int _a = 1; -+ int x = 2; -+ ++ namespace B ++ { ++ int ab = 11; ++ } +} + +namespace C +{ -+ int cc = 3; -+} ++ namespace D ++ { ++ using namespace A::B; + -+namespace D -+{ -+ int dx = 4; -+} -+ -+using namespace C; -+int marker5() -+{ -+ cc; -+ return marker6(); -+} -+ -+int marker4() -+{ -+ using D::dx; -+ return marker5(); -+} -+ -+int marker3() -+{ -+ return marker4(); -+} -+ -+int marker2() -+{ -+ namespace B = A; -+ B::_a; -+ return marker3(); -+} -+ -+int marker1() -+{ -+ int total = 0; ++ int ++ second() + { -+ int b = 1; -+ { -+ using namespace A; -+ int c = 2; -+ { -+ int d = 3; -+ total = _a + b + c + d + marker2(); // marker1 stop -+ } -+ } ++ ab; ++ return 0; + } -+ return total; ++ } ++ ++ int ++ first() ++ { ++ //ab; ++ return D::second(); ++ } +} + -+int main() ++int ++main() +{ -+ using namespace A; -+ _a; -+ return marker1(); ++ //ab; ++ return C::first(); +} -diff --git a/gdb/testsuite/gdb.cp/namespace-using.exp b/gdb/testsuite/gdb.cp/namespace-using.exp +diff --git a/gdb/testsuite/gdb.cp/namespace-nested-imports.exp b/gdb/testsuite/gdb.cp/namespace-nested-imports.exp new file mode 100644 -index 0000000..ab6e6a4 +index 0000000..d279fb5 --- /dev/null -+++ b/gdb/testsuite/gdb.cp/namespace-using.exp -@@ -0,0 +1,183 @@ ++++ b/gdb/testsuite/gdb.cp/namespace-nested-imports.exp +@@ -0,0 +1,57 @@ +# Copyright 2008 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -38553,7 +20828,7 @@ index 0000000..ab6e6a4 +set prms_id 0 +set bug_id 0 + -+set testfile namespace-using ++set testfile namespace-nested-imports +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { @@ -38569,16 +20844,323 @@ index 0000000..ab6e6a4 +gdb_load ${binfile} + +############################################ -+# test printing of namespace imported within -+# the function. -+ +if ![runto_main] then { + perror "couldn't run to breakpoint main" + continue +} + -+gdb_test "print _a" "= 1" ++gdb_test "print ab" "No symbol .* in current context." + ++############################################ ++gdb_breakpoint C::first ++gdb_continue_to_breakpoint "C::first" ++ ++gdb_test "print ab" "No symbol .* in current context." ++gdb_test "print C::D::ab" "= 11" ++ ++############################################ ++gdb_breakpoint C::D::second ++gdb_continue_to_breakpoint "C::D::second" ++ ++gdb_test "print ab" "= 11" +diff --git a/gdb/testsuite/gdb.cp/namespace-no-imports.cc b/gdb/testsuite/gdb.cp/namespace-no-imports.cc +new file mode 100644 +index 0000000..d1c68ab +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/namespace-no-imports.cc +@@ -0,0 +1,37 @@ ++ ++namespace A ++{ ++ int _a = 11; ++ ++ namespace B{ ++ ++ int ab = 22; ++ ++ namespace C{ ++ ++ int abc = 33; ++ ++ int second(){ ++ return 0; ++ } ++ ++ } ++ ++ int first(){ ++ _a; ++ ab; ++ C::abc; ++ return C::second(); ++ } ++ } ++} ++ ++ ++int ++main() ++{ ++ A::_a; ++ A::B::ab; ++ A::B::C::abc; ++ return A::B::first(); ++} +diff --git a/gdb/testsuite/gdb.cp/namespace-no-imports.exp b/gdb/testsuite/gdb.cp/namespace-no-imports.exp +new file mode 100644 +index 0000000..e508103 +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/namespace-no-imports.exp +@@ -0,0 +1,76 @@ ++# Copyright 2008 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++if $tracelevel then { ++ strace $tracelevel ++} ++ ++set prms_id 0 ++set bug_id 0 ++ ++set testfile namespace-no-imports ++set srcfile ${testfile}.cc ++set binfile ${objdir}/${subdir}/${testfile} ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++ ++# Get things started. ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++############################################ ++if ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue ++} ++ ++gdb_test "print A::_a" "= 11" ++gdb_test "print A::B::ab" "= 22" ++gdb_test "print A::B::C::abc" "= 33" ++ ++gdb_test "print _a" "No symbol .* in current context." ++gdb_test "print ab" "No symbol .* in current context." ++gdb_test "print abc" "No symbol .* in current context." ++ ++############################################ ++gdb_breakpoint A::B::first ++gdb_continue_to_breakpoint "A::B::first" ++ ++gdb_test "print A::_a" "= 11" ++gdb_test "print A::B::ab" "= 22" ++gdb_test "print A::B::C::abc" "= 33" ++ ++gdb_test "print _a" "= 11" ++gdb_test "print ab" "= 22" ++gdb_test "print C::abc" "= 33" ++ ++gdb_test "print abc" "No symbol .* in current context." ++ ++############################################ ++gdb_breakpoint A::B::C::second ++gdb_continue_to_breakpoint "A::B::C::second" ++ ++gdb_test "print A::_a" "= 11" ++gdb_test "print A::B::ab" "= 22" ++gdb_test "print A::B::C::abc" "= 33" ++ ++gdb_test "print _a" "= 11" ++gdb_test "print ab" "= 22" ++gdb_test "print abc" "= 33" +diff --git a/gdb/testsuite/gdb.cp/namespace-using.cc b/gdb/testsuite/gdb.cp/namespace-using.cc +index 4786fd5..8ff5622 100644 +--- a/gdb/testsuite/gdb.cp/namespace-using.cc ++++ b/gdb/testsuite/gdb.cp/namespace-using.cc +@@ -1,26 +1,129 @@ ++namespace M ++{ ++ int x = 911; ++} ++ ++namespace N ++{ ++ int x = 912; ++} ++ ++int marker10 () ++{ ++ using namespace M; ++ int y = x + 1; // marker10 stop ++ using namespace N; ++ return y; ++} ++ ++namespace J ++{ ++ int jx = 44; ++} ++ ++namespace K ++{ ++ int ++ marker9 () ++ { ++ //x; ++ return marker10 (); ++ } ++} ++ ++namespace L ++{ ++ using namespace J; ++ int ++ marker8 () ++ { ++ jx; ++ return K::marker9 (); ++ } ++} ++ ++namespace G ++{ ++ namespace H ++ { ++ int ghx = 6; ++ } ++} ++ ++namespace I ++{ ++ int ++ marker7 () ++ { ++ using namespace G::H; ++ ghx; ++ return L::marker8 (); ++ } ++} ++ ++namespace E ++{ ++ namespace F ++ { ++ int efx = 5; ++ } ++} ++ ++using namespace E::F; ++int ++marker6 () ++{ ++ efx; ++ return I::marker7 (); ++} ++ + namespace A + { + int _a = 1; + int x = 2; + } + +-int marker4(){ +- using A::x; +- return 0; ++namespace C ++{ ++ int cc = 3; ++} ++ ++namespace D ++{ ++ int dx = 4; ++} ++ ++using namespace C; ++int ++marker5 () ++{ ++ cc; ++ return marker6 (); ++} ++ ++int ++marker4 () ++{ ++ using D::dx; ++ return marker5 (); + } + +-int marker3(){ +- return marker4(); ++int ++marker3 () ++{ ++ return marker4 (); + } + +-int marker2() ++int ++marker2 () + { + namespace B = A; + B::_a; +- return marker3(); ++ return marker3 (); + } + +-int marker1() ++int ++marker1 () + { + int total = 0; + { +@@ -29,17 +132,18 @@ int marker1() + using namespace A; + int c = 2; + { +- int d = 3; +- total = _a + b + c + d + marker2(); // marker1 stop ++ int d = 3; ++ total = _a + b + c + d + marker2 (); // marker1 stop + } + } + } + return total; + } + +-int main() ++int ++main () + { + using namespace A; + _a; +- return marker1(); ++ return marker1 (); + } +diff --git a/gdb/testsuite/gdb.cp/namespace-using.exp b/gdb/testsuite/gdb.cp/namespace-using.exp +index f24973f..fa6b669 100644 +--- a/gdb/testsuite/gdb.cp/namespace-using.exp ++++ b/gdb/testsuite/gdb.cp/namespace-using.exp +@@ -46,15 +46,61 @@ if ![runto_main] then { + + gdb_test "print _a" "= 1" + +# Test that names are not printed when they +# are not imported + @@ -38596,20 +21178,20 @@ index 0000000..ab6e6a4 +gdb_load ${binfile} + + -+############################################ -+# test printing of namespace imported into -+# a scope containing the pc. -+ + ############################################ + # test printing of namespace imported into + # a scope containing the pc. + +if ![runto_main] then { + perror "couldn't run to breakpoint main" + continue +} + -+gdb_breakpoint [gdb_get_line_number "marker1 stop"] -+gdb_continue_to_breakpoint "marker1 stop" -+ -+gdb_test "print _a" "= 1" "print _a in a nested scope" -+ + gdb_breakpoint [gdb_get_line_number "marker1 stop"] + gdb_continue_to_breakpoint "marker1 stop" + + gdb_test "print _a" "= 1" "print _a in a nested scope" + + +gdb_exit +gdb_start @@ -38634,14 +21216,14 @@ index 0000000..ab6e6a4 +gdb_load ${binfile} + + -+############################################ -+# Test printing of namespace aliases -+ -+if ![runto marker2] then { -+ perror "couldn't run to breakpoint marker2" -+ continue -+} -+ + ############################################ + # Test printing of namespace aliases + +@@ -64,14 +110,24 @@ if ![runto marker2] then { + continue + } + +-gdb_test "print B::a" "= 1" +gdb_test "print B::_a" "= 1" + +gdb_test "print _a" "No symbol \"_a\" in current context." "print _a in namespace alias scope" @@ -38652,15 +21234,24 @@ index 0000000..ab6e6a4 +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + -+ -+############################################ -+# Test printing of namespace aliases -+ -+if ![runto marker4] then { -+ perror "couldn't run to breakpoint marker4" -+ continue + + ############################################ + # Test that names are not printed when they + # are not imported + +-gdb_breakpoint "marker3" +-gdb_continue_to_breakpoint "marker3" ++if {![runto marker3]} { ++ perror "couldn't run to breakpoint marker3" +} -+ + + gdb_test "print _a" "No symbol \"_a\" in current context." "Print a without import" + +@@ -84,4 +140,57 @@ if ![runto marker4] then { + continue + } + +-gdb_test "print x" "= 2" +gdb_test "print dx" "= 4" + +############################################ @@ -38714,6 +21305,7 @@ index 0000000..ab6e6a4 + +# Assert that M::x is printed and not N::x +gdb_test "print x" "= 911" "print x (from M::x)" ++ diff --git a/gdb/testsuite/gdb.cp/namespace.exp b/gdb/testsuite/gdb.cp/namespace.exp index 76b1b82..2042db2 100644 --- a/gdb/testsuite/gdb.cp/namespace.exp @@ -38784,7 +21376,7 @@ index 24025a2..a72932e 100644 set re_methods "${re_methods}${ws}int overload1arg\\(double\\);" set re_methods "${re_methods}${ws}int overloadfnarg\\((void|)\\);" diff --git a/gdb/testsuite/gdb.cp/ovldbreak.exp b/gdb/testsuite/gdb.cp/ovldbreak.exp -index 8a6b795..897171c 100644 +index 8a6b795..9997a45 100644 --- a/gdb/testsuite/gdb.cp/ovldbreak.exp +++ b/gdb/testsuite/gdb.cp/ovldbreak.exp @@ -127,10 +127,24 @@ proc set_bp_overloaded {name expectedmenu mychoice bpnumber linenumber} { @@ -38819,7 +21411,7 @@ index 8a6b795..897171c 100644 gdb_test "info break" \ "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main(\\(void\\))? at.*$srcfile:49\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main(\\((|void)\\))? at.*$srcfile:49\r \[\t \]+breakpoint already hit 1 time\r \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r @@ -38842,7 +21434,7 @@ index 8a6b795..897171c 100644 gdb_test "info break" \ "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main(\\(void\\))? at.*$srcfile:49\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main(\\((|void)\\))? at.*$srcfile:49\r \[\t \]+breakpoint already hit 1 time\r \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r @@ -38877,75 +21469,148 @@ index 8a6b795..897171c 100644 \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r -diff --git a/gdb/testsuite/gdb.cp/ref-types.exp b/gdb/testsuite/gdb.cp/ref-types.exp -index 4784cb2..b2e55cf 100644 ---- a/gdb/testsuite/gdb.cp/ref-types.exp -+++ b/gdb/testsuite/gdb.cp/ref-types.exp -@@ -284,7 +284,7 @@ gdb_expect { - - send_gdb "print UC\n" - gdb_expect { -- -re ".\[0-9\]* = 21 '\.025'\.*$gdb_prompt $" { -+ -re ".\[0-9\]* = 21 '\.25'\.*$gdb_prompt $" { - pass "print value of UC" - } - -re ".*$gdb_prompt $" { fail "print value of UC" } -@@ -557,7 +557,7 @@ gdb_expect { - - send_gdb "print rUC\n" - gdb_expect { -- -re ".\[0-9\]* = \\(unsigned char &\\) @$hex: 21 \'.025\'.*$gdb_prompt $" { -+ -re ".\[0-9\]* = \\(unsigned char &\\) @$hex: 21 \'.25\'.*$gdb_prompt $" { - pass "print value of rUC" - } - -re ".*$gdb_prompt $" { fail "print value of rUC" } -diff --git a/gdb/testsuite/gdb.cp/templates.exp b/gdb/testsuite/gdb.cp/templates.exp -index cd9b770..f49caff 100644 ---- a/gdb/testsuite/gdb.cp/templates.exp -+++ b/gdb/testsuite/gdb.cp/templates.exp -@@ -329,13 +329,11 @@ gdb_expect { - - send_gdb "print Foo::foo\n" - gdb_expect { -- -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } -+ -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo<(volatile char|char volatile) ?\\*> \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } - -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" - { -- # This used to be a kfail gdb/33. That problem has been -- # fixed, but now gdb/931 and gdb/1512 are rearing their ugly -- # heads. -- kfail "gdb/931" "print Foo::foo" -+ # This used to be a kfail gdb/33 and then kfail gdb/931. -+ fail "print Foo::foo" - } - -re "$gdb_prompt $" { fail "print Foo::foo" } - timeout { fail "(timeout) print Foo::foo" } -@@ -343,13 +341,11 @@ gdb_expect { - - send_gdb "print Foo::foo\n" - gdb_expect { -- -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } -+ -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo<(volatile char|char volatile) ?\\*> \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } - -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" - { -- # This used to be a kfail gdb/33. That problem has been -- # fixed, but now gdb/931 and gdb/1512 are rearing their ugly -- # heads. -- kfail "gdb/931" "print Foo::foo" -+ # This used to be a kfail gdb/33 and then kfail gdb/931. -+ fail "print Foo::foo" - } - -re "$gdb_prompt $" { fail "print Foo::foo" } - timeout { fail "(timeout) print Foo::foo" } -@@ -459,7 +455,7 @@ send_gdb "ptype quxint\n" - gdb_expect { - -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int qux\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" } - -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int qux\\(int, int\\);.*\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" } -- -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int qux\\(int, int\\);.*\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" } -+ -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int qux\\(int, int\\);.*\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" } - -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int qux\\(int, int\\);.*\r\n\\}\r\n$gdb_prompt $" { - kfail "gdb/1512" "ptype quxint" - } +diff --git a/gdb/testsuite/gdb.cp/shadowing.cc b/gdb/testsuite/gdb.cp/shadowing.cc +new file mode 100644 +index 0000000..1651510 +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/shadowing.cc +@@ -0,0 +1,45 @@ ++namespace A ++{ ++ int x = 11; ++} ++ ++int x = 22; ++int y = 0; ++ ++class B ++{ ++public: ++ int x; ++ ++ int ++ func() ++ { ++ x = 33; ++ y++; // marker1 ++ ++ { ++ int x = 44; ++ y++; // marker2 ++ ++ { ++ int x = 55; ++ y++; // marker3 ++ ++ { ++ using namespace A; ++ y++; // marker4 ++ ++ using A::x; ++ y++; // marker5 ++ } ++ } ++ } ++ } ++}; ++ ++int ++main() ++{ ++ B theB; ++ return theB.func(); ++} +diff --git a/gdb/testsuite/gdb.cp/shadowing.exp b/gdb/testsuite/gdb.cp/shadowing.exp +new file mode 100644 +index 0000000..fcbf680 +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/shadowing.exp +@@ -0,0 +1,85 @@ ++# Copyright 2008 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++if $tracelevel then { ++ strace $tracelevel ++} ++ ++set prms_id 0 ++set bug_id 0 ++ ++set testfile shadowing ++set srcfile ${testfile}.cc ++set binfile ${objdir}/${subdir}/${testfile} ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++ ++# Get things started. ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++if ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue ++} ++ ++############################################ ++# Test printing of class variable is not shadowed ++# by global variable ++ ++gdb_breakpoint [gdb_get_line_number "marker1"] ++gdb_continue_to_breakpoint "marker1" ++ ++gdb_test "print x" "= 33" "Print class x shadowing global x" ++ ++ ++############################################ ++# Test printing local variable is not shadowed ++# by class variable ++ ++gdb_breakpoint [gdb_get_line_number "marker2"] ++gdb_continue_to_breakpoint "marker2" ++ ++gdb_test "print x" "= 44" "Print local x shadowing class x" ++ ++############################################ ++# Test inner scope x is printed not outer scope ++ ++gdb_breakpoint [gdb_get_line_number "marker3"] ++gdb_continue_to_breakpoint "marker3" ++ ++gdb_test "print x" "= 55" "Print inner scope x" ++ ++############################################ ++# Test printing local variable is not shadowed ++# by namespace variable ++ ++gdb_breakpoint [gdb_get_line_number "marker4"] ++gdb_continue_to_breakpoint "marker4" ++ ++gdb_test "print x" "= 55" "Print local x not namespace x" ++ ++############################################ ++# Test imported namespace element is printed ++ ++gdb_breakpoint [gdb_get_line_number "marker5"] ++gdb_continue_to_breakpoint "marker5" ++ ++gdb_test "print x" "= 11" "Print imported namespace x" diff --git a/gdb/testsuite/gdb.dwarf2/dw2-stripped.c b/gdb/testsuite/gdb.dwarf2/dw2-stripped.c new file mode 100644 index 0000000..1f02d90 @@ -39079,104 +21744,6 @@ index 0000000..1c6e84a +gdb_test "step" \ + "func.* \\(.*\\) at .*" \ + "step" -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-strp.S b/gdb/testsuite/gdb.dwarf2/dw2-strp.S -index a1602a5..4dbb761 100644 ---- a/gdb/testsuite/gdb.dwarf2/dw2-strp.S -+++ b/gdb/testsuite/gdb.dwarf2/dw2-strp.S -@@ -28,7 +28,8 @@ - /* CU die */ - .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ - .4byte .Lproducer /* DW_AT_producer */ -- .byte 1 /* DW_AT_language (C) */ -+ /* Use C++ to exploit a bug in parsing DW_AT_name "". */ -+ .byte 4 /* DW_AT_language (C++) - */ - - .Larray_type: - .uleb128 2 /* Abbrev: DW_TAG_array_type */ -@@ -51,15 +52,25 @@ - .byte 1 /* DW_AT_byte_size */ - .byte 6 /* DW_AT_encoding */ - -- .uleb128 5 /* Abbrev: DW_TAG_variable */ -+ .uleb128 5 /* Abbrev: DW_TAG_variable DW_FORM_strp */ - .4byte .Lvarname /* DW_AT_name */ - .4byte .Lconst_type-.Lcu1_begin/* DW_AT_type */ - .4byte .Lvarcontents /* DW_AT_const_value */ - .byte 1 /* DW_AT_external */ - -+ .uleb128 6 /* Abbrev: DW_TAG_variable DW_FORM_string */ -+ .string "a_string2" /* DW_AT_name */ -+ .4byte .Lconst_type-.Lcu1_begin/* DW_AT_type */ -+ .string "hello world2\n" /* DW_AT_const_value */ -+ .byte 1 /* DW_AT_external */ -+ - .Lconst_type: -- .uleb128 6 /* Abbrev: DW_TAG_const_type */ -+ .uleb128 7 /* Abbrev: DW_TAG_const_type */ - .4byte .Larray_type-.Lcu1_begin/* DW_AT_type */ -+ -+ .uleb128 8 /* Abbrev: DW_TAG_variable (name "") */ -+ .4byte .Lemptyname /* DW_AT_name */ -+ - .byte 0 /* End of children of CU */ - .Lcu1_end: - -@@ -120,12 +131,35 @@ - .byte 0x0 /* Terminator */ - - .uleb128 6 /* Abbrev code */ -+ .uleb128 0x34 /* DW_TAG_variable */ -+ .byte 0x0 /* no_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x1c /* DW_AT_const_value */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x3f /* DW_AT_external */ -+ .uleb128 0xc /* DW_FORM_flag */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 7 /* Abbrev code */ - .uleb128 0x26 /* DW_TAG_const_type */ - .byte 0x0 /* DW_children_no */ - .uleb128 0x49 /* DW_AT_type */ - .uleb128 0x13 /* DW_FORM_ref4 */ - .byte 0x0 /* Terminator */ - .byte 0x0 /* Terminator */ -+ -+ .uleb128 8 /* Abbrev code */ -+ .uleb128 0x34 /* DW_TAG_variable */ -+ .byte 0x0 /* DW_children_no */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0xe /* DW_FORM_strp */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ - .byte 0x0 /* Terminator */ - - /* String table */ -@@ -140,3 +174,5 @@ - .string "a_string" - .Lvarcontents: - .string "hello world!\n" -+.Lemptyname: -+ .string "" -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-strp.exp b/gdb/testsuite/gdb.dwarf2/dw2-strp.exp -index 2201d30..41620a4 100644 ---- a/gdb/testsuite/gdb.dwarf2/dw2-strp.exp -+++ b/gdb/testsuite/gdb.dwarf2/dw2-strp.exp -@@ -48,5 +48,8 @@ gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load ${binfile} - --gdb_test "p a_string" "\\\$1 = \"hello world!\\\\n\"" -+gdb_test "p a_string" " = \"hello world!\\\\n\"" - gdb_test "ptype a_string" "type = char \\\[14\\\]" -+ -+gdb_test "p a_string2" " = \"hello world2\\\\n\"" -+gdb_test "ptype a_string2" "type = char \\\[14\\\]" diff --git a/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.S b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.S new file mode 100644 index 0000000..5fcdd84 @@ -39309,282 +21876,6 @@ index 0000000..c41151c +clean_restart $binfile + +gdb_test "ptype struct some_struct" "type = struct some_struct {\[\r\n \t\]*void field;\[\r\n \t\]*}" -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unresolved-main.c b/gdb/testsuite/gdb.dwarf2/dw2-unresolved-main.c -new file mode 100644 -index 0000000..c24eb96 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-unresolved-main.c -@@ -0,0 +1,46 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+ -+asm (".globl cu_text_start"); -+asm ("cu_text_start:"); -+ -+int -+main (void) -+{ -+ unsigned char var = 1; -+ -+ if (var != 1) -+ abort (); -+ { -+ extern unsigned char var; -+ -+ /* Do not rely on the `extern' DIE output by GCC (GCC PR debug/39563). */ -+asm (".globl extern_block_start"); -+asm ("extern_block_start:"); -+ if (var != 2) -+ abort (); -+asm (".globl extern_block_end"); -+asm ("extern_block_end:"); -+ } -+ -+ return 0; -+} -+ -+asm (".globl cu_text_end"); -+asm ("cu_text_end:"); -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S -new file mode 100644 -index 0000000..4c098f3 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S -@@ -0,0 +1,171 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2007, 2008, 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+ .data -+ -+/* VAR1 is wrong here, in the real inferior it is located on stack. As both -+ places are never modified and they are initialized to the same value it -+ makes no difference. Ensure the name clash for "var". */ -+var1: .byte 1 -+ -+ .globl var -+var: .byte 2 -+ -+/* Debug information */ -+ -+ .section .debug_info -+.Lcu1_begin: -+ /* CU header */ -+ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */ -+.Lcu1_start: -+ .2byte 2 /* DWARF Version */ -+ .4byte .Labbrev1_begin /* Offset into abbrev section */ -+ .byte 4 /* Pointer size */ -+ -+ /* CU die */ -+ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ -+ .4byte cu_text_end /* DW_AT_high_pc */ -+ .4byte cu_text_start /* DW_AT_low_pc */ -+ .ascii "dw2-unresolved-main.c\0" /* DW_AT_name */ -+ .ascii "GNU C 4.3.2\0" /* DW_AT_producer */ -+ .byte 1 /* DW_AT_language (C) */ -+ -+.Ltype_uchar: -+ .uleb128 2 /* Abbrev: DW_TAG_base_type */ -+ .ascii "unsigned char\0" /* DW_AT_name */ -+ .byte 1 /* DW_AT_byte_size */ -+ .byte 7 /* DW_AT_encoding */ -+ -+ /* main */ -+ .uleb128 3 /* Abbrev: DW_TAG_subprogram */ -+ .byte 1 /* DW_AT_decl_file */ -+ .byte 2 /* DW_AT_decl_line */ -+ .ascii "main\0" /* DW_AT_name */ -+ .4byte .Ltype_uchar-.Lcu1_begin /* DW_AT_type */ -+ .4byte cu_text_start /* DW_AT_low_pc */ -+ .4byte cu_text_end /* DW_AT_high_pc */ -+ -+ .uleb128 4 /* Abbrev: DW_TAG_variable (location) */ -+ .ascii "var\0" /* DW_AT_name */ -+ .byte 2f - 1f /* DW_AT_location */ -+1: .byte 3 /* DW_OP_addr */ -+/* See VAR1 definition why this DIE is not correct. */ -+ .4byte var1 /* */ -+2: .4byte .Ltype_uchar-.Lcu1_begin /* DW_AT_type */ -+ -+ .uleb128 6 /* Abbrev: DW_TAG_lexical_block */ -+ .4byte extern_block_start /* DW_AT_low_pc */ -+ .4byte extern_block_end /* DW_AT_high_pc */ -+ -+ .uleb128 5 /* Abbrev: DW_TAG_variable (extern) */ -+ .ascii "var\0" /* DW_AT_name */ -+ .4byte .Ltype_uchar-.Lcu1_begin /* DW_AT_type */ -+ .byte 1 /* DW_AT_external */ -+ -+ .byte 0 /* End of children of the lexical block */ -+ -+ .byte 0 /* End of children of main */ -+ -+ .byte 0 /* End of children of CU */ -+ -+.Lcu1_end: -+ -+/* Abbrev table */ -+ .section .debug_abbrev -+.Labbrev1_begin: -+ .uleb128 1 /* Abbrev code */ -+ .uleb128 0x11 /* DW_TAG_compile_unit */ -+ .byte 1 /* has_children */ -+ .uleb128 0x12 /* DW_AT_high_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x11 /* DW_AT_low_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x25 /* DW_AT_producer */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x13 /* DW_AT_language */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 2 /* Abbrev code */ -+ .uleb128 0x24 /* DW_TAG_base_type */ -+ .byte 0 /* has_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0xb /* DW_AT_byte_size */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .uleb128 0x3e /* DW_AT_encoding */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 3 /* Abbrev code */ -+ .uleb128 0x2e /* DW_TAG_subprogram */ -+ .byte 1 /* has_children */ -+ .uleb128 0x3a /* DW_AT_decl_file */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .uleb128 0x3b /* DW_AT_decl_line */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x11 /* DW_AT_low_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x12 /* DW_AT_high_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 4 /* Abbrev code (location) */ -+ .uleb128 0x34 /* DW_TAG_variable */ -+ .byte 0 /* has_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x2 /* DW_AT_location */ -+ .uleb128 0xa /* DW_FORM_block1 */ -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 5 /* Abbrev code (extern) */ -+ .uleb128 0x34 /* DW_TAG_variable */ -+ .byte 0 /* has_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x3f /* DW_AT_external */ -+ .uleb128 0xc /* DW_FORM_flag */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 6 /* Abbrev code */ -+ .uleb128 0x0b /* DW_TAG_lexical_block */ -+ .byte 1 /* has_children */ -+ .uleb128 0x11 /* DW_AT_low_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x12 /* DW_AT_high_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp -new file mode 100644 -index 0000000..b955da9 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp -@@ -0,0 +1,41 @@ -+# Copyright 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This test can only be run on targets which support DWARF-2 and use gas. -+# For now pick a sampling of likely targets. -+if {![istarget *-*-linux*] -+ && ![istarget *-*-gnu*] -+ && ![istarget *-*-elf*] -+ && ![istarget *-*-openbsd*] -+ && ![istarget arm-*-eabi*] -+ && ![istarget powerpc-*-eabi*]} { -+ return 0 -+} -+ -+if { [prepare_for_testing dw2-unresolved.exp "dw2-unresolved" {dw2-unresolved-main.c dw2-unresolved.S} {nodebug}] } { -+ return -1 -+} -+ -+if ![runto_main] { -+ return -1 -+} -+ -+# This testcase tests LOC_UNRESOLVED works right. -+ -+gdb_breakpoint "*extern_block_start" -+gdb_continue_to_breakpoint "*extern_block_start" -+ -+# Expect the inner value 2. Value 1 from the outer local block is shadowed. -+gdb_test "print var" "= 2( '.*')?" diff --git a/gdb/testsuite/gdb.fortran/common-block.exp b/gdb/testsuite/gdb.fortran/common-block.exp new file mode 100644 index 0000000..888f6c3 @@ -39765,12 +22056,106 @@ index 0000000..b614e8a + call in ! stop-here-out + +end program common_test +diff --git a/gdb/testsuite/gdb.fortran/dwarf-stride.exp b/gdb/testsuite/gdb.fortran/dwarf-stride.exp +new file mode 100644 +index 0000000..cd3486b +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/dwarf-stride.exp +@@ -0,0 +1,42 @@ ++# Copyright 2009 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++# This file was written by Jan Kratochvil . ++ ++# This file is part of the gdb testsuite. Array element stride must not be ++# specified in the number of elements but in a number of bytes instead. ++# Original problem: ++# (gdb) p c40pt(1) ++# $1 = '0-hello', ' ' ++# (gdb) p c40pt(2) ++# warning: Fortran array stride not divisible by the element size ++ ++set testfile dwarf-stride ++set srcfile ${testfile}.f90 ++ ++if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77}] } { ++ return -1 ++} ++ ++if ![runto MAIN__] then { ++ perror "couldn't run to breakpoint MAIN__" ++ continue ++} ++ ++gdb_breakpoint [gdb_get_line_number "break-here"] ++gdb_continue_to_breakpoint "break-here" ".*break-here.*" ++gdb_test "p c40pt(1)" " = '0-hello.*" ++gdb_test "p c40pt(2)" " = '1-hello.*" +diff --git a/gdb/testsuite/gdb.fortran/dwarf-stride.f90 b/gdb/testsuite/gdb.fortran/dwarf-stride.f90 +new file mode 100644 +index 0000000..e492b3a +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/dwarf-stride.f90 +@@ -0,0 +1,40 @@ ++! Copyright 2009 Free Software Foundation, Inc. ++! ++! This program is free software; you can redistribute it and/or modify ++! it under the terms of the GNU General Public License as published by ++! the Free Software Foundation; either version 2 of the License, or ++! (at your option) any later version. ++! ++! This program is distributed in the hope that it will be useful, ++! but WITHOUT ANY WARRANTY; without even the implied warranty of ++! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++! GNU General Public License for more details. ++! ++! You should have received a copy of the GNU General Public License ++! along with this program; if not, write to the Free Software ++! Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++! ++! File written by Alan Matsuoka. ++ ++program repro ++ ++ type small_stride ++ character*40 long_string ++ integer small_pad ++ end type small_stride ++ ++ type(small_stride), dimension (20), target :: unpleasant ++ character*40, pointer, dimension(:):: c40pt ++ ++ integer i ++ ++ do i = 0,19 ++ unpleasant(i+1)%small_pad = i+1 ++ unpleasant(i+1)%long_string = char (ichar('0') + i) // '-hello' ++ end do ++ ++ c40pt => unpleasant%long_string ++ ++ print *, c40pt ! break-here ++ ++end program repro diff --git a/gdb/testsuite/gdb.fortran/dynamic.exp b/gdb/testsuite/gdb.fortran/dynamic.exp new file mode 100644 -index 0000000..77a1203 +index 0000000..f89cf6b --- /dev/null +++ b/gdb/testsuite/gdb.fortran/dynamic.exp -@@ -0,0 +1,156 @@ +@@ -0,0 +1,158 @@ +# Copyright 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -39892,7 +22277,9 @@ index 0000000..77a1203 +gdb_test "p varw" "\\$\[0-9\]* = \\( *\\( *\\( *6, *5, *1,\[()5, .\]*\\)" "p varw filled" +# "up" works with GCC but other Fortran compilers may copy the values into the +# outer function only on the exit of the inner function. -+gdb_test "finish" ".*call bar \\(y, x\\)" ++# We need both variants as depending on the arch we optionally may still be ++# executing the caller line or not after `finish'. ++gdb_test "finish" ".*(call bar \\(y, x\\)|call foo \\(x, z\\(2:6, 4:7, 6:8\\)\\))" +gdb_test "p z(2,4,5)" "\\$\[0-9\]* = 3" +gdb_test "p z(2,4,6)" "\\$\[0-9\]* = 6" +gdb_test "p z(2,4,7)" "\\$\[0-9\]* = 5" @@ -40031,128 +22418,6 @@ index 0000000..0f43564 + if (x (1, 1) .ne. 8 .or. x (2, 2) .ne. 9 .or. x (1, 2) .ne. 4) call abort + if (x (3, 1) .ne. 10) call abort +end -diff --git a/gdb/testsuite/gdb.fortran/library-module-lib.f90 b/gdb/testsuite/gdb.fortran/library-module-lib.f90 -new file mode 100644 -index 0000000..6369d34 ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/library-module-lib.f90 -@@ -0,0 +1,28 @@ -+! Copyright 2009 Free Software Foundation, Inc. -+! -+! This program is free software; you can redistribute it and/or modify -+! it under the terms of the GNU General Public License as published by -+! the Free Software Foundation; either version 3 of the License, or -+! (at your option) any later version. -+! -+! This program is distributed in the hope that it will be useful, -+! but WITHOUT ANY WARRANTY; without even the implied warranty of -+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+! GNU General Public License for more details. -+! -+! You should have received a copy of the GNU General Public License -+! along with this program. If not, see . -+ -+module lib -+ integer :: var_i = 1 -+contains -+ subroutine lib_func -+ if (var_i .ne. 1) call abort -+ var_i = 2 -+ end subroutine lib_func -+end module lib -+ -+module libmany -+ integer :: var_j = 3 -+ integer :: var_k = 4 -+end module libmany -diff --git a/gdb/testsuite/gdb.fortran/library-module-main.f90 b/gdb/testsuite/gdb.fortran/library-module-main.f90 -new file mode 100644 -index 0000000..de63a65 ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/library-module-main.f90 -@@ -0,0 +1,23 @@ -+! Copyright 2009 Free Software Foundation, Inc. -+! -+! This program is free software; you can redistribute it and/or modify -+! it under the terms of the GNU General Public License as published by -+! the Free Software Foundation; either version 3 of the License, or -+! (at your option) any later version. -+! -+! This program is distributed in the hope that it will be useful, -+! but WITHOUT ANY WARRANTY; without even the implied warranty of -+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+! GNU General Public License for more details. -+! -+! You should have received a copy of the GNU General Public License -+! along with this program. If not, see . -+ -+ use lib -+ use libmany, only: var_j -+ if (var_i .ne. 1) call abort -+ call lib_func -+ if (var_i .ne. 2) call abort -+ if (var_j .ne. 3) call abort -+ var_i = var_i ! i-is-2 -+end -diff --git a/gdb/testsuite/gdb.fortran/library-module.exp b/gdb/testsuite/gdb.fortran/library-module.exp -new file mode 100644 -index 0000000..4b4ea4c ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/library-module.exp -@@ -0,0 +1,53 @@ -+# Copyright 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile "library-module" -+set srcfile ${testfile}-main.f90 -+set srclibfile ${testfile}-lib.f90 -+set libfile ${testfile}-lib.so -+set binfile ${testfile} -+ -+# Required for -fPIC by gdb_compile_shlib. -+if [get_compiler_info not-used] { -+ warning "Could not get compiler info" -+ return -1 -+} -+ -+if { [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}] != "" } { -+ untested "Couldn't compile ${srclibfile}" -+ return -1 -+} -+ -+# prepare_for_testing cannot be used as linking with $libfile cannot be passed -+# just for the linking phase (and not the source compilation phase). And any -+# warnings on ignored $libfile abort the process. -+ -+if { [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}] != "" } { -+ untested "Couldn't compile ${srcfile}" -+ return -1 -+} -+ -+clean_restart $binfile -+ -+if ![runto MAIN__] then { -+ perror "couldn't run to breakpoint MAIN__" -+ continue -+} -+ -+gdb_breakpoint [gdb_get_line_number "i-is-2"] -+gdb_continue_to_breakpoint "i-is-2" ".*i-is-2.*" -+gdb_test "print var_i" " = 2" -+gdb_test "print var_j" " = 3" -+gdb_test "print var_k" "No symbol \"var_k\" in current context\\." diff --git a/gdb/testsuite/gdb.fortran/logical.exp b/gdb/testsuite/gdb.fortran/logical.exp new file mode 100644 index 0000000..ef76f43 @@ -40242,98 +22507,6 @@ index 0000000..4229304 + l8 = .TRUE. + l = .FALSE. ! stop-here +end -diff --git a/gdb/testsuite/gdb.fortran/module.exp b/gdb/testsuite/gdb.fortran/module.exp -index 342ccee..c836c3c 100644 ---- a/gdb/testsuite/gdb.fortran/module.exp -+++ b/gdb/testsuite/gdb.fortran/module.exp -@@ -15,21 +15,31 @@ - - set testfile "module" - set srcfile ${testfile}.f90 --set binfile ${objdir}/${subdir}/${testfile} - --if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { -- untested "Couldn't compile ${srcfile}" -+if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77}] } { - return -1 - } - --gdb_exit --gdb_start --gdb_reinitialize_dir $srcdir/$subdir --gdb_load ${binfile} -- - if ![runto MAIN__] then { - perror "couldn't run to breakpoint MAIN__" - continue - } - --gdb_test "print i" " = 42" -+# Do not use simple single-letter names as GDB would pick up for expectedly -+# nonexisting symbols some static variables from system libraries debuginfos. -+ -+gdb_breakpoint [gdb_get_line_number "i-is-1"] -+gdb_continue_to_breakpoint "i-is-1" ".*i-is-1.*" -+gdb_test "print var_i" " = 1" "print var_i value 1" -+ -+gdb_breakpoint [gdb_get_line_number "i-is-2"] -+gdb_continue_to_breakpoint "i-is-2" ".*i-is-2.*" -+gdb_test "print var_i" " = 2" "print var_i value 2" -+ -+gdb_breakpoint [gdb_get_line_number "a-b-c-d"] -+gdb_continue_to_breakpoint "a-b-c-d" ".*a-b-c-d.*" -+gdb_test "print var_a" "No symbol \"var_a\" in current context\\." -+gdb_test "print var_b" " = 11" -+gdb_test "print var_c" "No symbol \"var_c\" in current context\\." -+gdb_test "print var_d" " = 12" -+gdb_test "print var_i" " = 14" "print var_i value 14" -diff --git a/gdb/testsuite/gdb.fortran/module.f90 b/gdb/testsuite/gdb.fortran/module.f90 -index 501ccc8..118931d 100644 ---- a/gdb/testsuite/gdb.fortran/module.f90 -+++ b/gdb/testsuite/gdb.fortran/module.f90 -@@ -13,10 +13,37 @@ - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see . - --module mod -- integer :: i = 42 --end module mod -+module mod1 -+ integer :: var_i = 1 -+end module mod1 - -- use mod -- print *, i -+module mod2 -+ integer :: var_i = 2 -+end module mod2 -+ -+module modmany -+ integer :: var_a = 10, var_b = 11, var_c = 12, var_i = 14 -+end module modmany -+ -+ subroutine sub1 -+ use mod1 -+ if (var_i .ne. 1) call abort -+ var_i = var_i ! i-is-1 -+ end -+ -+ subroutine sub2 -+ use mod2 -+ if (var_i .ne. 2) call abort -+ var_i = var_i ! i-is-2 -+ end -+ -+ use modmany, only: var_b, var_d => var_c, var_i -+ -+ call sub1 -+ call sub2 -+ -+ if (var_b .ne. 11) call abort -+ if (var_d .ne. 12) call abort -+ if (var_i .ne. 14) call abort -+ var_b = var_b ! a-b-c-d - end diff --git a/gdb/testsuite/gdb.fortran/string.exp b/gdb/testsuite/gdb.fortran/string.exp new file mode 100644 index 0000000..ab72206 @@ -40470,76 +22643,63 @@ index 495ae45..d08d7a4 100644 -re ".*time_at_startup = get_run_time.*$gdb_prompt $" { set description "next over get_run_time and everything it calls" set command "next" -diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp -index 6ea59fc..0f91af7 100644 ---- a/gdb/testsuite/gdb.mi/mi-break.exp -+++ b/gdb/testsuite/gdb.mi/mi-break.exp -@@ -85,11 +85,11 @@ proc test_tbreak_creation_and_listing {} { - mi_create_breakpoint "-t basics.c:callee2" 2 del callee2 ".*basics.c" $line_callee2_body $hex \ - "insert temp breakpoint at basics.c:callee2" +diff --git a/gdb/testsuite/gdb.mi/gdb701.exp b/gdb/testsuite/gdb.mi/gdb701.exp +index d4acdc2..244c731 100644 +--- a/gdb/testsuite/gdb.mi/gdb701.exp ++++ b/gdb/testsuite/gdb.mi/gdb701.exp +@@ -54,7 +54,7 @@ mi_gdb_test "-var-list-children fooPtr" \ -- mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_body $hex \ -+ mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_head $hex \ - "insert temp breakpoint at basics.c:\$line_callee3_head" + foreach i [list x y z] { + mi_gdb_test "-var-list-children fooPtr.$i" \ +- "(&\".*\"\r\n)*\\^done,numchild=\"0\"" \ ++ "(&\".*\"\r\n)*\\^done,numchild=\"0\",has_more=\"0\"" \ + "list children of fooPtr.$i" + } - # Getting the quoting right is tricky. That is "\"\":$line_callee4_head" -- mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_body $hex \ -+ mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_head $hex \ - "insert temp breakpoint at \"\":\$line_callee4_head" +diff --git a/gdb/testsuite/gdb.mi/mi-var-display.exp b/gdb/testsuite/gdb.mi/mi-var-display.exp +index 4b02e50..faa9172 100644 +--- a/gdb/testsuite/gdb.mi/mi-var-display.exp ++++ b/gdb/testsuite/gdb.mi/mi-var-display.exp +@@ -558,7 +558,7 @@ mi_gdb_test "-var-info-num-children e" \ + # Test: c_variable-7.55 + # Desc: children of e + mi_gdb_test "-var-list-children e" \ +- "\\^done,numchild=\"0\"" \ ++ "\\^done,numchild=\"0\",has_more=\"0\"" \ + "get children of e" - mi_gdb_test "666-break-list" \ -diff --git a/gdb/testsuite/gdb.mi/mi-simplerun.exp b/gdb/testsuite/gdb.mi/mi-simplerun.exp -index 654146a..14a1446 100644 ---- a/gdb/testsuite/gdb.mi/mi-simplerun.exp -+++ b/gdb/testsuite/gdb.mi/mi-simplerun.exp -@@ -74,10 +74,10 @@ proc test_breakpoints_creation_and_listing {} { - mi_create_breakpoint "basics.c:callee2" 2 keep callee2 ".*basics.c" $line_callee2_body $hex \ - "insert breakpoint at basics.c:callee2" + # Test: c_variable-7.60 +@@ -600,7 +600,7 @@ mi_gdb_test "-var-info-num-children anone" \ + # Test: c_variable-7.75 + # Desc: children of anone + mi_gdb_test "-var-list-children anone" \ +- "\\^done,numchild=\"0\"" \ ++ "\\^done,numchild=\"0\",has_more=\"0\"" \ + "get children of anone" -- mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_body $hex \ -+ mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_head $hex \ - "insert breakpoint at basics.c:\$line_callee3_head" -- mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_body $hex \ -+ mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_head $hex \ - "insert breakpoint at \"\":\$line_callee4_head" +diff --git a/gdb/testsuite/gdb.mi/mi2-var-display.exp b/gdb/testsuite/gdb.mi/mi2-var-display.exp +index d6ce673..17e208a 100644 +--- a/gdb/testsuite/gdb.mi/mi2-var-display.exp ++++ b/gdb/testsuite/gdb.mi/mi2-var-display.exp +@@ -557,7 +557,7 @@ mi_gdb_test "-var-info-num-children e" \ + # Test: c_variable-7.55 + # Desc: children of e + mi_gdb_test "-var-list-children e" \ +- "\\^done,numchild=\"0\"" \ ++ "\\^done,numchild=\"0\",has_more=\"0\"" \ + "get children of e" - mi_gdb_test "204-break-list" \ -diff --git a/gdb/testsuite/gdb.mi/mi2-break.exp b/gdb/testsuite/gdb.mi/mi2-break.exp -index d08081a..7f43315 100644 ---- a/gdb/testsuite/gdb.mi/mi2-break.exp -+++ b/gdb/testsuite/gdb.mi/mi2-break.exp -@@ -85,11 +85,11 @@ proc test_tbreak_creation_and_listing {} { - mi_create_breakpoint "-t basics.c:callee2" 2 del callee2 ".*basics.c" $line_callee2_body $hex \ - "insert temp breakpoint at basics.c:callee2" + # Test: c_variable-7.60 +@@ -599,7 +599,7 @@ mi_gdb_test "-var-info-num-children anone" \ + # Test: c_variable-7.75 + # Desc: children of anone + mi_gdb_test "-var-list-children anone" \ +- "\\^done,numchild=\"0\"" \ ++ "\\^done,numchild=\"0\",has_more=\"0\"" \ + "get children of anone" -- mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_body $hex \ -+ mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_head $hex \ - "insert temp breakpoint at basics.c:\$line_callee3_head" - # Getting the quoting right is tricky. That is "\"\":$line_callee4_head" -- mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_body $hex \ -+ mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_head $hex \ - "insert temp breakpoint at \"\":\$line_callee4_head" - - mi_gdb_test "666-break-list" \ -diff --git a/gdb/testsuite/gdb.mi/mi2-simplerun.exp b/gdb/testsuite/gdb.mi/mi2-simplerun.exp -index eddb2ed..13443ee 100644 ---- a/gdb/testsuite/gdb.mi/mi2-simplerun.exp -+++ b/gdb/testsuite/gdb.mi/mi2-simplerun.exp -@@ -74,10 +74,10 @@ proc test_breakpoints_creation_and_listing {} { - mi_create_breakpoint "basics.c:callee2" 2 keep callee2 ".*basics.c" $line_callee2_body $hex \ - "insert breakpoint at basics.c:callee2" - -- mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_body $hex \ -+ mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_head $hex \ - "insert breakpoint at basics.c:\$line_callee3_head" - -- mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_body $hex \ -+ mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_head $hex \ - "insert breakpoint at \"\":\$line_callee4_head" - - mi_gdb_test "204-break-list" \ diff --git a/gdb/testsuite/gdb.opt/array-from-register-func.c b/gdb/testsuite/gdb.opt/array-from-register-func.c new file mode 100644 index 0000000..729f457 @@ -40654,37 +22814,194 @@ index 79be9e7..c49f713 100644 all info install-info dvi install uninstall installcheck check: @echo "Nothing to be done for $@..." -diff --git a/gdb/testsuite/gdb.python/find.c b/gdb/testsuite/gdb.python/find.c +diff --git a/gdb/testsuite/gdb.python/python-cmd.exp b/gdb/testsuite/gdb.python/python-cmd.exp +index f6ef938..1032a2d 100644 +--- a/gdb/testsuite/gdb.python/python-cmd.exp ++++ b/gdb/testsuite/gdb.python/python-cmd.exp +@@ -20,36 +20,15 @@ if $tracelevel then { + strace $tracelevel + } + +-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... +-# Run a test named NAME, consisting of multiple lines of input. +-# After each input line INPUT, search for result line RESULT. +-# Succeed if all results are seen; fail otherwise. +-proc gdb_py_test_multiple {name args} { +- global gdb_prompt +- foreach {input result} $args { +- if {[gdb_test_multiple $input "$name - $input" { +- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { +- pass "$name - $input" +- } +- }]} { +- return 1 +- } +- } +- return 0 +-} +- + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + +-gdb_test_multiple "python print 'hello, world!'" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 + } + + # Test a simple command. +diff --git a/gdb/testsuite/gdb.python/python-frame.exp b/gdb/testsuite/gdb.python/python-frame.exp +index 82b526e..82ae814 100644 +--- a/gdb/testsuite/gdb.python/python-frame.exp ++++ b/gdb/testsuite/gdb.python/python-frame.exp +@@ -20,40 +20,28 @@ if $tracelevel then { + strace $tracelevel + } + ++# Start with a fresh gdb. ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++ ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 ++} ++ + set testfile "python-frame" + set srcfile ${testfile}.c + set binfile ${objdir}/${subdir}/${testfile} ++ + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + untested "Couldn't compile ${srcfile}" + return -1 + } + +-# Run a command in GDB, and report a failure if a Python exception is thrown. +-# If report_pass is true, report a pass if no exception is thrown. +-proc gdb_py_test_silent_cmd {cmd name report_pass} { +- global gdb_prompt +- +- gdb_test_multiple $cmd $name { +- -re "Traceback.*$gdb_prompt $" { fail $name } +- -re "$gdb_prompt $" { if $report_pass { pass $name } } +- } +-} +- +-# Start with a fresh gdb. +- +-gdb_exit +-gdb_start +-gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + +-gdb_test_multiple "python print 'hello, world!'" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} +-} +- + # The following tests require execution. + + if ![runto_main] then { +@@ -65,19 +53,20 @@ gdb_breakpoint "f2" + gdb_continue_to_breakpoint "breakpoint at f2" + gdb_test "up" "" "" + +-gdb_py_test_silent_cmd "python f1 = gdb.selected_frame ()" "get second frame" 0 +-gdb_py_test_silent_cmd "python f0 = f1.newer ()" "get first frame" 0 ++gdb_py_test_silent_cmd "python frames = gdb.selected_thread ().frames ()" "get frames list" 1 ++gdb_test "python print frames" "\\(, , \\)" "verify frames list" ++gdb_py_test_silent_cmd "python f0 = frames\[0\]" "get first frame" 0 ++gdb_py_test_silent_cmd "python f1 = frames\[1\]" "get second frame" 0 + + gdb_test "python print 'result =', f0 == f1" " = False" "test equality comparison (false)" + gdb_test "python print 'result =', f0 == f0" " = True" "test equality comparison (true)" +-gdb_test "python print 'result =', f0 != f1" " = True" "test inequality comparison (true)" +-gdb_test "python print 'result =', f0 != f0" " = False" "test inequality comparison (false)" + gdb_test "python print 'result =', f0.is_valid ()" " = True" "test Frame.is_valid" + gdb_test "python print 'result =', f0.name ()" " = f2" "test Frame.name" + gdb_test "python print 'result =', f0.type () == gdb.NORMAL_FRAME" " = True" "test Frame.type" + gdb_test "python print 'result =', f0.unwind_stop_reason () == gdb.FRAME_UNWIND_NO_REASON" " = True" "test Frame.type" + gdb_test "python print 'result =', gdb.frame_stop_reason_string (gdb.FRAME_UNWIND_INNER_ID)" " = previous frame inner to this frame \\(corrupt stack\\?\\)" "test gdb.frame_stop_reason_string" + gdb_test "python print 'result =', f0.pc ()" " = \[0-9\]+" "test Frame.pc" ++gdb_test "python print 'result =', f0.function ()" " = symbol for f2" "test Frame.function" + gdb_test "python print 'result =', f0.older () == f1" " = True" "test Frame.older" + gdb_test "python print 'result =', f1.newer () == f0" " = True" "test Frame.newer" + gdb_test "python print 'result =', f0.read_var ('variable_which_surely_doesnt_exist')" \ +@@ -85,4 +74,7 @@ gdb_test "python print 'result =', f0.read_var ('variable_which_surely_doesnt_ex + "test Frame.read_var - error" + gdb_test "python print 'result =', f0.read_var ('a')" " = 1" "test Frame.read_var - success" + ++gdb_test "python print 'result =', gdb.selected_thread ().newest_frame () == f0" " = True" "test gdb.newest_frame" + gdb_test "python print 'result =', gdb.selected_frame () == f1" " = True" "test gdb.selected_frame" ++ ++gdb_test "python print 'result =', f0.block ()" "" "test Frame.block" +diff --git a/gdb/testsuite/gdb.python/python-function.exp b/gdb/testsuite/gdb.python/python-function.exp +index 7feca2b..4ae519f 100644 +--- a/gdb/testsuite/gdb.python/python-function.exp ++++ b/gdb/testsuite/gdb.python/python-function.exp +@@ -20,36 +20,15 @@ if $tracelevel then { + strace $tracelevel + } + +-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... +-# Run a test named NAME, consisting of multiple lines of input. +-# After each input line INPUT, search for result line RESULT. +-# Succeed if all results are seen; fail otherwise. +-proc gdb_py_test_multiple {name args} { +- global gdb_prompt +- foreach {input result} $args { +- if {[gdb_test_multiple $input "$name - $input" { +- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { +- pass "$name - $input" +- } +- }]} { +- return 1 +- } +- } +- return 0 +-} +- + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + +-gdb_test_multiple "python print 'hello, world!'" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 + } + + gdb_py_test_multiple "input convenience function" \ +diff --git a/gdb/testsuite/gdb.python/python-inferior.c b/gdb/testsuite/gdb.python/python-inferior.c new file mode 100644 -index 0000000..35ddd8c +index 0000000..0b48299 --- /dev/null -+++ b/gdb/testsuite/gdb.python/find.c -@@ -0,0 +1,64 @@ -+/* Testcase for the search_memory Python function. -+ This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@gnu.org */ -+ -+/* Based on the gdb.base/find.c testcase. */ -+ ++++ b/gdb/testsuite/gdb.python/python-inferior.c +@@ -0,0 +1,49 @@ ++#include +#include +#include ++#include + +#define CHUNK_SIZE 16000 /* same as findcmd.c's */ +#define BUF_SIZE (2 * CHUNK_SIZE) /* at least two chunks */ @@ -40699,10 +23016,19 @@ index 0000000..35ddd8c + +static int x; + -+static void -+stop_here () ++ ++int f2 (int a) +{ -+ x = 1; // stop here ++ char *str = "hello, testsuite"; ++ ++ puts (str); /* Break here. */ ++ ++ return ++a; ++} ++ ++int f1 (int a, int b) ++{ ++ return f2(a) + b; +} + +static void @@ -40715,22 +23041,19 @@ index 0000000..35ddd8c + memset (search_buf, 'x', search_buf_size); +} + -+int -+main () ++int main (int argc, char *argv[]) +{ + init_bufs (); + -+ stop_here (); -+ -+ return 0; ++ return f1 (1, 2); +} -diff --git a/gdb/testsuite/gdb.python/find.exp b/gdb/testsuite/gdb.python/find.exp +diff --git a/gdb/testsuite/gdb.python/python-inferior.exp b/gdb/testsuite/gdb.python/python-inferior.exp new file mode 100644 -index 0000000..defc31c +index 0000000..ea413c6 --- /dev/null -+++ b/gdb/testsuite/gdb.python/find.exp -@@ -0,0 +1,203 @@ -+# Copyright 2008, 2009 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.python/python-inferior.exp +@@ -0,0 +1,201 @@ ++# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -40745,71 +23068,69 @@ index 0000000..defc31c +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + -+# This tests the search_memory Python function. -+# Based on the gdb.base/find.exp testcase. ++# This file is part of the GDB testsuite. It tests the mechanism ++# exposing inferiors to Python. + +if $tracelevel then { + strace $tracelevel +} + -+# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... -+# Run a test named NAME, consisting of multiple lines of input. -+# After each input line INPUT, search for result line RESULT. -+# Succeed if all results are seen; fail otherwise. -+proc gdb_py_test_multiple {name args} { -+ global gdb_prompt -+ foreach {input result} $args { -+ if {[gdb_test_multiple $input "$name - $input" { -+ -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { -+ pass "$name - $input" -+ } -+ }]} { -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+set testfile "find" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { -+ untested find.exp -+ return -1 -+} ++# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir ++ ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 ++} ++ ++set testfile "python-inferior" ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${testfile} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 ++} ++ +gdb_load ${binfile} + -+gdb_test_multiple "python print 'hello, world!'" "verify python support" { -+ -re "not supported.*$gdb_prompt $" { -+ unsupported "python support is disabled" -+ return -1 -+ } -+ -re "$gdb_prompt $" {} ++# The following tests require execution. ++ ++if ![runto_main] then { ++ fail "Can't run to main" ++ return 0 +} + -+gdb_test "break $srcfile:stop_here" \ -+ "Breakpoint.*at.* file .*$srcfile, line.*" \ -+ "breakpoint function in file" ++runto [gdb_get_line_number "Break here."] + -+gdb_run_cmd -+gdb_expect { -+ -re "Breakpoint \[0-9\]+,.*stop_here.* at .*$srcfile:.*$gdb_prompt $" { -+ pass "run until function breakpoint" -+ } -+ -re "$gdb_prompt $" { -+ fail "run until function breakpoint" -+ } -+ timeout { -+ fail "run until function breakpoint (timeout)" -+ } -+} ++# Test basic gdb.Inferior attributes and methods. + -+# We've now got the target program in a state where we can test "find". ++gdb_py_test_silent_cmd "python inferiors = gdb.inferiors ()" "get inferiors list" 1 ++gdb_test "python print inferiors" "\\(,\\)" "verify inferiors list" ++gdb_py_test_silent_cmd "python i0 = inferiors\[0\]" "get first inferior" 0 ++ ++gdb_test "python print 'result =', i0 == inferiors\[0\]" " = True" "test equality comparison (true)" ++gdb_test "python print 'result =', i0.num" " = \[0-9\]+" "test Inferior.num" ++gdb_test "python print 'result =', i0.pid" " = \[0-9\]+" "test Inferior.pid" ++gdb_test "python print 'result =', i0.was_attached" " = False" "test Inferior.was_attached" ++gdb_test "python print i0.threads ()" "\\(,\\)" "test Inferior.threads" ++ ++# Test memory read and write operations. ++ ++gdb_py_test_silent_cmd "python addr = gdb.selected_frame ().read_var ('str')" \ ++ "read str address" 0 ++gdb_py_test_silent_cmd "python str = gdb.inferiors()\[0\].read_memory (addr, 5)" \ ++ "read str contents" 1 ++gdb_py_test_silent_cmd "python str\[1\] = 'a'" "change str" 0 ++gdb_py_test_silent_cmd "python gdb.inferiors()\[0\].write_memory (addr, str)" \ ++ "write str" 1 ++gdb_test "print str" " = 0x\[\[:xdigit:\]\]+ \"hallo, testsuite\"" \ ++ "ensure str was changed in the inferior" ++ ++# Test memory search. + +set hex_number {0x[0-9a-fA-F][0-9a-fA-F]*} +set dec_number {[0-9]+} @@ -40826,35 +23147,35 @@ index 0000000..defc31c +gdb_test "py start_addr = search_buf.address" "" "" +gdb_test "py length = search_buf.type.sizeof" "" "" + -+gdb_test "py print gdb.search_memory (start_addr, length, 'aaa')" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 'aaa')" \ + "${two_patterns_found}" "find string pattern" + +# Test not finding pattern because search range too small, with +# potential find at the edge of the range. + -+gdb_test "py print gdb.search_memory (start_addr, 10+3, 'aaaa')" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, 10+3, 'aaaa')" \ + "${pattern_not_found}" "pattern not found at end of range" + +# Increase the search range by 1 and we should find the pattern. + -+gdb_test "py print gdb.search_memory (start_addr, 10+3+1, \['a', 'a', 'a', 'a'\])" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, 10+3+1, \['a', 'a', 'a', 'a'\])" \ + "${one_pattern_found}" "pattern found at end of range" + +# Test max-count with size, with different parameter position + -+gdb_test "py print gdb.search_memory (start_addr, length, \[0x61, 0x61\], 1, 1)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, \[0x61, 0x61\], 1, 1)" \ + "${one_pattern_found}" "size = 1, max_count = 1" + -+gdb_test "py print gdb.search_memory (start_addr, length, \[0x61, 0x61\], 1, 2)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, \[0x61, 0x61\], 1, 2)" \ + "${two_patterns_found}" "size = 1, max_count = 2, normal ordering" + -+gdb_test "py print gdb.search_memory (start_addr, length, \[0x61, 0x61\], size = 1, max_count = 2)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, \[0x61, 0x61\], size = 1, max_count = 2)" \ + "${two_patterns_found}" "size = 1, max_count = 2, normal ordering, with keywords" + -+gdb_test "py print gdb.search_memory (start_addr, length, \[0x61, 0x61\], max_count = 2, size = 1)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, \[0x61, 0x61\], max_count = 2, size = 1)" \ + "${two_patterns_found}" "size = 1, max_count = 2, inverted ordering" + -+gdb_test "py print gdb.search_memory (start_addr, length, \['a', 'a'\], max_count = 2)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, \['a', 'a'\], max_count = 2)" \ + "${two_patterns_found}" "max_count = 2, with keyword" + +# Test 16-bit pattern. @@ -40865,10 +23186,10 @@ index 0000000..defc31c +gdb_test "py length = search_buf.type.sizeof" "" "" +gdb_test "py pattern = gdb.parse_and_eval ('(int16_t) 0x1234')" "" "" + -+gdb_test "py print gdb.search_memory (start_addr, length, 0x1234, 2)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 0x1234, 2)" \ + "${one_pattern_found}" "find 16-bit pattern, with python pattern" + -+gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, pattern)" \ + "${one_pattern_found}" "find 16-bit pattern, with value pattern" + +# Test 32-bit pattern. @@ -40879,9 +23200,9 @@ index 0000000..defc31c +gdb_test "py length = search_buf.type.sizeof" "" "" +gdb_test "py pattern = gdb.parse_and_eval ('(int32_t) 0x12345678')" "" "" + -+gdb_test "py print gdb.search_memory (start_addr, length, 0x12345678, 4)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 0x12345678, 4)" \ + "${one_pattern_found}" "find 32-bit pattern, with python pattern" -+gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, pattern)" \ + "${one_pattern_found}" "find 32-bit pattern, with value pattern" + +# Test 64-bit pattern. @@ -40892,9 +23213,9 @@ index 0000000..defc31c +gdb_test "py length = search_buf.type.sizeof" "" "" +gdb_test "py pattern = gdb.parse_and_eval ('(int64_t) 0xfedcba9876543210LL')" "" "" + -+gdb_test "py print gdb.search_memory (start_addr, length, 0xfedcba9876543210, 8)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 0xfedcba9876543210, 8)" \ + "${one_pattern_found}" "find 64-bit pattern, with python pattern" -+gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, pattern)" \ + "${one_pattern_found}" "find 64-bit pattern, with value pattern" + +# Test mixed-sized patterns. @@ -40908,7 +23229,7 @@ index 0000000..defc31c +gdb_test "py pattern2 = gdb.parse_and_eval ('(int16_t) 0x6363')" "" "" +gdb_test "py pattern3 = gdb.parse_and_eval ('(int32_t) 0x64646464')" "" "" + -+gdb_test "py print gdb.search_memory (start_addr, 100, \[pattern1, pattern2, pattern3\])" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, 100, \[pattern1, pattern2, pattern3\])" \ + "${one_pattern_found}" "find mixed-sized pattern" + +# Test search spanning a large range, in the particular case of native @@ -40922,7 +23243,7 @@ index 0000000..defc31c +gdb_test "py start_addr = gdb.selected_frame ().read_var ('search_buf')" "" "" +gdb_test "py length = gdb.selected_frame ().read_var ('search_buf_size')" "" "" + -+gdb_test "py print gdb.search_memory (start_addr, length, 0x12345678, 4)" \ ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 0x12345678, 4)" \ + "${two_patterns_found}" "search spanning large range" + +# For native targets, test a pattern straddling a chunk boundary. @@ -40930,51 +23251,14 @@ index 0000000..defc31c +if [isnative] { + gdb_test "set *(int32_t*) &search_buf\[${CHUNK_SIZE}-1\] = 0xfdb97531" "" "" + -+ gdb_test "py print gdb.search_memory (start_addr, length, 0xfdb97531, 4)" \ ++ gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 0xfdb97531, 4)" \ + "${one_pattern_found}" "find pattern straddling chunk boundary" +} -diff --git a/gdb/testsuite/gdb.python/python-cmd.exp b/gdb/testsuite/gdb.python/python-cmd.exp -index 6c73ff2..f6ef938 100644 ---- a/gdb/testsuite/gdb.python/python-cmd.exp -+++ b/gdb/testsuite/gdb.python/python-cmd.exp -@@ -92,6 +92,32 @@ gdb_py_test_multiple "input subcommand" \ - - gdb_test "prefix_cmd subcmd ugh" "subcmd output, arg = ugh" "call subcmd" - -+# Test prefix command using keyword arguments. -+ -+gdb_py_test_multiple "input prefix command, keyword arguments" \ -+ "python" "" \ -+ "class prefix_cmd2 (gdb.Command):" "" \ -+ " def __init__ (self):" "" \ -+ " super (prefix_cmd2, self).__init__ (\"prefix_cmd2\", gdb.COMMAND_OBSCURE, prefix = True, completer_class = gdb.COMPLETE_FILENAME)" "" \ -+ " def invoke (self, arg, from_tty):" "" \ -+ " print \"prefix_cmd2 output, arg = %s\" % arg" "" \ -+ "prefix_cmd2 ()" "" \ -+ "end" "" -+ -+gdb_test "prefix_cmd2 argh" "prefix_cmd2 output, arg = argh" "call prefix command, keyword arguments" -+ -+gdb_py_test_multiple "input subcommand under prefix_cmd2" \ -+ "python" "" \ -+ "class subcmd (gdb.Command):" "" \ -+ " def __init__ (self):" "" \ -+ " super (subcmd, self).__init__ (\"prefix_cmd2 subcmd\", gdb.COMMAND_OBSCURE)" "" \ -+ " def invoke (self, arg, from_tty):" "" \ -+ " print \"subcmd output, arg = %s\" % arg" "" \ -+ "subcmd ()" "" \ -+ "end" "" -+ -+gdb_test "prefix_cmd2 subcmd ugh" "subcmd output, arg = ugh" "call subcmd under prefix_cmd2" -+ - # Test a subcommand in an existing GDB prefix. - - gdb_py_test_multiple "input new subcommand" \ -diff --git a/gdb/testsuite/gdb.python/python-frame.c b/gdb/testsuite/gdb.python/python-frame.c +diff --git a/gdb/testsuite/gdb.python/python-infthread.c b/gdb/testsuite/gdb.python/python-infthread.c new file mode 100644 index 0000000..22eb9f2 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-frame.c ++++ b/gdb/testsuite/gdb.python/python-infthread.c @@ -0,0 +1,14 @@ +int f2 (int a) +{ @@ -40990,12 +23274,12 @@ index 0000000..22eb9f2 +{ + return f1 (1, 2); +} -diff --git a/gdb/testsuite/gdb.python/python-frame.exp b/gdb/testsuite/gdb.python/python-frame.exp +diff --git a/gdb/testsuite/gdb.python/python-infthread.exp b/gdb/testsuite/gdb.python/python-infthread.exp new file mode 100644 -index 0000000..674c25e +index 0000000..d444554 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-frame.exp -@@ -0,0 +1,92 @@ ++++ b/gdb/testsuite/gdb.python/python-infthread.exp +@@ -0,0 +1,58 @@ +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -41012,46 +23296,34 @@ index 0000000..674c25e +# along with this program. If not, see . + +# This file is part of the GDB testsuite. It tests the mechanism -+# exposing values to Python. ++# exposing inferior threads to Python. + +if $tracelevel then { + strace $tracelevel +} + -+set testfile "python-frame" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested "Couldn't compile ${srcfile}" -+ return -1 -+} -+ -+# Run a command in GDB, and report a failure if a Python exception is thrown. -+# If report_pass is true, report a pass if no exception is thrown. -+proc gdb_py_test_silent_cmd {cmd name report_pass} { -+ global gdb_prompt -+ -+ gdb_test_multiple $cmd $name { -+ -re "Traceback.*$gdb_prompt $" { fail $name } -+ -re "$gdb_prompt $" { if $report_pass { pass $name } } -+ } -+} -+ +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} + -+gdb_test_multiple "python print 'hello, world!'" "verify python support" { -+ -re "not supported.*$gdb_prompt $" { -+ unsupported "python support is disabled" -+ return -1 -+ } -+ -re "$gdb_prompt $" {} ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 +} + ++set testfile "python-infthread" ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${testfile} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 ++} ++ ++gdb_load ${binfile} ++ +# The following tests require execution. + +if ![runto_main] then { @@ -41059,904 +23331,340 @@ index 0000000..674c25e + return 0 +} + -+gdb_breakpoint "f2" -+gdb_continue_to_breakpoint "breakpoint at f2" -+gdb_test "up" "" "" ++runto [gdb_get_line_number "Break here."] + -+gdb_py_test_silent_cmd "python frames = gdb.frames ()" "get frames list" 1 -+gdb_test "python print frames" "\\(, , \\)" "verify frames list" -+gdb_py_test_silent_cmd "python f0 = frames\[0\]" "get first frame" 0 -+gdb_py_test_silent_cmd "python f1 = frames\[1\]" "get second frame" 0 ++# Test basic gdb.Inferior attributes and methods. + -+gdb_test "python print 'result =', f0.equals (f1)" " = False" "test equals (false)" -+gdb_test "python print 'result =', f0.equals (f0)" " = True" "test equals (true)" -+gdb_test "python print 'result =', f0.is_valid ()" " = True" "test Frame.is_valid" -+gdb_test "python print 'result =', f0.name ()" " = f2" "test Frame.name" -+gdb_test "python print 'result =', f0.type () == gdb.NORMAL_FRAME" " = True" "test Frame.type" -+gdb_test "python print 'result =', f0.unwind_stop_reason () == gdb.FRAME_UNWIND_NO_REASON" " = True" "test Frame.type" -+gdb_test "python print 'result =', gdb.frame_stop_reason_string (gdb.FRAME_UNWIND_INNER_ID)" " = previous frame inner to this frame \\(corrupt stack\\?\\)" "test gdb.frame_stop_reason_string" -+gdb_test "python print 'result =', f0.pc ()" " = \[0-9\]+" "test Frame.pc" -+gdb_test "python print 'result =', f0.addr_in_block ()" " = \[0-9\]+" "test Frame.addr_in_block" -+gdb_test "python print 'result =', f0.older ().equals (f1)" " = True" "test Frame.older" -+gdb_test "python print 'result =', f1.newer ().equals (f0)" " = True" "test Frame.newer" -+gdb_test "python print 'result =', f0.read_var ('variable_which_surely_doesnt_exist')" \ -+ "ValueError: variable 'variable_which_surely_doesnt_exist' not found.*Error while executing Python code." \ -+ "test Frame.read_var - error" -+gdb_test "python print 'result =', f0.read_var ('a')" " = 1" "test Frame.read_var - success" -+ -+gdb_test "python print 'result =', gdb.newest_frame ().equals (f0)" " = True" "test gdb.newest_frame" -+gdb_test "python print 'result =', gdb.selected_frame ().equals (f1)" " = True" "test gdb.selected_frame" -+ -+gdb_test "python print 'result =', f0.block ()" "" "test Frame.block" -diff --git a/gdb/testsuite/gdb.python/python-function.exp b/gdb/testsuite/gdb.python/python-function.exp -new file mode 100644 -index 0000000..7feca2b ---- /dev/null -+++ b/gdb/testsuite/gdb.python/python-function.exp -@@ -0,0 +1,79 @@ -+# Copyright (C) 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This file is part of the GDB testsuite. It tests the mechanism -+# exposing convenience functions to Python. -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... -+# Run a test named NAME, consisting of multiple lines of input. -+# After each input line INPUT, search for result line RESULT. -+# Succeed if all results are seen; fail otherwise. -+proc gdb_py_test_multiple {name args} { -+ global gdb_prompt -+ foreach {input result} $args { -+ if {[gdb_test_multiple $input "$name - $input" { -+ -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { -+ pass "$name - $input" -+ } -+ }]} { -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+# Start with a fresh gdb. -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+ -+gdb_test_multiple "python print 'hello, world!'" "verify python support" { -+ -re "not supported.*$gdb_prompt $" { -+ unsupported "python support is disabled" -+ return -1 -+ } -+ -re "$gdb_prompt $" {} -+} -+ -+gdb_py_test_multiple "input convenience function" \ -+ "python" "" \ -+ "class test_func (gdb.Function):" "" \ -+ " def __init__ (self):" "" \ -+ " super (test_func, self).__init__ (\"test_func\")" "" \ -+ " def invoke (self, arg):" "" \ -+ " return \"test_func output, arg = %s\" % arg.string ()" "" \ -+ "test_func ()" "" \ -+ "end" "" -+ -+gdb_test "print \$test_func (\"ugh\")" "= \"test_func output, arg = ugh\"" "call function" -+ -+# Test returning a gdb.Value from the function. This segfaulted GDB at one point. -+ -+gdb_py_test_multiple "input value-returning convenience function" \ -+ "python" "" \ -+ "class Double (gdb.Function):" "" \ -+ " def __init__ (self):" "" \ -+ " super (Double, self).__init__ (\"double\")" "" \ -+ " def invoke (self, n):" "" \ -+ " return n*2" "" \ -+ "Double ()" "" \ -+ "end" "" -+ -+gdb_test "print \$double (1)" "= 2" "call value-returning function" ++gdb_py_test_silent_cmd "python t0 = gdb.selected_thread ()" "test gdb.selected_thread" 1 ++gdb_test "python print t0" "\\" "verify InferiorThread object" ++gdb_test "python print 'result =', t0.num" " = \[0-9\]+" "test Inferior.num" diff --git a/gdb/testsuite/gdb.python/python-mi.exp b/gdb/testsuite/gdb.python/python-mi.exp -new file mode 100644 -index 0000000..5c9f3c7 ---- /dev/null +index 3258810..e7bfe54 100644 +--- a/gdb/testsuite/gdb.python/python-mi.exp +++ b/gdb/testsuite/gdb.python/python-mi.exp -@@ -0,0 +1,124 @@ -+# Copyright (C) 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This file is part of the GDB testsuite. It tests Python-based -+# pretty-printing for MI. -+ -+load_lib mi-support.exp -+set MIFLAGS "-i=mi2" -+ -+gdb_exit -+if [mi_gdb_start] { -+ continue -+} -+ -+set testfile "python-prettyprint" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DMI}] != "" } { -+ untested mi2-var-child.exp -+ return -1 -+} -+ -+mi_delete_breakpoints -+mi_gdb_reinitialize_dir $srcdir/$subdir -+mi_gdb_load ${binfile} -+ -+if {[lsearch -exact [mi_get_features] python] < 0} { -+ unsupported "python support is disabled" -+ return -1 -+} -+ -+mi_runto main -+ -+mi_gdb_test "python execfile ('${srcdir}/${subdir}/${testfile}.py')" "" -+ -+mi_continue_to_line [gdb_get_line_number {MI breakpoint here} ${testfile}.c] \ -+ "step to breakpoint" -+ -+mi_create_floating_varobj container c "create container varobj" +@@ -48,7 +48,21 @@ mi_gdb_test "python execfile ('${srcdir}/${subdir}/${testfile}.py')" "" + mi_continue_to_line [gdb_get_line_number {MI breakpoint here} ${testfile}.c] \ + "step to breakpoint" + +-mi_create_floating_varobj container c "create container varobj" ++mi_create_floating_varobj container c \ ++ "create container varobj, no pretty-printing" + +mi_list_varobj_children container { -+} "examine container children=0" ++ { container.name name 1 string } ++ { container.len len 0 int } ++ { container.elements elements 1 "int ." } ++} "examine container children=0, no pretty-printing" + -+mi_next "next over update 1" ++mi_delete_varobj container "delete varobj" + -+mi_varobj_update_dynamic container { -+ { {container.\[0\]} {\[0\]} 0 int } -+} "varobj update 1" ++mi_gdb_test "-enable-pretty-printing" "" + -+mi_next "next over update 2" -+ -+mi_varobj_update_dynamic container { -+ { {container.\[0\]} {\[0\]} 0 int } -+ { {container.\[1\]} {\[1\]} 0 int } -+} "varobj update 2" -+ -+mi_gdb_test "-var-set-visualizer container None" \ -+ "\\^done" \ -+ "clear visualizer" -+ -+mi_gdb_test "-var-update container" \ -+ "\\^done,changelist=\\\[\\\]" \ -+ "varobj update after clearing" -+ -+mi_gdb_test "-var-set-visualizer container gdb.default_visualizer" \ -+ "\\^done" \ -+ "choose default visualizer" -+ -+mi_varobj_update_dynamic container { -+ { {container.\[0\]} {\[0\]} 0 int } -+ { {container.\[1\]} {\[1\]} 0 int } -+} "varobj update after choosing default" -+ -+mi_gdb_test "-var-set-visualizer container ContainerPrinter" \ -+ "\\^done" \ -+ "choose visualizer using expression" -+ -+mi_varobj_update_dynamic container { -+ { {container.\[0\]} {\[0\]} 0 int } -+ { {container.\[1\]} {\[1\]} 0 int } -+} "varobj update after choosing via expression" -+ -+mi_gdb_test "-var-set-child-range container 1 2" \ -+ "\\^done" \ -+ "select child range" -+ -+mi_gdb_test "-var-update container" \ -+ "\\^done,changelist=\\\[\\\]" \ -+ "varobj update after selecting child range" -+ -+mi_list_varobj_children_range container 2 { ++mi_create_floating_varobj container c \ ++ "create container varobj" + + mi_list_varobj_children container { + } "examine container children=0" +@@ -92,6 +106,15 @@ mi_varobj_update_dynamic container { + { {container.\[1\]} {\[1\]} 0 int } + } "varobj update after choosing via expression" + ++mi_list_varobj_children_range container 1 2 2 { + { {container.\[1\]} {\[1\]} 0 int } +} "list varobj children after selecting child range" + -+mi_gdb_test "-var-set-child-range container -1 -1" \ -+ "\\^done" \ -+ "reset child range" -+ -+mi_gdb_test "-var-update container" \ -+ "\\^done,changelist=\\\[\\\]" \ -+ "varobj update after resetting child range" -+ -+mi_list_varobj_children container { ++mi_list_varobj_children_range container -1 -1 2 { + { {container.\[0\]} {\[0\]} 0 int } + { {container.\[1\]} {\[1\]} 0 int } +} "list varobj children after resetting child range" + -+mi_continue_to_line \ -+ [gdb_get_line_number {Another MI breakpoint} ${testfile}.c] \ -+ "step to second breakpoint" -+ -+mi_varobj_update_with_type_change container int 0 "update after type change" + mi_continue_to_line \ + [gdb_get_line_number {Another MI breakpoint} ${testfile}.c] \ + "step to second breakpoint" diff --git a/gdb/testsuite/gdb.python/python-prettyprint.c b/gdb/testsuite/gdb.python/python-prettyprint.c -new file mode 100644 -index 0000000..399be23 ---- /dev/null +index 3cafc48..5cc35be 100644 +--- a/gdb/testsuite/gdb.python/python-prettyprint.c +++ b/gdb/testsuite/gdb.python/python-prettyprint.c -@@ -0,0 +1,191 @@ -+/* This testcase is part of GDB, the GNU debugger. +@@ -15,6 +15,8 @@ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + ++#include + -+ Copyright 2008, 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+struct s + struct s + { + int a; +@@ -148,6 +150,11 @@ void do_nothing(void) + c = 23; /* Another MI breakpoint */ + } + ++struct nullstr +{ -+ int a; -+ int *b; ++ char *s; +}; + -+struct ss -+{ -+ struct s a; -+ struct s b; -+}; -+ -+#ifdef __cplusplus -+struct S : public s { -+ int zs; -+}; -+ -+struct SS { -+ int zss; -+ S s; -+}; -+ -+struct SSS -+{ -+ SSS (int x, const S& r); -+ int a; -+ const S &b; -+}; -+SSS::SSS (int x, const S& r) : a(x), b(r) { } -+ -+class VirtualTest -+{ -+ private: -+ int value; -+ -+ public: -+ VirtualTest () -+ { -+ value = 1; -+ } -+}; -+ -+class Vbase1 : public virtual VirtualTest { }; -+class Vbase2 : public virtual VirtualTest { }; -+class Vbase3 : public virtual VirtualTest { }; -+ -+class Derived : public Vbase1, public Vbase2, public Vbase3 -+{ -+ private: -+ int value; -+ -+ public: -+ Derived () -+ { -+ value = 2; -+ } -+}; -+ -+#endif -+ -+typedef struct string_repr -+{ -+ struct whybother -+ { -+ const char *contents; -+ } whybother; -+} string; -+ -+/* This lets us avoid malloc. */ -+int array[100]; -+ -+struct container -+{ -+ string name; -+ int len; -+ int *elements; -+}; -+ -+typedef struct container zzz_type; -+ -+string -+make_string (const char *s) -+{ -+ string result; -+ result.whybother.contents = s; -+ return result; -+} -+ -+zzz_type -+make_container (const char *s) -+{ -+ zzz_type result; -+ -+ result.name = make_string (s); -+ result.len = 0; -+ result.elements = 0; -+ -+ return result; -+} -+ -+void -+add_item (zzz_type *c, int val) -+{ -+ if (c->len == 0) -+ c->elements = array; -+ c->elements[c->len] = val; -+ ++c->len; -+} -+ -+void init_s(struct s *s, int a) -+{ -+ s->a = a; -+ s->b = &s->a; -+} -+ -+void init_ss(struct ss *s, int a, int b) -+{ -+ init_s(&s->a, a); -+ init_s(&s->b, b); -+} -+ -+void do_nothing(void) -+{ -+ int c; -+ -+ c = 23; /* Another MI breakpoint */ -+} -+ -+int -+main () -+{ -+ struct ss ss; -+ struct ss ssa[2]; -+ string x = make_string ("this is x"); -+ zzz_type c = make_container ("container"); -+ const struct string_repr cstring = { { "const string" } }; -+ -+ init_ss(&ss, 1, 2); -+ init_ss(ssa+0, 3, 4); -+ init_ss(ssa+1, 5, 6); -+ -+#ifdef __cplusplus -+ S cps; -+ -+ cps.zs = 7; -+ init_s(&cps, 8); -+ -+ SS cpss; -+ cpss.zss = 9; -+ init_s(&cpss.s, 10); -+ -+ SS cpssa[2]; -+ cpssa[0].zss = 11; -+ init_s(&cpssa[0].s, 12); -+ cpssa[1].zss = 13; -+ init_s(&cpssa[1].s, 14); -+ -+ SSS sss(15, cps); -+ -+ SSS& ref (sss); -+ -+ Derived derived; -+ -+#endif -+ -+ add_item (&c, 23); /* MI breakpoint here */ -+ add_item (&c, 72); -+ -+#ifdef MI -+ do_nothing (); -+#endif -+ -+ return 0; /* break to inspect struct and union */ -+} + int + main () + { +@@ -156,10 +163,13 @@ main () + string x = make_string ("this is x"); + zzz_type c = make_container ("container"); + const struct string_repr cstring = { { "const string" } }; ++ /* Clearing by being `static' could invoke an other GDB C++ bug. */ ++ struct nullstr nullstr; + + init_ss(&ss, 1, 2); + init_ss(ssa+0, 3, 4); + init_ss(ssa+1, 5, 6); ++ memset (&nullstr, 0, sizeof nullstr); + + struct ns ns; + ns.null_str = "embedded\0null\0string"; diff --git a/gdb/testsuite/gdb.python/python-prettyprint.exp b/gdb/testsuite/gdb.python/python-prettyprint.exp -new file mode 100644 -index 0000000..f83b1cd ---- /dev/null +index 01d4a06..b2dc85d 100644 +--- a/gdb/testsuite/gdb.python/python-prettyprint.exp +++ b/gdb/testsuite/gdb.python/python-prettyprint.exp -@@ -0,0 +1,92 @@ -+# Copyright (C) 2008, 2009 Free Software Foundation, Inc. +@@ -27,12 +27,9 @@ set binfile ${objdir}/${subdir}/${testfile} + # Start with a fresh gdb. + gdb_exit + gdb_start +-gdb_test_multiple "python print 'hello, world!'" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 + } + + proc run_lang_tests {lang} { +@@ -86,6 +83,8 @@ proc run_lang_tests {lang} { + + gdb_test "print c" " = container $hex \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}" + ++ gdb_test "print nullstr" "RuntimeError: Error reading string from inferior.*" + -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This file is part of the GDB testsuite. It tests Python-based -+# pretty-printing for the CLI. -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+set testfile "python-prettyprint" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+ -+# Start with a fresh gdb. -+gdb_exit -+gdb_start -+gdb_test_multiple "python print 'hello, world!'" "verify python support" { -+ -re "not supported.*$gdb_prompt $" { -+ unsupported "python support is disabled" -+ return -1 -+ } -+ -re "$gdb_prompt $" {} -+} -+ -+proc run_lang_tests {lang} { -+ global srcdir subdir srcfile binfile testfile hex -+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug $lang"] != "" } { -+ untested "Couldn't compile ${srcfile} in $lang mode" -+ return -1 -+ } -+ -+ set nl "\[\r\n\]+" -+ -+ # Start with a fresh gdb. -+ gdb_exit -+ gdb_start -+ gdb_reinitialize_dir $srcdir/$subdir -+ gdb_load ${binfile} -+ -+ -+ if ![runto_main ] then { -+ perror "couldn't run to breakpoint" -+ return -+ } -+ -+ gdb_test "set print pretty on" "" -+ -+ gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \ -+ ".*Breakpoint.*" -+ gdb_test "continue" ".*Breakpoint.*" -+ -+ gdb_test "python execfile ('${srcdir}/${subdir}/${testfile}.py')" "" -+ -+ gdb_test "print ss" " = a=< a=<1> b=<$hex>> b=< a=<2> b=<$hex>>" -+ gdb_test "print ssa\[1\]" " = a=< a=<5> b=<$hex>> b=< a=<6> b=<$hex>>" -+ gdb_test "print ssa" " = {a=< a=<3> b=<$hex>> b=< a=<4> b=<$hex>>, a=< a=<5> b=<$hex>> b=< a=<6> b=<$hex>>}" -+ -+ if {$lang == "c++"} { -+ gdb_test "print cps" "= a=<8> b=<$hex>" -+ gdb_test "print cpss" " = {$nl *zss = 9, *$nl *s = a=<10> b=<$hex>$nl}" -+ gdb_test "print cpssa\[0\]" " = {$nl *zss = 11, *$nl *s = a=<12> b=<$hex>$nl}" -+ gdb_test "print cpssa\[1\]" " = {$nl *zss = 13, *$nl *s = a=<14> b=<$hex>$nl}" -+ gdb_test "print cpssa" " = {{$nl *zss = 11, *$nl *s = a=<12> b=<$hex>$nl *}, {$nl *zss = 13, *$nl *s = a=<14> b=<$hex>$nl *}}" -+ gdb_test "print sss" "= a=<15> b=< a=<8> b=<$hex>>" -+ gdb_test "print ref" "= a=<15> b=< a=<8> b=<$hex>>" -+ gdb_test "print derived" \ -+ " = \{.* = pp class name: Vbase1.* = \{.* = pp value variable is: 1,.*members of Vbase2:.*_vptr.Vbase2 = $hex.* = \{.*members of Vbase3.*members of Derived:.*value = 2.*" -+ } -+ -+ gdb_test "print x" " = $hex \"this is x\"" -+ gdb_test "print cstring" " = $hex \"const string\"" -+ -+ gdb_test "print c" " = container $hex \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}" -+ -+ gdb_test "continue" "Program exited normally\." -+} -+ -+run_lang_tests "c" -+run_lang_tests "c++" + gdb_test "continue" "Program exited normally\." + } + diff --git a/gdb/testsuite/gdb.python/python-prettyprint.py b/gdb/testsuite/gdb.python/python-prettyprint.py -new file mode 100644 -index 0000000..a53e412 ---- /dev/null +index bf009a1..c3e0dc4 100644 +--- a/gdb/testsuite/gdb.python/python-prettyprint.py +++ b/gdb/testsuite/gdb.python/python-prettyprint.py -@@ -0,0 +1,151 @@ -+# Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This file is part of the GDB testsuite. It tests python pretty -+# printers. -+ -+import re -+ -+# Test returning a Value from a printer. -+class string_print: +@@ -92,6 +92,13 @@ class pp_vbase1: + def to_string (self): + return "pp class name: " + self.val.type.tag + ++class pp_nullstr: + def __init__(self, val): + self.val = val + + def to_string(self): -+ return self.val['whybother']['contents'] ++ return self.val['s'].string(gdb.parameter('target-charset')) + -+# Test a class-based printer. -+class ContainerPrinter: -+ class _iterator: -+ def __init__ (self, pointer, len): -+ self.start = pointer -+ self.pointer = pointer -+ self.end = pointer + len -+ -+ def __iter__(self): -+ return self -+ -+ def next(self): -+ if self.pointer == self.end: -+ raise StopIteration -+ result = self.pointer -+ self.pointer = self.pointer + 1 -+ return ('[%d]' % int (result - self.start), result.dereference()) -+ -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return 'container %s with %d elements' % (self.val['name'], self.val['len']) -+ -+ def children(self): -+ return self._iterator(self.val['elements'], self.val['len']) -+ -+class pp_s: -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ a = self.val["a"] -+ b = self.val["b"] -+ if a.address != b: -+ raise Exception("&a(%s) != b(%s)" % (str(a.address), str(b))) -+ return " a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">" -+ -+class pp_ss: -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return "a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">" -+ -+class pp_sss: -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return "a=<" + str(self.val['a']) + "> b=<" + str(self.val["b"]) + ">" -+ -+class pp_multiple_virtual: -+ def __init__ (self, val): -+ self.val = val -+ -+ def to_string (self): -+ return "pp value variable is: " + str (self.val['value']) -+ -+class pp_vbase1: -+ def __init__ (self, val): -+ self.val = val -+ -+ def to_string (self): -+ return "pp class name: " + self.val.type.tag -+ -+def lookup_function (val): -+ "Look-up and return a pretty-printer that can print val." -+ -+ # Get the type. + class pp_ns: + "Print a std::basic_string of some kind" + +@@ -109,7 +116,7 @@ def lookup_function (val): + "Look-up and return a pretty-printer that can print val." + + # Get the type. +- type = val.type; + type = val.type + + # If it points to a reference, get the reference. + if type.code == gdb.TYPE_CODE_REF: +@@ -148,6 +155,9 @@ def register_pretty_printers (): + + pretty_printers_dict[re.compile ('^VirtualTest$')] = pp_multiple_virtual + pretty_printers_dict[re.compile ('^Vbase1$')] = pp_vbase1 + -+ # If it points to a reference, get the reference. -+ if type.code == gdb.TYPE_CODE_REF: -+ type = type.target () -+ -+ # Get the unqualified type, stripped of typedefs. -+ type = type.unqualified ().strip_typedefs () -+ -+ # Get the type name. -+ typename = type.tag -+ -+ if typename == None: -+ return None -+ -+ # Iterate over local dictionary of types to determine -+ # if a printer is registered for that type. Return an -+ # instantiation of the printer if found. -+ for function in pretty_printers_dict: -+ if function.match (typename): -+ return pretty_printers_dict[function] (val) -+ -+ # Cannot find a pretty printer. Return None. -+ -+ return None -+ -+ -+def register_pretty_printers (): -+ pretty_printers_dict[re.compile ('^struct s$')] = pp_s -+ pretty_printers_dict[re.compile ('^s$')] = pp_s -+ pretty_printers_dict[re.compile ('^S$')] = pp_s -+ -+ pretty_printers_dict[re.compile ('^struct ss$')] = pp_ss -+ pretty_printers_dict[re.compile ('^ss$')] = pp_ss -+ pretty_printers_dict[re.compile ('^const S &$')] = pp_s -+ pretty_printers_dict[re.compile ('^SSS$')] = pp_sss -+ -+ pretty_printers_dict[re.compile ('^VirtualTest$')] = pp_multiple_virtual -+ pretty_printers_dict[re.compile ('^Vbase1$')] = pp_vbase1 -+ -+ # Note that we purposely omit the typedef names here. -+ # Printer lookup is based on canonical name. -+ # However, we do need both tagged and untagged variants, to handle -+ # both the C and C++ cases. -+ pretty_printers_dict[re.compile ('^struct string_repr$')] = string_print -+ pretty_printers_dict[re.compile ('^struct container$')] = ContainerPrinter -+ pretty_printers_dict[re.compile ('^string_repr$')] = string_print -+ pretty_printers_dict[re.compile ('^container$')] = ContainerPrinter -+ -+pretty_printers_dict = {} -+ -+register_pretty_printers () -+gdb.pretty_printers.append (lookup_function) -diff --git a/gdb/testsuite/gdb.python/python-template.cc b/gdb/testsuite/gdb.python/python-template.cc -new file mode 100644 -index 0000000..bd6a212 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/python-template.cc -@@ -0,0 +1,30 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+template -+struct Foo { -+}; -+ -+#ifndef TYPE -+#define TYPE int -+#endif -+ -+int main() -+{ -+ Foo foo; -+ return 0; // break here -+} ++ pretty_printers_dict[re.compile ('^struct nullstr$')] = pp_nullstr ++ pretty_printers_dict[re.compile ('^nullstr$')] = pp_nullstr + + # Note that we purposely omit the typedef names here. + # Printer lookup is based on canonical name. diff --git a/gdb/testsuite/gdb.python/python-template.exp b/gdb/testsuite/gdb.python/python-template.exp -new file mode 100644 -index 0000000..1ace5d6 ---- /dev/null +index 1ace5d6..b80f56e 100644 +--- a/gdb/testsuite/gdb.python/python-template.exp +++ b/gdb/testsuite/gdb.python/python-template.exp -@@ -0,0 +1,75 @@ -+# Copyright (C) 2008, 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This file is part of the GDB testsuite. It tests the mechanism -+# exposing values to Python. -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+set testfile "python-template" -+set srcfile ${testfile}.cc -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ -+ {debug c++}] != "" } { -+ untested "Couldn't compile ${srcfile}" -+ return -1 -+} -+ +@@ -20,6 +20,17 @@ if $tracelevel then { + strace $tracelevel + } + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + -+gdb_test_multiple "python print 23" "verify python support" { -+ -re "not supported.*$gdb_prompt $" { -+ unsupported "python support is disabled" -+ return -1 -+ } -+ -re "$gdb_prompt $" {} ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 +} + -+proc test_template_arg {type} { -+ global testfile srcdir subdir srcfile binfile -+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ -+ executable \ -+ [list debug c++ additional_flags="-DTYPE=$type"]] != "" } { -+ untested $type -+ return -1 -+ } -+ gdb_load ${binfile} -+ if ![runto_main ] then { -+ perror "couldn't run to breakpoint" -+ return -+ } -+ # There is no executable code in main(), so we are where we want to be -+ gdb_test "print foo" "" -+ gdb_test "python foo = gdb.history(0)" "" -+ -+ # Replace '*' with '\*' in regex. -+ regsub -all {\*} $type {\*} t -+ gdb_test "python print foo.type.template_argument(0)" $t $type -+} -+ -+test_template_arg "const int" -+test_template_arg "volatile int" -+test_template_arg "const int &" -+test_template_arg "volatile int &" -+test_template_arg "volatile int * const" -+test_template_arg "volatile int * const *" -+test_template_arg "const int * volatile" -+test_template_arg "const int * volatile * const * volatile *" -diff --git a/gdb/testsuite/gdb.python/python-value.c b/gdb/testsuite/gdb.python/python-value.c -index 17e5c62..9637fe9 100644 ---- a/gdb/testsuite/gdb.python/python-value.c -+++ b/gdb/testsuite/gdb.python/python-value.c -@@ -33,13 +33,17 @@ enum e - TWO = 2 - }; + set testfile "python-template" + set srcfile ${testfile}.cc + set binfile ${objdir}/${subdir}/${testfile} +@@ -29,20 +40,6 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ + return -1 + } -+typedef struct s *PTR; -+ - enum e evalue = TWO; - - int - main (int argc, char *argv[]) - { -+ char *cp = argv[0]; /* Prevent gcc from optimizing argv[] out. */ - struct s s; - union u u; -+ PTR x = &s; - - s.a = 3; - s.b = 5; +-# Start with a fresh gdb. +- +-gdb_exit +-gdb_start +-gdb_reinitialize_dir $srcdir/$subdir +- +-gdb_test_multiple "python print 23" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} +-} +- + proc test_template_arg {type} { + global testfile srcdir subdir srcfile binfile + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ diff --git a/gdb/testsuite/gdb.python/python-value.exp b/gdb/testsuite/gdb.python/python-value.exp -index 8f5e0ab..c1a051c 100644 +index 19cabeb..ccf438f 100644 --- a/gdb/testsuite/gdb.python/python-value.exp +++ b/gdb/testsuite/gdb.python/python-value.exp -@@ -70,6 +70,9 @@ proc test_value_creation {} { - gdb_py_test_silent_cmd "python a = gdb.Value (u'unicode test')" "create unicode value" 1 - gdb_test "python print a" "\"unicode test\"" "print Unicode string" - gdb_test "python print a.__class__" "" "verify type of unicode string" -+ -+ # Test address attribute is None in a non-addressable value -+ gdb_test "python print 'result =', i.address" "= None" "Test address attribute in non-addressable value" +@@ -20,43 +20,6 @@ if $tracelevel then { + strace $tracelevel } - proc test_value_numeric_ops {} { -@@ -225,6 +228,43 @@ proc test_value_in_inferior {} { +-set testfile "python-value" +-set srcfile ${testfile}.c +-set binfile ${objdir}/${subdir}/${testfile} +-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { +- untested "Couldn't compile ${srcfile}" +- return -1 +-} +- +-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... +-# Run a test named NAME, consisting of multiple lines of input. +-# After each input line INPUT, search for result line RESULT. +-# Succeed if all results are seen; fail otherwise. +-proc gdb_py_test_multiple {name args} { +- global gdb_prompt +- foreach {input result} $args { +- if {[gdb_test_multiple $input "$name - $input" { +- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { +- pass "$name - $input" +- } +- }]} { +- return 1 +- } +- } +- return 0 +-} +- +-# Run a command in GDB, and report a failure if a Python exception is thrown. +-# If report_pass is true, report a pass if no exception is thrown. +-proc gdb_py_test_silent_cmd {cmd name report_pass} { +- global gdb_prompt +- +- gdb_test_multiple $cmd $name { +- -re "Traceback.*$gdb_prompt $" { fail $name } +- -re "$gdb_prompt $" { if $report_pass { pass $name } } +- } +-} +- + proc test_value_creation {} { + global gdb_prompt - # Check that the dereferenced value is sane - gdb_test "python print arg0" "0x.*$testfile\"" "verify dereferenced value" -+ -+ # Smoke-test is_optimized_out attribute -+ gdb_test "python print 'result =', arg0.is_optimized_out" "= False" "Test is_optimized_out attribute" -+ -+ # Test address attribute -+ gdb_test "python print 'result =', arg0.address" "= 0x\[\[:xdigit:\]\]+" "Test address attribute" +@@ -292,21 +255,37 @@ proc test_value_after_death {} { + "print value's type" + } + ++# Regression test for a cast failure. The bug was that if we cast a ++# value to its own type, gdb could crash. This happened because we ++# could end up double-freeing a struct value. ++proc test_cast_regression {} { ++ gdb_test "python v = gdb.Value(5)" "" "create value for cast test" ++ gdb_test "python v = v.cast(v.type)" "" "cast value for cast test" ++ gdb_test "python print v" "5" "print value for cast test" +} + -+proc test_value_after_death {} { -+ # Construct a type while the inferior is still running. -+ gdb_py_test_silent_cmd "python ptrtype = gdb.lookup_type('PTR')" \ -+ "create PTR type" 1 -+ -+ # Check the type has the expected name. -+ gdb_test "python print ptrtype" "PTR" \ -+ "check initial PTR type" -+ -+ # Kill the inferior and remove the symbols. -+ gdb_test "kill" "" "kill the inferior" \ -+ "Kill the program being debugged. .y or n. $" \ -+ "y" -+ gdb_test "file" "" "Discard the symbols" \ -+ "Discard symbol table from.*y or n. $" \ -+ "y" -+ -+ # Now create a value using that type. Relies on arg0, created by -+ # test_value_in_inferior. -+ gdb_py_test_silent_cmd "python castval = arg0.cast(ptrtype.pointer())" \ -+ "cast arg0 to PTR" 1 -+ -+ # Make sure the type is deleted. -+ gdb_py_test_silent_cmd "python ptrtype = None" \ -+ "delete PTR type" 1 -+ -+ # Now see if the value's type is still valid. -+ gdb_test "python print castval.type" "PTR \\*" \ -+ "print value's type" + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir +-gdb_load ${binfile} + +-gdb_test_multiple "python print 'hello, world!'" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 } - -@@ -256,3 +296,4 @@ if ![runto_main] then { - } ++set testfile "python-value" ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${testfile} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 ++} ++ ++gdb_load ${binfile} ++ + test_value_creation + test_value_numeric_ops + test_value_boolean +@@ -322,3 +301,4 @@ if ![runto_main] then { test_value_in_inferior -+test_value_after_death + test_value_after_death ++test_cast_regression +diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp +index 5223fc8..03e1eab 100644 +--- a/gdb/testsuite/gdb.python/python.exp ++++ b/gdb/testsuite/gdb.python/python.exp +@@ -26,30 +26,9 @@ gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + +-gdb_test_multiple "python print 23" "verify python support" { +- -re "not supported.*$gdb_prompt $" { +- unsupported "python support is disabled" +- return -1 +- } +- -re "$gdb_prompt $" {} +-} +- +-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... +-# Run a test named NAME, consisting of multiple lines of input. +-# After each input line INPUT, search for result line RESULT. +-# Succeed if all results are seen; fail otherwise. +-proc gdb_py_test_multiple {name args} { +- global gdb_prompt +- foreach {input result} $args { +- if {[gdb_test_multiple $input "$name - $input" { +- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { +- pass "$name - $input" +- } +- }]} { +- return 1 +- } +- } +- return 0 ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 + } + + gdb_py_test_multiple "multi-line python command" \ diff --git a/gdb/testsuite/lib/cp-support.exp b/gdb/testsuite/lib/cp-support.exp index dbd2f59..44e1b51 100644 --- a/gdb/testsuite/lib/cp-support.exp @@ -41979,167 +23687,130 @@ index dbd2f59..44e1b51 100644 # Check the actual key. It would be nice to require that it match diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp -index 820ab20..8b8e7c6 100644 +index 0c93a73..d0c3493 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp -@@ -1162,9 +1162,12 @@ proc default_gdb_start { } { - global gdb_prompt - global timeout - global gdb_spawn_id; -+ global env +@@ -27,6 +27,7 @@ if {$tool == ""} { + } - gdb_stop_suppressing_tests; + load_lib libgloss.exp ++load_lib python-support.exp -+ set env(LC_CTYPE) C -+ - verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS" + global GDB - if [info exists gdb_spawn_id] { diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp -index f62c240..bda7ea1 100644 +index 9b4c464..33f277a 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp -@@ -1237,6 +1237,21 @@ proc mi_varobj_update_with_type_change { name new_type new_children testname } { +@@ -1258,7 +1258,7 @@ proc mi_varobj_update_dynamic {name children testname} { + set er "\\^done,changelist=\\\[" + + append er "{name=\"$name\",in_scope=\"true\",type_changed=\"false\"" +- append er ",children=\\\[$children_exp_j.*\\\]}\\\]" ++ append er ",children=\\\[$children_exp_j.*\\\],has_more=\".\"}\\\]" + + verbose -log "Expecting: $er" mi_gdb_test "-var-update $name" $er $testname - } - -+# Update a dynamic varobj named NAME. CHILDREN is a list of children, -+# in the same form as mi_list_varobj_children. TESTNAME is the name -+# of the test. -+proc mi_varobj_update_dynamic {name children testname} { -+ set children_exp_j [mi_child_regexp $children 0] -+ -+ set er "\\^done,changelist=\\\[" -+ -+ append er "{name=\"$name\",in_scope=\"true\",type_changed=\"false\"" -+ append er ",children=\\\[$children_exp_j.*\\\]}\\\]" -+ -+ verbose -log "Expecting: $er" -+ mi_gdb_test "-var-update $name" $er $testname -+} -+ - proc mi_check_varobj_value { name value testname } { - - mi_gdb_test "-var-evaluate-expression $name" \ -@@ -1244,6 +1259,42 @@ proc mi_check_varobj_value { name value testname } { - $testname - } - -+# Helper proc which constructs a child regexp for -+# mi_list_varobj_children and mi_varobj_update_dynamic. -+proc mi_child_regexp {children add_child} { -+ set children_exp {} -+ set whatever "\"\[^\"\]+\"" -+ -+ if {$add_child} { -+ set pre "child=" -+ } else { -+ set pre "" -+ } -+ -+ foreach item $children { -+ -+ set name [lindex $item 0] -+ set exp [lindex $item 1] -+ set numchild [lindex $item 2] -+ if {[llength $item] == 5} { -+ set type [lindex $item 3] -+ set value [lindex $item 4] -+ -+ lappend children_exp\ -+ "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\"$value\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" -+ } elseif {[llength $item] == 4} { -+ set type [lindex $item 3] -+ -+ lappend children_exp\ -+ "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" -+ } else { -+ lappend children_exp\ -+ "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread-id=\"\[0-9\]+\")?}" -+ } -+ } -+ return [join $children_exp ","] -+} -+ - # Check the results of the: - # - # -var-list-children VARNAME -@@ -1265,39 +1316,23 @@ proc mi_check_varobj_value { name value testname } { +@@ -1328,14 +1328,13 @@ proc mi_child_regexp {children add_child} { # have no value. # proc mi_list_varobj_children { varname children testname } { -+ mi_list_varobj_children_range $varname [llength $children] $children \ -+ $testname -+} +- mi_list_varobj_children_range $varname [llength $children] $children \ ++ mi_list_varobj_children_range $varname "" "" [llength $children] $children \ + $testname + } -+# Like mi_list_varobj_children, but assumes that a subrange has been -+# selected with -var-set-child-range. NUMCHILDREN is the total number -+# of children. -+proc mi_list_varobj_children_range {varname numchildren children testname} { +-# Like mi_list_varobj_children, but assumes that a subrange has been +-# selected with -var-set-child-range. NUMCHILDREN is the total number +-# of children. +-proc mi_list_varobj_children_range {varname numchildren children testname} { ++# Like mi_list_varobj_children, but sets a subrange. NUMCHILDREN is ++# the total number of children. ++proc mi_list_varobj_children_range {varname from to numchildren children testname} { set options "" if {[llength $varname] == 2} { set options [lindex $varname 1] - set varname [lindex $varname 0] +@@ -1351,9 +1350,18 @@ proc mi_list_varobj_children_range {varname numchildren children testname} { + set expected "\\^done,numchild=\"0\"" } -- set numchildren [llength $children] -- set children_exp {} - set whatever "\"\[^\"\]+\"" ++ if {"$to" == ""} { ++ append expected ",has_more=\"0\"" ++ } elseif {$to >= 0 && $numchildren > $to} { ++ append expected ",has_more=\"1\"" ++ } else { ++ append expected ",has_more=\"0\"" ++ } ++ + verbose -log "Expecting: $expected" -- foreach item $children { -- -- set name [lindex $item 0] -- set exp [lindex $item 1] -- set numchild [lindex $item 2] -- if {[llength $item] == 5} { -- set type [lindex $item 3] -- set value [lindex $item 4] -- -- lappend children_exp\ -- "child={name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\"$value\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" -- } elseif {[llength $item] == 4} { -- set type [lindex $item 3] -- -- lappend children_exp\ -- "child={name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" -- } else { -- lappend children_exp\ -- "child={name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread-id=\"\[0-9\]+\")?}" -- } -- } -- set children_exp_j [join $children_exp ","] -+ set children_exp_j [mi_child_regexp $children 1] - if {$numchildren} { - set expected "\\^done,numchild=\".*\",children=\\\[$children_exp_j.*\\\]" - } { -@@ -1770,3 +1805,25 @@ proc mi_check_thread_states { xstates test } { - verbose -log "expecting: $pattern" - mi_gdb_test "-thread-info" $pattern $test +- mi_gdb_test "-var-list-children $options $varname" $expected $testname ++ mi_gdb_test "-var-list-children $options $varname $from $to" \ ++ $expected $testname } + + # Verifies that variable object VARNAME has NUMBER children, +diff --git a/gdb/testsuite/lib/python-support.exp b/gdb/testsuite/lib/python-support.exp +new file mode 100644 +index 0000000..b8e9836 +--- /dev/null ++++ b/gdb/testsuite/lib/python-support.exp +@@ -0,0 +1,53 @@ ++global python_supported_saved + -+# Return a list of MI features supported by this gdb. -+proc mi_get_features {} { -+ global expect_out mi_gdb_prompt ++# Return 1 if Python scripting is supported in GDB, 0 if not. ++proc python_supported { } { ++ global gdb_prompt ++ global python_supported_saved + -+ send_gdb "-list-features\n" ++ if [info exists python_supported_saved] { ++ verbose "python_supported: returning saved $python_supported_saved" 2 ++ return $python_supported_saved ++ } + -+ gdb_expect { -+ -re "\\^done,features=\\\[(.*)\\\]\r\n$mi_gdb_prompt$" { -+ regsub -all -- \" $expect_out(1,string) "" features -+ return [split $features ,] -+ } -+ -re ".*\r\n$mi_gdb_prompt$" { -+ verbose -log "got $expect_out(buffer)" -+ return "" -+ } -+ timeout { -+ verbose -log "timeout in mi_gdb_prompt" -+ return "" ++ gdb_test_multiple "python print 'hello, world!'" "verify python support" { ++ -re "not supported.*$gdb_prompt $" { ++ return [set python_supported_saved 0] ++ } ++ -re "$gdb_prompt $" { ++ return [set python_supported_saved 1] ++ } ++ } ++ ++ return [set python_supported_saved 0] ++} ++ ++# Run a command in GDB, and report a failure if a Python exception is thrown. ++# If report_pass is true, report a pass if no exception is thrown. ++proc gdb_py_test_silent_cmd {cmd name report_pass} { ++ global gdb_prompt ++ ++ gdb_test_multiple $cmd $name { ++ -re "Traceback.*$gdb_prompt $" { fail $name } ++ -re "$gdb_prompt $" { if $report_pass { pass $name } } ++ } ++} ++ ++# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... ++# Run a test named NAME, consisting of multiple lines of input. ++# After each input line INPUT, search for result line RESULT. ++# Succeed if all results are seen; fail otherwise. ++proc gdb_py_test_multiple {name args} { ++ global gdb_prompt ++ ++ foreach {input result} $args { ++ if {[gdb_test_multiple $input "$name - $input" { ++ -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { ++ pass "$name - $input" ++ } ++ }]} { ++ return 1 + } + } ++ return 0 +} diff --git a/gdb/thread.c b/gdb/thread.c -index 9dea7c2..326e44e 100644 +index a7ac3c8..815c82d 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -61,7 +61,6 @@ static int thread_alive (struct thread_info *); @@ -42150,7 +23821,7 @@ index 9dea7c2..326e44e 100644 /* Frontend view of the thread state. Possible extensions: stepping, finishing, until(ling),... */ -@@ -459,16 +458,23 @@ thread_alive (struct thread_info *tp) +@@ -497,16 +496,23 @@ thread_alive (struct thread_info *tp) return 1; } @@ -42180,10 +23851,10 @@ index 9dea7c2..326e44e 100644 } diff --git a/gdb/top.c b/gdb/top.c -index d676f02..d6b17f0 100644 +index de49418..237e575 100644 --- a/gdb/top.c +++ b/gdb/top.c -@@ -377,6 +377,7 @@ execute_command (char *p, int from_tty) +@@ -378,6 +378,7 @@ execute_command (char *p, int from_tty) } free_all_values (); @@ -42191,42 +23862,20 @@ index d676f02..d6b17f0 100644 /* Force cleanup of any alloca areas if using C alloca instead of a builtin alloca. */ -@@ -1246,7 +1247,8 @@ quit_target (void *arg) - struct qt_args *qt = (struct qt_args *)arg; - - /* Kill or detach all inferiors. */ -- iterate_over_inferiors (kill_or_detach, qt); -+ if (target_has_execution) -+ iterate_over_inferiors (kill_or_detach, qt); - - /* Give all pushed targets a chance to do minimal cleanup, and pop - them all out. */ -diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c -index 83df64e..003ef3a 100644 ---- a/gdb/tracepoint.c -+++ b/gdb/tracepoint.c -@@ -1587,7 +1587,7 @@ encode_actions (struct tracepoint *t, char ***tdp_actions, - case UNOP_MEMVAL: - /* safe because we know it's a simple expression */ - tempval = evaluate_expression (exp); -- addr = VALUE_ADDRESS (tempval) + value_offset (tempval); -+ addr = value_address (tempval); - len = TYPE_LENGTH (check_typedef (exp->elts[1].type)); - add_memrange (collect, memrange_absolute, addr, len); - break; diff --git a/gdb/typeprint.c b/gdb/typeprint.c -index 1f824fa..4a92a13 100644 +index 8133ad0..0af62e1 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c -@@ -35,6 +35,7 @@ +@@ -35,6 +35,8 @@ #include "gdb_string.h" #include "exceptions.h" #include "valprint.h" +#include "dwarf2loc.h" ++ #include extern void _initialize_typeprint (void); -@@ -76,6 +77,9 @@ void +@@ -76,6 +78,9 @@ void type_print (struct type *type, char *varstring, struct ui_file *stream, int show) { @@ -42236,7 +23885,7 @@ index 1f824fa..4a92a13 100644 LA_PRINT_TYPE (type, varstring, stream, show, 0); } -@@ -115,7 +119,8 @@ whatis_exp (char *exp, int show) +@@ -115,7 +120,8 @@ whatis_exp (char *exp, int show) { struct expression *expr; struct value *val; @@ -42246,7 +23895,7 @@ index 1f824fa..4a92a13 100644 struct type *real_type = NULL; struct type *type; int full = 0; -@@ -126,12 +131,13 @@ whatis_exp (char *exp, int show) +@@ -126,12 +132,13 @@ whatis_exp (char *exp, int show) if (exp) { expr = parse_expression (exp); @@ -42257,11 +23906,11 @@ index 1f824fa..4a92a13 100644 else val = access_value_history (0); -+ object_address_set (VALUE_ADDRESS (val)); ++ object_address_set (value_raw_address (val)); type = value_type (val); get_user_print_options (&opts); -@@ -168,8 +174,7 @@ whatis_exp (char *exp, int show) +@@ -168,8 +175,7 @@ whatis_exp (char *exp, int show) type_print (type, "", gdb_stdout, show); printf_filtered ("\n"); @@ -42271,25 +23920,23 @@ index 1f824fa..4a92a13 100644 } static void -@@ -236,7 +241,7 @@ print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream) - break; - - case TYPE_CODE_CHAR: -- LA_PRINT_CHAR ((unsigned char) val, stream); -+ LA_PRINT_CHAR ((unsigned char) val, type, stream); - break; - - case TYPE_CODE_BOOL: diff --git a/gdb/typeprint.h b/gdb/typeprint.h -index f561310..b39fd17 100644 +index f561310..d261c79 100644 --- a/gdb/typeprint.h +++ b/gdb/typeprint.h -@@ -26,4 +26,6 @@ void print_type_scalar (struct type * type, LONGEST, struct ui_file *); +@@ -20,10 +20,13 @@ + #ifndef TYPEPRINT_H + #define TYPEPRINT_H + ++enum language; + struct ui_file; + + void print_type_scalar (struct type * type, LONGEST, struct ui_file *); void c_type_print_varspec_suffix (struct type *, struct ui_file *, int, int, int); + -+void c_type_print_args (struct type *, struct ui_file *, int); ++void c_type_print_args (struct type *, struct ui_file *, int, enum language); #endif diff --git a/gdb/ui-file.c b/gdb/ui-file.c index 02a0314..5c8c96e 100644 @@ -42361,232 +24008,47 @@ index 1562d5a..d86a7eb 100644 extern long ui_file_read (struct ui_file *file, char *buf, long length_buf); diff --git a/gdb/utils.c b/gdb/utils.c -index 9224839..88a9a39 100644 +index eb75f2e..1e246b8 100644 --- a/gdb/utils.c +++ b/gdb/utils.c -@@ -272,6 +272,19 @@ make_cleanup_fclose (FILE *file) - } - - static void -+do_obstack_free (void *arg) -+{ -+ struct obstack *ob = arg; -+ obstack_free (ob, NULL); -+} +@@ -2605,7 +2605,10 @@ fprintf_symbol_filtered (struct ui_file *stream, char *name, + As an extra hack, string1=="FOO(ARGS)" matches string2=="FOO". + This "feature" is useful when searching for matching C++ function names + (such as if the user types 'break FOO', where FOO is a mangled C++ +- function). */ ++ function). + -+struct cleanup * -+make_cleanup_obstack_free (struct obstack *obstack) -+{ -+ return make_cleanup (do_obstack_free, obstack); -+} -+ -+static void - do_ui_file_delete (void *arg) - { - ui_file_delete (arg); -@@ -1554,21 +1567,33 @@ query (const char *ctlstr, ...) - va_end (args); - } ++ As an extra-special hack, we do the same with ' ', so that ++ "FOO(ARGS) const" can match "FOO", too. */ --/* Print an error message saying that we couldn't make sense of a -- \^mumble sequence in a string or character constant. START and END -- indicate a substring of some larger string that contains the -- erroneous backslash sequence, missing the initial backslash. */ --static NORETURN int --no_control_char_error (const char *start, const char *end) -+/* A helper for parse_escape that converts a host character to a -+ target character. C is the host character. If conversion is -+ possible, then the target character is stored in *TARGET_C and the -+ function returns 1. Otherwise, the function returns 0. */ -+ -+static int -+host_char_to_target (int c, int *target_c) - { -- int len = end - start; -- char *copy = alloca (end - start + 1); -+ struct obstack host_data; -+ char the_char = c; -+ struct cleanup *cleanups; -+ int result = 0; -+ -+ obstack_init (&host_data); -+ cleanups = make_cleanup_obstack_free (&host_data); -+ -+ convert_between_encodings (target_charset (), host_charset (), -+ &the_char, 1, 1, &host_data, translit_none); - -- memcpy (copy, start, len); -- copy[len] = '\0'; -+ if (obstack_object_size (&host_data) == 1) -+ { -+ result = 1; -+ *target_c = *(char *) obstack_base (&host_data); -+ } - -- error (_("There is no control character `\\%s' in the `%s' character set."), -- copy, target_charset ()); -+ do_cleanups (cleanups); -+ return result; - } - - /* Parse a C escape sequence. STRING_PTR points to a variable -@@ -1591,53 +1616,13 @@ parse_escape (char **string_ptr) - { - int target_char; - int c = *(*string_ptr)++; -- if (c_parse_backslash (c, &target_char)) -- return target_char; -- else -- switch (c) -- { -+ switch (c) -+ { - case '\n': - return -2; - case 0: - (*string_ptr)--; - return 0; -- case '^': -- { -- /* Remember where this escape sequence started, for reporting -- errors. */ -- char *sequence_start_pos = *string_ptr - 1; -- -- c = *(*string_ptr)++; -- -- if (c == '?') -- { -- /* XXXCHARSET: What is `delete' in the host character set? */ -- c = 0177; -- -- if (!host_char_to_target (c, &target_char)) -- error (_("There is no character corresponding to `Delete' " -- "in the target character set `%s'."), host_charset ()); -- -- return target_char; -- } -- else if (c == '\\') -- target_char = parse_escape (string_ptr); -- else -- { -- if (!host_char_to_target (c, &target_char)) -- no_control_char_error (sequence_start_pos, *string_ptr); -- } -- -- /* Now target_char is something like `c', and we want to find -- its control-character equivalent. */ -- if (!target_char_to_control_char (target_char, &target_char)) -- no_control_char_error (sequence_start_pos, *string_ptr); -- -- return target_char; -- } -- -- /* XXXCHARSET: we need to use isdigit and value-of-digit -- methods of the host character set here. */ - - case '0': - case '1': -@@ -1648,16 +1633,16 @@ parse_escape (char **string_ptr) - case '6': - case '7': - { -- int i = c - '0'; -+ int i = host_hex_value (c); - int count = 0; - while (++count < 3) - { - c = (**string_ptr); -- if (c >= '0' && c <= '7') -+ if (isdigit (c) && c != '8' && c != '9') - { - (*string_ptr)++; - i *= 8; -- i += c - '0'; -+ i += host_hex_value (c); - } - else - { -@@ -1666,14 +1651,39 @@ parse_escape (char **string_ptr) - } - return i; + int + strcmp_iw (const char *string1, const char *string2) +@@ -2630,7 +2633,7 @@ strcmp_iw (const char *string1, const char *string2) + string2++; } -- default: -- if (!host_char_to_target (c, &target_char)) -- error -- ("The escape sequence `\%c' is equivalent to plain `%c', which" -- " has no equivalent\n" "in the `%s' character set.", c, c, -- target_charset ()); -- return target_char; -- } -+ -+ case 'a': -+ c = '\a'; -+ break; -+ case 'b': -+ c = '\b'; -+ break; -+ case 'f': -+ c = '\f'; -+ break; -+ case 'n': -+ c = '\n'; -+ break; -+ case 'r': -+ c = '\r'; -+ break; -+ case 't': -+ c = '\t'; -+ break; -+ case 'v': -+ c = '\v'; -+ break; -+ -+ default: -+ break; -+ } -+ -+ if (!host_char_to_target (c, &target_char)) -+ error -+ ("The escape sequence `\%c' is equivalent to plain `%c', which" -+ " has no equivalent\n" "in the `%s' character set.", c, c, -+ target_charset ()); -+ return target_char; + } +- return (*string1 != '\0' && *string1 != '(') || (*string2 != '\0'); ++ return (*string1 != ' ' && *string1 != '\0' && *string1 != '(') || (*string2 != '\0' && *string2 != '('); } - - /* Print the character C on STREAM as part of the contents of a literal -diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c -index 9850de4..285fe3f 100644 ---- a/gdb/v850-tdep.c -+++ b/gdb/v850-tdep.c -@@ -705,7 +705,7 @@ v850_push_dummy_call (struct gdbarch *gdbarch, - if (!v850_type_is_scalar (value_type (*args)) - && TYPE_LENGTH (value_type (*args)) > E_MAX_RETTYPE_SIZE_IN_REGS) - { -- store_unsigned_integer (valbuf, 4, VALUE_ADDRESS (*args)); -+ store_unsigned_integer (valbuf, 4, value_address (*args)); - len = 4; - val = valbuf; - } + + /* This is like strcmp except that it ignores whitespace and treats diff --git a/gdb/valarith.c b/gdb/valarith.c -index f38cdb8..8e103cf 100644 +index a9c875d..12f6f07 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c -@@ -164,9 +164,9 @@ an integer nor a pointer of the same type.")); +@@ -139,7 +139,6 @@ an integer nor a pointer of the same type.")); struct value * - value_subscript (struct value *array, struct value *idx) + value_subscript (struct value *array, LONGEST index) { - struct value *bound; int c_style = current_language->c_style_arrays; struct type *tarray; -+ LONGEST index = value_as_long (idx); - array = coerce_ref (array); - tarray = check_typedef (value_type (array)); -@@ -179,13 +179,26 @@ value_subscript (struct value *array, struct value *idx) +@@ -154,12 +153,26 @@ value_subscript (struct value *array, LONGEST index) get_discrete_bounds (range_type, &lowerbound, &upperbound); if (VALUE_LVAL (array) != lval_memory) -- return value_subscripted_rvalue (array, idx, lowerbound); +- return value_subscripted_rvalue (array, index, lowerbound); + { + if (index >= lowerbound && index <= upperbound) + { @@ -42600,9 +24062,8 @@ index f38cdb8..8e103cf 100644 if (c_style == 0) { -- LONGEST index = value_as_long (idx); if (index >= lowerbound && index <= upperbound) -- return value_subscripted_rvalue (array, idx, lowerbound); +- return value_subscripted_rvalue (array, index, lowerbound); + { + CORE_ADDR element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (tarray)); + CORE_ADDR offset = (index - lowerbound) * element_size; @@ -42612,29 +24073,7 @@ index f38cdb8..8e103cf 100644 /* Emit warning unless we have an array of unknown size. An array of unknown size has lowerbound 0 and upperbound -1. */ if (upperbound > -1) -@@ -194,49 +207,52 @@ value_subscript (struct value *array, struct value *idx) - c_style = 1; - } - -- if (lowerbound != 0) -- { -- bound = value_from_longest (value_type (idx), (LONGEST) lowerbound); -- idx = value_binop (idx, bound, BINOP_SUB); -- } -- -+ index -= lowerbound; - array = value_coerce_array (array); - } - - if (c_style) -- return value_ind (value_ptradd (array, idx)); -+ { -+ struct value *idx; -+ -+ idx = value_from_longest (builtin_type_int32, index); -+ return value_ind (value_ptradd (array, idx)); -+ } - else +@@ -178,33 +191,37 @@ value_subscript (struct value *array, LONGEST index) error (_("not an array or string")); } @@ -42648,13 +24087,12 @@ index f38cdb8..8e103cf 100644 + check_typedef (TYPE_TARGET_TYPE (array_type)). */ struct value * --value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound) +-value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound) +value_subscripted_rvalue (struct value *array, CORE_ADDR offset) { struct type *array_type = check_typedef (value_type (array)); struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type)); - unsigned int elt_size = TYPE_LENGTH (elt_type); -- LONGEST index = value_as_long (idx); - unsigned int elt_offs = elt_size * longest_to_int (index - lowerbound); struct value *v; @@ -42685,7 +24123,7 @@ index f38cdb8..8e103cf 100644 } diff --git a/gdb/valops.c b/gdb/valops.c -index 9810f2b..14c562e 100644 +index 5e5c4ed..59c9018 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -38,6 +38,7 @@ @@ -42696,19 +24134,7 @@ index 9810f2b..14c562e 100644 #include #include "gdb_string.h" -@@ -254,9 +255,8 @@ value_cast_structs (struct type *type, struct value *v2) - if (v) - { - /* Downcasting is possible (t1 is superclass of v2). */ -- CORE_ADDR addr2 = VALUE_ADDRESS (v2); -- addr2 -= (VALUE_ADDRESS (v) -- + value_offset (v) -+ CORE_ADDR addr2 = value_address (v2); -+ addr2 -= (value_address (v) - + value_embedded_offset (v)); - return value_at (type, addr2); - } -@@ -371,8 +371,6 @@ value_cast (struct type *type, struct value *arg2) +@@ -369,8 +370,6 @@ value_cast (struct type *type, struct value *arg2) new_length = val_length / element_length; if (val_length % element_length != 0) warning (_("array element type size does not divide object size in cast")); @@ -42717,16 +24143,7 @@ index 9810f2b..14c562e 100644 range_type = create_range_type ((struct type *) NULL, TYPE_TARGET_TYPE (range_type), low_bound, -@@ -511,7 +509,7 @@ value_cast (struct type *type, struct value *arg2) - } - else if (VALUE_LVAL (arg2) == lval_memory) - return value_at_lazy (type, -- VALUE_ADDRESS (arg2) + value_offset (arg2)); -+ value_address (arg2)); - else if (code1 == TYPE_CODE_VOID) - { - return value_zero (builtin_type_void, not_lval); -@@ -568,6 +566,64 @@ value_one (struct type *type, enum lval_type lv) +@@ -565,6 +564,64 @@ value_one (struct type *type, enum lval_type lv) return val; } @@ -42756,7 +24173,7 @@ index 9810f2b..14c562e 100644 + +/* Return non-zero if the variable is valid. If it is valid the function + may store the data address (DW_AT_DATA_LOCATION) of TYPE at *ADDRESS_RETURN. -+ You must set *ADDRESS_RETURN as VALUE_ADDRESS (VAL) before calling this ++ You must set *ADDRESS_RETURN from value_raw_address (VAL) before calling this + function. If no DW_AT_DATA_LOCATION is present for TYPE the address at + *ADDRESS_RETURN is left unchanged. ADDRESS_RETURN must not be NULL, use + object_address_data_not_valid () for just the data validity check. */ @@ -42791,31 +24208,13 @@ index 9810f2b..14c562e 100644 /* Return a value with type TYPE located at ADDR. Call value_at only if the data needs to be fetched immediately; -@@ -593,7 +649,7 @@ value_at (struct type *type, CORE_ADDR addr) - read_memory (addr, value_contents_all_raw (val), TYPE_LENGTH (type)); - - VALUE_LVAL (val) = lval_memory; -- VALUE_ADDRESS (val) = addr; -+ set_value_address (val, addr); - - return val; - } -@@ -611,7 +667,7 @@ value_at_lazy (struct type *type, CORE_ADDR addr) - val = allocate_value_lazy (type); - - VALUE_LVAL (val) = lval_memory; -- VALUE_ADDRESS (val) = addr; -+ set_value_address (val, addr); - - return val; - } -@@ -637,11 +693,19 @@ value_fetch_lazy (struct value *val) - allocate_value_contents (val); - if (VALUE_LVAL (val) == lval_memory) +@@ -652,11 +709,19 @@ value_fetch_lazy (struct value *val) + } + else if (VALUE_LVAL (val) == lval_memory) { -- CORE_ADDR addr = VALUE_ADDRESS (val) + value_offset (val); +- CORE_ADDR addr = value_address (val); - int length = TYPE_LENGTH (check_typedef (value_enclosing_type (val))); -+ CORE_ADDR addr = VALUE_ADDRESS (val); ++ CORE_ADDR addr = value_raw_address (val); + + if (object_address_get_data (value_type (val), &addr)) + { @@ -42833,64 +24232,27 @@ index 9810f2b..14c562e 100644 } else if (VALUE_LVAL (val) == lval_register) { -@@ -709,7 +773,7 @@ value_fetch_lazy (struct value *val) - VALUE_REGNUM (new_val)); - else if (VALUE_LVAL (new_val) == lval_memory) - fprintf_unfiltered (gdb_stdlog, " address=0x%s", -- paddr_nz (VALUE_ADDRESS (new_val))); -+ paddr_nz (value_address (new_val))); - else - fprintf_unfiltered (gdb_stdlog, " computed"); - -@@ -813,16 +877,15 @@ value_assign (struct value *toval, struct value *fromval) - error (_("Can't handle bitfields which don't fit in a %d bit word."), - (int) sizeof (LONGEST) * HOST_CHAR_BIT); - -- read_memory (VALUE_ADDRESS (toval) + value_offset (toval), -- buffer, changed_len); -+ read_memory (value_address (toval), buffer, changed_len); - modify_field (buffer, value_as_long (fromval), - value_bitpos (toval), value_bitsize (toval)); -- changed_addr = VALUE_ADDRESS (toval) + value_offset (toval); -+ changed_addr = value_address (toval); - dest_buffer = buffer; - } - else - { -- changed_addr = VALUE_ADDRESS (toval) + value_offset (toval); -+ changed_addr = value_address (toval); - changed_len = TYPE_LENGTH (type); - dest_buffer = value_contents (fromval); - } -@@ -985,11 +1048,11 @@ value_repeat (struct value *arg1, int count) - - val = allocate_repeat_value (value_enclosing_type (arg1), count); - -- read_memory (VALUE_ADDRESS (arg1) + value_offset (arg1), -+ read_memory (value_address (arg1), - value_contents_all_raw (val), - TYPE_LENGTH (value_enclosing_type (val))); - VALUE_LVAL (val) = lval_memory; -- VALUE_ADDRESS (val) = VALUE_ADDRESS (arg1) + value_offset (arg1); -+ set_value_address (val, value_address (arg1)); - - return val; - } -@@ -1036,10 +1099,11 @@ address_of_variable (struct symbol *var, struct block *b) - - val = value_of_variable (var, b); - -- if ((VALUE_LVAL (val) == lval_memory && value_lazy (val)) -+ if ((VALUE_LVAL (val) == lval_memory && value_lazy (val) -+ && object_address_get_data (type, &VALUE_ADDRESS (val))) +@@ -1061,7 +1126,18 @@ address_of_variable (struct symbol *var, struct block *b) + if ((VALUE_LVAL (val) == lval_memory && value_lazy (val)) || TYPE_CODE (type) == TYPE_CODE_FUNC) { -- CORE_ADDR addr = VALUE_ADDRESS (val); -+ CORE_ADDR addr = value_address (val); +- CORE_ADDR addr = value_address (val); ++ CORE_ADDR addr; ++ ++ if (VALUE_LVAL (val) == lval_memory) ++ { ++ addr = value_raw_address (val); ++ if (!object_address_get_data (type, &addr)) ++ error (_("Can't take address of memory lvalue \"%s\"."), ++ SYMBOL_PRINT_NAME (var)); ++ set_value_address (val, addr); ++ } ++ ++ addr = value_address (val); return value_from_pointer (lookup_pointer_type (type), addr); } -@@ -1145,6 +1209,7 @@ struct value * +@@ -1167,6 +1243,7 @@ struct value * value_coerce_array (struct value *arg1) { struct type *type = check_typedef (value_type (arg1)); @@ -42898,120 +24260,21 @@ index 9810f2b..14c562e 100644 /* If the user tries to do something requiring a pointer with an array that has not yet been pushed to the target, then this would -@@ -1154,8 +1219,12 @@ value_coerce_array (struct value *arg1) +@@ -1176,8 +1253,12 @@ value_coerce_array (struct value *arg1) if (VALUE_LVAL (arg1) != lval_memory) error (_("Attempt to take address of value not located in memory.")); -+ address = VALUE_ADDRESS (arg1); ++ address = value_raw_address (arg1); + if (!object_address_get_data (type, &address)) + error (_("Attempt to take address of non-valid value.")); + return value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)), -- (VALUE_ADDRESS (arg1) + value_offset (arg1))); +- value_address (arg1)); + address + value_offset (arg1)); } /* Given a value which is a function, return a value which is a pointer -@@ -1170,7 +1239,7 @@ value_coerce_function (struct value *arg1) - error (_("Attempt to take address of value not located in memory.")); - - retval = value_from_pointer (lookup_pointer_type (value_type (arg1)), -- (VALUE_ADDRESS (arg1) + value_offset (arg1))); -+ (value_address (arg1))); - return retval; - } - -@@ -1205,8 +1274,7 @@ value_addr (struct value *arg1) - - /* Get target memory address */ - arg2 = value_from_pointer (lookup_pointer_type (value_type (arg1)), -- (VALUE_ADDRESS (arg1) -- + value_offset (arg1) -+ (value_address (arg1) - + value_embedded_offset (arg1))); - - /* This may be a pointer to a base subobject; so remember the -@@ -1352,6 +1420,24 @@ value_array (int lowbound, int highbound, struct value **elemvec) - return val; - } - -+struct value * -+value_typed_string (char *ptr, int len, struct type *char_type) -+{ -+ struct value *val; -+ int lowbound = current_language->string_lower_bound; -+ int highbound = len / TYPE_LENGTH (char_type); -+ struct type *rangetype = create_range_type ((struct type *) NULL, -+ builtin_type_int32, -+ lowbound, -+ highbound + lowbound - 1); -+ struct type *stringtype -+ = create_array_type ((struct type *) NULL, char_type, rangetype); -+ -+ val = allocate_value (stringtype); -+ memcpy (value_contents_raw (val), ptr, len); -+ return val; -+} -+ - /* Create a value for a string constant by allocating space in the - inferior, copying the data into that space, and returning the - address with type TYPE_CODE_STRING. PTR points to the string -@@ -1600,8 +1686,7 @@ search_struct_field (char *name, struct value *arg1, int offset, - - boffset = baseclass_offset (type, i, - value_contents (arg1) + offset, -- VALUE_ADDRESS (arg1) -- + value_offset (arg1) + offset); -+ value_address (arg1) + offset); - if (boffset == -1) - error (_("virtual baseclass botch")); - -@@ -1616,13 +1701,13 @@ search_struct_field (char *name, struct value *arg1, int offset, - - v2 = allocate_value (basetype); - base_addr = -- VALUE_ADDRESS (arg1) + value_offset (arg1) + boffset; -+ value_address (arg1) + boffset; - if (target_read_memory (base_addr, - value_contents_raw (v2), - TYPE_LENGTH (basetype)) != 0) - error (_("virtual baseclass botch")); - VALUE_LVAL (v2) = lval_memory; -- VALUE_ADDRESS (v2) = base_addr; -+ set_value_address (v2, base_addr); - } - else - { -@@ -1745,8 +1830,7 @@ search_struct_method (char *name, struct value **arg1p, - if (offset < 0 || offset >= TYPE_LENGTH (type)) - { - gdb_byte *tmp = alloca (TYPE_LENGTH (baseclass)); -- if (target_read_memory (VALUE_ADDRESS (*arg1p) -- + value_offset (*arg1p) + offset, -+ if (target_read_memory (value_address (*arg1p) + offset, - tmp, TYPE_LENGTH (baseclass)) != 0) - error (_("virtual baseclass botch")); - base_valaddr = tmp; -@@ -1755,8 +1839,7 @@ search_struct_method (char *name, struct value **arg1p, - base_valaddr = value_contents (*arg1p) + offset; - - base_offset = baseclass_offset (type, i, base_valaddr, -- VALUE_ADDRESS (*arg1p) -- + value_offset (*arg1p) + offset); -+ value_address (*arg1p) + offset); - if (base_offset == -1) - error (_("virtual baseclass botch")); - } -@@ -1965,7 +2048,7 @@ find_method_list (struct value **argp, char *method, - base_offset = value_offset (*argp) + offset; - base_offset = baseclass_offset (type, i, - value_contents (*argp) + base_offset, -- VALUE_ADDRESS (*argp) + base_offset); -+ value_address (*argp) + base_offset); - if (base_offset == -1) - error (_("virtual baseclass botch")); - } -@@ -2083,12 +2166,25 @@ find_overload_match (struct type **arg_types, int nargs, +@@ -2060,12 +2141,25 @@ find_overload_match (struct type **arg_types, int nargs, if (method) { gdb_assert (obj); @@ -43042,17 +24305,13 @@ index 9810f2b..14c562e 100644 fns_ptr = value_find_oload_method_list (&temp, name, 0, &num_fns, -@@ -2108,16 +2204,29 @@ find_overload_match (struct type **arg_types, int nargs, +@@ -2085,16 +2179,29 @@ find_overload_match (struct type **arg_types, int nargs, } else { - const char *qualified_name = SYMBOL_CPLUS_DEMANGLED_NAME (fsym); + const char *qualified_name = SYMBOL_NATURAL_NAME (fsym); - -- /* If we have a C++ name, try to extract just the function -- part. */ -- if (qualified_name) -- func_name = cp_func_name (qualified_name); ++ + /* If we have a function with a C++ name, try to extract just + the function part. Do not try this for non-functions (e.g. + function pointers). */ @@ -43060,7 +24319,11 @@ index 9810f2b..14c562e 100644 + && TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym))) == TYPE_CODE_FUNC) + { + func_name = cp_func_name (qualified_name); -+ + +- /* If we have a C++ name, try to extract just the function +- part. */ +- if (qualified_name) +- func_name = cp_func_name (qualified_name); + /* If cp_func_name did not remove anything, the name of the + symbol did not include scope or argument types - it was + probably a C-style function. */ @@ -43080,7 +24343,7 @@ index 9810f2b..14c562e 100644 if (func_name == NULL) { *symp = fsym; -@@ -2558,8 +2667,8 @@ check_field (struct type *type, const char *name) +@@ -2525,8 +2632,8 @@ check_field (struct type *type, const char *name) the comment before value_struct_elt_for_reference. */ struct value * @@ -43091,7 +24354,7 @@ index 9810f2b..14c562e 100644 enum noside noside) { switch (TYPE_CODE (curtype)) -@@ -2567,7 +2676,7 @@ value_aggregate_elt (struct type *curtype, +@@ -2534,7 +2641,7 @@ value_aggregate_elt (struct type *curtype, case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: return value_struct_elt_for_reference (curtype, 0, curtype, @@ -43100,43 +24363,142 @@ index 9810f2b..14c562e 100644 want_address, noside); case TYPE_CODE_NAMESPACE: return value_namespace_elt (curtype, name, -@@ -2671,7 +2780,7 @@ value_struct_elt_for_reference (struct type *domain, int offset, +@@ -2545,6 +2652,56 @@ value_aggregate_elt (struct type *curtype, + } + } + ++/* Compares the two method/function types T1 and T2 for "equality" ++ with respect to the the methods' parameters. If the types of the ++ two parameter lists are the same, returns 1; 0 otherwise. This ++ comparison may ignore any artificial parameters in T1 if ++ SKIP_ARTIFICIAL is non-zero. This function will ALWAYS skip ++ the first artificial parameter in T1, assumed to be a 'this' pointer. ++ ++ The type T2 is expected to have come from make_params (in eval.c). */ ++static int ++compare_parameters (struct type *t1, struct type *t2, int skip_artificial) ++{ ++ int start = 0; ++ ++ if (TYPE_FIELD_ARTIFICIAL (t1, 0)) ++ ++start; ++ ++ /* If skipping artificial fields, find the first real field ++ in T1. */ ++ if (skip_artificial) ++ { ++ while (start < TYPE_NFIELDS (t1) ++ && TYPE_FIELD_ARTIFICIAL (t1, start)) ++ ++start; ++ } ++ ++ /* Now compare parameters */ ++ ++ /* Special case: a method taking void. T1 will contain no ++ non-artificial fields, and T2 will contain TYPE_CODE_VOID. */ ++ if ((TYPE_NFIELDS (t1) - start) == 0 && TYPE_NFIELDS (t2) == 1 ++ && TYPE_CODE (TYPE_FIELD_TYPE (t2, 0)) == TYPE_CODE_VOID) ++ return 1; ++ ++ if ((TYPE_NFIELDS (t1) - start) == TYPE_NFIELDS (t2)) ++ { ++ int i; ++ for (i = 0; i < TYPE_NFIELDS (t2); ++i) ++ { ++ if (rank_one_type (TYPE_FIELD_TYPE (t1, start + i), ++ TYPE_FIELD_TYPE (t2, i)) ++ != 0) ++ return 0; ++ } ++ ++ return 1; ++ } ++ ++ return 0; ++} ++ + /* C++: Given an aggregate type CURTYPE, and a member name NAME, + return the address of this member as a "pointer to member" type. + If INTYPE is non-null, then it will be the type of the member we +@@ -2622,23 +2779,46 @@ value_struct_elt_for_reference (struct type *domain, int offset, + } + if (t_field_name && strcmp (t_field_name, name) == 0) + { +- int j = TYPE_FN_FIELDLIST_LENGTH (t, i); ++ int j; ++ int len = TYPE_FN_FIELDLIST_LENGTH (t, i); + struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i); + + check_stub_method_group (t, i); + +- if (intype == 0 && j > 1) +- error (_("non-unique member `%s' requires type instantiation"), name); if (intype) { - while (j--) +- while (j--) - if (TYPE_FN_FIELD_TYPE (f, j) == intype) -+ if (compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype)) - break; - if (j < 0) - error (_("no member function matches that type instantiation")); -@@ -2725,7 +2834,7 @@ value_struct_elt_for_reference (struct type *domain, int offset, - result = allocate_value (lookup_methodptr_type (TYPE_FN_FIELD_TYPE (f, j))); - cplus_make_method_ptr (value_type (result), - value_contents_writeable (result), -- VALUE_ADDRESS (v), 0); -+ value_address (v), 0); - } - } - return result; -@@ -2791,7 +2900,7 @@ value_maybe_namespace_elt (const struct type *curtype, +- break; +- if (j < 0) +- error (_("no member function matches that type instantiation")); +- } ++ for (j = 0; j < len; ++j) ++ { ++ if (compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype, 0) ++ || compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype, 1)) ++ break; ++ } ++ ++ if (j == len) ++ error (_("no member function matches that type instantiation")); } + else +- j = 0; ++ { ++ int ii; ++ /* Skip artificial methods. This is necessary if, for example, ++ the user wants to "print subclass::subclass" with only ++ one defined user constructor. There is no ambiguity in this ++ case. */ ++ for (ii = 0; ii < TYPE_FN_FIELDLIST_LENGTH (t, i); ++ ++ii) ++ { ++ if (TYPE_FN_FIELD_ARTIFICIAL (f, ii)) ++ --len; ++ } ++ ++ /* Desired method is ambiguous if more than one method is ++ defined. */ ++ if (len > 1) ++ error (_("non-unique member `%s' requires type instantiation"), name); ++ ++ /* This assumes, of course, that all artificial methods appear ++ BEFORE any concrete methods. */ ++ j = TYPE_FN_FIELDLIST_LENGTH (t, i) - 1; ++ } + + if (TYPE_FN_FIELD_STATIC_P (f, j)) + { +@@ -2752,9 +2932,9 @@ value_maybe_namespace_elt (const struct type *curtype, struct symbol *sym; struct value *result; - sym = cp_lookup_symbol_namespace (namespace_name, name, NULL, -+ sym = cp_lookup_symbol_namespace_incremental (namespace_name, name, NULL, ++ sym = cp_lookup_symbol_namespace_incremental (namespace_name, name, get_selected_block (0), - VAR_DOMAIN); +- VAR_DOMAIN); ++ VAR_DOMAIN, 0); -@@ -2884,7 +2993,7 @@ value_full_object (struct value *argp, - /* Go back by the computed top_offset from the beginning of the - object, adjusting for the embedded offset of argp if that's what - value_rtti_type used for its computation. */ -- new_val = value_at_lazy (real_type, VALUE_ADDRESS (argp) - top + -+ new_val = value_at_lazy (real_type, value_address (argp) - top + - (using_enc ? 0 : value_embedded_offset (argp))); - deprecated_set_value_type (new_val, value_type (argp)); - set_value_embedded_offset (new_val, (using_enc -@@ -2989,8 +3098,6 @@ value_slice (struct value *array, int lowbound, int length) + if (sym == NULL) + return NULL; +@@ -2896,7 +3076,7 @@ value_of_local (const char *name, int complain) + + /* Calling lookup_block_symbol is necessary to get the LOC_REGISTER + symbol instead of the LOC_ARG one (if both exist). */ +- sym = lookup_block_symbol (b, name, NULL, VAR_DOMAIN); ++ sym = lookup_block_symbol (b, name, VAR_DOMAIN); + if (sym == NULL) + { + if (complain) +@@ -2950,8 +3130,6 @@ value_slice (struct value *array, int lowbound, int length) || lowbound + length - 1 > upperbound) error (_("slice out of range")); @@ -43146,115 +24508,10 @@ index 9810f2b..14c562e 100644 TYPE_TARGET_TYPE (range_type), lowbound, diff --git a/gdb/valprint.c b/gdb/valprint.c -index b02e9df..a9e8227 100644 +index cbb5d94..cf35bf0 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c -@@ -34,6 +34,7 @@ - #include "doublest.h" - #include "exceptions.h" - #include "dfp.h" -+#include "python/python.h" - - #include - -@@ -80,7 +81,9 @@ struct value_print_options user_print_options = - 0, /* print_array_indexes */ - 0, /* deref_ref */ - 1, /* static_field_print */ -- 1 /* pascal_static_field_print */ -+ 1, /* pascal_static_field_print */ -+ 0, /* raw */ -+ 0 /* summary */ - }; - - /* Initialize *OPTS to be a copy of the user print options. */ -@@ -257,6 +260,15 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - return (0); - } - -+ if (!options->raw) -+ { -+ ret = apply_val_pretty_printer (type, valaddr, embedded_offset, -+ address, stream, recurse, options, -+ language); -+ if (ret) -+ return ret; -+ } -+ - TRY_CATCH (except, RETURN_MASK_ERROR) - { - ret = language->la_val_print (type, valaddr, embedded_offset, address, -@@ -287,6 +299,13 @@ value_check_printable (struct value *val, struct ui_file *stream) - return 0; - } - -+ if (TYPE_CODE (value_type (val)) == TYPE_CODE_INTERNAL_FUNCTION) -+ { -+ fprintf_filtered (stream, _(""), -+ value_internal_function_name (val)); -+ return 0; -+ } -+ - return 1; - } - -@@ -308,7 +327,7 @@ common_val_print (struct value *val, struct ui_file *stream, int recurse, - return 0; - - return val_print (value_type (val), value_contents_all (val), -- value_embedded_offset (val), VALUE_ADDRESS (val), -+ value_embedded_offset (val), value_address (val), - stream, recurse, options, language); - } - -@@ -324,6 +343,18 @@ value_print (struct value *val, struct ui_file *stream, - if (!value_check_printable (val, stream)) - return 0; - -+ if (!options->raw) -+ { -+ int r = apply_val_pretty_printer (value_type (val), -+ value_contents_all (val), -+ value_embedded_offset (val), -+ value_address (val), -+ stream, 0, options, -+ current_language); -+ if (r) -+ return r; -+ } -+ - return LA_VALUE_PRINT (val, stream, options); - } - -@@ -919,7 +950,8 @@ print_hex_chars (struct ui_file *stream, const gdb_byte *valaddr, - Omit any leading zero chars. */ - - void --print_char_chars (struct ui_file *stream, const gdb_byte *valaddr, -+print_char_chars (struct ui_file *stream, struct type *type, -+ const gdb_byte *valaddr, - unsigned len, enum bfd_endian byte_order) - { - const gdb_byte *p; -@@ -932,7 +964,7 @@ print_char_chars (struct ui_file *stream, const gdb_byte *valaddr, - - while (p < valaddr + len) - { -- LA_EMIT_CHAR (*p, stream, '\''); -+ LA_EMIT_CHAR (*p, type, stream, '\''); - ++p; - } - } -@@ -944,7 +976,7 @@ print_char_chars (struct ui_file *stream, const gdb_byte *valaddr, - - while (p >= valaddr) - { -- LA_EMIT_CHAR (*p, stream, '\''); -+ LA_EMIT_CHAR (*p, type, stream, '\''); - --p; - } - } -@@ -1085,6 +1117,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, +@@ -1153,6 +1153,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, for (; i < len && things_printed < options->print_max; i++) { @@ -43262,7 +24519,7 @@ index b02e9df..a9e8227 100644 if (i != 0) { if (options->prettyprint_arrays) -@@ -1104,7 +1137,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, +@@ -1172,7 +1173,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, rep1 = i + 1; reps = 1; while ((rep1 < len) && @@ -43271,129 +24528,22 @@ index b02e9df..a9e8227 100644 { ++reps; ++rep1; -@@ -1112,7 +1145,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, - - if (reps > options->repeat_count_threshold) - { -- val_print (elttype, valaddr + i * eltlen, 0, address + i * eltlen, -+ val_print (elttype, valaddr + elt_offset, 0, address + elt_offset, - stream, recurse + 1, options, current_language); - annotate_elt_rep (reps); - fprintf_filtered (stream, " ", reps); -@@ -1123,7 +1156,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, - } - else - { -- val_print (elttype, valaddr + i * eltlen, 0, address + i * eltlen, -+ val_print (elttype, valaddr + elt_offset, 0, address + elt_offset, - stream, recurse + 1, options, current_language); - annotate_elt (); - things_printed++; -@@ -1315,7 +1348,8 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, - whichever is smaller. */ - - int --val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream, -+val_print_string (struct type *elttype, CORE_ADDR addr, int len, -+ struct ui_file *stream, - const struct value_print_options *options) - { - int force_ellipsis = 0; /* Force ellipsis to be printed if nonzero. */ -@@ -1325,6 +1359,7 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream, - int bytes_read; - gdb_byte *buffer = NULL; /* Dynamically growable fetch buffer. */ - struct cleanup *old_chain = NULL; /* Top of the old cleanup chain. */ -+ int width = TYPE_LENGTH (elttype); - - /* First we need to figure out the limit on the number of characters we are - going to attempt to fetch and print. This is actually pretty simple. If -@@ -1378,7 +1413,7 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream, - { - fputs_filtered (" ", stream); - } -- LA_PRINT_STRING (stream, buffer, bytes_read / width, width, force_ellipsis, options); -+ LA_PRINT_STRING (stream, elttype, buffer, bytes_read / width, force_ellipsis, options); - } - - if (errcode != 0) -diff --git a/gdb/valprint.h b/gdb/valprint.h -index 8b65af6..4f63fa6 100644 ---- a/gdb/valprint.h -+++ b/gdb/valprint.h -@@ -84,6 +84,12 @@ struct value_print_options - /* If nonzero, print static fields for Pascal. FIXME: C++ and Java - share one flag, why not Pascal too? */ - int pascal_static_field_print; -+ -+ /* Controls Python pretty-printing. */ -+ int raw; -+ -+ /* If nonzero, print the value in "summary" form. */ -+ int summary; - }; - - /* The global print options set by the user. In general this should -@@ -134,9 +140,10 @@ extern void print_decimal_chars (struct ui_file *, const gdb_byte *, - extern void print_hex_chars (struct ui_file *, const gdb_byte *, - unsigned int, enum bfd_endian); - --extern void print_char_chars (struct ui_file *, const gdb_byte *, -- unsigned int, enum bfd_endian); -+extern void print_char_chars (struct ui_file *, struct type *, -+ const gdb_byte *, unsigned int, enum bfd_endian); - - int read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, - gdb_byte **buffer, int *bytes_read); -+ - #endif diff --git a/gdb/value.c b/gdb/value.c -index 4d4329e..5c81d83 100644 +index 65a5aa9..007e4b0 100644 --- a/gdb/value.c +++ b/gdb/value.c -@@ -36,6 +36,7 @@ +@@ -37,8 +37,10 @@ #include "block.h" #include "dfp.h" #include "objfiles.h" +#include "cli/cli-decode.h" #include "valprint.h" + #include "cli/cli-decode.h" ++#include "observer.h" #include "python/python.h" -@@ -44,6 +45,23 @@ - void _initialize_values (void); - -+/* Definition of a user function. */ -+struct internal_function -+{ -+ /* The name of the function. It is a bit odd to have this in the -+ function itself -- the user might use a differently-named -+ convenience variable to hold the function. */ -+ char *name; -+ -+ /* The handler. */ -+ internal_function_fn handler; -+ -+ /* User data for the handler. */ -+ void *cookie; -+}; -+ -+static struct cmd_list_element *functionlist; -+ - struct value - { - /* Type of value; either not an lval, or one of the various -@@ -203,6 +221,10 @@ struct value_history_chunk - static struct value_history_chunk *value_history_chain; - - static int value_history_count; /* Abs number of last entry stored */ -+ -+/* The type of internal functions. */ -+ -+static struct type *internal_fn_type; - - /* List of all value objects currently allocated - (except for those released by calls to release_value) -@@ -225,9 +247,11 @@ allocate_value_lazy (struct type *type) +@@ -257,7 +259,9 @@ allocate_value_lazy (struct type *type) val->next = all_values; all_values = val; val->type = type; @@ -43401,26 +24551,9 @@ index 4d4329e..5c81d83 100644 val->enclosing_type = type; + type_incref (type); VALUE_LVAL (val) = not_lval; -- VALUE_ADDRESS (val) = 0; -+ val->location.address = 0; + val->location.address = 0; VALUE_FRAME_ID (val) = null_frame_id; - val->offset = 0; - val->bitpos = 0; -@@ -269,13 +293,9 @@ struct value * - allocate_repeat_value (struct type *type, int count) - { - int low_bound = current_language->string_lower_bound; /* ??? */ -- /* FIXME-type-allocation: need a way to free this type when we are -- done with it. */ - struct type *range_type - = create_range_type ((struct type *) NULL, builtin_type_int32, - low_bound, count + low_bound - 1); -- /* FIXME-type-allocation: need a way to free this type when we are -- done with it. */ - return allocate_value (create_array_type ((struct type *) NULL, - type, range_type)); - } -@@ -335,6 +355,8 @@ value_type (struct value *value) +@@ -367,6 +371,8 @@ value_type (struct value *value) void deprecated_set_value_type (struct value *value, struct type *type) { @@ -43429,66 +24562,45 @@ index 4d4329e..5c81d83 100644 value->type = type; } -@@ -509,6 +531,32 @@ deprecated_value_address_hack (struct value *value) - return &value->location.address; - } - -+CORE_ADDR -+value_address (struct value *value) -+{ -+ if (value->lval == lval_internalvar -+ || value->lval == lval_internalvar_component) -+ return 0; -+ return value->location.address + value->offset; -+} -+ -+CORE_ADDR -+value_raw_address (struct value *value) -+{ -+ if (value->lval == lval_internalvar -+ || value->lval == lval_internalvar_component) -+ return 0; -+ return value->location.address; -+} -+ -+void -+set_value_address (struct value *value, CORE_ADDR addr) -+{ -+ gdb_assert (value->lval != lval_internalvar -+ && value->lval != lval_internalvar_component); -+ value->location.address = addr; -+} -+ - struct internalvar ** - deprecated_value_internalvar_hack (struct value *value) - { -@@ -547,11 +595,16 @@ value_mark (void) - return all_values; - } - -+/* Deallocate a value and run destructors if needed. */ -+ - void - value_free (struct value *val) +@@ -623,6 +629,9 @@ value_free (struct value *val) { if (val) { + type_decref (val->type); + type_decref (val->enclosing_type); + - if (VALUE_LVAL (val) == lval_computed) - { - struct lval_funcs *funcs = val->location.computed.funcs; -@@ -655,6 +708,8 @@ value_copy (struct value *arg) + gdb_assert (val->reference_count > 0); + val->reference_count--; + if (val->reference_count > 0) +@@ -642,8 +651,8 @@ value_free (struct value *val) + } + + xfree (val->contents); ++ xfree (val); + } +- xfree (val); + } + + /* Free all values allocated since MARK was obtained by value_mark +@@ -736,6 +745,9 @@ value_copy (struct value *arg) val = allocate_value_lazy (encl_type); else val = allocate_value (encl_type); ++ + type_incref (arg->type); + type_decref (val->type); val->type = arg->type; VALUE_LVAL (val) = VALUE_LVAL (arg); val->location = arg->location; -@@ -693,6 +748,7 @@ set_value_component_location (struct value *component, struct value *whole) +@@ -771,12 +783,15 @@ value_copy (struct value *arg) + void + set_value_component_location (struct value *component, struct value *whole) + { ++ CORE_ADDR addr; ++ + if (VALUE_LVAL (whole) == lval_internalvar) + VALUE_LVAL (component) = lval_internalvar_component; + else VALUE_LVAL (component) = VALUE_LVAL (whole); component->location = whole->location; @@ -43496,16 +24608,18 @@ index 4d4329e..5c81d83 100644 if (VALUE_LVAL (whole) == lval_computed) { struct lval_funcs *funcs = whole->location.computed.funcs; -@@ -700,6 +756,8 @@ set_value_component_location (struct value *component, struct value *whole) +@@ -784,6 +799,10 @@ set_value_component_location (struct value *component, struct value *whole) if (funcs->copy_closure) component->location.computed.closure = funcs->copy_closure (whole); } + -+ object_address_get_data (value_type (whole), &VALUE_ADDRESS (component)); ++ addr = value_raw_address (component); ++ object_address_get_data (value_type (whole), &addr); ++ set_value_address (component, addr); } -@@ -830,6 +888,25 @@ show_values (char *num_exp, int from_tty) +@@ -914,6 +933,29 @@ show_values (char *num_exp, int from_tty) num_exp[1] = '\0'; } } @@ -43527,142 +24641,59 @@ index 4d4329e..5c81d83 100644 + xfree (chunk); + } + value_history_count = 0; ++ ++ /* Free the unreferenced types above. */ ++ free_all_values (); ++ free_all_types (); +} /* Internal variables. These are variables within the debugger that hold values assigned by debugger commands. -@@ -878,7 +955,7 @@ init_if_undefined_command (char* args, int from_tty) - the return value is NULL. */ - - struct internalvar * --lookup_only_internalvar (char *name) -+lookup_only_internalvar (const char *name) - { - struct internalvar *var; - -@@ -894,7 +971,7 @@ lookup_only_internalvar (char *name) - NAME should not normally include a dollar sign. */ - - struct internalvar * --create_internalvar (char *name) -+create_internalvar (const char *name) - { - struct internalvar *var; - var = (struct internalvar *) xmalloc (sizeof (struct internalvar)); -@@ -902,6 +979,7 @@ create_internalvar (char *name) - var->value = allocate_value (builtin_type_void); - var->endian = gdbarch_byte_order (current_gdbarch); - var->make_value = NULL; -+ var->canonical = 0; - release_value (var->value); - var->next = internalvars; - internalvars = var; -@@ -934,7 +1012,7 @@ create_internalvar_type_lazy (char *name, internalvar_make_value fun) - one is created, with a void value. */ - - struct internalvar * --lookup_internalvar (char *name) -+lookup_internalvar (const char *name) - { - struct internalvar *var; - -@@ -1031,6 +1109,9 @@ set_internalvar (struct internalvar *var, struct value *val) - { - struct value *newval; - -+ if (var->canonical) -+ error (_("Cannot overwrite convenience function %s"), var->name); -+ - newval = value_copy (val); - newval->modifiable = 1; - -@@ -1042,7 +1123,7 @@ set_internalvar (struct internalvar *var, struct value *val) - - /* Begin code which must not call error(). If var->value points to - something free'd, an error() obviously leaves a dangling pointer. -- But we also get a danling pointer if var->value points to -+ But we also get a dangling pointer if var->value points to - something in the value chain (i.e., before release_value is - called), because after the error free_all_values will get called before - long. */ -@@ -1059,6 +1140,76 @@ internalvar_name (struct internalvar *var) - return var->name; +@@ -1388,6 +1430,37 @@ call_internal_function (struct gdbarch *gdbarch, + return (*ifn->handler) (gdbarch, language, ifn->cookie, argc, argv); } -+static struct value * -+value_create_internal_function (const char *name, -+ internal_function_fn handler, -+ void *cookie) -+{ -+ struct value *result = allocate_value (internal_fn_type); -+ gdb_byte *addr = value_contents_writeable (result); -+ struct internal_function **fnp = (struct internal_function **) addr; -+ struct internal_function *ifn = XNEW (struct internal_function); -+ ifn->name = xstrdup (name); -+ ifn->handler = handler; -+ ifn->cookie = cookie; -+ *fnp = ifn; -+ return result; -+} ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ + -+char * -+value_internal_function_name (struct value *val) -+{ -+ gdb_byte *addr = value_contents_writeable (val); -+ struct internal_function *ifn = * (struct internal_function **) addr; -+ return ifn->name; -+} -+ -+struct value * -+call_internal_function (struct value *func, int argc, struct value **argv) -+{ -+ gdb_byte *addr = value_contents_writeable (func); -+ struct internal_function *ifn = * (struct internal_function **) addr; -+ return (*ifn->handler) (ifn->cookie, argc, argv); -+} -+ -+/* The 'function' command. This does nothing -- it is just a -+ placeholder to let "help function NAME" work. This is also used as -+ the implementation of the sub-command that is created when -+ registering an internal function. */ +static void -+function_command (char *command, int from_tty) ++value_types_mark_used (void) +{ -+ /* Do nothing. */ -+} -+ -+/* Clean up if an internal function's command is destroyed. */ -+static void -+function_destroyer (struct cmd_list_element *self, void *ignore) -+{ -+ xfree (self->name); -+ xfree (self->doc); -+} -+ -+/* Add a new internal function. NAME is the name of the function; DOC -+ is a documentation string describing the function. HANDLER is -+ called when the function is invoked. COOKIE is an arbitrary -+ pointer which is passed to HANDLER and is intended for "user -+ data". */ -+void -+add_internal_function (const char *name, const char *doc, -+ internal_function_fn handler, void *cookie) -+{ -+ struct cmd_list_element *cmd; -+ struct internalvar *var = lookup_internalvar (name); -+ struct value *fnval = value_create_internal_function (name, handler, cookie); -+ set_internalvar (var, fnval); -+ var->canonical = 1; -+ -+ cmd = add_cmd (xstrdup (name), no_class, function_command, (char *) doc, -+ &functionlist); -+ cmd->destroyer = function_destroyer; ++ struct internalvar *var; ++ struct value_history_chunk *chunk; ++ ++ for (var = internalvars; var != NULL; var = var->next) ++ switch (var->kind) ++ { ++ case INTERNALVAR_VALUE: ++ type_mark_used (value_type (var->u.value)); ++ break; ++ ++ case INTERNALVAR_SCALAR: ++ type_mark_used (var->u.scalar.type); ++ break; ++ ++ } ++ ++ for (chunk = value_history_chain; chunk != NULL; chunk = chunk->next) ++ { ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE (chunk->values); i++) ++ if (chunk->values[i]) ++ type_mark_used (value_type (chunk->values[i])); ++ } +} + + /* The 'function' command. This does nothing -- it is just a + placeholder to let "help function NAME" work. This is also used as + the implementation of the sub-command that is created when +@@ -1430,17 +1503,26 @@ add_internal_function (const char *name, const char *doc, /* Update VALUE before discarding OBJFILE. COPIED_TYPES is used to prevent cycles / duplicates. */ -@@ -1067,12 +1218,21 @@ preserve_one_value (struct value *value, struct objfile *objfile, +-static void ++void + preserve_one_value (struct value *value, struct objfile *objfile, htab_t copied_types) { if (TYPE_OBJFILE (value->type) == objfile) @@ -43687,35 +24718,36 @@ index 4d4329e..5c81d83 100644 + } } - /* Update the internal variables and value history when OBJFILE is -@@ -1196,7 +1356,7 @@ value_as_address (struct value *val) + /* Likewise for internal variable VAR. */ +@@ -1454,7 +1536,7 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile, + case INTERNALVAR_SCALAR: + if (var->u.scalar.type && TYPE_OBJFILE (var->u.scalar.type) == objfile) + var->u.scalar.type +- = copy_type_recursive (objfile, var->u.scalar.type, copied_types); ++ = copy_type_recursive (var->u.scalar.type, copied_types); + break; - Upon entry to this function, if VAL is a value of type `function' - (that is, TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_FUNC), then -- VALUE_ADDRESS (val) is the address of the function. This is what -+ value_address (val) is the address of the function. This is what - you'll get if you evaluate an expression like `main'. The call - to COERCE_ARRAY below actually does all the usual unary - conversions, which includes converting values of type `function' -@@ -1216,7 +1376,7 @@ value_as_address (struct value *val) - function, just return its address directly. */ - if (TYPE_CODE (value_type (val)) == TYPE_CODE_FUNC - || TYPE_CODE (value_type (val)) == TYPE_CODE_METHOD) -- return VALUE_ADDRESS (val); -+ return value_address (val); + case INTERNALVAR_VALUE: +@@ -1469,7 +1551,7 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile, + this objfile's types, and the convenience variables will be adjusted to + use the new global types. */ - val = coerce_array (val); +-void ++static void + preserve_values (struct objfile *objfile) + { + htab_t copied_types; +@@ -1490,8 +1572,7 @@ preserve_values (struct objfile *objfile) + for (var = internalvars; var; var = var->next) + preserve_one_internalvar (var, objfile, copied_types); -@@ -1447,7 +1607,7 @@ value_static_field (struct type *type, int fieldno) - } - if (retval && VALUE_LVAL (retval) == lval_memory) - SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno), -- VALUE_ADDRESS (retval)); -+ value_address (retval)); - } - return retval; +- for (val = values_in_python; val; val = val->next) +- preserve_one_value (val, objfile, copied_types); ++ preserve_python_values (objfile, copied_types); + + htab_delete (copied_types); } -@@ -1465,6 +1625,8 @@ value_change_enclosing_type (struct value *val, struct type *new_encl_type) +@@ -1857,6 +1938,8 @@ value_change_enclosing_type (struct value *val, struct type *new_encl_type) val->contents = (gdb_byte *) xrealloc (val->contents, TYPE_LENGTH (new_encl_type)); @@ -43724,7 +24756,7 @@ index 4d4329e..5c81d83 100644 val->enclosing_type = new_encl_type; return val; } -@@ -1516,6 +1678,8 @@ value_primitive_field (struct value *arg1, int offset, +@@ -1921,6 +2004,8 @@ value_primitive_field (struct value *arg1, int offset, memcpy (value_contents_all_raw (v), value_contents_all_raw (arg1), TYPE_LENGTH (value_enclosing_type (arg1))); } @@ -43733,29 +24765,7 @@ index 4d4329e..5c81d83 100644 v->type = type; v->offset = value_offset (arg1); v->embedded_offset = (offset + value_embedded_offset (arg1) -@@ -1592,7 +1756,7 @@ value_fn_field (struct value **arg1p, struct fn_field *f, int j, struct type *ty - v = allocate_value (ftype); - if (sym) - { -- VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)); -+ set_value_address (v, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))); - } - else - { -@@ -1601,9 +1765,9 @@ value_fn_field (struct value **arg1p, struct fn_field *f, int j, struct type *ty - struct objfile *objfile = msymbol_objfile (msym); - struct gdbarch *gdbarch = get_objfile_arch (objfile); - -- VALUE_ADDRESS (v) -- = gdbarch_convert_from_func_ptr_addr -- (gdbarch, SYMBOL_VALUE_ADDRESS (msym), ¤t_target); -+ set_value_address (v, -+ gdbarch_convert_from_func_ptr_addr -+ (gdbarch, SYMBOL_VALUE_ADDRESS (msym), ¤t_target)); - } - - if (arg1p) -@@ -1750,6 +1914,41 @@ pack_long (gdb_byte *buf, struct type *type, LONGEST num) +@@ -2171,6 +2256,42 @@ pack_long (gdb_byte *buf, struct type *type, LONGEST num) } @@ -43764,6 +24774,7 @@ index 4d4329e..5c81d83 100644 +void +pack_unsigned_long (gdb_byte *buf, struct type *type, ULONGEST num) +{ ++ enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type)); + int len; + + type = check_typedef (type); @@ -43778,7 +24789,7 @@ index 4d4329e..5c81d83 100644 + case TYPE_CODE_BOOL: + case TYPE_CODE_RANGE: + case TYPE_CODE_MEMBERPTR: -+ store_unsigned_integer (buf, len, num); ++ store_unsigned_integer (buf, len, byte_order, num); + break; + + case TYPE_CODE_REF: @@ -43797,7 +24808,7 @@ index 4d4329e..5c81d83 100644 /* Convert C numbers into newly allocated values. */ struct value * -@@ -1763,6 +1962,19 @@ value_from_longest (struct type *type, LONGEST num) +@@ -2184,6 +2305,19 @@ value_from_longest (struct type *type, LONGEST num) } @@ -43817,76 +24828,21 @@ index 4d4329e..5c81d83 100644 /* Create a value representing a pointer of type TYPE to the address ADDR. */ struct value * -@@ -1816,8 +2028,9 @@ value_from_contents_and_address (struct type *type, - set_value_lazy (v, 1); - else - memcpy (value_contents_raw (v), valaddr, TYPE_LENGTH (type)); -- VALUE_ADDRESS (v) = address; -- VALUE_LVAL (v) = lval_memory; -+ set_value_address (v, address); -+ if (address != 0) -+ VALUE_LVAL (v) = lval_memory; - return v; - } - -@@ -1944,4 +2157,15 @@ init-if-undefined VARIABLE = EXPRESSION\n\ - Set an internal VARIABLE to the result of the EXPRESSION if it does not\n\ - exist or does not contain a value. The EXPRESSION is not evaluated if the\n\ - VARIABLE is already initialized.")); -+ -+ add_prefix_cmd ("function", no_class, function_command, _("\ -+Placeholder command for showing help on convenience functions."), -+ &functionlist, "function ", 0, &cmdlist); -+ -+ internal_fn_type = alloc_type (OBJFILE_INTERNAL, NULL); -+ TYPE_CODE (internal_fn_type) = TYPE_CODE_INTERNAL_FUNCTION; -+ TYPE_LENGTH (internal_fn_type) = sizeof (struct internal_function *); -+ TYPE_NAME (internal_fn_type) = ""; +@@ -2342,4 +2476,9 @@ VARIABLE is already initialized.")); + add_prefix_cmd ("function", no_class, function_command, _("\ + Placeholder command for showing help on convenience functions."), + &functionlist, "function ", 0, &cmdlist); + + make_final_cleanup (value_history_cleanup, NULL); ++ ++ observer_attach_objfile_unloading (preserve_values); ++ observer_attach_mark_used (value_types_mark_used); } diff --git a/gdb/value.h b/gdb/value.h -index aa43365..1ad3c75 100644 +index 29ad783..bc96309 100644 --- a/gdb/value.h +++ b/gdb/value.h -@@ -272,12 +272,23 @@ extern void set_value_component_location (struct value *component, - extern enum lval_type *deprecated_value_lval_hack (struct value *); - #define VALUE_LVAL(val) (*deprecated_value_lval_hack (val)) - --/* If lval == lval_memory, this is the address in the inferior. If -- lval == lval_register, this is the byte offset into the registers -- structure. */ -+/* Backward compatibility for the Fedora merge branch. */ - extern CORE_ADDR *deprecated_value_address_hack (struct value *); - #define VALUE_ADDRESS(val) (*deprecated_value_address_hack (val)) - -+/* If lval == lval_memory, return the address in the inferior. If -+ lval == lval_register, return the byte offset into the registers -+ structure. Otherwise, return 0. The returned address -+ includes the offset, if any. */ -+extern CORE_ADDR value_address (struct value *); -+ -+/* Like value_address, except the result does not include value's -+ offset. */ -+extern CORE_ADDR value_raw_address (struct value *); -+ -+/* Set the address of a value. */ -+extern void set_value_address (struct value *, CORE_ADDR); -+ - /* Pointer to internal variable. */ - extern struct internalvar **deprecated_value_internalvar_hack (struct value *); - #define VALUE_INTERNALVAR(val) (*deprecated_value_internalvar_hack (val)) -@@ -314,6 +325,9 @@ struct internalvar - struct value *value; - internalvar_make_value make_value; - int endian; -+ /* True if this internalvar is the canonical name for a convenience -+ function. */ -+ int canonical; - }; - - -@@ -342,12 +356,17 @@ extern LONGEST unpack_field_as_long (struct type *type, +@@ -344,11 +344,16 @@ extern LONGEST unpack_field_as_long (struct type *type, extern void pack_long (gdb_byte *buf, struct type *type, LONGEST num); extern struct value *value_from_longest (struct type *type, LONGEST num); @@ -43895,7 +24851,6 @@ index aa43365..1ad3c75 100644 extern struct value *value_from_double (struct type *type, DOUBLEST num); extern struct value *value_from_decfloat (struct type *type, const gdb_byte *decbytes); - extern struct value *value_from_string (char *string); +extern const char *object_address_data_not_valid (struct type *type); +extern int object_address_get_data (struct type *type, @@ -43904,16 +24859,7 @@ index aa43365..1ad3c75 100644 extern struct value *value_at (struct type *type, CORE_ADDR addr); extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr); -@@ -388,6 +407,8 @@ extern struct value *value_mark (void); - - extern void value_free_to_mark (struct value *mark); - -+extern struct value *value_typed_string (char *ptr, int len, -+ struct type *char_type); - extern struct value *value_string (char *ptr, int len); - extern struct value *value_bitstring (char *ptr, int len); - -@@ -435,6 +456,7 @@ extern struct value *value_struct_elt (struct value **argp, +@@ -438,6 +443,7 @@ extern struct value *value_struct_elt (struct value **argp, extern struct value *value_aggregate_elt (struct type *curtype, char *name, @@ -43921,62 +24867,36 @@ index aa43365..1ad3c75 100644 int want_address, enum noside noside); -@@ -533,14 +555,14 @@ extern void set_internalvar_component (struct internalvar *var, - int bitpos, int bitsize, - struct value *newvalue); +@@ -658,12 +664,13 @@ extern void typedef_print (struct type *type, struct symbol *news, --extern struct internalvar *lookup_only_internalvar (char *name); -+extern struct internalvar *lookup_only_internalvar (const char *name); + extern char *internalvar_name (struct internalvar *var); --extern struct internalvar *create_internalvar (char *name); -+extern struct internalvar *create_internalvar (const char *name); +-extern void preserve_values (struct objfile *); +- + /* From values.c */ - extern struct internalvar * - create_internalvar_type_lazy (char *name, internalvar_make_value fun); + extern struct value *value_copy (struct value *); --extern struct internalvar *lookup_internalvar (char *name); -+extern struct internalvar *lookup_internalvar (const char *name); - - extern int value_equal (struct value *arg1, struct value *arg2); - -@@ -619,7 +641,7 @@ extern int common_val_print (struct value *val, - const struct value_print_options *options, - const struct language_defn *language); - --extern int val_print_string (CORE_ADDR addr, int len, int width, -+extern int val_print_string (struct type *elttype, CORE_ADDR addr, int len, - struct ui_file *stream, - const struct value_print_options *options); - -@@ -658,5 +680,22 @@ extern struct value *value_allocate_space_in_inferior (int); ++extern void preserve_one_value (struct value *value, struct objfile *objfile, ++ htab_t copied_types); ++ + /* From valops.c */ + extern struct value *varying_to_slice (struct value *); +@@ -681,7 +688,7 @@ extern struct value *value_allocate_space_in_inferior (int); extern struct value *value_of_local (const char *name, int complain); --extern struct value * value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound); -+extern struct value *value_subscripted_rvalue (struct value *array, + extern struct value *value_subscripted_rvalue (struct value *array, +- LONGEST index, int lowerbound); + CORE_ADDR offset); -+ -+/* User function handler. */ -+ -+typedef struct value *(*internal_function_fn) (void *cookie, -+ int argc, -+ struct value **argv); -+ -+void add_internal_function (const char *name, const char *doc, -+ internal_function_fn handler, -+ void *cookie); -+ -+struct value *call_internal_function (struct value *function, -+ int argc, struct value **argv); -+ -+char *value_internal_function_name (struct value *); -+ - #endif /* !defined (VALUE_H) */ + + /* User function handler. */ + diff --git a/gdb/varobj.c b/gdb/varobj.c -index 2ec6d90..1237c96 100644 +index 4a94988..9bfc130 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c -@@ -29,11 +29,20 @@ +@@ -29,11 +29,14 @@ #include "gdb_assert.h" #include "gdb_string.h" @@ -43986,59 +24906,46 @@ index 2ec6d90..1237c96 100644 #include "vec.h" #include "gdbthread.h" #include "inferior.h" -+#include "valprint.h" ++#include "observer.h" ++#include "parser-defs.h" + + #if HAVE_PYTHON + #include "python/python.h" +@@ -59,6 +62,15 @@ char *varobj_format_string[] = + /* String representations of gdb's known languages */ + char *varobj_language_string[] = { "unknown", "C", "C++", "Java" }; + ++/* True if we want to allow Python-based pretty-printing. */ ++static int pretty_printing = 0; + -+#if HAVE_PYTHON -+#include "python/python.h" -+#include "python/python-internal.h" -+#else -+typedef int PyObject; -+#endif - - /* Non-zero if we want to see trace of varobj level stuff. */ - -@@ -138,6 +147,12 @@ struct varobj - /* Children of this object. */ - VEC (varobj_p) *children; - -+ /* Whether the children of this varobj were requested. This field is -+ used to decide if dynamic varobj should recompute their children. -+ In the event that the frontend never asked for the children, we -+ can avoid that. */ -+ int children_requested; ++void ++varobj_enable_pretty_printing (void) ++{ ++ pretty_printing = 1; ++} + - /* Description of the root variable. Points to root variable for children. */ - struct varobj_root *root; + /* Data structures */ -@@ -159,6 +174,16 @@ struct varobj - not fetched if either the variable is frozen, or any parents is + /* Every root variable has one of these structures saved in its +@@ -173,6 +185,17 @@ struct varobj frozen. */ int not_fetched; -+ + + /* Sub-range of children which the MI consumer has requested. If + FROM < 0 or TO < 0, means that all children have been + requested. */ + int from; + int to; + -+ /* The pretty-printer that has been constructed. If NULL, then a -+ new printer object is needed, and one will be constructed. */ -+ PyObject *pretty_printer; - }; - - struct cpstack -@@ -190,6 +215,10 @@ static void uninstall_variable (struct varobj *); - - static struct varobj *create_child (struct varobj *, int, char *); - -+static struct varobj * -+create_child_with_value (struct varobj *parent, int index, const char *name, -+ struct value *value); ++ /* The pretty-printer constructor. If NULL, then the default ++ pretty-printer will be looked up. If None, then no ++ pretty-printer will be installed. */ ++ PyObject *constructor; + - /* Utility routines */ - - static struct varobj *new_variable (void); -@@ -200,6 +229,8 @@ static void free_variable (struct varobj *var); + /* The pretty-printer that has been constructed. If NULL, then a + new printer object is needed, and one will be constructed. */ + PyObject *pretty_printer; +@@ -221,6 +244,8 @@ static void free_variable (struct varobj *var); static struct cleanup *make_cleanup_free_variable (struct varobj *var); @@ -44047,332 +24954,212 @@ index 2ec6d90..1237c96 100644 static struct type *get_type (struct varobj *var); static struct type *get_value_type (struct varobj *var); -@@ -215,6 +246,8 @@ static char *cppop (struct cpstack **pstack); +@@ -236,8 +261,6 @@ static char *cppop (struct cpstack **pstack); static int install_new_value (struct varobj *var, struct value *value, int initial); -+static void install_default_visualizer (struct varobj *var); -+ +-static void install_default_visualizer (struct varobj *var); +- /* Language-specific routines. */ static enum varobj_languages variable_language (struct varobj *var); -@@ -232,13 +265,17 @@ static struct value *value_of_child (struct varobj *parent, int index); - static char *my_value_of_variable (struct varobj *var, - enum varobj_display_formats format); - --static char *value_get_print_value (struct value *value, -- enum varobj_display_formats format); -+char *value_get_print_value (struct value *value, -+ enum varobj_display_formats format, -+ PyObject *value_formatter); - - static int varobj_value_is_changeable_p (struct varobj *var); - - static int is_root_p (struct varobj *var); - -+static struct varobj * -+varobj_add_child (struct varobj *var, const char *name, struct value *value); -+ - /* C implementation */ - - static int c_number_of_children (struct varobj *var); -@@ -570,8 +607,10 @@ varobj_create (char *objname, +@@ -614,9 +637,9 @@ varobj_create (char *objname, do_cleanups (old_chain); return NULL; } + make_cleanup_uninstall_variable (var); } -+ install_default_visualizer (var); +- install_default_visualizer (var); discard_cleanups (old_chain); return var; } -@@ -678,6 +717,33 @@ varobj_delete (struct varobj *var, char ***dellist, int only_children) - return delcount; - } - -+/* Convenience function for varobj_set_visualizer. Instantiate a -+ pretty-printer for a given value. */ -+static PyObject * -+instantiate_pretty_printer (PyObject *constructor, struct value *value) -+{ -+#if HAVE_PYTHON -+ PyObject *val_obj = NULL; -+ PyObject *printer; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ value = value_copy (value); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ val_obj = value_to_value_object (value); -+ -+ if (! val_obj) -+ return NULL; -+ -+ printer = gdbpy_instantiate_printer (constructor, val_obj); -+ Py_DECREF (val_obj); -+ return printer; -+#endif -+ return NULL; -+} -+ - /* Set/Get variable object display format */ - - enum varobj_display_formats -@@ -702,7 +768,8 @@ varobj_set_display_format (struct varobj *var, - && var->value && !value_lazy (var->value)) - { - xfree (var->print_value); -- var->print_value = value_get_print_value (var->value, var->format); -+ var->print_value = value_get_print_value (var->value, var->format, -+ var->pretty_printer); +@@ -884,7 +907,9 @@ update_dynamic_varobj_children (struct varobj *var, } + make_cleanup_py_decref (iterator); - return var->format; -@@ -714,6 +781,21 @@ varobj_get_display_format (struct varobj *var) - return var->format; - } - -+char * -+varobj_get_display_hint (struct varobj *var) -+{ -+ char *result = NULL; -+ -+#if HAVE_PYTHON -+ PyGILState_STATE state = PyGILState_Ensure (); -+ if (var->pretty_printer) -+ result = gdbpy_get_display_hint (var->pretty_printer); -+ PyGILState_Release (state); -+#endif -+ -+ return result; -+} -+ - /* If the variable object is bound to a specific thread, that - is its evaluation can always be done in context of a frame - inside that thread, returns GDB id of the thread -- which -@@ -746,12 +828,141 @@ varobj_get_frozen (struct varobj *var) - return var->frozen; - } - -+static int -+update_dynamic_varobj_children (struct varobj *var, -+ VEC (varobj_p) **changed, -+ VEC (varobj_p) **new_and_unchanged, -+ int *cchanged) -+ -+{ -+#if HAVE_PYTHON -+ /* FIXME: we *might* want to provide this functionality as -+ a standalone function, so that other interested parties -+ than varobj code can benefit for this. */ -+ struct cleanup *back_to; -+ PyObject *children; -+ PyObject *iterator; -+ int i; -+ int children_changed = 0; -+ PyObject *printer = var->pretty_printer; -+ PyGILState_STATE state; -+ -+ state = PyGILState_Ensure (); -+ back_to = make_cleanup_py_restore_gil (&state); -+ -+ *cchanged = 0; -+ if (!PyObject_HasAttr (printer, gdbpy_children_cst)) -+ { -+ do_cleanups (back_to); -+ return 0; -+ } -+ -+ children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, -+ NULL); -+ -+ if (!children) -+ { -+ gdbpy_print_stack (); -+ error ("Null value returned for children"); -+ } -+ -+ make_cleanup_py_decref (children); -+ -+ if (!PyIter_Check (children)) -+ error ("Returned value is not iterable"); -+ -+ iterator = PyObject_GetIter (children); -+ if (!iterator) -+ { -+ gdbpy_print_stack (); -+ error ("Could not get children iterator"); -+ } -+ make_cleanup_py_decref (iterator); -+ -+ for (i = 0; ; ++i) -+ { -+ PyObject *item = PyIter_Next (iterator); -+ PyObject *py_v; -+ struct value *v; -+ char *name; -+ struct cleanup *inner; -+ -+ if (!item) -+ break; -+ inner = make_cleanup_py_decref (item); -+ -+ if (!PyArg_ParseTuple (item, "sO", &name, &py_v)) -+ error ("Invalid item from the child list"); -+ -+ if (PyObject_TypeCheck (py_v, &value_object_type)) -+ { -+ /* If we just call convert_value_from_python for this type, -+ we won't know who owns the result. For this one case we -+ need to copy the resulting value. */ -+ v = value_object_to_value (py_v); -+ v = value_copy (v); -+ } -+ else -+ v = convert_value_from_python (py_v); -+ -+ /* TODO: This assume the name of the i-th child never changes. */ -+ -+ /* Now see what to do here. */ -+ if (VEC_length (varobj_p, var->children) < i + 1) -+ { -+ /* There's no child yet. */ -+ struct varobj *child = varobj_add_child (var, name, v); -+ if (new_and_unchanged) -+ VEC_safe_push (varobj_p, *new_and_unchanged, child); -+ children_changed = 1; -+ } -+ else -+ { -+ varobj_p existing = VEC_index (varobj_p, var->children, i); -+ if (install_new_value (existing, v, 0) && changed) -+ { -+ if (changed) -+ VEC_safe_push (varobj_p, *changed, existing); -+ } -+ else -+ { -+ if (new_and_unchanged) -+ VEC_safe_push (varobj_p, *new_and_unchanged, existing); -+ } -+ } -+ -+ do_cleanups (inner); -+ } -+ -+ if (i < VEC_length (varobj_p, var->children)) -+ { -+ int i; -+ children_changed = 1; -+ for (i = 0; i < VEC_length (varobj_p, var->children); ++i) -+ varobj_delete (VEC_index (varobj_p, var->children, i), NULL, 0); -+ } -+ VEC_truncate (varobj_p, var->children, i); -+ var->num_children = VEC_length (varobj_p, var->children); -+ -+ do_cleanups (back_to); -+ -+ *cchanged = children_changed; -+ return 1; -+#else -+ gdb_assert (0 && "should never be called if Python is not enabled"); -+#endif -+} - - int - varobj_get_num_children (struct varobj *var) - { - if (var->num_children == -1) -- var->num_children = number_of_children (var); -+ { -+ int changed; -+ if (!var->pretty_printer -+ || !update_dynamic_varobj_children (var, NULL, NULL, &changed)) -+ var->num_children = number_of_children (var); -+ } - - return var->num_children; - } -@@ -764,7 +975,16 @@ varobj_list_children (struct varobj *var) - { - struct varobj *child; - char *name; -- int i; -+ int i, children_changed; -+ -+ var->children_requested = 1; -+ -+ if (var->pretty_printer -+ /* This, in theory, can result in the number of children changing without -+ frontend noticing. But well, calling -var-list-children on the same -+ varobj twice is not something a sane frontend would do. */ -+ && update_dynamic_varobj_children (var, NULL, NULL, &children_changed)) -+ return var->children; - - if (var->num_children == -1) - var->num_children = number_of_children (var); -@@ -790,12 +1010,24 @@ varobj_list_children (struct varobj *var) +- for (i = 0; ; ++i) ++ /* We ask for one extra child, so that MI can report whether there ++ are more children. */ ++ for (i = 0; var->to < 0 || i < var->to + 1; ++i) + { + PyObject *item = PyIter_Next (iterator); + PyObject *py_v; +@@ -1015,7 +1040,6 @@ varobj_list_children (struct varobj *var) name = name_of_child (var, i); existing = create_child (var, i, name); VEC_replace (varobj_p, var->children, i, existing); -+ install_default_visualizer (existing); +- install_default_visualizer (existing); } } - return var->children; +@@ -1029,7 +1053,6 @@ varobj_add_child (struct varobj *var, const char *name, struct value *value) + VEC_length (varobj_p, var->children), + name, value); + VEC_safe_push (varobj_p, var->children, v); +- install_default_visualizer (v); + return v; } -+static struct varobj * -+varobj_add_child (struct varobj *var, const char *name, struct value *value) +@@ -1168,6 +1191,112 @@ varobj_set_value (struct varobj *var, char *expression) + return 1; + } + ++#if HAVE_PYTHON ++ ++/* A helper function to install a constructor function and visualizer ++ in a varobj. */ ++ ++static void ++install_visualizer (struct varobj *var, PyObject *constructor, ++ PyObject *visualizer) +{ -+ varobj_p v = create_child_with_value (var, -+ VEC_length (varobj_p, var->children), -+ name, value); -+ VEC_safe_push (varobj_p, var->children, v); -+ install_default_visualizer (v); -+ return v; ++ Py_XDECREF (var->constructor); ++ var->constructor = constructor; ++ ++ Py_XDECREF (var->pretty_printer); ++ var->pretty_printer = visualizer; +} + - /* Obtain the type of an object Variable as a string similar to the one gdb - prints on the console */ - -@@ -1002,6 +1234,13 @@ install_new_value (struct varobj *var, struct value *value, int initial) - a type. */ - gdb_assert (var->type || CPLUS_FAKE_CHILD (var)); - changeable = varobj_value_is_changeable_p (var); ++/* Install the default visualizer for VAR. */ + -+ /* If the type has custom visualizer, we consider it to be always -+ changeable. FIXME: need to make sure this behaviour will not -+ mess up read-sensitive values. */ -+ if (var->pretty_printer) -+ changeable = 1; ++static void ++install_default_visualizer (struct varobj *var) ++{ ++ if (pretty_printing) ++ { ++ PyObject *pretty_printer = NULL; + - need_to_fetch = changeable; - - /* We are not interested in the address of references, and given -@@ -1053,12 +1292,14 @@ install_new_value (struct varobj *var, struct value *value, int initial) ++ if (var->value) ++ { ++ pretty_printer = gdbpy_get_varobj_pretty_printer (var->value); ++ if (! pretty_printer) ++ { ++ gdbpy_print_stack (); ++ error (_("Cannot instantiate printer for default visualizer")); ++ } ++ } ++ ++ if (pretty_printer == Py_None) ++ { ++ Py_DECREF (pretty_printer); ++ pretty_printer = NULL; ++ } ++ ++ install_visualizer (var, NULL, pretty_printer); ++ } ++} ++ ++/* Instantiate and install a visualizer for VAR using CONSTRUCTOR to ++ make a new object. */ ++ ++static void ++construct_visualizer (struct varobj *var, PyObject *constructor) ++{ ++ PyObject *pretty_printer; ++ ++ Py_INCREF (constructor); ++ if (constructor == Py_None) ++ pretty_printer = NULL; ++ else ++ { ++ pretty_printer = instantiate_pretty_printer (constructor, var->value); ++ if (! pretty_printer) ++ { ++ gdbpy_print_stack (); ++ Py_DECREF (constructor); ++ constructor = Py_None; ++ Py_INCREF (constructor); ++ } ++ ++ if (pretty_printer == Py_None) ++ { ++ Py_DECREF (pretty_printer); ++ pretty_printer = NULL; ++ } ++ } ++ ++ install_visualizer (var, constructor, pretty_printer); ++} ++ ++#endif /* HAVE_PYTHON */ ++ ++/* A helper function for install_new_value. This creates and installs ++ a visualizer for VAR, if appropriate. */ ++ ++static void ++install_new_value_visualizer (struct varobj *var) ++{ ++#if HAVE_PYTHON ++ /* If the constructor is None, then we want the raw value. */ ++ if (var->constructor != Py_None) ++ { ++ struct cleanup *cleanup; ++ PyObject *pretty_printer = NULL; ++ ++ cleanup = varobj_ensure_python_env (var); ++ ++ if (!var->constructor) ++ install_default_visualizer (var); ++ else ++ construct_visualizer (var, var->constructor); ++ ++ do_cleanups (cleanup); ++ } ++#else ++ /* Do nothing. */ ++#endif ++} ++ + /* Assign a new value to a variable object. If INITIAL is non-zero, + this is the first assignement after the variable object was just + created, or changed type. In that case, just assign the value +@@ -1274,7 +1403,7 @@ install_new_value (struct varobj *var, struct value *value, int initial) + { + changed = 1; } - } +- else ++ else if (! var->pretty_printer) + { + /* Try to compare the values. That requires that both + values are non-lazy. */ +@@ -1328,65 +1457,47 @@ install_new_value (struct varobj *var, struct value *value, int initial) + var->not_fetched = 0; + var->updated = 0; ++ install_new_value_visualizer (var); + - /* Below, we'll be comparing string rendering of old and new - values. Don't get string rendering if the value is - lazy -- if it is, the code above has decided that the value - should not be fetched. */ - if (value && !value_lazy (value)) -- print_value = value_get_print_value (value, var->format); -+ print_value = value_get_print_value (value, var->format, -+ var->pretty_printer); + gdb_assert (!var->value || value_type (var->value)); - /* If the type is changeable, compare the old and the new values. - If this is the initial assignment, we don't have any old value -@@ -1123,6 +1364,150 @@ install_new_value (struct varobj *var, struct value *value, int initial) return changed; } +-static void +-install_visualizer (struct varobj *var, PyObject *visualizer) +-{ +-#if HAVE_PYTHON +- /* If there are any children now, wipe them. */ +- varobj_delete (var, NULL, 1 /* children only */); +- var->num_children = -1; +- +- Py_XDECREF (var->pretty_printer); +- var->pretty_printer = visualizer; +- +- install_new_value (var, var->value, 1); +- +- /* If we removed the visualizer, and the user ever requested the +- object's children, then we must compute the list of children. +- Note that we needn't do this when installing a visualizer, +- because updating will recompute dynamic children. */ +- if (!visualizer && var->children_requested) +- varobj_list_children (var); +-#else +- error (_("Python support required")); +-#endif +-} +- +-static void +-install_default_visualizer (struct varobj *var) +/* Return the effective requested range for a varobj. VAR is the + varobj. CHILDREN is the computed list of children. FROM and TO + are out parameters. If VAR has no bounds selected, *FROM and *TO @@ -44382,21 +25169,44 @@ index 2ec6d90..1237c96 100644 +void +varobj_get_child_range (struct varobj *var, VEC (varobj_p) *children, + int *from, int *to) -+{ + { +-#if HAVE_PYTHON +- struct cleanup *cleanup; +- PyObject *pretty_printer = NULL; +- +- cleanup = varobj_ensure_python_env (var); +- +- if (var->value) + if (var->from < 0 || var->to < 0) -+ { + { +- pretty_printer = gdbpy_get_varobj_pretty_printer (var->value); +- if (! pretty_printer) +- { +- gdbpy_print_stack (); +- error (_("Cannot instantiate printer for default visualizer")); +- } + *from = 0; + *to = VEC_length (varobj_p, children); -+ } + } +- +- if (pretty_printer == Py_None) + else -+ { + { +- Py_DECREF (pretty_printer); +- pretty_printer = NULL; + *from = var->from; + if (*from > VEC_length (varobj_p, children)) + *from = VEC_length (varobj_p, children); + *to = var->to; + if (*to > VEC_length (varobj_p, children)) + *to = VEC_length (varobj_p, children); -+ } + } +- +- install_visualizer (var, pretty_printer); +- do_cleanups (cleanup); +-#else +- /* No error is right as this function is inserted just as a hook. */ +-#endif +} + +/* Set the selected sub-range of children of VAR to start at index @@ -44407,310 +25217,58 @@ index 2ec6d90..1237c96 100644 +{ + var->from = from; + var->to = to; -+} -+ -+static void -+install_visualizer (struct varobj *var, PyObject *visualizer) -+{ -+#if HAVE_PYTHON + } + + void +@@ -1404,31 +1515,19 @@ varobj_set_visualizer (struct varobj *var, const char *visualizer) + make_cleanup_py_decref (globals); + + constructor = PyRun_String (visualizer, Py_eval_input, globals, globals); +- +- /* Do not instantiate NoneType. */ +- if (constructor == Py_None) +- { +- pretty_printer = Py_None; +- Py_INCREF (pretty_printer); +- } +- else +- pretty_printer = instantiate_pretty_printer (constructor, var->value); + +- Py_XDECREF (constructor); +- +- if (! pretty_printer) ++ if (! constructor) + { + gdbpy_print_stack (); + error (_("Could not evaluate visualizer expression: %s"), visualizer); + } + +- if (pretty_printer == Py_None) +- { +- Py_DECREF (pretty_printer); +- pretty_printer = NULL; +- } ++ construct_visualizer (var, constructor); ++ Py_XDECREF (constructor); + +- install_visualizer (var, pretty_printer); + /* If there are any children now, wipe them. */ + varobj_delete (var, NULL, 1 /* children only */); + var->num_children = -1; -+ -+ Py_XDECREF (var->pretty_printer); -+ var->pretty_printer = visualizer; -+ -+ install_new_value (var, var->value, 1); -+ -+ /* If we removed the visualizer, and the user ever requested the -+ object's children, then we must compute the list of children. -+ Note that we needn't do this when installing a visualizer, -+ because updating will recompute dynamic children. */ -+ if (!visualizer && var->children_requested) -+ varobj_list_children (var); -+#else -+ error ("Python support required"); -+#endif -+} -+ -+static void -+install_default_visualizer (struct varobj *var) -+{ -+#if HAVE_PYTHON -+ struct cleanup *cleanup; -+ PyGILState_STATE state; -+ PyObject *pretty_printer = NULL; -+ -+ state = PyGILState_Ensure (); -+ cleanup = make_cleanup_py_restore_gil (&state); -+ -+ if (var->value) -+ { -+ pretty_printer = gdbpy_get_varobj_pretty_printer (var->value); -+ if (! pretty_printer) -+ { -+ gdbpy_print_stack (); -+ error (_("Cannot instantiate printer for default visualizer")); -+ } -+ } -+ -+ if (pretty_printer == Py_None) -+ { -+ Py_DECREF (pretty_printer); -+ pretty_printer = NULL; -+ } -+ -+ install_visualizer (var, pretty_printer); -+ do_cleanups (cleanup); -+#else -+ /* No error is right as this function is inserted just as a hook. */ -+#endif -+} -+ -+void -+varobj_set_visualizer (struct varobj *var, const char *visualizer) -+{ -+#if HAVE_PYTHON -+ PyObject *mainmod, *globals, *pretty_printer, *constructor; -+ struct cleanup *back_to, *value; -+ PyGILState_STATE state; -+ -+ -+ state = PyGILState_Ensure (); -+ back_to = make_cleanup_py_restore_gil (&state); -+ -+ mainmod = PyImport_AddModule ("__main__"); -+ globals = PyModule_GetDict (mainmod); -+ Py_INCREF (globals); -+ make_cleanup_py_decref (globals); -+ -+ constructor = PyRun_String (visualizer, Py_eval_input, globals, globals); -+ -+ /* Do not instantiate NoneType. */ -+ if (constructor == Py_None) -+ { -+ pretty_printer = Py_None; -+ Py_INCREF (pretty_printer); -+ } -+ else -+ pretty_printer = instantiate_pretty_printer (constructor, var->value); -+ -+ Py_XDECREF (constructor); -+ -+ if (! pretty_printer) -+ { -+ gdbpy_print_stack (); -+ error ("Could not evaluate visualizer expression: %s", visualizer); -+ } -+ -+ if (pretty_printer == Py_None) -+ { -+ Py_DECREF (pretty_printer); -+ pretty_printer = NULL; -+ } -+ -+ install_visualizer (var, pretty_printer); -+ -+ do_cleanups (back_to); -+#else -+ error ("Python support required"); -+#endif -+} -+ - /* Update the values for a variable and its children. This is a - two-pronged attack. First, re-parse the value for the root's - expression to see if it's changed. Then go all the way -@@ -1148,7 +1533,7 @@ VEC(varobj_update_result) *varobj_update (struct varobj **varp, int explicit) - struct varobj **cv; - struct varobj **templist = NULL; - struct value *new; -- VEC (varobj_p) *stack = NULL; -+ VEC (varobj_update_result) *stack = NULL; - VEC (varobj_update_result) *result = NULL; - struct frame_info *fi; -@@ -1187,20 +1572,85 @@ VEC(varobj_update_result) *varobj_update (struct varobj **varp, int explicit) - - if (new == NULL) - r.status = VAROBJ_NOT_IN_SCOPE; -- -- if (r.type_changed || r.changed) -- VEC_safe_push (varobj_update_result, result, &r); -+ r.value_installed = 1; - - if (r.status == VAROBJ_NOT_IN_SCOPE) -- return result; -+ { -+ VEC_safe_push (varobj_update_result, result, &r); -+ return result; -+ } -+ -+ VEC_safe_push (varobj_update_result, stack, &r); -+ } -+ else -+ { -+ varobj_update_result r = {*varp}; -+ VEC_safe_push (varobj_update_result, stack, &r); - } -- -- VEC_safe_push (varobj_p, stack, *varp); - - /* Walk through the children, reconstructing them all. */ -- while (!VEC_empty (varobj_p, stack)) -+ while (!VEC_empty (varobj_update_result, stack)) - { -- v = VEC_pop (varobj_p, stack); -+ varobj_update_result r = *(VEC_last (varobj_update_result, stack)); -+ struct varobj *v = r.varobj; -+ -+ VEC_pop (varobj_update_result, stack); -+ -+ /* Update this variable, unless it's a root, which is already -+ updated. */ -+ if (!r.value_installed) -+ { -+ new = value_of_child (v->parent, v->index); -+ if (install_new_value (v, new, 0 /* type not changed */)) -+ { -+ r.changed = 1; -+ v->updated = 0; -+ } -+ } -+ -+ /* We probably should not get children of a varobj that has a -+ pretty-printer, but for which -var-list-children was never -+ invoked. Presumably, such varobj is not yet expanded in the -+ UI, so we need not bother getting it. */ -+ if (v->pretty_printer) -+ { -+ VEC (varobj_p) *changed = 0, *new_and_unchanged = 0; -+ int i, children_changed; -+ varobj_p tmp; -+ -+ if (!v->children_requested) -+ continue; -+ -+ if (v->frozen) -+ continue; -+ -+ /* If update_dynamic_varobj_children returns 0, then we have -+ a non-conforming pretty-printer, so we skip it. */ -+ if (update_dynamic_varobj_children (v, &changed, &new_and_unchanged, -+ &children_changed)) -+ { -+ if (children_changed) -+ r.children_changed = 1; -+ for (i = 0; VEC_iterate (varobj_p, changed, i, tmp); ++i) -+ { -+ varobj_update_result r = {tmp}; -+ r.changed = 1; -+ r.value_installed = 1; -+ VEC_safe_push (varobj_update_result, stack, &r); -+ } -+ for (i = 0; -+ VEC_iterate (varobj_p, new_and_unchanged, i, tmp); -+ ++i) -+ { -+ varobj_update_result r = {tmp}; -+ r.value_installed = 1; -+ VEC_safe_push (varobj_update_result, stack, &r); -+ } -+ if (r.changed || r.children_changed) -+ VEC_safe_push (varobj_update_result, result, &r); -+ continue; -+ } -+ } - - /* Push any children. Use reverse order so that the first - child is popped from the work stack first, and so -@@ -1211,26 +1661,18 @@ VEC(varobj_update_result) *varobj_update (struct varobj **varp, int explicit) - varobj_p c = VEC_index (varobj_p, v->children, i); - /* Child may be NULL if explicitly deleted by -var-delete. */ - if (c != NULL && !c->frozen) -- VEC_safe_push (varobj_p, stack, c); -- } -- -- /* Update this variable, unless it's a root, which is already -- updated. */ -- if (v->root->rootvar != v) -- { -- new = value_of_child (v->parent, v->index); -- if (install_new_value (v, new, 0 /* type not changed */)) - { -- /* Note that it's changed */ -- varobj_update_result r = {v}; -- r.changed = 1; -- VEC_safe_push (varobj_update_result, result, &r); -- v->updated = 0; -+ varobj_update_result r = {c}; -+ VEC_safe_push (varobj_update_result, stack, &r); - } - } -+ -+ if (r.changed || r.type_changed) -+ VEC_safe_push (varobj_update_result, result, &r); - } - -- VEC_free (varobj_p, stack); -+ VEC_free (varobj_update_result, stack); -+ - return result; - } - -@@ -1429,16 +1871,23 @@ uninstall_variable (struct varobj *var) - static struct varobj * - create_child (struct varobj *parent, int index, char *name) - { -+ return create_child_with_value (parent, index, name, -+ value_of_child (parent, index)); -+} -+ -+static struct varobj * -+create_child_with_value (struct varobj *parent, int index, const char *name, -+ struct value *value) -+{ - struct varobj *child; - char *childs_name; -- struct value *value; - - child = new_variable (); - - /* name is allocated by name_of_child */ -- child->name = name; -+ /* FIXME: xstrdup should not be here. */ -+ child->name = xstrdup (name); - child->index = index; -- value = value_of_child (parent, index); - child->parent = parent; - child->root = parent->root; - childs_name = xstrprintf ("%s.%s", parent->obj_name, name); -@@ -1487,6 +1936,10 @@ new_variable (void) - var->print_value = NULL; + do_cleanups (back_to); + #else +@@ -1864,6 +1963,9 @@ new_variable (void) var->frozen = 0; var->not_fetched = 0; -+ var->children_requested = 0; + var->children_requested = 0; + var->from = -1; + var->to = -1; -+ var->pretty_printer = 0; ++ var->constructor = 0; + var->pretty_printer = 0; return var; - } -@@ -1519,6 +1972,14 @@ free_variable (struct varobj *var) - xfree (var->root); - } - -+#if HAVE_PYTHON -+ { -+ PyGILState_STATE state = PyGILState_Ensure (); -+ Py_XDECREF (var->pretty_printer); -+ PyGILState_Release (state); -+ } -+#endif -+ - xfree (var->name); - xfree (var->obj_name); - xfree (var->print_value); -@@ -1538,6 +1999,18 @@ make_cleanup_free_variable (struct varobj *var) +@@ -1927,6 +2029,18 @@ make_cleanup_free_variable (struct varobj *var) return make_cleanup (do_free_variable_cleanup, var); } @@ -44729,131 +25287,246 @@ index 2ec6d90..1237c96 100644 /* This returns the type of the variable. It also skips past typedefs to return the real type of the variable. -@@ -1792,24 +2265,71 @@ my_value_of_variable (struct varobj *var, enum varobj_display_formats format) - return NULL; - } - --static char * --value_get_print_value (struct value *value, enum varobj_display_formats format) -+char * -+value_get_print_value (struct value *value, enum varobj_display_formats format, -+ PyObject *value_formatter) - { +@@ -2187,7 +2301,7 @@ value_get_print_value (struct value *value, enum varobj_display_formats format, long dummy; struct ui_file *stb; struct cleanup *old_chain; -- char *thevalue; +- gdb_byte *thevalue = NULL; + char *thevalue = NULL; struct value_print_options opts; + int len = 0; - if (value == NULL) - return NULL; +@@ -3173,6 +3287,19 @@ java_value_of_variable (struct varobj *var, enum varobj_display_formats format) + return cplus_value_of_variable (var, format); + } -+#if HAVE_PYTHON -+ { -+ PyGILState_STATE state = PyGILState_Ensure (); -+ if (value_formatter && PyObject_HasAttr (value_formatter, -+ gdbpy_to_string_cst)) -+ { -+ char *hint; -+ struct value *replacement; -+ int string_print = 0; ++/* Iterate all the existing VAROBJs and call the FUNC callback for them with an ++ arbitrary caller supplied DATA pointer. */ + -+ hint = gdbpy_get_display_hint (value_formatter); -+ if (hint) -+ { -+ if (!strcmp (hint, "string")) -+ string_print = 1; -+ xfree (hint); -+ } ++static void ++all_varobjs (void (*func) (struct varobj *var, void *data), void *data) ++{ ++ struct vlist **vlp, *vl; + -+ thevalue = apply_varobj_pretty_printer (value_formatter, -+ &replacement); -+ if (thevalue && !string_print) -+ { -+ PyGILState_Release (state); -+ return thevalue; -+ } -+ if (replacement) -+ value = replacement; -+ } -+ PyGILState_Release (state); -+ } -+#endif ++ for (vlp = varobj_table; vlp < varobj_table + VAROBJ_TABLE_SIZE; vlp++) ++ for (vl = *vlp; vl != NULL; vl = vl->next) ++ (*func) (vl->var, data); ++} + - stb = mem_fileopen (); - old_chain = make_cleanup_ui_file_delete (stb); + /* Iterate all the existing _root_ VAROBJs and call the FUNC callback for them + with an arbitrary caller supplied DATA pointer. */ - get_formatted_print_options (&opts, format_code[(int) format]); - opts.deref_ref = 0; -- common_val_print (value, stb, 0, &opts, current_language); -+ opts.raw = 1; -+ if (thevalue) -+ { -+ struct type *string_char_type; -+ -+ make_cleanup (xfree, thevalue); -+ -+ /* OUTPUT is already in the hosts's charset. */ -+ string_char_type = language_string_char_type (current_language, -+ current_gdbarch); -+ LA_PRINT_STRING (stb, string_char_type, (gdb_byte *) thevalue, -+ strlen (thevalue), 0, &opts); -+ } -+ else -+ common_val_print (value, stb, 0, &opts, current_language); - thevalue = ui_file_xstrdup (stb, &dummy); - - do_cleanups (old_chain); -@@ -1900,7 +2420,7 @@ varobj_floating_p (struct varobj *var) - value is not known. - - If WAS_PTR is not NULL, set *WAS_PTR to 0 or 1 -- depending on whether pointer was deferenced -+ depending on whether pointer was dereferenced - in this function. */ - static void - adjust_value_for_child_access (struct value **value, -@@ -2269,6 +2789,11 @@ c_value_of_variable (struct varobj *var, enum varobj_display_formats format) - catch that case explicitly. */ - struct type *type = get_type (var); - -+ /* If we have a custom formatter, return whatever string it has -+ produced. */ -+ if (var->pretty_printer && var->print_value) -+ return xstrdup (var->print_value); -+ - /* Strip top-level references. */ - while (TYPE_CODE (type) == TYPE_CODE_REF) - type = check_typedef (TYPE_TARGET_TYPE (type)); -@@ -2313,7 +2838,8 @@ c_value_of_variable (struct varobj *var, enum varobj_display_formats format) - if (format == var->format) - return xstrdup (var->print_value); - else -- return value_get_print_value (var->value, format); -+ return value_get_print_value (var->value, format, -+ var->pretty_printer); - } - } +@@ -3190,48 +3317,110 @@ all_root_varobjs (void (*func) (struct varobj *var, void *data), void *data) + (*func) (var_root->rootvar, data); } + } +- +-extern void _initialize_varobj (void); +-void +-_initialize_varobj (void) ++ ++/* Helper for varobj_types_mark_used. Call type_mark_used for any TYPEs ++ referenced from this VAR. */ ++ ++static void ++varobj_types_mark_used_iter (struct varobj *var, void *unused) + { +- int sizeof_table = sizeof (struct vlist *) * VAROBJ_TABLE_SIZE; ++ /* Even FLOATING or IS_INVALID VARs with non-NULL TYPE references will ++ free them in free_variable. Still EXP may also reference TYPEs ++ but these belong to SYMBOLs which should be always associated with ++ an OBJFILE (and therefore not useful to be type_mark_used). */ + +- varobj_table = xmalloc (sizeof_table); +- memset (varobj_table, 0, sizeof_table); ++ type_mark_used (var->type); ++ if (var->value) ++ type_mark_used (value_type (var->value)); + +- add_setshow_zinteger_cmd ("debugvarobj", class_maintenance, +- &varobjdebug, _("\ +-Set varobj debugging."), _("\ +-Show varobj debugging."), _("\ +-When non-zero, varobj debugging is enabled."), +- NULL, +- show_varobjdebug, +- &setlist, &showlist); ++ /* Check VAROBJROOTs only once during the varobj_types_mark_used pass. */ ++ ++ if (var->root->rootvar == var) ++ { ++ if (var->root->exp) ++ exp_types_mark_used (var->root->exp); ++ } + } + +-/* Invalidate varobj VAR if it is tied to locals and re-create it if it is +- defined on globals. It is a helper for varobj_invalidate. */ ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ + + static void +-varobj_invalidate_iter (struct varobj *var, void *unused) ++varobj_types_mark_used (void) + { +- /* Floating varobjs are reparsed on each stop, so we don't care if the +- presently parsed expression refers to something that's gone. */ +- if (var->root->floating) +- return; ++ /* Check all the VAROBJs, even non-root ones. Child VAROBJs can reference ++ types from other OBJFILEs through TYPE_IS_OPAQUE resolutions by ++ check_typedef. Such types references will not be interconnected into the ++ same TYPE_GROUP. */ ++ ++ all_varobjs (varobj_types_mark_used_iter, NULL); ++} ++ ++/* Invalidate VAR if it is tied to the specified OBJFILE. Call this function ++ before you start removing OBJFILE. ++ ++ Call varobj_revalidate_iter after the OBJFILE update get finished. ++ ++ Invalidated varobjs will be always printed in_scope="invalid". */ ++ ++static void ++varobj_invalidate_iter (struct varobj *var, void *objfile_voidp) ++{ ++ struct objfile *objfile = objfile_voidp; ++ ++ /* Check VAROBJROOTs only once during the varobj_invalidate pass. */ ++ ++ if (var->root->rootvar == var) ++ { ++ /* Check even FLOATING VAROBJROOTs as their data will be still checked ++ during varobj_update by varobj_get_type. */ ++ ++ if (var->root->is_valid ++ && block_objfile (var->root->valid_block) == objfile) ++ var->root->is_valid = 0; ++ ++ if (var->root->exp && exp_uses_objfile (var->root->exp, objfile)) ++ { ++ var->root->is_valid = 0; ++ ++ /* No one touches EXP for !IS_VALID varobj. */ ++ xfree (var->root->exp); ++ var->root->exp = NULL; ++ } ++ } ++ ++ if (var->type && TYPE_OBJFILE (var->type) == objfile) ++ { ++ var->root->is_valid = 0; ++ ++ var->type = NULL; ++ } ++ ++ if (var->value && TYPE_OBJFILE (value_type (var->value)) == objfile) ++ { ++ var->root->is_valid = 0; ++ ++ value_free (var->value); ++ var->value = NULL; ++ } ++} ++ ++/* Recreate any global varobjs possibly previously invalidated. If the ++ expressions are no longer evaluatable set/keep the VAR invalid. */ ++ ++static void ++varobj_revalidate_iter (struct varobj *var, void *unused) ++{ ++ /* Global VAR must be re-evaluated. */ + +- /* global var must be re-evaluated. */ + if (var->root->valid_block == NULL) + { + struct varobj *tmp_var; + + /* Try to create a varobj with same expression. If we succeed + replace the old varobj, otherwise invalidate it. */ +- tmp_var = varobj_create (NULL, var->name, (CORE_ADDR) 0, +- USE_CURRENT_FRAME); +- if (tmp_var != NULL) +- { ++ tmp_var = varobj_create (NULL, var->name, 0, USE_CURRENT_FRAME); ++ if (tmp_var != NULL) ++ { + tmp_var->obj_name = xstrdup (var->obj_name); + varobj_delete (var, NULL, 0); + install_variable (tmp_var); +@@ -3243,12 +3432,61 @@ varobj_invalidate_iter (struct varobj *var, void *unused) + var->root->is_valid = 0; + } + +-/* Invalidate the varobjs that are tied to locals and re-create the ones that +- are defined on globals. +- Invalidated varobjs will be always printed in_scope="invalid". */ ++/* Call varobj_invalidate_iter for all the VAROBJs. */ + +-void +-varobj_invalidate (void) ++static void ++varobj_invalidate (struct objfile *objfile) + { +- all_root_varobjs (varobj_invalidate_iter, NULL); ++ /* Check all the VAROBJs, even non-root ones. Child VAROBJs can reference ++ types from other OBJFILEs through TYPE_IS_OPAQUE resolutions by ++ check_typedef. */ ++ ++ all_varobjs (varobj_invalidate_iter, objfile); ++} ++ ++/* Call varobj_revalidate_iter for all the root VAROBJs. */ ++ ++static void ++varobj_revalidate (void) ++{ ++ /* Check only root VAROBJs. Any successful revalidation will replace the ++ whole VAROBJs tree starting with root VAROBJs and its children get created ++ later on-demand. So there is no point trying to revalidate the child ++ VAROBJs. */ ++ ++ all_root_varobjs (varobj_revalidate_iter, NULL); ++} ++ ++/* Call varobj_revalidate just providing a different function prototype. ++ Currently existing VAROBJs may become valid or change with new symbols ++ loaded. */ ++ ++static void ++varobj_revalidate_for_objfile (struct objfile *objfile) ++{ ++ varobj_revalidate (); ++} ++ ++extern void _initialize_varobj (void); ++void ++_initialize_varobj (void) ++{ ++ int sizeof_table = sizeof (struct vlist *) * VAROBJ_TABLE_SIZE; ++ ++ varobj_table = xmalloc (sizeof_table); ++ memset (varobj_table, 0, sizeof_table); ++ ++ add_setshow_zinteger_cmd ("debugvarobj", class_maintenance, ++ &varobjdebug, _("\ ++Set varobj debugging."), _("\ ++Show varobj debugging."), _("\ ++When non-zero, varobj debugging is enabled."), ++ NULL, ++ show_varobjdebug, ++ &setlist, &showlist); ++ ++ observer_attach_objfile_unloading (varobj_invalidate ); ++ observer_attach_objfile_unloaded (varobj_revalidate); ++ observer_attach_new_objfile (varobj_revalidate_for_objfile); ++ observer_attach_mark_used (varobj_types_mark_used); + } diff --git a/gdb/varobj.h b/gdb/varobj.h -index f2cdcf8..10758d6 100644 +index 7297243..aabd743 100644 --- a/gdb/varobj.h +++ b/gdb/varobj.h -@@ -72,7 +72,12 @@ typedef struct varobj_update_result_t - struct varobj *varobj; - int type_changed; - int changed; -+ int children_changed; - enum varobj_scope_status status; -+ /* This variable is used internally by varobj_update to indicate if the -+ new value of varobj is already computed and installed, or has to -+ be yet installed. Don't use this outside varobj.c */ -+ int value_installed; - } varobj_update_result; - - DEF_VEC_O (varobj_update_result); -@@ -107,6 +112,14 @@ extern void varobj_set_frozen (struct varobj *var, int frozen); +@@ -112,6 +112,12 @@ extern void varobj_set_frozen (struct varobj *var, int frozen); extern int varobj_get_frozen (struct varobj *var); @@ -44863,30 +25536,31 @@ index f2cdcf8..10758d6 100644 + +extern void varobj_set_child_range (struct varobj *var, int from, int to); + -+extern char *varobj_get_display_hint (struct varobj *var); -+ - extern int varobj_get_num_children (struct varobj *var); + extern char *varobj_get_display_hint (struct varobj *var); - /* Return the list of children of VAR. The returned vector -@@ -141,4 +154,13 @@ extern int varobj_editable_p (struct varobj *var); + extern int varobj_get_num_children (struct varobj *var); +@@ -143,12 +149,13 @@ extern void all_root_varobjs (void (*func) (struct varobj *var, void *data), + extern VEC(varobj_update_result) *varobj_update (struct varobj **varp, + int explicit); + +-extern void varobj_invalidate (void); +- + extern int varobj_editable_p (struct varobj *var); extern int varobj_floating_p (struct varobj *var); +-extern void varobj_set_visualizer (struct varobj *var, const char *visualizer); +extern void +varobj_set_visualizer (struct varobj *var, const char *visualizer); + -+extern void -+varobj_clear_type_visualizers (); -+ -+extern void -+varobj_set_visualizer (struct varobj *var, const char *visualizer); -+ ++extern void varobj_enable_pretty_printing (void); + #endif /* VAROBJ_H */ diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c -index aab3e48..d41738b 100644 +index c56ab86..dacf913 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c -@@ -3021,6 +3021,7 @@ static struct sym_fns xcoff_sym_fns = +@@ -3038,6 +3038,7 @@ static struct sym_fns xcoff_sym_fns = xcoff_new_init, /* sym_new_init: init anything gbl to entire symtab */ xcoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */ xcoff_initial_scan, /* sym_read: read a symbol file into symtab */ @@ -44894,3055 +25568,3 @@ index aab3e48..d41738b 100644 xcoff_symfile_finish, /* sym_finish: finished with file, cleanup */ xcoff_symfile_offsets, /* sym_offsets: xlate offsets ext->int form */ default_symfile_segments, /* sym_segments: Get segment information from -diff --git a/gdb/xml-syscall.c b/gdb/xml-syscall.c -new file mode 100644 -index 0000000..498f58a ---- /dev/null -+++ b/gdb/xml-syscall.c -@@ -0,0 +1,423 @@ -+/* Functions that provide the mechanism to parse a syscall XML file -+ and get its values. -+ -+ Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, -+ 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008 -+ Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include "defs.h" -+#include "gdbtypes.h" -+#include "xml-support.h" -+#include "xml-syscall.h" -+ -+#include "filenames.h" -+ -+#include "gdb_assert.h" -+ -+#ifndef HAVE_LIBEXPAT -+ -+/* Dummy functions to indicate that there's no support for fetching -+ syscalls information. */ -+ -+static void -+syscall_warn_user (void) -+{ -+ static int have_warned = 0; -+ if (!have_warned) -+ { -+ have_warned = 1; -+ warning (_("Can not parse XML syscalls information; XML support was " -+ "disabled at compile time")); -+ } -+} -+ -+const struct syscalls_info * -+xml_init_syscalls_info (const char *filename) -+{ -+ syscall_warn_user (); -+ return NULL; -+} -+ -+int -+xml_get_syscall_number (const struct syscalls_info *sysinfo, -+ const char *syscall_name) -+{ -+ syscall_warn_user (); -+ return UNKNOWN_SYSCALL; -+} -+ -+const char * -+xml_get_syscall_name (const struct syscalls_info *sysinfo, -+ int syscall_number) -+{ -+ syscall_warn_user (); -+ return NULL; -+} -+ -+int -+xml_number_of_syscalls (const struct syscalls_info *sysinfo) -+{ -+ syscall_warn_user (); -+ return 0; -+} -+ -+const char ** -+xml_list_of_syscalls (const struct syscalls_info *sysinfo) -+{ -+ syscall_warn_user (); -+ return NULL; -+} -+ -+#else -+ -+/* Structure which describes a syscall. */ -+ -+typedef struct syscall_desc -+{ -+ /* The syscall number. */ -+ -+ int number; -+ -+ /* The syscall name. */ -+ -+ char *name; -+} *syscall_desc_p; -+DEF_VEC_P(syscall_desc_p); -+ -+/* Structure that represents syscalls information. */ -+ -+struct syscalls_info -+{ -+ /* The syscalls. */ -+ -+ VEC(syscall_desc_p) *syscalls; -+}; -+ -+/* Callback data for syscall information parsing. */ -+ -+struct syscall_parsing_data -+{ -+ /* The syscalls_info we are building. */ -+ -+ struct syscalls_info *sysinfo; -+}; -+ -+ -+static struct syscalls_info * -+allocate_syscalls_info (void) -+{ -+ return XZALLOC (struct syscalls_info); -+} -+ -+static void -+sysinfo_free_syscalls_desc (struct syscall_desc *sd) -+{ -+ xfree (sd->name); -+} -+ -+static void -+free_syscalls_info (void *arg) -+{ -+ struct syscalls_info *sysinfo = arg; -+ struct syscall_desc *sysdesc; -+ int i; -+ -+ for (i = 0; -+ VEC_iterate (syscall_desc_p, sysinfo->syscalls, i, sysdesc); -+ i++) -+ sysinfo_free_syscalls_desc (sysdesc); -+ VEC_free (syscall_desc_p, sysinfo->syscalls); -+ -+ xfree (sysinfo); -+} -+ -+struct cleanup * -+make_cleanup_free_syscalls_info (struct syscalls_info *sysinfo) -+{ -+ return make_cleanup (free_syscalls_info, sysinfo); -+} -+ -+/* Open FILENAME, read all its text into memory, close it, and return -+ the text. If something goes wrong, return NULL and warn. */ -+ -+static char * -+fetch_xml_from_file (const char *filename, void *baton) -+{ -+ const char *dirname = baton; -+ FILE *file; -+ struct cleanup *back_to; -+ char *text; -+ size_t len, offset; -+ -+ if (dirname && *dirname) -+ { -+ char *fullname = concat (dirname, "/", filename, (char *) NULL); -+ if (fullname == NULL) -+ nomem (0); -+ file = fopen (fullname, FOPEN_RT); -+ xfree (fullname); -+ } -+ else -+ file = fopen (filename, FOPEN_RT); -+ -+ if (file == NULL) -+ return NULL; -+ -+ back_to = make_cleanup_fclose (file); -+ -+ /* Read in the whole file, one chunk at a time. */ -+ len = 4096; -+ offset = 0; -+ text = xmalloc (len); -+ make_cleanup (free_current_contents, &text); -+ while (1) -+ { -+ size_t bytes_read; -+ -+ /* Continue reading where the last read left off. Leave at least -+ one byte so that we can NUL-terminate the result. */ -+ bytes_read = fread (text + offset, 1, len - offset - 1, file); -+ if (ferror (file)) -+ { -+ warning (_("Read error from \"%s\""), filename); -+ do_cleanups (back_to); -+ return NULL; -+ } -+ -+ offset += bytes_read; -+ -+ if (feof (file)) -+ break; -+ -+ len = len * 2; -+ text = xrealloc (text, len); -+ } -+ -+ fclose (file); -+ discard_cleanups (back_to); -+ -+ text[offset] = '\0'; -+ return text; -+} -+ -+static void -+syscall_create_syscall_desc (struct syscalls_info *sysinfo, -+ const char *name, int number) -+{ -+ struct syscall_desc *sysdesc = XZALLOC (struct syscall_desc); -+ -+ sysdesc->name = xstrdup (name); -+ sysdesc->number = number; -+ -+ VEC_safe_push (syscall_desc_p, sysinfo->syscalls, sysdesc); -+} -+ -+/* Handle the start of a element. */ -+ -+static void -+syscall_start_syscalls_info (struct gdb_xml_parser *parser, -+ const struct gdb_xml_element *element, -+ void *user_data, -+ VEC(gdb_xml_value_s) *attributes) -+{ -+ struct syscall_parsing_data *data = user_data; -+ struct syscalls_info *sysinfo = data->sysinfo; -+} -+ -+/* Handle the start of a element. */ -+ -+static void -+syscall_start_syscall (struct gdb_xml_parser *parser, -+ const struct gdb_xml_element *element, -+ void *user_data, VEC(gdb_xml_value_s) *attributes) -+{ -+ struct syscall_parsing_data *data = user_data; -+ struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes); -+ int len, i; -+ /* syscall info. */ -+ char *name = NULL; -+ int number = 0; -+ -+ len = VEC_length (gdb_xml_value_s, attributes); -+ -+ for (i = 0; i < len; i++) -+ { -+ if (strcmp (attrs[i].name, "name") == 0) -+ name = attrs[i].value; -+ else if (strcmp (attrs[i].name, "number") == 0) -+ number = * (ULONGEST *) attrs[i].value; -+ else -+ internal_error (__FILE__, __LINE__, -+ _("Unknown attribute name '%s'."), attrs[i].name); -+ } -+ -+ syscall_create_syscall_desc (data->sysinfo, name, number); -+} -+ -+ -+/* The elements and attributes of an XML syscall document. */ -+ -+static const struct gdb_xml_attribute syscall_attr[] = { -+ { "number", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, -+ { "name", GDB_XML_AF_NONE, NULL, NULL }, -+ { NULL, GDB_XML_AF_NONE, NULL, NULL } -+}; -+ -+static const struct gdb_xml_element syscalls_info_children[] = { -+ { "syscall", syscall_attr, NULL, -+ GDB_XML_EF_OPTIONAL | GDB_XML_EF_REPEATABLE, -+ syscall_start_syscall, NULL }, -+ { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } -+}; -+ -+static const struct gdb_xml_element syselements[] = { -+ { "syscalls_info", NULL, syscalls_info_children, -+ GDB_XML_EF_NONE, syscall_start_syscalls_info, NULL }, -+ { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } -+}; -+ -+static struct syscalls_info * -+syscall_parse_xml (const char *document, xml_fetch_another fetcher, -+ void *fetcher_baton) -+{ -+ struct cleanup *result_cleanup; -+ struct gdb_xml_parser *parser; -+ struct syscall_parsing_data data; -+ char *expanded_text; -+ int i; -+ -+ parser = gdb_xml_create_parser_and_cleanup (_("syscalls info"), -+ syselements, &data); -+ -+ memset (&data, 0, sizeof (struct syscall_parsing_data)); -+ data.sysinfo = allocate_syscalls_info (); -+ result_cleanup = make_cleanup_free_syscalls_info (data.sysinfo); -+ -+ if (gdb_xml_parse (parser, document) == 0) -+ { -+ /* Parsed successfully. */ -+ discard_cleanups (result_cleanup); -+ return data.sysinfo; -+ } -+ else -+ { -+ warning (_("Could not load XML syscalls info; ignoring")); -+ do_cleanups (result_cleanup); -+ return NULL; -+ } -+} -+ -+const struct syscalls_info * -+xml_init_syscalls_info (const char *filename) -+{ -+ char *full_file; -+ char *dirname; -+ struct syscalls_info *sysinfo; -+ struct cleanup *back_to; -+ -+ full_file = fetch_xml_from_file (filename, gdb_datadir); -+ if (full_file == NULL) -+ { -+ warning (_("Could not open \"%s\""), filename); -+ return NULL; -+ } -+ -+ back_to = make_cleanup (xfree, full_file); -+ -+ dirname = ldirname (filename); -+ if (dirname != NULL) -+ make_cleanup (xfree, dirname); -+ -+ sysinfo = syscall_parse_xml (full_file, fetch_xml_from_file, dirname); -+ do_cleanups (back_to); -+ -+ return sysinfo; -+} -+ -+int -+xml_get_syscall_number (const struct syscalls_info *sysinfo, -+ const char *syscall_name) -+{ -+ struct syscall_desc *sysdesc; -+ int i; -+ -+ if (sysinfo == NULL -+ || syscall_name == NULL) -+ return UNKNOWN_SYSCALL; -+ -+ for (i = 0; -+ VEC_iterate(syscall_desc_p, sysinfo->syscalls, i, sysdesc); -+ i++) -+ if (strcmp (sysdesc->name, syscall_name) == 0) -+ return sysdesc->number; -+ -+ return UNKNOWN_SYSCALL; -+} -+ -+const char * -+xml_get_syscall_name (const struct syscalls_info *sysinfo, -+ int syscall_number) -+{ -+ struct syscall_desc *sysdesc; -+ int i; -+ -+ if (sysinfo == NULL -+ || syscall_number < 0) -+ return NULL; -+ -+ for (i = 0; -+ VEC_iterate(syscall_desc_p, sysinfo->syscalls, i, sysdesc); -+ i++) -+ if (sysdesc->number == syscall_number) -+ return sysdesc->name; -+ -+ return NULL; -+} -+ -+int -+xml_number_of_syscalls (const struct syscalls_info *sysinfo) -+{ -+ return (sysinfo == NULL ? 0 : VEC_length(syscall_desc_p, -+ sysinfo->syscalls)); -+} -+ -+const char ** -+xml_list_of_syscalls (const struct syscalls_info *sysinfo) -+{ -+ struct syscall_desc *sysdesc; -+ const char **names = NULL; -+ int nsyscalls; -+ int i; -+ -+ if (sysinfo == NULL) -+ return NULL; -+ -+ nsyscalls = VEC_length (syscall_desc_p, sysinfo->syscalls); -+ names = xmalloc ((nsyscalls + 1) * sizeof (char *)); -+ -+ for (i = 0; -+ VEC_iterate (syscall_desc_p, sysinfo->syscalls, i, sysdesc); -+ i++) -+ names[i] = sysdesc->name; -+ -+ names[i] = NULL; -+ -+ return names; -+} -+ -+#endif /* HAVE_LIBEXPAT */ -diff --git a/gdb/xml-syscall.h b/gdb/xml-syscall.h -new file mode 100644 -index 0000000..ff11f20 ---- /dev/null -+++ b/gdb/xml-syscall.h -@@ -0,0 +1,64 @@ -+/* Functions that provide the mechanism to parse a syscall XML file -+ and get its values. -+ -+ Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, -+ 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008 -+ Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#ifndef XML_SYSCALL_H -+#define XML_SYSCALL_H 1 -+ -+/* Structure that stores information about the system's -+ syscalls. */ -+ -+struct syscalls_info; -+ -+ -+/* Function responsible for initializing the information -+ about the syscalls. It reads the XML file and fills the -+ struct syscalls_info with the values. -+ -+ Returns the struct syscalls_info if the file is valid, NULL otherwise. */ -+ -+const struct syscalls_info *xml_init_syscalls_info (const char *); -+ -+/* Function that retrieves the syscall number corresponding to the given -+ name. -+ -+ Returns the syscall number if found, or otherwise. */ -+ -+int xml_get_syscall_number (const struct syscalls_info *, const char *); -+ -+/* Function that retrieves the syscall name corresponding to the given -+ number. -+ -+ Returns the syscall name if found, NULL otherwise. */ -+const char *xml_get_syscall_name (const struct syscalls_info *, int); -+ -+/* Function that returns the number of syscalls defined in the system. -+ -+ Returns the number of syscalls, or zero otherwise. */ -+int xml_number_of_syscalls (const struct syscalls_info *); -+ -+/* Function used to retrieve the list of syscalls in the system. This list -+ is returned as an array of strings. -+ -+ Returns the list of syscalls in the system, or NULL otherwise. */ -+const char **xml_list_of_syscalls (const struct syscalls_info *sysinfo); -+ -+#endif /* XML_SYSCALL_H */ -diff --git a/include/elf/common.h b/include/elf/common.h -index 3ba44d9..764141e 100644 ---- a/include/elf/common.h -+++ b/include/elf/common.h -@@ -803,6 +803,7 @@ - #define AT_SECURE 23 /* Boolean, was exec setuid-like? */ - #define AT_BASE_PLATFORM 24 /* String identifying real platform, - may differ from AT_PLATFORM. */ -+#define AT_RANDOM 25 /* Address of 16 random bytes. */ - #define AT_EXECFN 31 /* Filename of executable. */ - /* Pointer to the global system page used for system calls and other - nice things. */ -diff --git a/include/opcode/ppc.h b/include/opcode/ppc.h -index e45fc58..dc9a7ba 100644 ---- a/include/opcode/ppc.h -+++ b/include/opcode/ppc.h -@@ -1,6 +1,6 @@ - /* ppc.h -- Header file for PowerPC opcode table - Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -- 2007 Free Software Foundation, Inc. -+ 2007, 2008, 2009 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support - - This file is part of GDB, GAS, and the GNU binutils. -@@ -351,4 +351,6 @@ struct powerpc_macro - extern const struct powerpc_macro powerpc_macros[]; - extern const int powerpc_num_macros; - -+extern ppc_cpu_t ppc_parse_cpu (ppc_cpu_t, const char *); -+ - #endif /* PPC_H */ -diff --git a/opcodes/po/es.po b/opcodes/po/es.po -index 873be13..40bea5c 100644 ---- a/opcodes/po/es.po -+++ b/opcodes/po/es.po -@@ -1,13 +1,14 @@ --# Mensajes en español para opcodes-2.17.90. --# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. --# Cristian Othón Martínez Vera , 2002, 2003, 2004, 2005, 2006, 2007. -+# Mensajes en español para opcodes-2.18.90. -+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -+# This file is distributed under the same license as the binutils package. -+# Cristian Othón Martínez Vera , 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009. - # - msgid "" - msgstr "" --"Project-Id-Version: opcodes 2.17.90\n" --"Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2007-07-05 09:17+0100\n" --"PO-Revision-Date: 2007-09-08 09:17-0500\n" -+"Project-Id-Version: opcodes 2.18.90\n" -+"Report-Msgid-Bugs-To: bug-binutils@gnu.org\n" -+"POT-Creation-Date: 2008-09-09 15:56+0930\n" -+"PO-Revision-Date: 2009-03-03 21:46-0600\n" - "Last-Translator: Cristian Othón Martínez Vera \n" - "Language-Team: Spanish \n" - "MIME-Version: 1.0\n" -@@ -52,7 +53,7 @@ msgid "too many long constants" - msgstr "demasiadas constantes long" - - #: arc-opc.c:668 --msgid "to many shimms in load" -+msgid "too many shimms in load" - msgstr "demasiados shimms en load" - - #. Do we have a limm already? -@@ -124,7 +125,7 @@ msgstr "No se reconoce el conjunto de nombres de registro: %s\n" - msgid "Unrecognised disassembler option: %s\n" - msgstr "No se reconoce la opción de desensamblador: %s\n" - --#: arm-dis.c:4226 -+#: arm-dis.c:4238 - #, c-format - msgid "" - "\n" -@@ -196,14 +197,14 @@ msgstr "La lista de registros no es v - - #: fr30-asm.c:310 frv-asm.c:1263 ip2k-asm.c:511 iq2000-asm.c:459 - #: m32c-asm.c:1589 m32r-asm.c:328 mep-asm.c:1001 mt-asm.c:595 --#: openrisc-asm.c:241 xc16x-asm.c:375 xstormy16-asm.c:276 -+#: openrisc-asm.c:241 xc16x-asm.c:376 xstormy16-asm.c:276 - #, c-format - msgid "Unrecognized field %d while parsing.\n" - msgstr "No se reconoció el campo %d durante la decodificación.\n" - - #: fr30-asm.c:361 frv-asm.c:1314 ip2k-asm.c:562 iq2000-asm.c:510 - #: m32c-asm.c:1640 m32r-asm.c:379 mep-asm.c:1052 mt-asm.c:646 --#: openrisc-asm.c:292 xc16x-asm.c:426 xstormy16-asm.c:327 -+#: openrisc-asm.c:292 xc16x-asm.c:427 xstormy16-asm.c:327 - msgid "missing mnemonic in syntax string" - msgstr "falta el mnemónico en la cadena sintáctica" - -@@ -216,7 +217,7 @@ msgstr "falta el mnem - #: m32r-asm.c:605 m32r-asm.c:706 mep-asm.c:1187 mep-asm.c:1191 mep-asm.c:1278 - #: mep-asm.c:1379 mt-asm.c:781 mt-asm.c:785 mt-asm.c:872 mt-asm.c:973 - #: openrisc-asm.c:427 openrisc-asm.c:431 openrisc-asm.c:518 openrisc-asm.c:619 --#: xc16x-asm.c:561 xc16x-asm.c:565 xc16x-asm.c:652 xc16x-asm.c:753 -+#: xc16x-asm.c:562 xc16x-asm.c:566 xc16x-asm.c:653 xc16x-asm.c:754 - #: xstormy16-asm.c:462 xstormy16-asm.c:466 xstormy16-asm.c:553 - #: xstormy16-asm.c:654 - msgid "unrecognized instruction" -@@ -224,40 +225,40 @@ msgstr "no se reconoce la instrucci - - #: fr30-asm.c:543 frv-asm.c:1496 ip2k-asm.c:744 iq2000-asm.c:692 - #: m32c-asm.c:1822 m32r-asm.c:561 mep-asm.c:1234 mt-asm.c:828 --#: openrisc-asm.c:474 xc16x-asm.c:608 xstormy16-asm.c:509 -+#: openrisc-asm.c:474 xc16x-asm.c:609 xstormy16-asm.c:509 - #, c-format - msgid "syntax error (expected char `%c', found `%c')" - msgstr "error sintáctico (se esperaba el carácter `%c', se encontró `%c')" - - #: fr30-asm.c:553 frv-asm.c:1506 ip2k-asm.c:754 iq2000-asm.c:702 - #: m32c-asm.c:1832 m32r-asm.c:571 mep-asm.c:1244 mt-asm.c:838 --#: openrisc-asm.c:484 xc16x-asm.c:618 xstormy16-asm.c:519 -+#: openrisc-asm.c:484 xc16x-asm.c:619 xstormy16-asm.c:519 - #, c-format - msgid "syntax error (expected char `%c', found end of instruction)" - msgstr "error sintáctico (se esperaba el carácter `%c', se encontró el final de la instrucción)" - - #: fr30-asm.c:581 frv-asm.c:1534 ip2k-asm.c:782 iq2000-asm.c:730 - #: m32c-asm.c:1860 m32r-asm.c:599 mep-asm.c:1272 mt-asm.c:866 --#: openrisc-asm.c:512 xc16x-asm.c:646 xstormy16-asm.c:547 -+#: openrisc-asm.c:512 xc16x-asm.c:647 xstormy16-asm.c:547 - msgid "junk at end of line" - msgstr "basura al final de la línea" - - #: fr30-asm.c:687 frv-asm.c:1640 ip2k-asm.c:888 iq2000-asm.c:836 - #: m32c-asm.c:1966 m32r-asm.c:705 mep-asm.c:1378 mt-asm.c:972 --#: openrisc-asm.c:618 xc16x-asm.c:752 xstormy16-asm.c:653 -+#: openrisc-asm.c:618 xc16x-asm.c:753 xstormy16-asm.c:653 - msgid "unrecognized form of instruction" - msgstr "no se reconoce la forma de instrucción" - - #: fr30-asm.c:699 frv-asm.c:1652 ip2k-asm.c:900 iq2000-asm.c:848 - #: m32c-asm.c:1978 m32r-asm.c:717 mep-asm.c:1390 mt-asm.c:984 --#: openrisc-asm.c:630 xc16x-asm.c:764 xstormy16-asm.c:665 -+#: openrisc-asm.c:630 xc16x-asm.c:765 xstormy16-asm.c:665 - #, c-format - msgid "bad instruction `%.50s...'" - msgstr "instrucción errónea `%.50s...'" - - #: fr30-asm.c:702 frv-asm.c:1655 ip2k-asm.c:903 iq2000-asm.c:851 - #: m32c-asm.c:1981 m32r-asm.c:720 mep-asm.c:1393 mt-asm.c:987 --#: openrisc-asm.c:633 xc16x-asm.c:767 xstormy16-asm.c:668 -+#: openrisc-asm.c:633 xc16x-asm.c:768 xstormy16-asm.c:668 - #, c-format - msgid "bad instruction `%.50s'" - msgstr "instrucción errónea `%.50s'" -@@ -377,11 +378,11 @@ msgstr "no se puede lidiar con insert %d\n" - msgid "%02x\t\t*unknown*" - msgstr "%02x\t\t*desconocido*" - --#: i386-dis.c:3196 -+#: i386-dis.c:9545 - msgid "" - msgstr "" - --#: i386-dis.c:3423 -+#: i386-dis.c:9776 - #, c-format - msgid "" - "\n" -@@ -392,79 +393,124 @@ msgstr "" - "Se admiten las siguientes opciones de desensamblador específicas de i386/x86-64\n" - "con el interruptor -M (las opciones múltiples se deben separar con comas):\n" - --#: i386-dis.c:3427 -+#: i386-dis.c:9780 - #, c-format - msgid " x86-64 Disassemble in 64bit mode\n" - msgstr " x86-64 Desensambla en modo 64bit\n" - --#: i386-dis.c:3428 -+#: i386-dis.c:9781 - #, c-format - msgid " i386 Disassemble in 32bit mode\n" - msgstr " i386 Desensambla en modo 32bit\n" - --#: i386-dis.c:3429 -+#: i386-dis.c:9782 - #, c-format - msgid " i8086 Disassemble in 16bit mode\n" - msgstr " i8086 Desensambla en modo 16bit\n" - --#: i386-dis.c:3430 -+#: i386-dis.c:9783 - #, c-format - msgid " att Display instruction in AT&T syntax\n" - msgstr " att Muestra las instrucciones con sintaxis AT&T\n" - --#: i386-dis.c:3431 -+#: i386-dis.c:9784 - #, c-format - msgid " intel Display instruction in Intel syntax\n" - msgstr " intel Muestra las instrucciones con sintaxis Intel\n" - --#: i386-dis.c:3432 -+#: i386-dis.c:9785 -+#, c-format -+msgid "" -+" att-mnemonic\n" -+" Display instruction in AT&T mnemonic\n" -+msgstr "" -+" att-mnemonic\n" -+" Muestra las instrucciones con mnemónicos AT&T\n" -+ -+#: i386-dis.c:9787 -+#, c-format -+msgid "" -+" intel-mnemonic\n" -+" Display instruction in Intel mnemonic\n" -+msgstr "" -+" intel-mnemonic\n" -+" Muestra las instrucciones con mnemónicos Intel\n" -+ -+#: i386-dis.c:9789 - #, c-format - msgid " addr64 Assume 64bit address size\n" - msgstr " addr64 Asume un tamaño de dirección de 64bit\n" - --#: i386-dis.c:3433 -+#: i386-dis.c:9790 - #, c-format - msgid " addr32 Assume 32bit address size\n" - msgstr " addr32 Asume un tamaño de dirección de 32bit\n" - --#: i386-dis.c:3434 -+#: i386-dis.c:9791 - #, c-format - msgid " addr16 Assume 16bit address size\n" - msgstr " addr16 Asume un tamaño de dirección de 16bit\n" - --#: i386-dis.c:3435 -+#: i386-dis.c:9792 - #, c-format - msgid " data32 Assume 32bit data size\n" - msgstr " data32 Asume un tamaño de datos de 32bit\n" - --#: i386-dis.c:3436 -+#: i386-dis.c:9793 - #, c-format - msgid " data16 Assume 16bit data size\n" - msgstr " data16 Asume un tamaño de datos de 16bit\n" - --#: i386-dis.c:3437 -+#: i386-dis.c:9794 - #, c-format - msgid " suffix Always display instruction suffix in AT&T syntax\n" - msgstr " suffix Siempre muestra el sufijo de instrucción con sintaxis AT&T\n" - --#: i386-gen.c:42 ia64-gen.c:307 -+#: i386-gen.c:411 ia64-gen.c:307 - #, c-format - msgid "%s: Error: " - msgstr "%s: Error: " - --#: i386-gen.c:109 --msgid "can't find i386-opc.tbl for reading\n" --msgstr "no se puede encontrar i386-opc.tbl para lectura\n" -+#: i386-gen.c:510 -+#, c-format -+msgid "%s: %d: Unknown bitfield: %s\n" -+msgstr "%s: %d: Campo de bits desconocido: %s\n" -+ -+#: i386-gen.c:674 -+#, c-format -+msgid "can't find i386-opc.tbl for reading, errno = %s\n" -+msgstr "no se puede encontrar i386-opc.tbl para lectura, errno =%s\n" - --#: i386-gen.c:260 --msgid "can't find i386-reg.tbl for reading\n" --msgstr "no se puede encontrar i386-reg.tbl para lectura\n" -+#: i386-gen.c:851 -+#, c-format -+msgid "can't find i386-reg.tbl for reading, errno = %s\n" -+msgstr "no se puede encontrar i386-reg.tbl para lectura, errno = %s\n" -+ -+#: i386-gen.c:943 -+#, c-format -+msgid "can't create i386-init.h, errno = %s\n" -+msgstr "no se puede crear i386-init.h, errno = %s\n" - --#: i386-gen.c:386 ia64-gen.c:2841 -+#: i386-gen.c:1032 ia64-gen.c:2850 - #, c-format - msgid "unable to change directory to \"%s\", errno = %s\n" - msgstr "no se puede cambiar el directorio a \"%s\", errno = %s\n" - -+#: i386-gen.c:1039 -+#, c-format -+msgid "%d unused bits in i386_cpu_flags.\n" -+msgstr "%d bits sin usar en i386_cpu_flags.\n" -+ -+#: i386-gen.c:1046 -+#, c-format -+msgid "%d unused bits in i386_operand_type.\n" -+msgstr "%d bits sin usar en i386_operand_type.\n" -+ -+#: i386-gen.c:1060 -+#, c-format -+msgid "can't create i386-tbl.h, errno = %s\n" -+msgstr "no se puede crear i386-tbl.h, errno = %s\n" -+ - #: ia64-gen.c:320 - #, c-format - msgid "%s: Warning: " -@@ -503,62 +549,67 @@ msgstr "campo solapado %s->%s\n" - msgid "overwriting note %d with note %d (IC:%s)\n" - msgstr "se sobreescribe la nota %d con la nota %d (IC:%s)\n" - --#: ia64-gen.c:1455 -+#: ia64-gen.c:1459 - #, c-format - msgid "don't know how to specify %% dependency %s\n" - msgstr "no se sabe cómo especificar la dependencia %% %s\n" - --#: ia64-gen.c:1477 -+#: ia64-gen.c:1481 - #, c-format - msgid "Don't know how to specify # dependency %s\n" - msgstr "No se sabe cómo especificar la dependencia # %s\n" - --#: ia64-gen.c:1516 -+#: ia64-gen.c:1520 - #, c-format - msgid "IC:%s [%s] has no terminals or sub-classes\n" - msgstr "IC:%s [%s] no tiene terminales o sub-clases\n" - --#: ia64-gen.c:1519 -+#: ia64-gen.c:1523 - #, c-format - msgid "IC:%s has no terminals or sub-classes\n" - msgstr "IC:%s no tiene terminales o sub-clases\n" - --#: ia64-gen.c:1528 -+#: ia64-gen.c:1532 - #, c-format - msgid "no insns mapped directly to terminal IC %s [%s]" - msgstr "no hay insns mapeadas directamente al IC terminal %s [%s]" - --#: ia64-gen.c:1531 -+#: ia64-gen.c:1535 - #, c-format - msgid "no insns mapped directly to terminal IC %s\n" - msgstr "no hay insns mapeadas directamente al IC terminal %s\n" - --#: ia64-gen.c:1542 -+#: ia64-gen.c:1546 - #, c-format - msgid "class %s is defined but not used\n" - msgstr "se define la clase %s pero no se utiliza\n" - --#: ia64-gen.c:1553 -+#: ia64-gen.c:1559 - #, c-format --msgid "Warning: rsrc %s (%s) has no chks%s\n" --msgstr "Aviso: el rsrc %s (%s) no tiene chks%s\n" -+msgid "Warning: rsrc %s (%s) has no chks\n" -+msgstr "Aviso: el rsrc %s (%s) no tiene chks\n" - --#: ia64-gen.c:1557 -+#: ia64-gen.c:1562 -+#, c-format -+msgid "Warning: rsrc %s (%s) has no chks or regs\n" -+msgstr "Aviso: el rsrc %s (%s) no tiene chks o regs\n" -+ -+#: ia64-gen.c:1566 - #, c-format - msgid "rsrc %s (%s) has no regs\n" - msgstr "el rsrc %s (%s) no tiene registros\n" - --#: ia64-gen.c:2469 -+#: ia64-gen.c:2478 - #, c-format - msgid "IC note %d in opcode %s (IC:%s) conflicts with resource %s note %d\n" - msgstr "la nota IC %d en el código de operación %s (IC:%s) tiene conflictos con el recurso %s nota %d\n" - --#: ia64-gen.c:2497 -+#: ia64-gen.c:2506 - #, c-format - msgid "IC note %d for opcode %s (IC:%s) conflicts with resource %s note %d\n" - msgstr "la nota IC %d para el código de operación %s (IC:%s) tiene conflictos con el recurso %s nota %d\n" - --#: ia64-gen.c:2511 -+#: ia64-gen.c:2520 - #, c-format - msgid "opcode %s has no class (ops %d %d %d)\n" - msgstr "el código de operación %s no tiene clase (ops %d %d %d)\n" -@@ -739,26 +790,26 @@ msgstr "S - msgid "invalid %function() here" - msgstr "%funcion() inválida aquí" - --#: mips-dis.c:745 -+#: mips-dis.c:781 - msgid "# internal error, incomplete extension sequence (+)" - msgstr "# error interno, secuencia de extensión incompleta (+)" - --#: mips-dis.c:852 -+#: mips-dis.c:915 - #, c-format - msgid "# internal error, undefined extension sequence (+%c)" - msgstr "# error interno, secuencia de extensión sin definir (+%c)" - --#: mips-dis.c:1211 -+#: mips-dis.c:1274 - #, c-format --msgid "# internal error, undefined modifier(%c)" --msgstr "# error interno, modificador(%c) sin definir" -+msgid "# internal error, undefined modifier (%c)" -+msgstr "# error interno, modificador (%c) sin definir" - --#: mips-dis.c:1818 -+#: mips-dis.c:1881 - #, c-format - msgid "# internal disassembler error, unrecognised modifier (%c)" - msgstr "# error interno del desensamblador, no se reconoce el modificador (%c)" - --#: mips-dis.c:2049 -+#: mips-dis.c:2112 - #, c-format - msgid "" - "\n" -@@ -769,7 +820,7 @@ msgstr "" - "Las siguientes opciones de desensamblador específicas de MIPS se admiten\n" - "para usarse con el interruptor -M (las opciones múltiples se deben separar con comas):\n" - --#: mips-dis.c:2053 -+#: mips-dis.c:2116 - #, c-format - msgid "" - "\n" -@@ -780,7 +831,7 @@ msgstr "" - " gpr-names=ABI Muestra los nombres GPR de acuerdo a la ABI especificada.\n" - " Por defecto: basado en el binario a desensamblar.\n" - --#: mips-dis.c:2057 -+#: mips-dis.c:2120 - #, c-format - msgid "" - "\n" -@@ -791,7 +842,7 @@ msgstr "" - " fpr-names=ABI Muestra los nombres FPR de acuerdo a la ABI especificada.\n" - " Por defecto: numérico.\n" - --#: mips-dis.c:2061 -+#: mips-dis.c:2124 - #, c-format - msgid "" - "\n" -@@ -804,7 +855,7 @@ msgstr "" - " la arquitectura especificada.\n" - " Por defecto: basado en el binario a desensamblar.\n" - --#: mips-dis.c:2066 -+#: mips-dis.c:2129 - #, c-format - msgid "" - "\n" -@@ -817,7 +868,7 @@ msgstr "" - " especificada.\n" - " Por defecto: basado en el binario a desensamblar.\n" - --#: mips-dis.c:2071 -+#: mips-dis.c:2134 - #, c-format - msgid "" - "\n" -@@ -828,7 +879,7 @@ msgstr "" - " reg-names=ABI Muestra los nombres GPR y FPR de acuerdo a\n" - " la ABI especificada.\n" - --#: mips-dis.c:2075 -+#: mips-dis.c:2138 - #, c-format - msgid "" - "\n" -@@ -839,7 +890,7 @@ msgstr "" - " reg-names=ARCH Muestra el registro CP0 y los nombres HWR de acuerdo a\n" - " la arquitectura especificada.\n" - --#: mips-dis.c:2079 -+#: mips-dis.c:2142 - #, c-format - msgid "" - "\n" -@@ -850,12 +901,12 @@ msgstr "" - " Para las opciones anteriores, se admiten los siguientes valores de \"ABI\":\n" - " " - --#: mips-dis.c:2084 mips-dis.c:2092 mips-dis.c:2094 -+#: mips-dis.c:2147 mips-dis.c:2155 mips-dis.c:2157 - #, c-format - msgid "\n" - msgstr "\n" - --#: mips-dis.c:2086 -+#: mips-dis.c:2149 - #, c-format - msgid "" - "\n" -@@ -894,9 +945,8 @@ msgid "Biiiig Trouble in parse_imm16!" - msgstr "¡Graaaan Problema en parse_imm16!" - - #: mt-asm.c:157 --#, c-format --msgid "%operator operand is not a symbol" --msgstr "el operando %operator no es un símbolo" -+msgid "The percent-operator's operand is not a symbol" -+msgstr "el operando de operador-porcentaje no es un símbolo" - - #: mt-asm.c:395 - msgid "invalid operand. type may have values 0,1,2 only." -@@ -912,42 +962,64 @@ msgstr "operando inv - msgid "$" - msgstr "$" - --#: ppc-opc.c:782 ppc-opc.c:810 -+#: ppc-opc.c:862 ppc-opc.c:890 - msgid "invalid conditional option" - msgstr "opción condicional inválida" - --#: ppc-opc.c:812 -+#: ppc-opc.c:892 - msgid "attempt to set y bit when using + or - modifier" - msgstr "intento de establecer el bit y cuando se usaba el modificador + ó -" - --#: ppc-opc.c:844 -+#: ppc-opc.c:924 - msgid "invalid mask field" - msgstr "campo de máscara inválido" - --#: ppc-opc.c:870 -+#: ppc-opc.c:950 - msgid "ignoring invalid mfcr mask" - msgstr "se descarta la máscara mfcr inválida" - --#: ppc-opc.c:920 ppc-opc.c:955 -+#: ppc-opc.c:1000 ppc-opc.c:1035 - msgid "illegal bitmask" - msgstr "máscara de bits ilegal" - --#: ppc-opc.c:1075 -+#: ppc-opc.c:1155 - msgid "index register in load range" - msgstr "registro índice en el rango de carga" - --#: ppc-opc.c:1091 -+#: ppc-opc.c:1171 - msgid "source and target register operands must be different" - msgstr "los operandos de registros fuente y objetivo deben ser diferentes" - --#: ppc-opc.c:1106 -+#: ppc-opc.c:1186 - msgid "invalid register operand when updating" - msgstr "operando de registro inválido mientras se actualizaba" - --#: ppc-opc.c:1188 -+#: ppc-opc.c:1265 - msgid "invalid sprg number" - msgstr "número sprg inválido" - -+#: s390-dis.c:276 -+#, c-format -+msgid "" -+"\n" -+"The following S/390 specific disassembler options are supported for use\n" -+"with the -M switch (multiple options should be separated by commas):\n" -+msgstr "" -+"\n" -+"Las siguientes opciones de desensamblador específicas de S/390 se admiten\n" -+"para usarse con el interruptor -M (las opciones múltiples se deben\n" -+"separar con comas):\n" -+ -+#: s390-dis.c:280 -+#, c-format -+msgid " esa Disassemble in ESA architecture mode\n" -+msgstr " esa Desensambla en modo de arquitectura ESA\n" -+ -+#: s390-dis.c:281 -+#, c-format -+msgid " zarch Disassemble in z/Architecture mode\n" -+msgstr " zarch Desensambla en modo de z/Architecture\n" -+ - #: score-dis.c:220 score-dis.c:383 - msgid "" - msgstr "" -@@ -1031,27 +1103,27 @@ msgstr "el valor inmediato no est - msgid "immediate value must be even" - msgstr "el valor inmediato debe ser par" - --#: xc16x-asm.c:65 -+#: xc16x-asm.c:66 - msgid "Missing '#' prefix" - msgstr "Falta el prefijo '#'" - --#: xc16x-asm.c:81 -+#: xc16x-asm.c:82 - msgid "Missing '.' prefix" - msgstr "Falta el prefijo '.'" - --#: xc16x-asm.c:97 -+#: xc16x-asm.c:98 - msgid "Missing 'pof:' prefix" - msgstr "Falta el prefijo 'pof:'" - --#: xc16x-asm.c:113 -+#: xc16x-asm.c:114 - msgid "Missing 'pag:' prefix" - msgstr "Falta el prefijo 'pag:'" - --#: xc16x-asm.c:129 -+#: xc16x-asm.c:130 - msgid "Missing 'sof:' prefix" - msgstr "Falta el prefijo 'sof:'" - --#: xc16x-asm.c:145 -+#: xc16x-asm.c:146 - msgid "Missing 'seg:' prefix" - msgstr "Falta el prefijo 'seg:'" - -@@ -1095,6 +1167,9 @@ msgstr "El operando no es un s - msgid "Syntax error: No trailing ')'" - msgstr "Error sintáctico: No hay ')' al final" - -+#~ msgid "%operator operand is not a symbol" -+#~ msgstr "el operando %operator no es un símbolo" -+ - #~ msgid "offset not a multiple of 16" - #~ msgstr "el desplazamiento no es un múltiplo de 16" - -diff --git a/opcodes/po/id.po b/opcodes/po/id.po -index 3edf294..0f6c063 100644 ---- a/opcodes/po/id.po -+++ b/opcodes/po/id.po -@@ -1,46 +1,133 @@ --# opcodes 2.12.1 (Indonesian) --# Copyright (C) 2002 Free Software Foundation, Inc. -+# Pesan bahasa indonesia untuk opcodes -+# Copyright (C) 2009 Free Software Foundation, Inc. -+# This file is distributed under the same license as the binutils package. - # Tedi Heriyanto , 2002. -+# Arif E. Nugroho , 2009. - # - msgid "" - msgstr "" --"Project-Id-Version: opcodes 2.12.1\n" --"POT-Creation-Date: 2002-02-08 03:24-0200\n" --"PO-Revision-Date: 2002-07-23 12:35GMT+0700\n" --"Last-Translator: Tedi Heriyanto \n" -+"Project-Id-Version: opcodes 2.18.90\n" -+"Report-Msgid-Bugs-To: bug-binutils@gnu.org\n" -+"POT-Creation-Date: 2008-09-09 15:56+0930\n" -+"PO-Revision-Date: 2009-03-10 13:30+0700\n" -+"Last-Translator: Arif E. Nugroho \n" - "Language-Team: Indonesian \n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" --"X-Generator: KBabel 0.9.5\n" - --#: alpha-opc.c:335 -+#: alpha-opc.c:155 - msgid "branch operand unaligned" - msgstr "operand cabang tidak rata" - --#: alpha-opc.c:358 alpha-opc.c:380 -+#: alpha-opc.c:171 alpha-opc.c:187 - msgid "jump hint unaligned" - msgstr "petunjuk lompat tidak rata" - --#: arc-dis.c:52 -+#: arc-dis.c:77 - msgid "Illegal limm reference in last instruction!\n" - msgstr "referensi limm ilegal dalam instruksi terakhir!\n" - --#: arm-dis.c:502 -+#: arc-opc.c:386 -+msgid "unable to fit different valued constants into instruction" -+msgstr "tidak dapat memasukan nilai konstanta berbeda kedalam instruksi" -+ -+#: arc-opc.c:395 -+msgid "auxiliary register not allowed here" -+msgstr "register tambahan tidak diperbolehkan disini" -+ -+#: arc-opc.c:401 arc-opc.c:418 -+msgid "attempt to set readonly register" -+msgstr "mencoba untuk menset register baca-saja" -+ -+#: arc-opc.c:406 arc-opc.c:423 -+msgid "attempt to read writeonly register" -+msgstr "mencoba untuk membaca register tulis-saja" -+ -+#: arc-opc.c:428 -+#, c-format -+msgid "invalid register number `%d'" -+msgstr "nomor register tidak valid `%d'" -+ -+#: arc-opc.c:594 arc-opc.c:645 arc-opc.c:673 -+msgid "too many long constants" -+msgstr "terlalu banyak konstanta panjang" -+ -+#: arc-opc.c:668 -+msgid "too many shimms in load" -+msgstr "terlalu banyak shimm dalam load" -+ -+#. Do we have a limm already? -+#: arc-opc.c:781 -+msgid "impossible store" -+msgstr "store tidak memungkinkan" -+ -+#: arc-opc.c:814 -+msgid "st operand error" -+msgstr "operand st error" -+ -+#: arc-opc.c:818 arc-opc.c:860 -+msgid "address writeback not allowed" -+msgstr "alamat writeback tidak diijinkan" -+ -+#: arc-opc.c:822 -+msgid "store value must be zero" -+msgstr "nilai simpan harus nol" -+ -+#: arc-opc.c:847 -+msgid "invalid load/shimm insn" -+msgstr "insn load/shimm tidak valid" -+ -+#: arc-opc.c:856 -+msgid "ld operand error" -+msgstr "operand ld error" -+ -+#: arc-opc.c:943 -+msgid "jump flags, but no .f seen" -+msgstr "tanda jump, tetapi tidak ada .f yang terlihat" -+ -+#: arc-opc.c:946 -+msgid "jump flags, but no limm addr" -+msgstr "tanda jump, tetapi tidak ada alamat limm" -+ -+#: arc-opc.c:949 -+msgid "flag bits of jump address limm lost" -+msgstr "tanda bit dari alamat jump limm hilang" -+ -+#: arc-opc.c:952 -+msgid "attempt to set HR bits" -+msgstr "mencoba menset bit HR" -+ -+#: arc-opc.c:955 -+msgid "bad jump flags value" -+msgstr "nilai tanda jump buruk" -+ -+#: arc-opc.c:988 -+msgid "branch address not on 4 byte boundary" -+msgstr "alamat cabang tidak dalam kelipatan 4 byte" -+ -+#: arc-opc.c:1024 -+msgid "must specify .jd or no nullify suffix" -+msgstr "harus menspesifikasikan .jd atau tidak ada akhiran nullify" -+ -+#: arm-dis.c:1808 - msgid "" - msgstr "" - --#: arm-dis.c:1012 -+#. XXX - should break 'option' at following delimiter. -+#: arm-dis.c:3818 - #, c-format - msgid "Unrecognised register name set: %s\n" - msgstr "Set nama register tidak dikenal: %s\n" - --#: arm-dis.c:1019 -+#. XXX - should break 'option' at following delimiter. -+#: arm-dis.c:3826 - #, c-format - msgid "Unrecognised disassembler option: %s\n" - msgstr "Option disasembler tidak dikenal: %s\n" - --#: arm-dis.c:1191 -+#: arm-dis.c:4238 -+#, c-format - msgid "" - "\n" - "The following ARM specific disassembler options are supported for use with\n" -@@ -50,297 +137,919 @@ msgstr "" - "Option disablembler khusus ARM berikut ini didukung untuk digunakan dengan\n" - "switch -M:\n" - --#: avr-dis.c:118 avr-dis.c:128 -+#: avr-dis.c:115 avr-dis.c:125 -+#, c-format - msgid "undefined" - msgstr "tidak didefinisikan" - --#: avr-dis.c:180 -+#: avr-dis.c:187 -+#, c-format - msgid "Internal disassembler error" - msgstr "Kesalahan disasembler internal" - --#: avr-dis.c:228 -+#: avr-dis.c:236 - #, c-format - msgid "unknown constraint `%c'" - msgstr "konstrain tidak dikenal `%c'" - --#: cgen-asm.c:346 fr30-ibld.c:195 m32r-ibld.c:195 openrisc-ibld.c:195 xstormy16-ibld.c:195 -+#: cgen-asm.c:336 fr30-ibld.c:200 frv-ibld.c:200 ip2k-ibld.c:200 -+#: iq2000-ibld.c:200 m32c-ibld.c:200 m32r-ibld.c:200 mep-ibld.c:200 -+#: mt-ibld.c:200 openrisc-ibld.c:200 xc16x-ibld.c:200 xstormy16-ibld.c:200 - #, c-format - msgid "operand out of range (%ld not between %ld and %ld)" - msgstr "operand keluar batas (%ld tidak antara %ld dan %ld)" - --#: cgen-asm.c:367 -+#: cgen-asm.c:358 - #, c-format - msgid "operand out of range (%lu not between %lu and %lu)" - msgstr "operand keluar batas (%lu tidak antara %lu dan %lu)" - --#: d30v-dis.c:312 -+#: d30v-dis.c:255 - #, c-format - msgid "" - msgstr "" - - #. Can't happen. --#: dis-buf.c:57 -+#: dis-buf.c:59 - #, c-format - msgid "Unknown error %d\n" - msgstr "Kesalahan tidak dikenal %d\n" - --#: dis-buf.c:62 -+#: dis-buf.c:68 - #, c-format --msgid "Address 0x%x is out of bounds.\n" --msgstr "Alamat 0x%x di luar batas.\n" -+msgid "Address 0x%s is out of bounds.\n" -+msgstr "Alamat 0x%s di luar jangkauan.\n" - --#: fr30-asm.c:323 m32r-asm.c:325 openrisc-asm.c:244 xstormy16-asm.c:231 -+#: fr30-asm.c:93 m32c-asm.c:877 m32c-asm.c:884 -+msgid "Register number is not valid" -+msgstr "Nomor register tidak valid" -+ -+#: fr30-asm.c:95 -+msgid "Register must be between r0 and r7" -+msgstr "Register harus berada diantara r0 dan r7" -+ -+#: fr30-asm.c:97 -+msgid "Register must be between r8 and r15" -+msgstr "Register harus berada diantara r8 dan r15" -+ -+#: fr30-asm.c:116 m32c-asm.c:915 -+msgid "Register list is not valid" -+msgstr "Daftar register tidak valid" -+ -+#: fr30-asm.c:310 frv-asm.c:1263 ip2k-asm.c:511 iq2000-asm.c:459 -+#: m32c-asm.c:1589 m32r-asm.c:328 mep-asm.c:1001 mt-asm.c:595 -+#: openrisc-asm.c:241 xc16x-asm.c:376 xstormy16-asm.c:276 - #, c-format - msgid "Unrecognized field %d while parsing.\n" - msgstr "Field tidak dikenal %d saat parsing.\n" - --#: fr30-asm.c:373 m32r-asm.c:375 openrisc-asm.c:294 xstormy16-asm.c:281 -+#: fr30-asm.c:361 frv-asm.c:1314 ip2k-asm.c:562 iq2000-asm.c:510 -+#: m32c-asm.c:1640 m32r-asm.c:379 mep-asm.c:1052 mt-asm.c:646 -+#: openrisc-asm.c:292 xc16x-asm.c:427 xstormy16-asm.c:327 - msgid "missing mnemonic in syntax string" - msgstr "mnemonik hilang dalam string sintaks" - - #. We couldn't parse it. --#: fr30-asm.c:509 fr30-asm.c:513 fr30-asm.c:600 fr30-asm.c:702 m32r-asm.c:511 m32r-asm.c:515 m32r-asm.c:602 m32r-asm.c:704 openrisc-asm.c:430 openrisc-asm.c:434 openrisc-asm.c:521 openrisc-asm.c:623 xstormy16-asm.c:417 xstormy16-asm.c:421 xstormy16-asm.c:508 xstormy16-asm.c:610 -+#: fr30-asm.c:496 fr30-asm.c:500 fr30-asm.c:587 fr30-asm.c:688 frv-asm.c:1449 -+#: frv-asm.c:1453 frv-asm.c:1540 frv-asm.c:1641 ip2k-asm.c:697 ip2k-asm.c:701 -+#: ip2k-asm.c:788 ip2k-asm.c:889 iq2000-asm.c:645 iq2000-asm.c:649 -+#: iq2000-asm.c:736 iq2000-asm.c:837 m32c-asm.c:1775 m32c-asm.c:1779 -+#: m32c-asm.c:1866 m32c-asm.c:1967 m32r-asm.c:514 m32r-asm.c:518 -+#: m32r-asm.c:605 m32r-asm.c:706 mep-asm.c:1187 mep-asm.c:1191 mep-asm.c:1278 -+#: mep-asm.c:1379 mt-asm.c:781 mt-asm.c:785 mt-asm.c:872 mt-asm.c:973 -+#: openrisc-asm.c:427 openrisc-asm.c:431 openrisc-asm.c:518 openrisc-asm.c:619 -+#: xc16x-asm.c:562 xc16x-asm.c:566 xc16x-asm.c:653 xc16x-asm.c:754 -+#: xstormy16-asm.c:462 xstormy16-asm.c:466 xstormy16-asm.c:553 -+#: xstormy16-asm.c:654 - msgid "unrecognized instruction" - msgstr "instruksti tidak dikenal" - --#: fr30-asm.c:556 m32r-asm.c:558 openrisc-asm.c:477 xstormy16-asm.c:464 -+#: fr30-asm.c:543 frv-asm.c:1496 ip2k-asm.c:744 iq2000-asm.c:692 -+#: m32c-asm.c:1822 m32r-asm.c:561 mep-asm.c:1234 mt-asm.c:828 -+#: openrisc-asm.c:474 xc16x-asm.c:609 xstormy16-asm.c:509 - #, c-format - msgid "syntax error (expected char `%c', found `%c')" - msgstr "kesalahan sintaks (diharapkan karakter `%c', ditemukan `%c')" - --#: fr30-asm.c:566 m32r-asm.c:568 openrisc-asm.c:487 xstormy16-asm.c:474 -+#: fr30-asm.c:553 frv-asm.c:1506 ip2k-asm.c:754 iq2000-asm.c:702 -+#: m32c-asm.c:1832 m32r-asm.c:571 mep-asm.c:1244 mt-asm.c:838 -+#: openrisc-asm.c:484 xc16x-asm.c:619 xstormy16-asm.c:519 - #, c-format - msgid "syntax error (expected char `%c', found end of instruction)" - msgstr "kesalahan sintaks (diharapkan karakter `%c', ditemukan akhir instruksi)" - --#: fr30-asm.c:594 m32r-asm.c:596 openrisc-asm.c:515 xstormy16-asm.c:502 -+#: fr30-asm.c:581 frv-asm.c:1534 ip2k-asm.c:782 iq2000-asm.c:730 -+#: m32c-asm.c:1860 m32r-asm.c:599 mep-asm.c:1272 mt-asm.c:866 -+#: openrisc-asm.c:512 xc16x-asm.c:647 xstormy16-asm.c:547 - msgid "junk at end of line" - msgstr "sampah di akhir baris" - --#: fr30-asm.c:701 m32r-asm.c:703 openrisc-asm.c:622 xstormy16-asm.c:609 -+#: fr30-asm.c:687 frv-asm.c:1640 ip2k-asm.c:888 iq2000-asm.c:836 -+#: m32c-asm.c:1966 m32r-asm.c:705 mep-asm.c:1378 mt-asm.c:972 -+#: openrisc-asm.c:618 xc16x-asm.c:753 xstormy16-asm.c:653 - msgid "unrecognized form of instruction" - msgstr "bentuk instruksi tidak dikenal" - --#: fr30-asm.c:713 m32r-asm.c:715 openrisc-asm.c:634 xstormy16-asm.c:621 -+#: fr30-asm.c:699 frv-asm.c:1652 ip2k-asm.c:900 iq2000-asm.c:848 -+#: m32c-asm.c:1978 m32r-asm.c:717 mep-asm.c:1390 mt-asm.c:984 -+#: openrisc-asm.c:630 xc16x-asm.c:765 xstormy16-asm.c:665 - #, c-format - msgid "bad instruction `%.50s...'" - msgstr "instruksi buruk `%.50s...'" - --#: fr30-asm.c:716 m32r-asm.c:718 openrisc-asm.c:637 xstormy16-asm.c:624 -+#: fr30-asm.c:702 frv-asm.c:1655 ip2k-asm.c:903 iq2000-asm.c:851 -+#: m32c-asm.c:1981 m32r-asm.c:720 mep-asm.c:1393 mt-asm.c:987 -+#: openrisc-asm.c:633 xc16x-asm.c:768 xstormy16-asm.c:668 - #, c-format - msgid "bad instruction `%.50s'" - msgstr "instruksi buruk `%.50s'" - - #. Default text to print if an instruction isn't recognized. --#: fr30-dis.c:39 m32r-dis.c:39 mmix-dis.c:282 openrisc-dis.c:39 xstormy16-dis.c:39 -+#: fr30-dis.c:41 frv-dis.c:41 ip2k-dis.c:41 iq2000-dis.c:41 m32c-dis.c:41 -+#: m32r-dis.c:41 mep-dis.c:41 mmix-dis.c:278 mt-dis.c:41 openrisc-dis.c:41 -+#: xc16x-dis.c:41 xstormy16-dis.c:41 - msgid "*unknown*" - msgstr "*tidak dikenal*" - --#: fr30-dis.c:318 m32r-dis.c:249 openrisc-dis.c:136 xstormy16-dis.c:169 -+#: fr30-dis.c:299 frv-dis.c:396 ip2k-dis.c:288 iq2000-dis.c:189 m32c-dis.c:891 -+#: m32r-dis.c:256 mep-dis.c:776 mt-dis.c:290 openrisc-dis.c:135 -+#: xc16x-dis.c:375 xstormy16-dis.c:168 - #, c-format - msgid "Unrecognized field %d while printing insn.\n" - msgstr "Field tidak dikenal %d saat mencetak insn.\n" - --#: fr30-ibld.c:166 m32r-ibld.c:166 openrisc-ibld.c:166 xstormy16-ibld.c:166 -+#: fr30-ibld.c:163 frv-ibld.c:163 ip2k-ibld.c:163 iq2000-ibld.c:163 -+#: m32c-ibld.c:163 m32r-ibld.c:163 mep-ibld.c:163 mt-ibld.c:163 -+#: openrisc-ibld.c:163 xc16x-ibld.c:163 xstormy16-ibld.c:163 - #, c-format - msgid "operand out of range (%ld not between %ld and %lu)" - msgstr "operand di luar batas (%ld tidak antara %ld dan %lu)" - --#: fr30-ibld.c:179 m32r-ibld.c:179 openrisc-ibld.c:179 xstormy16-ibld.c:179 -+#: fr30-ibld.c:184 frv-ibld.c:184 ip2k-ibld.c:184 iq2000-ibld.c:184 -+#: m32c-ibld.c:184 m32r-ibld.c:184 mep-ibld.c:184 mt-ibld.c:184 -+#: openrisc-ibld.c:184 xc16x-ibld.c:184 xstormy16-ibld.c:184 - #, c-format --msgid "operand out of range (%lu not between 0 and %lu)" --msgstr "operand di luar batas (%lu tidak antara 0 dan %lu)" -+msgid "operand out of range (0x%lx not between 0 and 0x%lx)" -+msgstr "operand di luar batas (0x%lx tidak antara 0 dan 0x%lx)" - --#: fr30-ibld.c:730 m32r-ibld.c:659 openrisc-ibld.c:633 xstormy16-ibld.c:678 -+#: fr30-ibld.c:726 frv-ibld.c:852 ip2k-ibld.c:603 iq2000-ibld.c:709 -+#: m32c-ibld.c:1727 m32r-ibld.c:661 mep-ibld.c:1024 mt-ibld.c:745 -+#: openrisc-ibld.c:629 xc16x-ibld.c:748 xstormy16-ibld.c:674 - #, c-format - msgid "Unrecognized field %d while building insn.\n" - msgstr "Field tidak dikenal %d saat membuild insn.\n" - --#: fr30-ibld.c:937 m32r-ibld.c:792 openrisc-ibld.c:735 xstormy16-ibld.c:826 -+#: fr30-ibld.c:931 frv-ibld.c:1169 ip2k-ibld.c:678 iq2000-ibld.c:884 -+#: m32c-ibld.c:2888 m32r-ibld.c:798 mep-ibld.c:1444 mt-ibld.c:965 -+#: openrisc-ibld.c:729 xc16x-ibld.c:968 xstormy16-ibld.c:820 - #, c-format - msgid "Unrecognized field %d while decoding insn.\n" - msgstr "Field tidak dikenal %d saat mendekode insn.\n" - --#: fr30-ibld.c:1086 m32r-ibld.c:902 openrisc-ibld.c:815 xstormy16-ibld.c:939 -+#: fr30-ibld.c:1077 frv-ibld.c:1447 ip2k-ibld.c:752 iq2000-ibld.c:1015 -+#: m32c-ibld.c:3505 m32r-ibld.c:911 mep-ibld.c:1737 mt-ibld.c:1165 -+#: openrisc-ibld.c:806 xc16x-ibld.c:1189 xstormy16-ibld.c:930 - #, c-format - msgid "Unrecognized field %d while getting int operand.\n" - msgstr "Field tidak dikenal %d saat memperoleh operand int.\n" - --#: fr30-ibld.c:1215 m32r-ibld.c:992 openrisc-ibld.c:875 xstormy16-ibld.c:1032 -+#: fr30-ibld.c:1205 frv-ibld.c:1707 ip2k-ibld.c:808 iq2000-ibld.c:1128 -+#: m32c-ibld.c:4104 m32r-ibld.c:1006 mep-ibld.c:2012 mt-ibld.c:1347 -+#: openrisc-ibld.c:865 xc16x-ibld.c:1392 xstormy16-ibld.c:1022 - #, c-format - msgid "Unrecognized field %d while getting vma operand.\n" - msgstr "Field tidak dikenal %d saat memperoleh operand vma.\n" - --#: fr30-ibld.c:1349 m32r-ibld.c:1090 openrisc-ibld.c:944 xstormy16-ibld.c:1134 -+#: fr30-ibld.c:1336 frv-ibld.c:1974 ip2k-ibld.c:867 iq2000-ibld.c:1248 -+#: m32c-ibld.c:4691 m32r-ibld.c:1107 mep-ibld.c:2271 mt-ibld.c:1536 -+#: openrisc-ibld.c:931 xc16x-ibld.c:1596 xstormy16-ibld.c:1121 - #, c-format - msgid "Unrecognized field %d while setting int operand.\n" - msgstr "Field tidak dikenal %d saat menset operand int.\n" - --#: fr30-ibld.c:1471 m32r-ibld.c:1176 openrisc-ibld.c:1001 xstormy16-ibld.c:1224 -+#: fr30-ibld.c:1457 frv-ibld.c:2231 ip2k-ibld.c:916 iq2000-ibld.c:1358 -+#: m32c-ibld.c:5268 m32r-ibld.c:1198 mep-ibld.c:2520 mt-ibld.c:1715 -+#: openrisc-ibld.c:987 xc16x-ibld.c:1790 xstormy16-ibld.c:1210 - #, c-format - msgid "Unrecognized field %d while setting vma operand.\n" - msgstr "Field tidak dikenal %d saat menset operand vma.\n" - --#: h8300-dis.c:384 -+#: frv-asm.c:608 -+msgid "missing `]'" -+msgstr "hilang `]'" -+ -+#: frv-asm.c:611 frv-asm.c:621 -+msgid "Special purpose register number is out of range" -+msgstr "Nomor register tujuan spesial di luar batas" -+ -+#: frv-asm.c:908 -+msgid "Value of A operand must be 0 or 1" -+msgstr "Nilai dari operand A harus berupa 0 atau 1" -+ -+#: frv-asm.c:944 -+msgid "register number must be even" -+msgstr "nomor register harus genap" -+ -+#. -- assembler routines inserted here. -+#. -- asm.c -+#: frv-asm.c:972 iq2000-asm.c:56 m32c-asm.c:141 m32c-asm.c:237 m32c-asm.c:279 -+#: m32c-asm.c:338 m32c-asm.c:360 m32r-asm.c:53 mep-asm.c:232 mep-asm.c:250 -+#: mep-asm.c:265 mep-asm.c:280 mep-asm.c:292 openrisc-asm.c:54 -+msgid "missing `)'" -+msgstr "hilang `)'" -+ -+#: h8300-dis.c:327 - #, c-format --msgid "Hmmmm %x" --msgstr "Hmmmm %x" -+msgid "Hmmmm 0x%x" -+msgstr "Hmmmm 0x%x" - --#: h8300-dis.c:395 -+#: h8300-dis.c:708 - #, c-format --msgid "Don't understand %x \n" --msgstr "Tidak mengerti %x \n" -+msgid "Don't understand 0x%x \n" -+msgstr "Tidak mengerti 0x%x \n" - --#: h8500-dis.c:143 -+#: h8500-dis.c:124 - #, c-format - msgid "can't cope with insert %d\n" - msgstr "tidak dapat menangani insert %d\n" - - #. Couldn't understand anything. --#: h8500-dis.c:350 -+#: h8500-dis.c:324 - #, c-format - msgid "%02x\t\t*unknown*" - msgstr "%02x\t\t*tidak dikenal*" - --#: i386-dis.c:1649 -+#: i386-dis.c:9545 - msgid "" - msgstr "" - --#: m10200-dis.c:199 -+#: i386-dis.c:9776 -+#, c-format -+msgid "" -+"\n" -+"The following i386/x86-64 specific disassembler options are supported for use\n" -+"with the -M switch (multiple options should be separated by commas):\n" -+msgstr "" -+"\n" -+"Option disablembler khusus i386/x86-64 berikut ini didukung untuk digunakan dengan\n" -+"pilihan -M (pilihan double seharusnya dipisahkan dengan koma):\n" -+ -+#: i386-dis.c:9780 -+#, c-format -+msgid " x86-64 Disassemble in 64bit mode\n" -+msgstr " x86-64 Disasemble dalam mode 64bit\n" -+ -+#: i386-dis.c:9781 -+#, c-format -+msgid " i386 Disassemble in 32bit mode\n" -+msgstr " i386 Disassemble dalam mode 32bit\n" -+ -+#: i386-dis.c:9782 -+#, c-format -+msgid " i8086 Disassemble in 16bit mode\n" -+msgstr " i8086 Disassemble dalam mode 16bit\n" -+ -+#: i386-dis.c:9783 -+#, c-format -+msgid " att Display instruction in AT&T syntax\n" -+msgstr " att Tampilkan instruksi dalam sintaks AT&T\n" -+ -+#: i386-dis.c:9784 -+#, c-format -+msgid " intel Display instruction in Intel syntax\n" -+msgstr " intel Tampilkan instruksi dalam sintaks Intel\n" -+ -+#: i386-dis.c:9785 -+#, c-format -+msgid "" -+" att-mnemonic\n" -+" Display instruction in AT&T mnemonic\n" -+msgstr "" -+" att-mnemonic\n" -+" Tampilkan instruksi dalam mnemonic AT&T\n" -+ -+#: i386-dis.c:9787 -+#, c-format -+msgid "" -+" intel-mnemonic\n" -+" Display instruction in Intel mnemonic\n" -+msgstr "" -+" intel-mnemonic\n" -+" Tampilkan instruksi dalam mnemonic Intel\n" -+ -+#: i386-dis.c:9789 -+#, c-format -+msgid " addr64 Assume 64bit address size\n" -+msgstr " addr64 Asumsikan ukuran alamat 64bit\n" -+ -+#: i386-dis.c:9790 -+#, c-format -+msgid " addr32 Assume 32bit address size\n" -+msgstr " addr32 Asumsikan ukuran alamat 32bit\n" -+ -+#: i386-dis.c:9791 -+#, c-format -+msgid " addr16 Assume 16bit address size\n" -+msgstr " addr16 Asumsikan ukuran alamat 16bit\n" -+ -+#: i386-dis.c:9792 - #, c-format --msgid "unknown\t0x%02x" --msgstr "tidak dikenal\t0x%02x" -+msgid " data32 Assume 32bit data size\n" -+msgstr " data32 Asumsikan ukuran data 32bit\n" - --#: m10200-dis.c:339 -+#: i386-dis.c:9793 -+#, c-format -+msgid " data16 Assume 16bit data size\n" -+msgstr " data16 Asumsikan ukuran data 16bit\n" -+ -+#: i386-dis.c:9794 -+#, c-format -+msgid " suffix Always display instruction suffix in AT&T syntax\n" -+msgstr " akhiran Selalu tampilkan akhiran instruksi dalam sintaks AT&T\n" -+ -+#: i386-gen.c:411 ia64-gen.c:307 -+#, c-format -+msgid "%s: Error: " -+msgstr "%s: Error: " -+ -+#: i386-gen.c:510 -+#, c-format -+msgid "%s: %d: Unknown bitfield: %s\n" -+msgstr "%s: %d: bitfield tidak diketahui: %s\n" -+ -+#: i386-gen.c:674 -+#, c-format -+msgid "can't find i386-opc.tbl for reading, errno = %s\n" -+msgstr "tidak dapat menemukan i386-opc.tbl untuk pembacaan, nomor error = %s\n" -+ -+#: i386-gen.c:851 -+#, c-format -+msgid "can't find i386-reg.tbl for reading, errno = %s\n" -+msgstr "tidak dapat menemukan i386-reg.tbl untuk pembacaan, nomor error = %s\n" -+ -+#: i386-gen.c:943 -+#, c-format -+msgid "can't create i386-init.h, errno = %s\n" -+msgstr "tidak dapat membuat i386-init.h, nomor error = %s\n" -+ -+#: i386-gen.c:1032 ia64-gen.c:2850 -+#, c-format -+msgid "unable to change directory to \"%s\", errno = %s\n" -+msgstr "tidak dapat mengubah direktori ke \"%s\", nomor error = %s\n" -+ -+#: i386-gen.c:1039 -+#, c-format -+msgid "%d unused bits in i386_cpu_flags.\n" -+msgstr "%d bit tidak digunakan dalam i386_cpu_flags.\n" -+ -+#: i386-gen.c:1046 -+#, c-format -+msgid "%d unused bits in i386_operand_type.\n" -+msgstr "%d bit tidak digunakan dalam i386_operand_type.\n" -+ -+#: i386-gen.c:1060 -+#, c-format -+msgid "can't create i386-tbl.h, errno = %s\n" -+msgstr "tidak dapat membuat i386-tbl.h, nomor error = %s\n" -+ -+#: ia64-gen.c:320 -+#, c-format -+msgid "%s: Warning: " -+msgstr "%s: Peringatan: " -+ -+#: ia64-gen.c:506 ia64-gen.c:740 -+#, c-format -+msgid "multiple note %s not handled\n" -+msgstr "catatan ganda %s tidak ditangani\n" -+ -+#: ia64-gen.c:617 -+msgid "can't find ia64-ic.tbl for reading\n" -+msgstr "tidak dapat menemukan ia64-ic.tbl untuk pembacaan\n" -+ -+#: ia64-gen.c:822 -+#, c-format -+msgid "can't find %s for reading\n" -+msgstr "tidak dapat menemukan %s untuk pembacaan\n" -+ -+#: ia64-gen.c:1046 -+#, c-format -+msgid "" -+"most recent format '%s'\n" -+"appears more restrictive than '%s'\n" -+msgstr "" -+"format paling baru '%s'\n" -+"tampak lebih terbatas dari '%s'\n" -+ -+#: ia64-gen.c:1057 -+#, c-format -+msgid "overlapping field %s->%s\n" -+msgstr "daerah saling menimpa %s->%s\n" -+ -+#: ia64-gen.c:1254 -+#, c-format -+msgid "overwriting note %d with note %d (IC:%s)\n" -+msgstr "catatan saling menulis %d dengan catatan %d (IC:%s)\n" -+ -+#: ia64-gen.c:1459 -+#, c-format -+msgid "don't know how to specify %% dependency %s\n" -+msgstr "tidak tahu bagaimana menspesifikasikan %% ketergantungan %s\n" -+ -+#: ia64-gen.c:1481 -+#, c-format -+msgid "Don't know how to specify # dependency %s\n" -+msgstr "Tidak tahu bagaimana menspesifikasikan # ketergantungan %s\n" -+ -+#: ia64-gen.c:1520 -+#, c-format -+msgid "IC:%s [%s] has no terminals or sub-classes\n" -+msgstr "IC:%s [%s] tidak memiliki terminal atau sub-kelas\n" -+ -+#: ia64-gen.c:1523 -+#, c-format -+msgid "IC:%s has no terminals or sub-classes\n" -+msgstr "IC:%s tidak memiliki terminal atau sub-kelas\n" -+ -+#: ia64-gen.c:1532 -+#, c-format -+msgid "no insns mapped directly to terminal IC %s [%s]" -+msgstr "tidak ada insns terpetakan secara langsung ke terminal IC %s [%s]" -+ -+#: ia64-gen.c:1535 -+#, c-format -+msgid "no insns mapped directly to terminal IC %s\n" -+msgstr "tidak ada insns terpetakan langsung ke terminal IC %s\n" -+ -+#: ia64-gen.c:1546 -+#, c-format -+msgid "class %s is defined but not used\n" -+msgstr "kelas %s didefinisikan tetapi tidak digunakan\n" -+ -+#: ia64-gen.c:1559 -+#, c-format -+msgid "Warning: rsrc %s (%s) has no chks\n" -+msgstr "Peringatan: rsrc %s (%s) tidak memiliki chks\n" -+ -+#: ia64-gen.c:1562 -+#, c-format -+msgid "Warning: rsrc %s (%s) has no chks or regs\n" -+msgstr "Peringatan: rsrc %s (%s) tidak memiliki chks atau regs\n" -+ -+#: ia64-gen.c:1566 -+#, c-format -+msgid "rsrc %s (%s) has no regs\n" -+msgstr "rsrc %s (%s) tidak memiliki regs\n" -+ -+#: ia64-gen.c:2478 -+#, c-format -+msgid "IC note %d in opcode %s (IC:%s) conflicts with resource %s note %d\n" -+msgstr "IC catatan %d dalam opcode %s (IC:%s) konflik dengan sumber daya %s catatan %d\n" -+ -+#: ia64-gen.c:2506 -+#, c-format -+msgid "IC note %d for opcode %s (IC:%s) conflicts with resource %s note %d\n" -+msgstr "IC catatan %d untuk opcode %s (IC:%s) konflik dengan sumber data %s catatan %d\n" -+ -+#: ia64-gen.c:2520 -+#, c-format -+msgid "opcode %s has no class (ops %d %d %d)\n" -+msgstr "opcode %s tidak memiliki kelas (ops %d %d %d)\n" -+ -+#. We've been passed a w. Return with an error message so that -+#. cgen will try the next parsing option. -+#: ip2k-asm.c:81 -+msgid "W keyword invalid in FR operand slot." -+msgstr "W kata kunci tidak valid dalam FR operand slot." -+ -+#. Invalid offset present. -+#: ip2k-asm.c:106 -+msgid "offset(IP) is not a valid form" -+msgstr "offset(IP) bukan sebuah bentuk valid" -+ -+#. Found something there in front of (DP) but it's out -+#. of range. -+#: ip2k-asm.c:154 -+msgid "(DP) offset out of range." -+msgstr "(DP) ofset di luar batas." -+ -+#. Found something there in front of (SP) but it's out -+#. of range. -+#: ip2k-asm.c:195 -+msgid "(SP) offset out of range." -+msgstr "(SP) ofset di luar batas." -+ -+#: ip2k-asm.c:211 -+msgid "illegal use of parentheses" -+msgstr "penggunaan tidak legal dari tanda petik" -+ -+#: ip2k-asm.c:218 -+msgid "operand out of range (not between 1 and 255)" -+msgstr "operand di luar batas (tidak antara 1 dan 255)" -+ -+#. Something is very wrong. opindex has to be one of the above. -+#: ip2k-asm.c:242 -+msgid "parse_addr16: invalid opindex." -+msgstr "parse_addr16: opindex tidak valid." -+ -+#: ip2k-asm.c:296 -+msgid "Byte address required. - must be even." -+msgstr "Alamat byte dibutuhkan. - harus genap." -+ -+#: ip2k-asm.c:305 -+msgid "cgen_parse_address returned a symbol. Literal required." -+msgstr "cgen_parse_address mengembalikan sebuah simbol. Literal dibutuhkan." -+ -+#: ip2k-asm.c:360 -+msgid "percent-operator operand is not a symbol" -+msgstr "percent-operator operand bukan sebuah simbol" -+ -+#: ip2k-asm.c:413 -+msgid "Attempt to find bit index of 0" -+msgstr "Mencoba untuk menemukan bit index dari 0" -+ -+#: iq2000-asm.c:112 iq2000-asm.c:142 -+msgid "immediate value cannot be register" -+msgstr "nilai langsung tidak dapat berupa register" -+ -+#: iq2000-asm.c:123 iq2000-asm.c:153 -+msgid "immediate value out of range" -+msgstr "nilai langsung di luar batas" -+ -+#: iq2000-asm.c:182 -+msgid "21-bit offset out of range" -+msgstr "21-bit ofset di luar batas" -+ -+#: m10200-dis.c:158 m10300-dis.c:582 - #, c-format - msgid "unknown\t0x%04lx" - msgstr "tidak dikenal\t0x%04lx" - --#: m10300-dis.c:685 -+#: m10200-dis.c:328 - #, c-format --msgid "unknown\t0x%04x" --msgstr "tidak dikenal\t0x%04x" -+msgid "unknown\t0x%02lx" -+msgstr "tidak dikenal\t0x%02lx" -+ -+#: m32c-asm.c:117 -+msgid "imm:6 immediate is out of range" -+msgstr "imm:6 nilai langsung di luar batas" - --#: m68k-dis.c:429 -+#: m32c-asm.c:147 - #, c-format --msgid "\n" --msgstr "\n" -+msgid "%dsp8() takes a symbolic address, not a number" -+msgstr "%dsp8() mengambil sebuah alamat simbolik, bukan sebuah angka" -+ -+#: m32c-asm.c:160 m32c-asm.c:164 m32c-asm.c:255 -+msgid "dsp:8 immediate is out of range" -+msgstr "dsp:8 nilai langsung di luar batas" -+ -+#: m32c-asm.c:185 m32c-asm.c:189 -+msgid "Immediate is out of range -8 to 7" -+msgstr "nilai langsung di luar dari jangkauan -8 ke 7" -+ -+#: m32c-asm.c:210 m32c-asm.c:214 -+msgid "Immediate is out of range -7 to 8" -+msgstr "nilai langsung di luar dari jangkauan -7 ke 8" -+ -+#: m32c-asm.c:285 -+#, c-format -+msgid "%dsp16() takes a symbolic address, not a number" -+msgstr "%dsp16() mengambil sebuah alamat simbolik, tetapi bukan sebuah angka" -+ -+#: m32c-asm.c:308 m32c-asm.c:315 m32c-asm.c:378 -+msgid "dsp:16 immediate is out of range" -+msgstr "dsp:16 nilai langsung di luar batas" -+ -+#: m32c-asm.c:404 -+msgid "dsp:20 immediate is out of range" -+msgstr "dsp:20 nilai langsung di luar batas" -+ -+#: m32c-asm.c:430 m32c-asm.c:450 -+msgid "dsp:24 immediate is out of range" -+msgstr "dsp:24 nilai langsung di luar batas" -+ -+#: m32c-asm.c:483 -+msgid "immediate is out of range 1-2" -+msgstr "nilai langsung di luar dari jangkauan 1-2" -+ -+#: m32c-asm.c:501 -+msgid "immediate is out of range 1-8" -+msgstr "nilai langsung di luar dari jangkauan 1-8" -+ -+#: m32c-asm.c:519 -+msgid "immediate is out of range 0-7" -+msgstr "nilai langsung di luar dari jangkauan 0-7" -+ -+#: m32c-asm.c:555 -+msgid "immediate is out of range 2-9" -+msgstr "nilai langsung di luar dari jangkauan 2-9" - --#: m68k-dis.c:1007 -+#: m32c-asm.c:573 -+msgid "Bit number for indexing general register is out of range 0-15" -+msgstr "Nomor bit untuk register umum pengindeksan diluar dari jangkauan 0-15" -+ -+#: m32c-asm.c:611 m32c-asm.c:667 -+msgid "bit,base is out of range" -+msgstr "bit,bas di luar batas" -+ -+#: m32c-asm.c:618 m32c-asm.c:623 m32c-asm.c:671 -+msgid "bit,base out of range for symbol" -+msgstr "bit,base di luar dari jangkauan untuk simbol" -+ -+#: m32c-asm.c:807 -+msgid "not a valid r0l/r0h pair" -+msgstr "bukan sebuah valid pasangan r0l/r0h" -+ -+#: m32c-asm.c:837 -+msgid "Invalid size specifier" -+msgstr "Ukuran penspesifikasi tidak valid" -+ -+#: m68k-dis.c:1163 - #, c-format - msgid "" - msgstr "" - --#: m88k-dis.c:255 -+#: m68k-dis.c:1320 -+#, c-format -+msgid "\n" -+msgstr "\n" -+ -+#: m88k-dis.c:679 -+#, c-format -+msgid "# " -+msgstr "# " -+ -+#: mep-asm.c:114 -+msgid "Only $tp or $13 allowed for this opcode" -+msgstr "Hanya $tp atau $13 diperbolehkan untuk opcode ini" -+ -+#: mep-asm.c:128 -+msgid "Only $sp or $15 allowed for this opcode" -+msgstr "Hanya $sp atau $15 diperbolehkan untuk opcode ini" -+ -+#: mep-asm.c:299 mep-asm.c:455 -+#, c-format -+msgid "invalid %function() here" -+msgstr "%function disini tidak valid" -+ -+#: mips-dis.c:781 -+msgid "# internal error, incomplete extension sequence (+)" -+msgstr "# internal error, urutan ekstensi (+) tidak lengkap" -+ -+#: mips-dis.c:915 - #, c-format --msgid "# " --msgstr "# " -+msgid "# internal error, undefined extension sequence (+%c)" -+msgstr "# kesalahan internal, tidak terdefinisi urutan ekstensi(+%c)" - --#: mips-dis.c:290 -+#: mips-dis.c:1274 - #, c-format --msgid "# internal error, undefined modifier(%c)" --msgstr "# kesalahan internal, modifier tidak didefinisikan(%c)" -+msgid "# internal error, undefined modifier (%c)" -+msgstr "# kesalahan internal, tidak terdefinisi pemodifikasi(%c)" - --#: mips-dis.c:1154 -+#: mips-dis.c:1881 - #, c-format - msgid "# internal disassembler error, unrecognised modifier (%c)" - msgstr "# kesalahan internal disasembler, modifier tidak dikenal (%c)" - --#: mmix-dis.c:34 -+#: mips-dis.c:2112 -+#, c-format -+msgid "" -+"\n" -+"The following MIPS specific disassembler options are supported for use\n" -+"with the -M switch (multiple options should be separated by commas):\n" -+msgstr "" -+"\n" -+"Pilihan disablembler khusus MIPS berikut ini didukung untuk digunakan dengan\n" -+"pilihan -M (pilihan ganda seharusnya dipisahkan dengan koma):\n" -+ -+#: mips-dis.c:2116 -+#, c-format -+msgid "" -+"\n" -+" gpr-names=ABI Print GPR names according to specified ABI.\n" -+" Default: based on binary being disassembled.\n" -+msgstr "" -+"\n" -+" gpr-names=ABI Tampilkan nama GPR menurut ABI yang dispesifikasikan.\n" -+" Baku: berdasar dari binari yang sedang diassembled.\n" -+ -+#: mips-dis.c:2120 -+#, c-format -+msgid "" -+"\n" -+" fpr-names=ABI Print FPR names according to specified ABI.\n" -+" Default: numeric.\n" -+msgstr "" -+"\n" -+" fpr-names=ABI Tampilkan nama FPR menurut ABI yang dispesifikasikan.\n" -+" Baku: numerik.\n" -+ -+#: mips-dis.c:2124 -+#, c-format -+msgid "" -+"\n" -+" cp0-names=ARCH Print CP0 register names according to\n" -+" specified architecture.\n" -+" Default: based on binary being disassembled.\n" -+msgstr "" -+"\n" -+" cp0-names=ARCH Tampilkan nama register CP0 menurut arsitektur\n" -+" yang dispesifikasikan.\n" -+" Baku: berdasar dari binari yang sedang diassembled.\n" -+ -+#: mips-dis.c:2129 -+#, c-format -+msgid "" -+"\n" -+" hwr-names=ARCH Print HWR names according to specified \n" -+"\t\t\t architecture.\n" -+" Default: based on binary being disassembled.\n" -+msgstr "" -+"\n" -+" hwr-names=ARCH Tampilkan nama HWR menurut arsitektur\n" -+"\t\t\t yang dispesifikasikan.\n" -+" Baku: berdasar dari binari yang sedang diassembled.\n" -+ -+#: mips-dis.c:2134 -+#, c-format -+msgid "" -+"\n" -+" reg-names=ABI Print GPR and FPR names according to\n" -+" specified ABI.\n" -+msgstr "" -+"\n" -+" reg-names=ABI Tampilkan nama GPR dan FPR menurut ABI yang\n" -+" dispesifikasikan.\n" -+ -+#: mips-dis.c:2138 -+#, c-format -+msgid "" -+"\n" -+" reg-names=ARCH Print CP0 register and HWR names according to\n" -+" specified architecture.\n" -+msgstr "" -+"\n" -+" reg-names=ARCH Tampilkan nama register CP0 dan HWR menurut\n" -+" arsitektur yang dispesifikasikan.\n" -+ -+#: mips-dis.c:2142 -+#, c-format -+msgid "" -+"\n" -+" For the options above, the following values are supported for \"ABI\":\n" -+" " -+msgstr "" -+"\n" -+" Untuk pilihan diatas, nilai berikut didukung untuk \"ABI\":\n" -+" " -+ -+#: mips-dis.c:2147 mips-dis.c:2155 mips-dis.c:2157 -+#, c-format -+msgid "\n" -+msgstr "\n" -+ -+#: mips-dis.c:2149 -+#, c-format -+msgid "" -+"\n" -+" For the options above, The following values are supported for \"ARCH\":\n" -+" " -+msgstr "" -+"\n" -+" Untuk pilihan diatas, nilai berikut didukung untuk \"ARCH\":\n" -+" " -+ -+#: mmix-dis.c:35 - #, c-format - msgid "Bad case %d (%s) in %s:%d\n" - msgstr "Case buruk %d (%s) dalam %s:%d\n" - --#: mmix-dis.c:44 -+#: mmix-dis.c:45 - #, c-format - msgid "Internal: Non-debugged code (test-case missing): %s:%d" - msgstr "Internal: Kode belum didebug (tidak ada test-case): %s:%d" - --#: mmix-dis.c:53 -+#: mmix-dis.c:54 - msgid "(unknown)" - msgstr "(tidak dikenal)" - --#: mmix-dis.c:517 -+#: mmix-dis.c:513 - #, c-format - msgid "*unknown operands type: %d*" - msgstr "*tipe operand tidak dikenal: %d*" - -+#: mt-asm.c:110 mt-asm.c:190 -+msgid "Operand out of range. Must be between -32768 and 32767." -+msgstr "Operand di luar batas. Harus berada diantara -32768 dan 32767." -+ -+#: mt-asm.c:149 -+msgid "Biiiig Trouble in parse_imm16!" -+msgstr "Masalah BESAR dalam parse_imm16!" -+ -+#: mt-asm.c:157 -+msgid "The percent-operator's operand is not a symbol" -+msgstr "Operand percent-operator bukan sebuah simbol" -+ -+#: mt-asm.c:395 -+msgid "invalid operand. type may have values 0,1,2 only." -+msgstr "operand tidak valid. tipe mungkin hanya memiliki nilai 0,1,2." -+ - #. I and Z are output operands and can`t be immediate --#. * A is an address and we can`t have the address of --#. * an immediate either. We don't know how much to increase --#. * aoffsetp by since whatever generated this is broken --#. * anyway! --#. --#: ns32k-dis.c:628 -+#. A is an address and we can`t have the address of -+#. an immediate either. We don't know how much to increase -+#. aoffsetp by since whatever generated this is broken -+#. anyway! -+#: ns32k-dis.c:534 -+#, c-format - msgid "$" - msgstr "$" - --#: ppc-opc.c:765 ppc-opc.c:798 -+#: ppc-opc.c:862 ppc-opc.c:890 - msgid "invalid conditional option" - msgstr "option kondisional tidak valid" - --#: ppc-opc.c:800 -+#: ppc-opc.c:892 - msgid "attempt to set y bit when using + or - modifier" - msgstr "berusaha menset bit y saat menggunakan modifier + atau -" - --#: ppc-opc.c:832 ppc-opc.c:884 --msgid "offset not a multiple of 4" --msgstr "offset bukan kelipatan 4" -- --#: ppc-opc.c:857 --msgid "offset not between -2048 and 2047" --msgstr "offset tidak berada antara -2048 dan 2047" -- --#: ppc-opc.c:882 --msgid "offset not between -8192 and 8191" --msgstr "offset tidak berada antara -8192 dan 8191" -+#: ppc-opc.c:924 -+msgid "invalid mask field" -+msgstr "topeng daerah tidak valid" - --#: ppc-opc.c:910 --msgid "ignoring least significant bits in branch offset" --msgstr "mengabaikan least significant bit dalam offset cabang" -+#: ppc-opc.c:950 -+msgid "ignoring invalid mfcr mask" -+msgstr "mengabaikan topeng mfcr tidak valid" - --#: ppc-opc.c:944 ppc-opc.c:981 -+#: ppc-opc.c:1000 ppc-opc.c:1035 - msgid "illegal bitmask" - msgstr "bitmask ilegal" - --#: ppc-opc.c:1054 --msgid "value out of range" --msgstr "nilai di luar batas" -- --#: ppc-opc.c:1130 -+#: ppc-opc.c:1155 - msgid "index register in load range" - msgstr "register indeks dalam daerah pemuatan" - --#: ppc-opc.c:1146 -+#: ppc-opc.c:1171 -+msgid "source and target register operands must be different" -+msgstr "sumber dan target operand register harus berbeda" -+ -+#: ppc-opc.c:1186 - msgid "invalid register operand when updating" - msgstr "operand register tidak valid saat mengupdate" - --#. Mark as non-valid instruction --#: sparc-dis.c:750 --msgid "unknown" --msgstr "tidak dikenal" -+#: ppc-opc.c:1265 -+msgid "invalid sprg number" -+msgstr "nomor sprg tidak valid" -+ -+#: s390-dis.c:276 -+#, c-format -+msgid "" -+"\n" -+"The following S/390 specific disassembler options are supported for use\n" -+"with the -M switch (multiple options should be separated by commas):\n" -+msgstr "" -+"\n" -+"Pilihan disablembler khusus S/390 berikut ini didukung untuk digunakan dengan\n" -+"pilihan -M (pilihan ganda seharusnya dipisahkan dengan koma):\n" -+ -+#: s390-dis.c:280 -+#, c-format -+msgid " esa Disassemble in ESA architecture mode\n" -+msgstr " esa Disassemble dalam mode arsitektur ESA\n" - --#: sparc-dis.c:825 -+#: s390-dis.c:281 -+#, c-format -+msgid " zarch Disassemble in z/Architecture mode\n" -+msgstr " zarch Disassemble dalam mode z/Architecture\n" -+ -+#: score-dis.c:220 score-dis.c:383 -+msgid "" -+msgstr "" -+ -+#: sparc-dis.c:282 - #, c-format - msgid "Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n" - msgstr "Kesalahan internal: sparc-opcode.h buruk: \"%s\", %#.8lx, %#.8lx\n" - --#: sparc-dis.c:836 -+#: sparc-dis.c:293 - #, c-format - msgid "Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n" - msgstr "Kesalahan internal: sparc-opcode.h buruk: \"%s\", %#.8lx, %#.8lx\n" - --#: sparc-dis.c:885 -+#: sparc-dis.c:343 - #, c-format - msgid "Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n" - msgstr "Kesalahan internal: sparc-opcode.h buruk: \"%s\" == \"%s\"\n" - --#: v850-dis.c:224 -+#. Mark as non-valid instruction. -+#: sparc-dis.c:1013 -+msgid "unknown" -+msgstr "tidak dikenal" -+ -+#: v850-dis.c:239 - #, c-format - msgid "unknown operand shift: %x\n" - msgstr "shift operand tidak dikenal: %x\n" - --#: v850-dis.c:236 -+#: v850-dis.c:253 - #, c-format - msgid "unknown pop reg: %d\n" - msgstr "reg pop tidak dikenal: %d\n" -@@ -350,74 +1059,122 @@ msgstr "reg pop tidak dikenal: %d\n" - #. v850_insert_operand() in gas/config/tc-v850.c. Error messages - #. containing the string 'out of range' will be ignored unless a - #. specific command line option is given to GAS. --#: v850-opc.c:68 -+#: v850-opc.c:48 - msgid "displacement value is not in range and is not aligned" - msgstr "nilai displacement tidak dalam jangkauan dan tidak rata" - --#: v850-opc.c:69 -+#: v850-opc.c:49 - msgid "displacement value is out of range" - msgstr "nilai displacement di luar batas" - --#: v850-opc.c:70 -+#: v850-opc.c:50 - msgid "displacement value is not aligned" - msgstr "nilai displacement tidak rata" - --#: v850-opc.c:72 -+#: v850-opc.c:52 - msgid "immediate value is out of range" - msgstr "nilai langsung di luar batas" - --#: v850-opc.c:83 -+#: v850-opc.c:60 - msgid "branch value not in range and to odd offset" - msgstr "nilai cabang tidak dalam jangkauan" - --#: v850-opc.c:85 v850-opc.c:117 -+#: v850-opc.c:62 v850-opc.c:89 - msgid "branch value out of range" - msgstr "nilai cabang di luar jangkauan" - --#: v850-opc.c:88 v850-opc.c:120 -+#: v850-opc.c:65 v850-opc.c:92 - msgid "branch to odd offset" - msgstr "cabang offset ganjil" - --#: v850-opc.c:115 -+#: v850-opc.c:87 - msgid "branch value not in range and to an odd offset" - msgstr "nilai cabang di luar jangkauan dan offset ganjil" - --#: v850-opc.c:346 -+#: v850-opc.c:279 - msgid "invalid register for stack adjustment" - msgstr "register tidak valid untuk penyesuaian stack" - --#: v850-opc.c:370 -+#: v850-opc.c:299 - msgid "immediate value not in range and not even" - msgstr "nilai langsung tidak dalam jangkauan dan tidak genap" - --#: v850-opc.c:375 -+#: v850-opc.c:304 - msgid "immediate value must be even" - msgstr "nilai langsung harus genap" - --#: xstormy16-asm.c:74 -+#: xc16x-asm.c:66 -+msgid "Missing '#' prefix" -+msgstr "Hilang awalan '#'" -+ -+#: xc16x-asm.c:82 -+msgid "Missing '.' prefix" -+msgstr "Hilang awalan '.'" -+ -+#: xc16x-asm.c:98 -+msgid "Missing 'pof:' prefix" -+msgstr "Hilang awalan 'pof:'" -+ -+#: xc16x-asm.c:114 -+msgid "Missing 'pag:' prefix" -+msgstr "Hilang awalan 'pag:'" -+ -+#: xc16x-asm.c:130 -+msgid "Missing 'sof:' prefix" -+msgstr "Hilang awalan 'sof:'" -+ -+#: xc16x-asm.c:146 -+msgid "Missing 'seg:' prefix" -+msgstr "Hilanga awalan 'seg:'" -+ -+#: xstormy16-asm.c:71 - msgid "Bad register in preincrement" - msgstr "register buruk dalam preinkremen" - --#: xstormy16-asm.c:79 -+#: xstormy16-asm.c:76 - msgid "Bad register in postincrement" - msgstr "Register buruk dalam pascainkremen" - --#: xstormy16-asm.c:81 -+#: xstormy16-asm.c:78 - msgid "Bad register name" - msgstr "Nama register buruk" - --#: xstormy16-asm.c:85 -+#: xstormy16-asm.c:82 - msgid "Label conflicts with register name" - msgstr "Label konflik dengan nama register" - --#: xstormy16-asm.c:89 -+#: xstormy16-asm.c:86 - msgid "Label conflicts with `Rx'" - msgstr "Label konflik dengan `Rx'" - --#: xstormy16-asm.c:91 -+#: xstormy16-asm.c:88 - msgid "Bad immediate expression" - msgstr "Ekspresi langsung yang buruk" - --#: xstormy16-asm.c:120 -+#: xstormy16-asm.c:109 -+msgid "No relocation for small immediate" -+msgstr "Tidak ada relokasi untuk immediate kecil" -+ -+#: xstormy16-asm.c:119 - msgid "Small operand was not an immediate number" - msgstr "Operand kecil bukan sebuah angka immediate" -+ -+#: xstormy16-asm.c:157 -+msgid "Operand is not a symbol" -+msgstr "Operand bukan sebuah simbol" -+ -+#: xstormy16-asm.c:165 -+msgid "Syntax error: No trailing ')'" -+msgstr "Sintaks error: Tidak ada akhiran ')'" -+ -+#~ msgid "unknown\t0x%04x" -+#~ msgstr "tidak dikenal\t0x%04x" -+ -+#~ msgid "offset not between -2048 and 2047" -+#~ msgstr "offset tidak berada antara -2048 dan 2047" -+ -+#~ msgid "offset not between -8192 and 8191" -+#~ msgstr "offset tidak berada antara -8192 dan 8191" -+ -+#~ msgid "ignoring least significant bits in branch offset" -+#~ msgstr "mengabaikan least significant bit dalam offset cabang" -diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c -index 9a28338..8511345 100644 ---- a/opcodes/ppc-dis.c -+++ b/opcodes/ppc-dis.c -@@ -1,6 +1,6 @@ - /* ppc-dis.c -- Disassemble PowerPC instructions - Copyright 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -- 2008 Free Software Foundation, Inc. -+ 2008, 2009 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support - - This file is part of the GNU opcodes library. -@@ -23,6 +23,7 @@ - #include - #include "sysdep.h" - #include "dis-asm.h" -+#include "opintl.h" - #include "opcode/ppc.h" - - /* This file provides several disassembler functions, all of which use -@@ -42,94 +43,198 @@ struct dis_private - #define POWERPC_DIALECT(INFO) \ - (((struct dis_private *) ((INFO)->private_data))->dialect) - --/* Determine which set of machines to disassemble for. PPC403/601 or -- BookE. For convenience, also disassemble instructions supported -- by the AltiVec vector unit. */ -+struct ppc_mopt { -+ const char *opt; -+ ppc_cpu_t cpu; -+ ppc_cpu_t sticky; -+}; -+ -+struct ppc_mopt ppc_opts[] = { -+ { "403", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_403 -+ | PPC_OPCODE_32), -+ 0 }, -+ { "405", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_403 -+ | PPC_OPCODE_405 | PPC_OPCODE_32), -+ 0 }, -+ { "440", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32 -+ | PPC_OPCODE_440 | PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI), -+ 0 }, -+ { "464", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32 -+ | PPC_OPCODE_440 | PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI), -+ 0 }, -+ { "601", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_601 -+ | PPC_OPCODE_32), -+ 0 }, -+ { "603", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32), -+ 0 }, -+ { "604", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32), -+ 0 }, -+ { "620", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64), -+ 0 }, -+ { "7400", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_ALTIVEC -+ | PPC_OPCODE_32), -+ 0 }, -+ { "7410", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_ALTIVEC -+ | PPC_OPCODE_32), -+ 0 }, -+ { "7450", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_ALTIVEC -+ | PPC_OPCODE_32), -+ 0 }, -+ { "7455", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_ALTIVEC -+ | PPC_OPCODE_32), -+ 0 }, -+ { "750cl", (PPC_OPCODE_PPC | PPC_OPCODE_PPCPS) -+ , 0 }, -+ { "altivec", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC), -+ PPC_OPCODE_ALTIVEC }, -+ { "any", 0, -+ PPC_OPCODE_ANY }, -+ { "booke", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32), -+ 0 }, -+ { "booke32", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32), -+ 0 }, -+ { "cell", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64 -+ | PPC_OPCODE_POWER4 | PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC), -+ 0 }, -+ { "com", (PPC_OPCODE_COMMON | PPC_OPCODE_32), -+ 0 }, -+ { "e300", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32 -+ | PPC_OPCODE_E300), -+ 0 }, -+ { "e500", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE -+ | PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK -+ | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI -+ | PPC_OPCODE_E500MC), -+ 0 }, -+ { "e500mc", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL -+ | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI -+ | PPC_OPCODE_E500MC), -+ 0 }, -+ { "e500x2", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE -+ | PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK -+ | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI -+ | PPC_OPCODE_E500MC), -+ 0 }, -+ { "efs", (PPC_OPCODE_PPC | PPC_OPCODE_EFS), -+ 0 }, -+ { "power4", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64 -+ | PPC_OPCODE_POWER4), -+ 0 }, -+ { "power5", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64 -+ | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5), -+ 0 }, -+ { "power6", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64 -+ | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 -+ | PPC_OPCODE_ALTIVEC), -+ 0 }, -+ { "power7", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_ISEL -+ | PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 -+ | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | PPC_OPCODE_ALTIVEC -+ | PPC_OPCODE_VSX), -+ 0 }, -+ { "ppc", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32), -+ 0 }, -+ { "ppc32", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32), -+ 0 }, -+ { "ppc64", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64), -+ 0 }, -+ { "ppc64bridge", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64_BRIDGE -+ | PPC_OPCODE_64), -+ 0 }, -+ { "ppcps", (PPC_OPCODE_PPC | PPC_OPCODE_PPCPS), -+ 0 }, -+ { "pwr", (PPC_OPCODE_POWER | PPC_OPCODE_32), -+ 0 }, -+ { "pwr2", (PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_32), -+ 0 }, -+ { "pwrx", (PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_32), -+ 0 }, -+ { "spe", (PPC_OPCODE_PPC | PPC_OPCODE_EFS), -+ PPC_OPCODE_SPE }, -+ { "vsx", (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC), -+ PPC_OPCODE_VSX }, -+}; -+ -+/* Handle -m and -M options that set cpu type, and .machine arg. */ -+ -+ppc_cpu_t -+ppc_parse_cpu (ppc_cpu_t ppc_cpu, const char *arg) -+{ -+ /* Sticky bits. */ -+ ppc_cpu_t retain_flags = ppc_cpu & (PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX -+ | PPC_OPCODE_SPE | PPC_OPCODE_ANY); -+ unsigned int i; -+ -+ for (i = 0; i < sizeof (ppc_opts) / sizeof (ppc_opts[0]); i++) -+ if (strcmp (ppc_opts[i].opt, arg) == 0) -+ { -+ if (ppc_opts[i].sticky) -+ { -+ retain_flags |= ppc_opts[i].sticky; -+ if ((ppc_cpu & ~(PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX -+ | PPC_OPCODE_SPE | PPC_OPCODE_ANY)) != 0) -+ break; -+ } -+ ppc_cpu = ppc_opts[i].cpu; -+ break; -+ } -+ if (i >= sizeof (ppc_opts) / sizeof (ppc_opts[0])) -+ return 0; -+ -+ ppc_cpu |= retain_flags; -+ return ppc_cpu; -+} -+ -+/* Determine which set of machines to disassemble for. */ - - static int - powerpc_init_dialect (struct disassemble_info *info) - { -- ppc_cpu_t dialect = PPC_OPCODE_PPC; -+ ppc_cpu_t dialect = 0; -+ char *arg; - struct dis_private *priv = calloc (sizeof (*priv), 1); - - if (priv == NULL) - return FALSE; - -- if (BFD_DEFAULT_TARGET_SIZE == 64) -- dialect |= PPC_OPCODE_64; -- -- if (info->disassembler_options -- && strstr (info->disassembler_options, "ppcps") != NULL) -- dialect |= PPC_OPCODE_PPCPS; -- else if (info->disassembler_options -- && strstr (info->disassembler_options, "booke") != NULL) -- dialect |= PPC_OPCODE_BOOKE; -- else if ((info->mach == bfd_mach_ppc_e500mc) -- || (info->disassembler_options -- && strstr (info->disassembler_options, "e500mc") != NULL)) -- dialect |= (PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL -- | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK -- | PPC_OPCODE_RFMCI | PPC_OPCODE_E500MC); -- else if ((info->mach == bfd_mach_ppc_e500) -- || (info->disassembler_options -- && strstr (info->disassembler_options, "e500") != NULL)) -- dialect |= (PPC_OPCODE_BOOKE -- | PPC_OPCODE_SPE | PPC_OPCODE_ISEL -- | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK -- | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK -- | PPC_OPCODE_RFMCI | PPC_OPCODE_E500MC); -- else if (info->disassembler_options -- && strstr (info->disassembler_options, "efs") != NULL) -- dialect |= PPC_OPCODE_EFS; -- else if (info->disassembler_options -- && strstr (info->disassembler_options, "e300") != NULL) -- dialect |= PPC_OPCODE_E300 | PPC_OPCODE_CLASSIC | PPC_OPCODE_COMMON; -- else if (info->disassembler_options -- && (strstr (info->disassembler_options, "440") != NULL -- || strstr (info->disassembler_options, "464") != NULL)) -- dialect |= PPC_OPCODE_BOOKE | PPC_OPCODE_32 -- | PPC_OPCODE_440 | PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI; -- else -- dialect |= (PPC_OPCODE_403 | PPC_OPCODE_601 | PPC_OPCODE_CLASSIC -- | PPC_OPCODE_COMMON | PPC_OPCODE_ALTIVEC); -- -- if (info->disassembler_options -- && strstr (info->disassembler_options, "power4") != NULL) -- dialect |= PPC_OPCODE_POWER4; -- -- if (info->disassembler_options -- && strstr (info->disassembler_options, "power5") != NULL) -- dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5; -- -- if (info->disassembler_options -- && strstr (info->disassembler_options, "cell") != NULL) -- dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC; -- -- if (info->disassembler_options -- && strstr (info->disassembler_options, "power6") != NULL) -- dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 -- | PPC_OPCODE_ALTIVEC; -+ arg = info->disassembler_options; -+ while (arg != NULL) -+ { -+ ppc_cpu_t new_cpu = 0; -+ char *end = strchr (arg, ','); - -- if (info->disassembler_options -- && strstr (info->disassembler_options, "power7") != NULL) -- dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 -- | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 -- | PPC_OPCODE_ISEL | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX; -+ if (end != NULL) -+ *end = 0; - -- if (info->disassembler_options -- && strstr (info->disassembler_options, "vsx") != NULL) -- dialect |= PPC_OPCODE_VSX; -+ if ((new_cpu = ppc_parse_cpu (dialect, arg)) != 0) -+ dialect = new_cpu; -+ else if (strcmp (arg, "32") == 0) -+ { -+ dialect &= ~PPC_OPCODE_64; -+ dialect |= PPC_OPCODE_32; -+ } -+ else if (strcmp (arg, "64") == 0) -+ { -+ dialect |= PPC_OPCODE_64; -+ dialect &= ~PPC_OPCODE_32; -+ } -+ else -+ fprintf (stderr, _("warning: ignoring unknown -M%s option\n"), arg); - -- if (info->disassembler_options -- && strstr (info->disassembler_options, "any") != NULL) -- dialect |= PPC_OPCODE_ANY; -+ if (end != NULL) -+ *end++ = ','; -+ arg = end; -+ } - -- if (info->disassembler_options) -+ if ((dialect & ~(PPC_OPCODE_32 | PPC_OPCODE_64)) == 0) - { -- if (strstr (info->disassembler_options, "32") != NULL) -- dialect &= ~PPC_OPCODE_64; -- else if (strstr (info->disassembler_options, "64") != NULL) -+ if (info->mach == bfd_mach_ppc64) - dialect |= PPC_OPCODE_64; -+ else -+ dialect |= PPC_OPCODE_32; -+ /* Choose a reasonable default. */ -+ dialect |= (PPC_OPCODE_PPC | PPC_OPCODE_COMMON | PPC_OPCODE_CLASSIC -+ | PPC_OPCODE_601 | PPC_OPCODE_ALTIVEC); - } - - info->private_data = priv; -@@ -230,6 +335,7 @@ print_insn_powerpc (bfd_vma memaddr, - const struct powerpc_opcode *opcode; - const struct powerpc_opcode *opcode_end; - unsigned long op; -+ ppc_cpu_t dialect_orig = dialect; - - status = (*info->read_memory_func) (memaddr, buffer, 4, info); - if (status != 0) -@@ -268,7 +374,7 @@ print_insn_powerpc (bfd_vma memaddr, - - if ((insn & opcode->mask) != opcode->opcode - || (opcode->flags & dialect) == 0 -- || (opcode->deprecated & dialect) != 0) -+ || (opcode->deprecated & dialect_orig) != 0) - continue; - - /* Make two passes over the operands. First see if any of them -@@ -339,16 +445,14 @@ print_insn_powerpc (bfd_vma memaddr, - (*info->print_address_func) (memaddr + value, info); - else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0) - (*info->print_address_func) ((bfd_vma) value & 0xffffffff, info); -- else if ((operand->flags & PPC_OPERAND_CR) == 0 -- || (dialect & PPC_OPCODE_PPC) == 0) -- (*info->fprintf_func) (info->stream, "%ld", value); - else if ((operand->flags & PPC_OPERAND_FSL) != 0) - (*info->fprintf_func) (info->stream, "fsl%ld", value); - else if ((operand->flags & PPC_OPERAND_FCR) != 0) - (*info->fprintf_func) (info->stream, "fcr%ld", value); - else if ((operand->flags & PPC_OPERAND_UDI) != 0) - (*info->fprintf_func) (info->stream, "%ld", value); -- else -+ else if ((operand->flags & PPC_OPERAND_CR) != 0 -+ && (dialect & PPC_OPCODE_PPC) != 0) - { - if (operand->bitm == 7) - (*info->fprintf_func) (info->stream, "cr%ld", value); -@@ -365,6 +469,8 @@ print_insn_powerpc (bfd_vma memaddr, - (*info->fprintf_func) (info->stream, "%s", cbnames[cc]); - } - } -+ else -+ (*info->fprintf_func) (info->stream, "%ld", value); - - if (need_paren) - { -@@ -400,23 +506,20 @@ print_insn_powerpc (bfd_vma memaddr, - void - print_ppc_disassembler_options (FILE *stream) - { -- fprintf (stream, "\n\ -+ unsigned int i, col; -+ -+ fprintf (stream, _("\n\ - The following PPC specific disassembler options are supported for use with\n\ --the -M switch:\n"); -- -- fprintf (stream, " booke Disassemble the BookE instructions\n"); -- fprintf (stream, " e300 Disassemble the e300 instructions\n"); -- fprintf (stream, " e500|e500x2 Disassemble the e500 instructions\n"); -- fprintf (stream, " e500mc Disassemble the e500mc instructions\n"); -- fprintf (stream, " 440 Disassemble the 440 instructions\n"); -- fprintf (stream, " 464 Disassemble the 464 instructions\n"); -- fprintf (stream, " efs Disassemble the EFS instructions\n"); -- fprintf (stream, " ppcps Disassemble the PowerPC paired singles instructions\n"); -- fprintf (stream, " power4 Disassemble the Power4 instructions\n"); -- fprintf (stream, " power5 Disassemble the Power5 instructions\n"); -- fprintf (stream, " power6 Disassemble the Power6 instructions\n"); -- fprintf (stream, " power7 Disassemble the Power7 instructions\n"); -- fprintf (stream, " vsx Disassemble the Vector-Scalar (VSX) instructions\n"); -- fprintf (stream, " 32 Do not disassemble 64-bit instructions\n"); -- fprintf (stream, " 64 Allow disassembly of 64-bit instructions\n"); -+the -M switch:\n")); -+ -+ for (col = 0, i = 0; i < sizeof (ppc_opts) / sizeof (ppc_opts[0]); i++) -+ { -+ col += fprintf (stream, " %s,", ppc_opts[i].opt); -+ if (col > 66) -+ { -+ fprintf (stream, "\n"); -+ col = 0; -+ } -+ } -+ fprintf (stream, " 32, 64\n"); - } -diff --git a/opcodes/ppc-opc.c b/opcodes/ppc-opc.c -index c872db5..9fac147 100644 ---- a/opcodes/ppc-opc.c -+++ b/opcodes/ppc-opc.c -@@ -3464,8 +3464,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"isellt", X(31,15), X_MASK, PPCISEL, PPCNONE, {RT, RA, RB}}, - --{"mfcr", XFXM(31,19,0,0), XRARB_MASK, COM, POWER4, {RT}}, - {"mfcr", XFXM(31,19,0,0), XFXFXM_MASK, POWER4, PPCNONE, {RT, FXM4}}, -+{"mfcr", XFXM(31,19,0,0), XRARB_MASK, COM, POWER4, {RT}}, - {"mfocrf", XFXM(31,19,0,1), XFXFXM_MASK, COM, PPCNONE, {RT, FXM}}, - - {"lwarx", X(31,20), XEH_MASK, PPC, PPCNONE, {RT, RA0, RB, EH}}, -@@ -3726,14 +3726,14 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"mullw.", XO(31,235,0,1), XO_MASK, PPCCOM, PPCNONE, {RT, RA, RB}}, - {"muls.", XO(31,235,0,1), XO_MASK, PWRCOM, PPCNONE, {RT, RA, RB}}, - -+{"icblce", X(31,238), X_MASK, PPCCHLK, E500MC, {CT, RA, RB}}, - {"msgclr", XRTRA(31,238,0,0),XRTRA_MASK,E500MC, PPCNONE, {RB}}, --{"icblce", X(31,238), X_MASK, PPCCHLK, PPCNONE, {CT, RA, RB}}, - {"mtsrin", X(31,242), XRA_MASK, PPC32, PPCNONE, {RS, RB}}, - {"mtsri", X(31,242), XRA_MASK, POWER32, PPCNONE, {RS, RB}}, - - {"dcbtstt", XRT(31,246,0x10), XRT_MASK, POWER7, PPCNONE, {RA, RB}}, --{"dcbtst", X(31,246), X_MASK, PPC, POWER4, {CT, RA, RB}}, - {"dcbtst", X(31,246), X_MASK, POWER4, PPCNONE, {RA, RB, CT}}, -+{"dcbtst", X(31,246), X_MASK, PPC, POWER4, {CT, RA, RB}}, - - {"stbux", X(31,247), X_MASK, COM, PPCNONE, {RS, RAS, RB}}, - -@@ -3767,8 +3767,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"lscbx.", XRC(31,277,1), X_MASK, M601, PPCNONE, {RT, RA, RB}}, - - {"dcbtt", XRT(31,278,0x10), XRT_MASK, POWER7, PPCNONE, {RA, RB}}, --{"dcbt", X(31,278), X_MASK, PPC, POWER4, {CT, RA, RB}}, - {"dcbt", X(31,278), X_MASK, POWER4, PPCNONE, {RA, RB, CT}}, -+{"dcbt", X(31,278), X_MASK, PPC, POWER4, {CT, RA, RB}}, - - {"lhzx", X(31,279), X_MASK, COM, PPCNONE, {RT, RA0, RB}}, - -@@ -4399,16 +4399,16 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"lswi", X(31,597), X_MASK, PPCCOM, PPCNONE, {RT, RA0, NB}}, - {"lsi", X(31,597), X_MASK, PWRCOM, PPCNONE, {RT, RA0, NB}}, - --{"msync", X(31,598), 0xffffffff, BOOKE, PPCNONE, {0}}, - {"lwsync", XSYNC(31,598,1), 0xffffffff, PPC, PPCNONE, {0}}, - {"ptesync", XSYNC(31,598,2), 0xffffffff, PPC64, PPCNONE, {0}}, --{"sync", X(31,598), XSYNC_MASK, PPCCOM, PPCNONE, {LS}}, -+{"sync", X(31,598), XSYNC_MASK, PPCCOM, BOOKE, {LS}}, -+{"msync", X(31,598), 0xffffffff, BOOKE, PPCNONE, {0}}, - {"dcs", X(31,598), 0xffffffff, PWRCOM, PPCNONE, {0}}, - - {"lfdx", X(31,599), X_MASK, COM, PPCNONE, {FRT, RA0, RB}}, - --{"lfdepx", X(31,607), X_MASK, E500MC, PPCNONE, {FRT, RA, RB}}, - {"mffgpr", XRC(31,607,0), XRA_MASK, POWER6, POWER7, {FRT, RB}}, -+{"lfdepx", X(31,607), X_MASK, E500MC, PPCNONE, {FRT, RA, RB}}, - - {"lddx", X(31,611), X_MASK, E500MC, PPCNONE, {RT, RA, RB}}, - -@@ -4502,8 +4502,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"sreq", XRC(31,729,0), X_MASK, M601, PPCNONE, {RA, RS, RB}}, - {"sreq.", XRC(31,729,1), X_MASK, M601, PPCNONE, {RA, RS, RB}}, - --{"stfdepx", X(31,735), X_MASK, E500MC, PPCNONE, {FRS, RA, RB}}, - {"mftgpr", XRC(31,735,0), XRA_MASK, POWER6, POWER7, {RT, FRB}}, -+{"stfdepx", X(31,735), X_MASK, E500MC, PPCNONE, {FRS, RA, RB}}, - - {"stddx", X(31,739), X_MASK, E500MC, PPCNONE, {RS, RA, RB}}, - -@@ -4560,8 +4560,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"lhbrx", X(31,790), X_MASK, COM, PPCNONE, {RT, RA0, RB}}, - --{"lfqx", X(31,791), X_MASK, POWER2, PPCNONE, {FRT, RA, RB}}, - {"lfdpx", X(31,791), X_MASK, POWER6, POWER7, {FRT, RA, RB}}, -+{"lfqx", X(31,791), X_MASK, POWER2, PPCNONE, {FRT, RA, RB}}, - - {"sraw", XRC(31,792,0), X_MASK, PPCCOM, PPCNONE, {RA, RS, RB}}, - {"sra", XRC(31,792,0), X_MASK, PWRCOM, PPCNONE, {RA, RS, RB}}, -@@ -4602,8 +4602,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"lbzcix", X(31,853), X_MASK, POWER6, PPCNONE, {RT, RA0, RB}}, - -+{"eieio", X(31,854), 0xffffffff, PPC, BOOKE, {0}}, - {"mbar", X(31,854), X_MASK, BOOKE, PPCNONE, {MO}}, --{"eieio", X(31,854), 0xffffffff, PPC, PPCNONE, {0}}, - - {"lfiwax", X(31,855), X_MASK, POWER6, PPCNONE, {FRT, RA0, RB}}, - -@@ -4638,8 +4638,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"sthbrx", X(31,918), X_MASK, COM, PPCNONE, {RS, RA0, RB}}, - --{"stfqx", X(31,919), X_MASK, POWER2, PPCNONE, {FRS, RA, RB}}, - {"stfdpx", X(31,919), X_MASK, POWER6, PPCNONE, {FRS, RA, RB}}, -+{"stfqx", X(31,919), X_MASK, POWER2, PPCNONE, {FRS, RA, RB}}, - - {"sraq", XRC(31,920,0), X_MASK, M601, PPCNONE, {RA, RS, RB}}, - {"sraq.", XRC(31,920,1), X_MASK, M601, PPCNONE, {RA, RS, RB}}, -@@ -4687,10 +4687,10 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"stxvd2x", X(31,972), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA, RB}}, - -+{"tlbld", X(31,978), XRTRA_MASK, PPC, PPC403|BOOKE, {RB}}, - {"tlbwehi", XTLB(31,978,0), XTLB_MASK, PPC403, PPCNONE, {RT, RA}}, - {"tlbwelo", XTLB(31,978,1), XTLB_MASK, PPC403, PPCNONE, {RT, RA}}, - {"tlbwe", X(31,978), X_MASK, PPC403|BOOKE, PPCNONE, {RSO, RAOPT, SHO}}, --{"tlbld", X(31,978), XRTRA_MASK, PPC, PPCNONE, {RB}}, - - {"stbcix", X(31,981), X_MASK, POWER6, PPCNONE, {RS, RA0, RB}}, - -@@ -4796,16 +4796,12 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"stfdu", OP(55), OP_MASK, COM, PPCNONE, {FRS, D, RAS}}, - - {"lq", OP(56), OP_MASK, POWER4, PPCNONE, {RTQ, DQ, RAQ}}, -- --{"lfq", OP(56), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}}, -- - {"psq_l", OP(56), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}}, -- --{"lfqu", OP(57), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}}, -- --{"psq_lu", OP(57), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}}, -+{"lfq", OP(56), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}}, - - {"lfdp", OP(57), OP_MASK, POWER6, POWER7, {FRT, D, RA0}}, -+{"psq_lu", OP(57), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}}, -+{"lfqu", OP(57), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}}, - - {"ld", DSO(58,0), DS_MASK, PPC64, PPCNONE, {RT, DS, RA0}}, - {"ldu", DSO(58,1), DS_MASK, PPC64, PPCNONE, {RT, DS, RAL}}, -@@ -4829,18 +4825,18 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"fsqrts", A(59,22,0), AFRAFRC_MASK, PPC, PPCNONE, {FRT, FRB}}, - {"fsqrts.", A(59,22,1), AFRAFRC_MASK, PPC, PPCNONE, {FRT, FRB}}, - --{"fres", A(59,24,0), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, --{"fres.", A(59,24,1), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, - {"fres", A(59,24,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"fres", A(59,24,0), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, - {"fres.", A(59,24,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"fres.", A(59,24,1), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, - - {"fmuls", A(59,25,0), AFRB_MASK, PPC, PPCNONE, {FRT, FRA, FRC}}, - {"fmuls.", A(59,25,1), AFRB_MASK, PPC, PPCNONE, {FRT, FRA, FRC}}, - --{"frsqrtes", A(59,26,0), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, --{"frsqrtes.", A(59,26,1), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, - {"frsqrtes", A(59,26,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"frsqrtes", A(59,26,0), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, - {"frsqrtes.", A(59,26,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"frsqrtes.", A(59,26,1), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, - - {"fmsubs", A(59,28,0), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}}, - {"fmsubs.", A(59,28,1), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}}, -@@ -4921,10 +4917,6 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"fcfidus", XRC(59,974,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}}, - {"fcfidus.", XRC(59,974,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}}, - --{"stfq", OP(60), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}}, -- --{"psq_st", OP(60), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}}, -- - {"xxsldwi", XX3(60,2), XX3SHW_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, SHW}}, - {"xxsel", XX4(60,3), XX4_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, XC6}}, - {"xxspltd", XX3(60,10), XX3DM_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S, DMEX}}, -@@ -5067,11 +5059,12 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"xvcvsxddp", XX2(60,504), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}}, - {"xvnegdp", XX2(60,505), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}}, - --{"psq_stu", OP(61), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}}, -- --{"stfqu", OP(61), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}}, -+{"psq_st", OP(60), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}}, -+{"stfq", OP(60), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}}, - - {"stfdp", OP(61), OP_MASK, POWER6, PPCNONE, {FRT, D, RA0}}, -+{"psq_stu", OP(61), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}}, -+{"stfqu", OP(61), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}}, - - {"std", DSO(62,0), DS_MASK, PPC64, PPCNONE, {RS, DS, RA0}}, - {"stdu", DSO(62,1), DS_MASK, PPC64, PPCNONE, {RS, DS, RAS}}, -@@ -5122,20 +5115,20 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"fsel", A(63,23,0), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}}, - {"fsel.", A(63,23,1), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}}, - --{"fre", A(63,24,0), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, --{"fre.", A(63,24,1), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, - {"fre", A(63,24,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"fre", A(63,24,0), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, - {"fre.", A(63,24,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"fre.", A(63,24,1), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}}, - - {"fmul", A(63,25,0), AFRB_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC}}, - {"fm", A(63,25,0), AFRB_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC}}, - {"fmul.", A(63,25,1), AFRB_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC}}, - {"fm.", A(63,25,1), AFRB_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC}}, - --{"frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, --{"frsqrte.", A(63,26,1), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, - {"frsqrte", A(63,26,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, - {"frsqrte.", A(63,26,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}}, -+{"frsqrte.", A(63,26,1), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}}, - - {"fmsub", A(63,28,0), A_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC, FRB}}, - {"fms", A(63,28,0), A_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC, FRB}}, -@@ -5195,10 +5188,10 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"dcmpoq", X(63,130), X_MASK, POWER6, PPCNONE, {BF, FRA, FRB}}, - --{"mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, POWER6, {BFF, U}}, - {"mtfsfi", XRC(63,134,0), XWRA_MASK|(3<<21)|(1<<11), POWER6, PPCNONE, {BFF, U, W}}, --{"mtfsfi.", XRC(63,134,1), XRA_MASK|(3<<21)|(1<<11), COM, POWER6, {BFF, U}}, -+{"mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, POWER6, {BFF, U}}, - {"mtfsfi.", XRC(63,134,1), XWRA_MASK|(3<<21)|(1<<11), POWER6, PPCNONE, {BFF, U, W}}, -+{"mtfsfi.", XRC(63,134,1), XRA_MASK|(3<<21)|(1<<11), COM, POWER6, {BFF, U}}, - - {"fnabs", XRC(63,136,0), XRA_MASK, COM, PPCNONE, {FRT, FRB}}, - {"fnabs.", XRC(63,136,1), XRA_MASK, COM, PPCNONE, {FRT, FRB}}, -@@ -5254,10 +5247,10 @@ const struct powerpc_opcode powerpc_opcodes[] = { - - {"dtstsfq", X(63,674), X_MASK, POWER6, PPCNONE, {BF, FRA, FRB}}, - --{"mtfsf", XFL(63,711,0), XFL_MASK, COM, POWER6, {FLM, FRB}}, - {"mtfsf", XFL(63,711,0), XFL_MASK, POWER6, PPCNONE, {FLM, FRB, XFL_L, W}}, --{"mtfsf.", XFL(63,711,1), XFL_MASK, COM, POWER6, {FLM, FRB}}, -+{"mtfsf", XFL(63,711,0), XFL_MASK, COM, POWER6, {FLM, FRB}}, - {"mtfsf.", XFL(63,711,1), XFL_MASK, POWER6, PPCNONE, {FLM, FRB, XFL_L, W}}, -+{"mtfsf.", XFL(63,711,1), XFL_MASK, COM, POWER6, {FLM, FRB}}, - - {"drdpq", XRC(63,770,0), X_MASK, POWER6, PPCNONE, {FRT, FRB}}, - {"drdpq.", XRC(63,770,1), X_MASK, POWER6, PPCNONE, {FRT, FRB}}, diff --git a/gdb-bz507267-block-sort-fast.patch b/gdb-bz507267-block-sort-fast.patch deleted file mode 100644 index 2c61a0b..0000000 --- a/gdb-bz507267-block-sort-fast.patch +++ /dev/null @@ -1,76 +0,0 @@ -https://bugzilla.redhat.com/show_bug.cgi?id=507267 - ---- gdb-6.8.50.20090302/gdb/buildsym.c-orig 2009-06-22 15:20:39.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/buildsym.c 2009-06-22 17:50:54.000000000 +0200 -@@ -900,6 +900,19 @@ watch_main_source_file_lossage (void) - } - } - -+/* Helper function for qsort. Parametes are `struct block *' pointers, -+ function sorts them in descending order by their BLOCK_START. */ -+ -+static int -+block_compar (const void *ap, const void *bp) -+{ -+ const struct block *a = *(const struct block **) ap; -+ const struct block *b = *(const struct block **) bp; -+ -+ return (BLOCK_START (b) > BLOCK_START (a)) -+ - (BLOCK_START (b) < BLOCK_START (a)); -+} -+ - /* Finish the symbol definitions for one main source file, close off - all the lexical contexts for that file (creating struct block's for - them), then make the struct symtab for that file and put it in the -@@ -953,32 +966,28 @@ end_symtab (CORE_ADDR end_addr, struct o - OBJF_REORDERED is true, then sort the pending blocks. */ - if ((objfile->flags & OBJF_REORDERED) && pending_blocks) - { -- /* FIXME! Remove this horrid bubble sort and use merge sort!!! */ -- int swapped; -- do -- { -- struct pending_block *pb, *pbnext; -+ unsigned count = 0; -+ struct pending_block *pb; -+ struct block **barray, **bp; -+ struct cleanup *back_to; - -- pb = pending_blocks; -- pbnext = pb->next; -- swapped = 0; -+ for (pb = pending_blocks; pb != NULL; pb = pb->next) -+ count++; - -- while (pbnext) -- { -- /* swap blocks if unordered! */ -+ barray = xmalloc (sizeof (*barray) * count); -+ back_to = make_cleanup (xfree, barray); - -- if (BLOCK_START (pb->block) < BLOCK_START (pbnext->block)) -- { -- struct block *tmp = pb->block; -- pb->block = pbnext->block; -- pbnext->block = tmp; -- swapped = 1; -- } -- pb = pbnext; -- pbnext = pbnext->next; -- } -- } -- while (swapped); -+ bp = barray; -+ for (pb = pending_blocks; pb != NULL; pb = pb->next) -+ *bp++ = pb->block; -+ -+ qsort (barray, count, sizeof (*barray), block_compar); -+ -+ bp = barray; -+ for (pb = pending_blocks; pb != NULL; pb = pb->next) -+ pb->block = *bp++; -+ -+ do_cleanups (back_to); - } - - /* Cleanup any undefined types that have been left hanging around diff --git a/gdb-c_get_string-xfree.patch b/gdb-c_get_string-xfree.patch deleted file mode 100644 index 00703b5..0000000 --- a/gdb-c_get_string-xfree.patch +++ /dev/null @@ -1,110 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2009-04/msg00284.html -http://sourceware.org/ml/gdb-cvs/2009-04/msg00077.html -http://sourceware.org/ml/archer/2009-q2/msg00049.html - -gdb/ -2009-04-14 Jan Kratochvil - - * c-lang.c (c_get_string): Fix xfree crash on a failed string read. - -gdb/testsuite/ -2009-04-14 Jan Kratochvil - - * gdb.python/python-prettyprint.c: Include . - (struct nullstr): New. - (main): New variable `nullstr'. Clear it. - * gdb.python/python-prettyprint.exp (run_lang_tests): Test `nullstr'. - * gdb.python/python-prettyprint.py (class pp_nullstr): New. - (register_pretty_printers): Register `pp_nullstr'. - ---- src/gdb/c-lang.c 2009/03/21 00:46:17 1.63 -+++ src/gdb/c-lang.c 2009/04/14 21:54:33 1.64 -@@ -657,7 +657,7 @@ - buffer, length); - if (err) - { -- xfree (buffer); -+ xfree (*buffer); - error (_("Error reading string from inferior: %s"), - safe_strerror (err)); - } -diff --git a/gdb/testsuite/gdb.python/python-prettyprint.c b/gdb/testsuite/gdb.python/python-prettyprint.c -index 399be23..0d9110d 100644 ---- a/gdb/testsuite/gdb.python/python-prettyprint.c -+++ b/gdb/testsuite/gdb.python/python-prettyprint.c -@@ -15,6 +15,8 @@ - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -+#include -+ - struct s - { - int a; -@@ -143,6 +145,11 @@ void do_nothing(void) - c = 23; /* Another MI breakpoint */ - } - -+struct nullstr -+{ -+ char *s; -+}; -+ - int - main () - { -@@ -151,10 +158,13 @@ main () - string x = make_string ("this is x"); - zzz_type c = make_container ("container"); - const struct string_repr cstring = { { "const string" } }; -+ /* Clearing by being `static' could invoke an other GDB C++ bug. */ -+ struct nullstr nullstr; - - init_ss(&ss, 1, 2); - init_ss(ssa+0, 3, 4); - init_ss(ssa+1, 5, 6); -+ memset (&nullstr, 0, sizeof nullstr); - - #ifdef __cplusplus - S cps; -diff --git a/gdb/testsuite/gdb.python/python-prettyprint.exp b/gdb/testsuite/gdb.python/python-prettyprint.exp -index f83b1cd..907dcfd 100644 ---- a/gdb/testsuite/gdb.python/python-prettyprint.exp -+++ b/gdb/testsuite/gdb.python/python-prettyprint.exp -@@ -85,6 +85,8 @@ proc run_lang_tests {lang} { - - gdb_test "print c" " = container $hex \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}" - -+ gdb_test "print nullstr" "RuntimeError: Error reading string from inferior.*" -+ - gdb_test "continue" "Program exited normally\." - } - -diff --git a/gdb/testsuite/gdb.python/python-prettyprint.py b/gdb/testsuite/gdb.python/python-prettyprint.py -index a53e412..82e5331 100644 ---- a/gdb/testsuite/gdb.python/python-prettyprint.py -+++ b/gdb/testsuite/gdb.python/python-prettyprint.py -@@ -92,6 +92,13 @@ class pp_vbase1: - def to_string (self): - return "pp class name: " + self.val.type.tag - -+class pp_nullstr: -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return self.val['s'].string(gdb.parameter('target-charset')) -+ - def lookup_function (val): - "Look-up and return a pretty-printer that can print val." - -@@ -135,6 +142,9 @@ def register_pretty_printers (): - - pretty_printers_dict[re.compile ('^VirtualTest$')] = pp_multiple_virtual - pretty_printers_dict[re.compile ('^Vbase1$')] = pp_vbase1 -+ -+ pretty_printers_dict[re.compile ('^struct nullstr$')] = pp_nullstr -+ pretty_printers_dict[re.compile ('^nullstr$')] = pp_nullstr - - # Note that we purposely omit the typedef names here. - # Printer lookup is based on canonical name. diff --git a/gdb-charset-crash.patch b/gdb-charset-crash.patch deleted file mode 100755 index 6bfd75d..0000000 --- a/gdb-charset-crash.patch +++ /dev/null @@ -1,44 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2009-04/msg00356.html -http://sourceware.org/ml/gdb-cvs/2009-04/msg00081.html - -gdb/ -2009-04-15 Tom Tromey - - * c-lang.c (evaluate_subexp_c): Correctly handle EVAL_SKIP. - -gdb/testsuite/ -2009-04-15 Tom Tromey - - * gdb.base/charset.exp: Add regression test. - ---- src/gdb/c-lang.c 2009/04/14 21:54:33 1.64 -+++ src/gdb/c-lang.c 2009/04/15 21:55:04 1.65 -@@ -941,7 +941,15 @@ - *pos += 2; - - if (noside == EVAL_SKIP) -- return NULL; -+ { -+ /* Return a dummy value of the appropriate type. */ -+ if ((dest_type & C_CHAR) != 0) -+ result = allocate_value (type); -+ else -+ result = value_typed_string ("", 0, type); -+ do_cleanups (cleanup); -+ return result; -+ } - - if ((dest_type & C_CHAR) != 0) - { ---- src/gdb/testsuite/gdb.base/charset.exp 2009/03/25 19:25:49 1.13 -+++ src/gdb/testsuite/gdb.base/charset.exp 2009/04/15 21:55:04 1.14 -@@ -604,4 +604,9 @@ - test_combination u UCS-2 U UCS-4 - } - -+# Regression test for a cleanup bug in the charset code. -+gdb_test "print 'a' == 'a' || 'b' == 'b'" \ -+ ".* = 1" \ -+ "EVAL_SKIP cleanup handling regression test" -+ - gdb_exit diff --git a/gdb-varobj-revalidate-core.patch b/gdb-varobj-revalidate-core.patch deleted file mode 100644 index 0f3f253..0000000 --- a/gdb-varobj-revalidate-core.patch +++ /dev/null @@ -1,328 +0,0 @@ -Re: [patch] [4/5] Types reference counting [varobj-validation] -http://sourceware.org/ml/gdb-patches/2009-04/msg00610.html - -gdb/ -2009-04-22 Jan Kratochvil - - Split varobj_invalidate into a two-phased operation. - * objfiles.c: Include varobj.h - (free_objfile): Call varobj_invalidate. - * parser-defs.h (exp_uses_objfile): New prototype. - * printcmd.c (display_uses_objfile): Move the EXP checking part to ... - * parse.c (exp_uses_objfile): ... a new function here. - * symfile.c (new_symfile_objfile): Call varobj_revalidate. - (reread_symbols): Call varobj_invalidate and varobj_revalidate. - (clear_symtab_users): No longer call varobj_invalidate. - * varobj.c: New includes objfiles.h and parser-defs.h. - (varobj_invalidate): New parameter `objfile', comment it. - New variable `var'. Invalidate any varobj related to `objfile'. - Remove unconditional invalidation of local varobjs. Move global - varobjs revalidation to ... - (varobj_revalidate): ... a new function. - * varobj.h (varobj_invalidate): Update the prototype. - (varobj_revalidate): New prototype. - -[ Cut the printcmd.c simplification/change. ] - -Index: gdb-6.8.50.20090302/gdb/objfiles.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/objfiles.c 2009-05-10 21:36:30.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/objfiles.c 2009-05-10 21:36:42.000000000 +0200 -@@ -50,6 +50,7 @@ - #include "addrmap.h" - #include "arch-utils.h" - #include "exec.h" -+#include "varobj.h" - - /* Prototypes for local functions */ - -@@ -409,6 +410,7 @@ free_objfile (struct objfile *objfile) - /* Remove any references to this objfile in the global value - lists. */ - preserve_values (objfile); -+ varobj_invalidate (objfile); - - /* First do any symbol file specific actions required when we are - finished with a particular symbol file. Note that if the objfile -Index: gdb-6.8.50.20090302/gdb/parse.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/parse.c 2009-05-10 21:36:29.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/parse.c 2009-05-10 21:36:42.000000000 +0200 -@@ -1373,6 +1373,45 @@ parser_fprintf (FILE *x, const char *y, - va_end (args); - } - -+/* Return 1 if EXP uses OBJFILE (and will become dangling when OBJFILE -+ is unloaded), otherwise return 0. */ -+ -+int -+exp_uses_objfile (struct expression *exp, struct objfile *objfile) -+{ -+ int endpos; -+ const union exp_element *const elts = exp->elts; -+ -+ for (endpos = exp->nelts; endpos > 0; ) -+ { -+ int i, args, oplen = 0; -+ -+ exp->language_defn->la_exp_desc->operator_length (exp, endpos, -+ &oplen, &args); -+ gdb_assert (oplen > 0); -+ -+ i = endpos - oplen; -+ if (elts[i].opcode == OP_VAR_VALUE) -+ { -+ const struct block *const block = elts[i + 1].block; -+ const struct symbol *const symbol = elts[i + 2].symbol; -+ const struct obj_section *const section = -+ SYMBOL_OBJ_SECTION (symbol); -+ -+ /* Check objfile where is placed the code touching the variable. */ -+ if (matching_objfiles (block_objfile (block), objfile)) -+ return 1; -+ -+ /* Check objfile where the variable itself is placed. */ -+ if (section && section->objfile == objfile) -+ return 1; -+ } -+ endpos -= oplen; -+ } -+ -+ return 0; -+} -+ - void - _initialize_parse (void) - { -Index: gdb-6.8.50.20090302/gdb/parser-defs.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/parser-defs.h 2009-05-10 21:36:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/parser-defs.h 2009-05-10 21:36:42.000000000 +0200 -@@ -299,4 +299,6 @@ extern void print_subexp_standard (struc - - extern void parser_fprintf (FILE *, const char *, ...) ATTR_FORMAT (printf, 2 ,3); - -+extern int exp_uses_objfile (struct expression *exp, struct objfile *objfile); -+ - #endif /* PARSER_DEFS_H */ -Index: gdb-6.8.50.20090302/gdb/symfile.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/symfile.c 2009-05-10 21:36:29.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/symfile.c 2009-05-10 21:37:51.000000000 +0200 -@@ -931,6 +931,8 @@ new_symfile_objfile (struct objfile *obj - - /* We're done reading the symbol file; finish off complaints. */ - clear_complaints (&symfile_complaints, 0, verbo); -+ -+ varobj_revalidate (); - } - - /* A helper function which returns true if OBJFILE has any debug -@@ -3261,6 +3263,7 @@ reread_symbols (void) - /* Remove any references to this objfile in the global - value lists. */ - preserve_values (objfile); -+ varobj_invalidate (objfile); - - /* Nuke all the state that we will re-read. Much of the following - code which sets things to NULL really is necessary to tell -@@ -3359,6 +3362,7 @@ reread_symbols (void) - frameless. */ - - reinit_frame_cache (); -+ varobj_revalidate (); - - /* Discard cleanups as symbol reading was successful. */ - discard_cleanups (old_cleanups); -@@ -3739,10 +3743,6 @@ clear_symtab_users (void) - between expressions and which ought to be reset each time. */ - expression_context_block = NULL; - innermost_block = NULL; -- -- /* Varobj may refer to old symbols, perform a cleanup. */ -- varobj_invalidate (); -- - } - - static void -Index: gdb-6.8.50.20090302/gdb/varobj.c -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/varobj.c 2009-05-10 21:36:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/varobj.c 2009-05-10 21:40:55.000000000 +0200 -@@ -26,6 +26,8 @@ - #include "gdbcmd.h" - #include "block.h" - #include "valprint.h" -+#include "objfiles.h" -+#include "parser-defs.h" - - #include "gdb_assert.h" - #include "gdb_string.h" -@@ -3272,48 +3274,117 @@ When non-zero, varobj debugging is enabl - &setlist, &showlist); - } - --/* Invalidate the varobjs that are tied to locals and re-create the ones that -- are defined on globals. -+/* Invalidate the varobjs that are tied to the specified OBJFILE. Call this -+ function before you start removing OBJFILE. -+ -+ Call varobj_revalidate after the OBJFILEs updates get finished. -+ - Invalidated varobjs will be always printed in_scope="invalid". */ -+ - void --varobj_invalidate (void) -+varobj_invalidate (struct objfile *objfile) - { - struct varobj **all_rootvarobj; - struct varobj **varp; - - if (varobj_list (&all_rootvarobj) > 0) -- { -- varp = all_rootvarobj; -- while (*varp != NULL) -- { -- /* Floating varobjs are reparsed on each stop, so we don't care if -- the presently parsed expression refers to something that's gone. */ -- if ((*varp)->root->floating) -- continue; -- -- /* global var must be re-evaluated. */ -- if ((*varp)->root->valid_block == NULL) -- { -- struct varobj *tmp_var; -- -- /* Try to create a varobj with same expression. If we succeed replace -- the old varobj, otherwise invalidate it. */ -- tmp_var = varobj_create (NULL, (*varp)->name, (CORE_ADDR) 0, USE_CURRENT_FRAME); -- if (tmp_var != NULL) -- { -- tmp_var->obj_name = xstrdup ((*varp)->obj_name); -- varobj_delete (*varp, NULL, 0); -- install_variable (tmp_var); -- } -- else -- (*varp)->root->is_valid = 0; -- } -- else /* locals must be invalidated. */ -- (*varp)->root->is_valid = 0; -+ { -+ varp = all_rootvarobj; -+ while (*varp != NULL) -+ { -+ struct varobj *var = *varp; - -- varp++; -- } -- } -+ /* Floating varobjs are reparsed on each stop, so we don't care if -+ the presently parsed expression refers to something that's gone. -+ */ -+ if (var->root->floating) -+ continue; -+ -+ if (var->root->is_valid -+ && matching_objfiles (block_objfile (var->root->valid_block), -+ objfile)) -+ var->root->is_valid = 0; -+ -+ if (var->root->is_valid -+ && exp_uses_objfile (var->root->exp, objfile)) -+ { -+ var->root->is_valid = 0; -+ -+ /* No one touches EXP for !IS_VALID varobj. */ -+ xfree (var->root->exp); -+ var->root->exp = NULL; -+ } -+ -+ if (var->type && TYPE_OBJFILE (var->type) == objfile) -+ { -+ if (!var->root->valid_block) -+ var->root->is_valid = 0; -+ else -+ gdb_assert (!var->root->is_valid); -+ -+ var->type = NULL; -+ } -+ -+ if (var->value -+ && TYPE_OBJFILE (value_type (var->value)) == objfile) -+ { -+ if (!var->root->valid_block) -+ var->root->is_valid = 0; -+ else -+ gdb_assert (!var->root->is_valid); -+ -+ value_free (var->value); -+ var->value = NULL; -+ } -+ -+ varp++; -+ } -+ } -+ xfree (all_rootvarobj); -+} -+ -+/* Recreate any global varobjs possibly previously invalidated. If the -+ expressions are no longer evaluatable set/keep the varobj invalid. */ -+ -+void -+varobj_revalidate (void) -+{ -+ struct varobj **all_rootvarobj; -+ struct varobj **varp; -+ -+ if (varobj_list (&all_rootvarobj) > 0) -+ { -+ varp = all_rootvarobj; -+ while (*varp != NULL) -+ { -+ struct varobj *var = *varp; -+ -+ /* Floating varobjs are reparsed on each stop, so we don't care if -+ the presently parsed expression refers to something that's gone. -+ */ -+ if (var->root->floating) -+ continue; -+ -+ /* global var must be re-evaluated. */ -+ if (var->root->valid_block == NULL) -+ { -+ struct varobj *tmp_var; -+ -+ /* Try to create a varobj with same expression. If we succeed -+ replace the old varobj, otherwise invalidate it. */ -+ tmp_var = varobj_create (NULL, var->name, 0, USE_CURRENT_FRAME); -+ if (tmp_var != NULL) -+ { -+ tmp_var->obj_name = xstrdup (var->obj_name); -+ varobj_delete (var, NULL, 0); -+ install_variable (tmp_var); -+ } -+ else -+ var->root->is_valid = 0; -+ } -+ -+ varp++; -+ } -+ } - xfree (all_rootvarobj); -- return; - } -Index: gdb-6.8.50.20090302/gdb/varobj.h -=================================================================== ---- gdb-6.8.50.20090302.orig/gdb/varobj.h 2009-05-10 21:36:27.000000000 +0200 -+++ gdb-6.8.50.20090302/gdb/varobj.h 2009-05-10 21:36:42.000000000 +0200 -@@ -148,7 +148,9 @@ extern int varobj_list (struct varobj ** - extern VEC(varobj_update_result) *varobj_update (struct varobj **varp, - int explicit); - --extern void varobj_invalidate (void); -+extern void varobj_invalidate (struct objfile *objfile); -+ -+extern void varobj_revalidate (void); - - extern int varobj_editable_p (struct varobj *var); - diff --git a/gdb-varobj-revalidate-prep.patch b/gdb-varobj-revalidate-prep.patch deleted file mode 100644 index 0b3b090..0000000 --- a/gdb-varobj-revalidate-prep.patch +++ /dev/null @@ -1,86 +0,0 @@ -Re: [patch] Make a function for block->objfile lookups -http://sourceware.org/ml/gdb-patches/2009-04/msg00609.html - -gdb/ -2009-04-22 Jan Kratochvil - - * block.c (block_objfile): New function. - * block.h (block_objfile): New prototype. - * objfiles.c (matching_objfiles): New function. - * objfiles.h (matching_objfiles): New prototype. - * printcmd.c: Remove include solib.h. - (display_uses_solib_p): Rename to ... - (display_uses_objfile): ... a new function name. Change the SOLIB - parameter to OBJFILE parameter. Use now a matching_objfiles call. - (clear_dangling_display_expressions): Update the caller. - -[ Cut the printcmd.c simplification/change. ] - ---- ./gdb/block.c 3 Jan 2009 05:57:50 -0000 1.18 -+++ ./gdb/block.c 22 Apr 2009 19:51:40 -0000 -@@ -309,3 +309,21 @@ allocate_block (struct obstack *obstack) - - return bl; - } -+ -+/* Return OBJFILE in which BLOCK is located or NULL if we cannot find it for -+ whatever reason. */ -+ -+struct objfile * -+block_objfile (const struct block *block) -+{ -+ struct symbol *func; -+ -+ if (block == NULL) -+ return NULL; -+ -+ func = block_linkage_function (block); -+ if (func == NULL) -+ return NULL; -+ -+ return SYMBOL_SYMTAB (func)->objfile; -+} ---- ./gdb/block.h 3 Jan 2009 05:57:50 -0000 1.19 -+++ ./gdb/block.h 22 Apr 2009 19:51:40 -0000 -@@ -164,4 +164,6 @@ extern const struct block *block_global_ - - extern struct block *allocate_block (struct obstack *obstack); - -+extern struct objfile *block_objfile (const struct block *block); -+ - #endif /* BLOCK_H */ ---- ./gdb/objfiles.c 11 Mar 2009 20:26:02 -0000 1.82 -+++ ./gdb/objfiles.c 22 Apr 2009 19:51:40 -0000 -@@ -891,3 +891,21 @@ objfile_data (struct objfile *objfile, c - gdb_assert (data->index < objfile->num_data); - return objfile->data[data->index]; - } -+ -+/* Return non-zero if A and B point to the same OBJFILE, ignoring any binary -+ vs. debuginfo variants of the pointers. If either A or B is NULL return -+ zero as not a match. */ -+ -+int -+matching_objfiles (struct objfile *a, struct objfile *b) -+{ -+ if (a == NULL || b == NULL) -+ return 0; -+ -+ if (a->separate_debug_objfile_backlink) -+ a = a->separate_debug_objfile_backlink; -+ if (b->separate_debug_objfile_backlink) -+ b = b->separate_debug_objfile_backlink; -+ -+ return a == b; -+} ---- ./gdb/objfiles.h 15 Jan 2009 16:35:22 -0000 1.59 -+++ ./gdb/objfiles.h 22 Apr 2009 19:51:40 -0000 -@@ -497,6 +497,8 @@ extern struct obj_section *find_pc_secti - - extern int in_plt_section (CORE_ADDR, char *); - -+extern int matching_objfiles (struct objfile *a, struct objfile *b); -+ - /* Keep a registry of per-objfile data-pointers required by other GDB - modules. */ - diff --git a/gdb.spec b/gdb.spec index 6dc3c0e..a034c49 100644 --- a/gdb.spec +++ b/gdb.spec @@ -10,11 +10,11 @@ Name: gdb%{?_with_debug:-debug} # Set version to contents of gdb/version.in. # NOTE: the FSF gdb versions are numbered N.M for official releases, like 6.3 # and, since January 2005, X.Y.Z.date for daily snapshots, like 6.3.50.20050112 # (daily snapshot from mailine), or 6.3.0.20040112 (head of the release branch). -Version: 6.8.50.20090302 +Version: 6.8.50.20090803 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 42%{?_with_upstream:.upstream}%{?dist} +Release: 1%{?_with_upstream:.upstream}%{?dist} License: GPLv3+ Group: Development/Debuggers @@ -82,12 +82,6 @@ Patch112: gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch # Make upstream `set scheduler-locking step' as default. Patch260: gdb-6.6-scheduler_locking-step-is-default.patch -# Fix to display base constructors from list and breakpoint commands -Patch116: gdb-6.3-linespec-20041213.patch - -# Continue removing breakpoints even when failure occurs. -Patch117: gdb-6.3-removebp-20041130.patch - # Add a wrapper script to GDB that implements pstack using the # --readnever option. Patch118: gdb-6.3-gstack-20050411.patch @@ -102,9 +96,8 @@ Patch125: gdb-6.3-test-self-20050110.patch # Fix for non-threaded watchpoints. Patch128: gdb-6.3-nonthreaded-wp-20050117.patch -# Fix to support multiple destructors just like multiple constructors +# Test support of multiple destructors just like multiple constructors Patch133: gdb-6.3-test-dtorfix-20050121.patch -Patch134: gdb-6.3-dtorfix-20050121.patch # Fix to support executable moving Patch136: gdb-6.3-test-movedir-20050125.patch @@ -116,7 +109,6 @@ Patch136: gdb-6.3-test-movedir-20050125.patch Patch140: gdb-6.3-gcore-thread-20050204.patch # Stop while intentionally stepping and the thread exit is met. -Patch141: gdb-6.6-step-thread-exit.patch Patch259: gdb-6.3-step-thread-exit-20050211-test.patch # Prevent gdb from being pushed into background @@ -193,9 +185,6 @@ Patch196: gdb-6.5-sharedlibrary-path.patch # FIXME: It could be autodetected. Patch199: gdb-6.5-bz190810-gdbserver-arch-advice.patch -# Fix dereferencing registers for 32bit inferiors on 64bit hosts (BZ 181390). -Patch200: gdb-6.5-bz181390-memory-address-width.patch - # Fix `gcore' command for 32bit inferiors on 64bit hosts. Patch201: gdb-6.5-gcore-i386-on-amd64.patch @@ -228,8 +217,8 @@ Patch229: gdb-6.3-bz140532-ppc-unwinding-test.patch # Testcase for exec() from threaded program (BZ 202689). Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch -# Backported post gdb-6.8.50.20090302 snapshot fixups. -Patch232: gdb-6.8.50.20090302-upstream.patch +# Backported post gdb-6.8.50.20090803 snapshot fixups. +#Patch232: gdb-6.8.50.20090803-upstream.patch # Testcase for PPC Power6/DFP instructions disassembly (BZ 230000). Patch234: gdb-6.6-bz230000-power6-disassembly-test.patch @@ -340,7 +329,6 @@ Patch324: gdb-6.8-glibc-headers-compat.patch Patch326: gdb-6.8-tui-singlebinary.patch # Support transparent debugging of inlined functions for an optimized code. -Patch327: gdb-6.8-inlining.patch Patch350: gdb-6.8-inlining-addon.patch Patch328: gdb-6.8-inlining-by-name.patch @@ -356,9 +344,6 @@ Patch331: gdb-6.8-quit-never-aborts.patch # Support DW_TAG_constant for Fortran in recent Fedora/RH GCCs. Patch332: gdb-6.8-fortran-tag-constant.patch -# bare names of constructors and destructors should be unique for GDB-6.8+. -Patch334: gdb-6.8-ctors-dtors-unique.patch - # Fix attaching to stopped processes and/or pending signals. Patch337: gdb-6.8-attach-signalled-detach-stopped.patch @@ -376,22 +361,6 @@ Patch349: gdb-archer.patch Patch352: gdb-6.8-bz457187-largefile.patch Patch360: gdb-6.8-bz457187-largefile-test.patch -# Fix crash on pretty-printer reading uninitialized std::string (BZ 495781). -Patch357: gdb-c_get_string-xfree.patch - -# Fix crash in the charset support. -Patch359: gdb-charset-crash.patch - -# Fix crashes due to (missing) varobj revalidation, for VLA (for BZ 377541). -Patch369: gdb-varobj-revalidate-prep.patch -Patch370: gdb-varobj-revalidate-core.patch - -# Implement DW_OP_call_frame_cfa (for recent GCC). -Patch373: gdb-DW_OP_call_frame_cfa.patch - -# Accelerate sorting blocks on reading a file (found on WebKit) (BZ 507267). -Patch374: gdb-bz507267-block-sort-fast.patch - # Fix compatibility of --with-system-readline and readline-6.0+. Patch375: gdb-readline-6.0.patch @@ -481,7 +450,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %if 0%{!?_with_upstream:1} -%patch232 -p1 +#patch232 -p1 %patch349 -p1 %patch1 -p1 %patch3 -p1 @@ -491,17 +460,13 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch106 -p1 %patch111 -p1 %patch112 -p1 -%patch116 -p1 -%patch117 -p1 %patch118 -p1 %patch122 -p1 %patch125 -p1 %patch128 -p1 %patch133 -p1 -%patch134 -p1 %patch136 -p1 %patch140 -p1 -%patch141 -p1 %patch259 -p1 %patch142 -p1 %patch145 -p1 @@ -527,7 +492,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch195 -p1 %patch196 -p1 %patch199 -p1 -%patch200 -p1 %patch201 -p1 %patch208 -p1 %patch209 -p1 @@ -578,25 +542,17 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch322 -p1 %patch324 -p1 %patch326 -p1 -%patch327 -p1 %patch350 -p1 %patch328 -p1 %patch329 -p1 %patch330 -p1 %patch331 -p1 %patch332 -p1 -%patch334 -p1 %patch337 -p1 %patch343 -p1 %patch348 -p1 %patch352 -p1 -%patch357 -p1 -%patch359 -p1 %patch360 -p1 -%patch369 -p1 -%patch370 -p1 -%patch373 -p1 -%patch374 -p1 %patch375 -p1 %patch124 -p1 @@ -886,6 +842,10 @@ fi %endif %changelog +* Tue Aug 4 2009 Jan Kratochvil - 6.8.50.20090803-1 +- Upgrade to the FSF GDB gdb-6.8.50 snapshot: 6.8.50.20090803 +- archer-jankratochvil-fedora12 commit: 0222cb1f4ddd1eda32965e464cb60b1e44e110b2 + * Fri Jul 31 2009 Jan Kratochvil - 6.8.50.20090302-42 - Release bump only. diff --git a/sources b/sources index d211e26..f43fd39 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -a8eae0d4ef955ebcecfc7511af31070a gdb-6.8.50.20090302.tar.bz2 +f120526b72a3dfd29e9f06a562e34aa1 gdb-6.8.50.20090803.tar.bz2