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); - } - - 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; - } +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 + + 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.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, + ""); + ++ 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/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.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 - /* Types used for symbols with no debug information. */ - struct type *nodebug_text_symbol; + /* This type is used to represent a GDB internal function. */ + struct type *internal_fn; ++ + 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 + }; + + /* Return the type table for the specified architecture. */ +Index: gdb-6.8.50.20090802/gdb/parse.c =================================================================== ---- 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/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 -=================================================================== ---- 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 +Index: gdb-6.8.50.20090803/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 -=================================================================== ---- 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 +Index: gdb-6.8.50.20090803/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-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-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-delayed-symfile -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,658 +195,170 @@ 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 @@ - - *** Changes since GDB 6.8 - -+* 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'. -+ - * 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. -+ - 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]) +@@ -425,6 +425,13 @@ x86/x86_64 Darwin i[34567]86-*-darwin* + + x86_64 MinGW x86_64-*-mingw* + ++* New native configurations + - # - # 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 - ]) - -@@ -230,6 +233,8 @@ size_t iconv(); - LIBICONV="-liconv" - fi - AC_SUBST(LIBICONV) -+ AC_SUBST(LIBICONV_INCLUDE) -+ AC_SUBST(LIBICONV_LIBDIR) - ]) ++x86/x86_64 Darwin i[34567]86-*-darwin* ++ ++info os processes ++ Show operating system information about processes. ++ + * New targets - 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; - -- 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); - - 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; -+ - 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); - } +@@ -4727,14 +4727,10 @@ ada_lookup_symbol (const char *name, const struct block *block0, - 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) + static struct symbol * + ada_lookup_symbol_nonlocal (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain) { - return ada_to_fixed_value_create (value_type (val), -- VALUE_ADDRESS (val) + value_offset (val), -+ value_address (val), - val); +- 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); } -@@ -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); +@@ -10839,6 +10835,40 @@ ada_operator_length (struct expression *exp, int pc, int *oplenp, int *argsp) + } } - 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) ++/* Implementation of the exp_descriptor method operator_check. */ ++ ++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) - { - 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) ++ /* 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) { - 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); + /* readline include files */ + #include "readline/readline.h" +@@ -564,6 +565,53 @@ get_number_or_range (char **pp) -+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. */ + ++/* Set break condition of breakpoint B to EXP. */ + +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) - - - -+/* Set break condition of breakpoint B to EXP. */ -+ -+void -+set_breakpoint_condition (struct breakpoint *b, char *exp, int from_tty) ++set_breakpoint_condition (struct breakpoint *b, char *exp, int from_tty) +{ + struct bp_location *loc = b->loc; + @@ -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,1077 +449,164 @@ 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 - }; +@@ -8821,6 +8834,22 @@ all_tracepoints () + return tp_vec; + } --/* 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. */ ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ + +static void -+print_one_catch_syscall (struct breakpoint *b, CORE_ADDR *last_addr) ++breakpoint_types_mark_used (void) +{ -+ 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. */ ++ struct breakpoint *b; + -+static void -+print_mention_catch_syscall (struct breakpoint *b) -+{ -+ if (b->syscalls_to_be_caught) ++ ALL_BREAKPOINTS (b) + { -+ 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 (")"); ++ if (b->exp) ++ exp_types_mark_used (b->exp); ++ if (b->val) ++ type_mark_used (value_type (b->val)); + } -+ 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; + + /* This help string is used for the break, hbreak, tbreak and thbreak commands. + It is defined as a macro to prevent duplication. +@@ -9323,4 +9352,5 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."), + automatic_hardware_breakpoints = 1; - 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; + observer_attach_about_to_proceed (breakpoint_about_to_proceed); ++ observer_attach_mark_used (breakpoint_types_mark_used); + } +diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h +index d8fe047..3a929b5 100644 +--- a/gdb/breakpoint.h ++++ b/gdb/breakpoint.h +@@ -913,6 +913,9 @@ extern void breakpoint_retire_moribund (void); + /* Tell a breakpoint to be quiet. */ + extern void make_breakpoint_silent (struct breakpoint *); -+ 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); ++/* Set break condition of breakpoint B to EXP. */ ++extern void set_breakpoint_condition (struct breakpoint *b, char *exp, int from_tty); + - mention (b); - update_global_location_list (1); + /* Return a tracepoint with the given number if found. */ + extern struct breakpoint *get_tracepoint (int num); -@@ -4775,6 +5052,23 @@ static struct breakpoint_ops catch_exec_breakpoint_ops = - print_mention_catch_exec - }; +diff --git a/gdb/c-exp.y b/gdb/c-exp.y +index aacc112..e206983 100644 +--- a/gdb/c-exp.y ++++ b/gdb/c-exp.y +@@ -117,6 +117,8 @@ static int yylex (void); -+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; + void yyerror (char *); - /* If we have explicit pc, don't expand. -@@ -5264,14 +5557,42 @@ expand_line_sal_maybe (struct symtab_and_line sal) ++/* Cleanup for 'nonempty_typelist' */ ++static struct cleanup *typelist_cleanup; + %} - 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; - } + /* Although the yacc "value" of an expression is not used, +@@ -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 *); + %} - 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); - } + %type exp exp1 type_exp start variable qualified_name lcurly +@@ -199,9 +202,12 @@ static int parse_number (char *, int, int, YYSTYPE *); - /* 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; + %token NAME_OR_INT -- 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); - } ++%token OPERATOR + %token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON + %token TEMPLATE + %token ERROR ++%token NEW DELETE ++%type operator - /* 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; -+ } - } + /* 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); } + ; - 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)); +-exp : exp ARROW '*' exp ++exp : exp ARROW_STAR exp + { write_exp_elt_opcode (STRUCTOP_MPTR); } + ; - if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len)) -@@ -6668,6 +6996,122 @@ catch_ada_exception_command (char *arg, int from_tty, - from_tty); - } +@@ -368,7 +374,7 @@ exp : exp '.' qualified_name + write_exp_elt_opcode (STRUCTOP_MEMBER); } + ; -+/* 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. */ -+ -+static void -+catch_syscall_command_1 (char *arg, int from_tty, struct cmd_list_element *command) -+{ -+ int tempflag; -+ struct syscall_filter *filter; -+ struct syscall s; -+ -+ /* 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. */ +-exp : exp '.' '*' exp ++exp : exp DOT_STAR exp + { write_exp_elt_opcode (STRUCTOP_MEMBER); } + ; - 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; - } +@@ -401,6 +407,36 @@ arglist : arglist ',' exp %prec ABOVE_COMMA + { arglist_len++; } + ; -+/* 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; ++exp : exp '(' nonempty_typelist ')' const_or_volatile ++ { int i; ++ write_exp_elt_opcode (TYPE_INSTANCE); ++ write_exp_elt_longcst ((LONGEST) $3[0]); ++ for (i = 0; i < $3[0]; ++i) ++ write_exp_elt_type ($3[i + 1]); ++ write_exp_elt_longcst((LONGEST) $3[0]); ++ write_exp_elt_opcode (TYPE_INSTANCE); ++ do_cleanups (typelist_cleanup); ++ } ++ ; + -+ 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; -+ } ++/* ++exp : BLOCKNAME '(' nonempty_typelist ')' ++ { int i; ++ write_exp_elt_opcode (TYPE_INSTANCE_LOOKUP); ++ write_exp_elt_sym ($1.sym); ++ write_exp_elt_opcode (TYPE_INSTANCE_LOOKUP); + -+ 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); -+} -+ - - /* 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); - - 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); - } - - 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 ---- 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); -+ - /* 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; - } - -+ 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 ---- a/gdb/c-exp.y -+++ b/gdb/c-exp.y -@@ -119,6 +119,8 @@ static int yylex (void); - - void yyerror (char *); - -+/* Cleanup for 'nonempty_typelist' */ -+static struct cleanup *typelist_cleanup; - %} - - /* 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; - -+ 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. */ - --%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 - -@@ -399,6 +405,38 @@ arglist : arglist ',' exp %prec ABOVE_COMMA - { arglist_len++; } - ; - -+exp : exp '(' nonempty_typelist ')' -+ { 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) -+ write_exp_elt_type ($3[i + 1]); -+ write_exp_elt_longcst((LONGEST) $3[0]); -+ write_exp_elt_opcode (TYPE_INSTANCE); -+ do_cleanups (typelist_cleanup); -+ } -+ ; -+ -+/* -+exp : BLOCKNAME '(' nonempty_typelist ')' -+ { int i; -+ write_exp_elt_opcode (TYPE_INSTANCE_LOOKUP); -+ write_exp_elt_sym ($1.sym); -+ write_exp_elt_opcode (TYPE_INSTANCE_LOOKUP); -+ -+ write_exp_elt_opcode (TYPE_INSTANCE); -+ write_exp_elt_longcst ((LONGEST) $3[0]); -+ for (i = 0; i < $3[0]; ++i) -+ write_exp_elt_type ($3[i + 1]); -+ write_exp_elt_longcst((LONGEST) $3[0]); -+ write_exp_elt_opcode (TYPE_INSTANCE); -+ do_cleanups (typelist_cleanup); -+ } -+ ; -+*/ ++ write_exp_elt_opcode (TYPE_INSTANCE); ++ write_exp_elt_longcst ((LONGEST) $3[0]); ++ for (i = 0; i < $3[0]; ++i) ++ write_exp_elt_type ($3[i + 1]); ++ write_exp_elt_longcst((LONGEST) $3[0]); ++ write_exp_elt_opcode (TYPE_INSTANCE); ++ do_cleanups (typelist_cleanup); ++ } ++ ; ++*/ + 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; -+ -+/* 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. */ -+ -+int -+c_parse_escape (char **ptr, struct obstack *output) -+{ -+ char *tokptr = *ptr; -+ int result = 1; -+ -+ /* 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; ++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; ++ } ++ ++ $$ = 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 (); ++ ++ 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); ++ } ++ ; + -+ value->type = type; -+ value->ptr = obstack_base (&tempbuf); -+ value->length = obstack_object_size (&tempbuf); + -+ *outptr = tokptr; + -+ return quote == '"' ? STRING : CHAR; -+} + 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) ++{ ++ 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; ++}; + - 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,1337 +952,528 @@ 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. */ + *charset = target_charset (); + +@@ -1038,6 +1038,9 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, + return evaluate_subexp_standard (expect_type, exp, pos, noside); + } + ++ ++/* Preprocessing and parsing C and C++ expressions. */ + -+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; -+ } -+ } -+} - - /* 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) + + /* Table mapping opcodes into strings for printing operators +@@ -1138,6 +1141,7 @@ static const struct exp_descriptor exp_descriptor_c = { -- 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; + 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 b193080..04cf3bc 100644 +--- a/gdb/c-typeprint.c ++++ b/gdb/c-typeprint.c +@@ -32,6 +32,7 @@ + #include "c-lang.h" + #include "typeprint.h" + #include "cp-abi.h" ++#include "jv-lang.h" -- c &= 0xFF; /* Avoid sign bit follies */ -+ classify_type (type, &encoding); + #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); -- 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); +-static void c_type_print_args (struct type *, struct ui_file *); +- + 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 +198,23 @@ cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, + fprintf_filtered (stream, "void"); + + fprintf_filtered (stream, ")"); + -+ convert_between_encodings ("wchar_t", host_charset (), -+ obstack_base (&wchar_buf), -+ obstack_object_size (&wchar_buf), -+ 1, &output, translit_char); -+ obstack_1grow (&output, '\0'); ++ /* For non-static methods, read qualifiers from the type of ++ THIS. */ ++ if (!staticp) ++ { ++ struct type *domain; + -+ fputs_filtered (obstack_base (&output), stream); ++ gdb_assert (nargs > 0); ++ gdb_assert (TYPE_CODE (args[0].type) == TYPE_CODE_PTR); ++ domain = TYPE_TARGET_TYPE (args[0].type); + -+ do_cleanups (cleanups); - } - - 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; ++ if (TYPE_CONST (domain)) ++ fprintf_filtered (stream, " const"); + -+ 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; ++ if (TYPE_VOLATILE (domain)) ++ fprintf_filtered (stream, " volatile"); + } -+ - 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) +@@ -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. 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, enum language language) { - 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; - } + int i, len; + struct field *args; +@@ -370,13 +390,19 @@ c_type_print_args (struct type *type, struct ui_file *stream) -- 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) + for (i = 0; i < TYPE_NFIELDS (type); i++) { -- /* 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) ++ if (TYPE_FIELD_ARTIFICIAL (type, i) && !show_artificial) ++ continue; ++ + if (printed_any) { -- fputs_filtered (", ", stream); -+ obstack_grow_wstr (&wchar_buf, L", "); - need_comma = 0; + fprintf_filtered (stream, ", "); + wrap_here (" "); } -- 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) +- 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, "["); +- if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 ++ if (TYPE_ARRAY_BOUND_IS_DWARF_BLOCK (type, 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; -+ } -+ } ++ /* No _() - printed sources should not be locale dependent. */ ++ fprintf_filtered (stream, "variable"); + } -+ -+ /* 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; - } ++ else if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 + && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) + fprintf_filtered (stream, "%d", + (TYPE_LENGTH (type) +@@ -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, language_c); + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, + passed_a_ptr, 0); + break; +diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c +index ce7c2a6..6380fec 100644 +--- a/gdb/cli/cli-cmds.c ++++ b/gdb/cli/cli-cmds.c +@@ -46,6 +46,8 @@ + #include "cli/cli-setshow.h" + #include "cli/cli-cmds.h" -- 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; ++#include "python/python.h" + -+ 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; - } - } + #ifdef TUI + #include "tui/tui.h" /* For tui_active et.al. */ + #endif +@@ -183,6 +185,7 @@ struct cmd_list_element *showchecklist; + + /* Command tracing state. */ + ++static int source_python = 0; + int source_verbose = 0; + int trace_commands = 0; + +@@ -444,6 +447,7 @@ source_script (char *file, int from_tty) + struct cleanup *old_cleanups; + char *full_pathname = NULL; + int fd; ++ int is_python; -@@ -173,13 +548,27 @@ c_printstr (struct ui_file *stream, const gdb_byte *string, - if (in_quotes) + if (file == NULL || *file == 0) { - if (options->inspect_it) -- fputs_filtered ("\\\"", stream); -+ obstack_grow_wstr (&wchar_buf, L"\\\""); - else -- fputs_filtered ("\"", stream); -+ obstack_grow_wstr (&wchar_buf, L"\""); +@@ -476,8 +480,16 @@ source_script (char *file, int from_tty) + } } -- if (force_ellipses || i < length) -- fputs_filtered ("...", stream); -+ if (force_ellipses || !finished) -+ obstack_grow_wstr (&wchar_buf, L"..."); ++ is_python = source_python; ++ if (strlen (file) > 3 && !strcmp (&file[strlen (file) - 3], ".py")) ++ is_python = 1; + -+ /* OUTPUT is where we collect `char's for printing. */ -+ obstack_init (&output); -+ make_cleanup_obstack_free (&output); + stream = fdopen (fd, FOPEN_RT); +- script_from_file (stream, file); + -+ convert_between_encodings ("wchar_t", host_charset (), -+ obstack_base (&wchar_buf), -+ obstack_object_size (&wchar_buf), -+ 1, &output, translit_char); -+ obstack_1grow (&output, '\0'); ++ if (is_python) ++ source_python_script (stream, file); ++ else ++ script_from_file (stream, file); + + do_cleanups (old_cleanups); + } +@@ -491,15 +503,30 @@ source_verbose_cleanup (void *old_value) + xfree (old_value); + } + ++/* A helper for source_command. Look for an argument in *ARGS. ++ Update *ARGS by stripping leading whitespace. If an argument is ++ found, return it (a character). Otherwise, return 0. */ ++static int ++find_argument (char **args) ++{ ++ int result = 0; ++ while (isspace ((*args)[0])) ++ ++*args; ++ if ((*args)[0] == '-' && isalpha ((*args)[1])) ++ { ++ result = (*args)[1]; ++ *args += 3; ++ } ++ return result; ++} + -+ fputs_filtered (obstack_base (&output), stream); + static void + source_command (char *args, int from_tty) + { + struct cleanup *old_cleanups; +- char *file = args; +- int *old_source_verbose = xmalloc (sizeof(int)); + +- *old_source_verbose = source_verbose; +- old_cleanups = make_cleanup (source_verbose_cleanup, old_source_verbose); ++ old_cleanups = make_cleanup_restore_integer (&source_verbose); ++ make_cleanup_restore_integer (&source_python); + + /* -v causes the source command to run in verbose mode. + We still have to be able to handle filenames with spaces in a +@@ -507,23 +534,28 @@ source_command (char *args, int from_tty) + + if (args) + { +- /* Make sure leading white space does not break the comparisons. */ +- while (isspace(args[0])) +- args++; +- +- /* Is -v the first thing in the string? */ +- if (args[0] == '-' && args[1] == 'v' && isspace (args[2])) ++ while (1) + { +- source_verbose = 1; +- +- /* Trim -v and whitespace from the filename. */ +- file = &args[3]; +- while (isspace (file[0])) +- file++; ++ int arg = find_argument (&args); ++ if (!arg) ++ break; ++ switch (arg) ++ { ++ case 'v': ++ source_verbose = 1; ++ break; ++ case 'p': ++ source_python = 1; ++ break; ++ default: ++ error (_("unrecognized option -%c"), arg); ++ } + } + } + +- source_script (file, from_tty); ++ source_script (args, from_tty); + -+ do_cleanups (cleanup); ++ do_cleanups (old_cleanups); } - /* 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. */ +@@ -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\ +-when GDB is started."), gdbinit); ++when GDB is started.\n\ ++Optional -p switch (before the filename) causes FILE to be evaluated\n\ ++as Python code."), gdbinit); + c = add_cmd ("source", class_support, source_command, + source_help_text, &cmdlist); + set_cmd_completer (c, filename_completer); +diff --git a/gdb/coffread.c b/gdb/coffread.c +index 888f8b4..65494b8 100644 +--- a/gdb/coffread.c ++++ b/gdb/coffread.c +@@ -346,7 +346,7 @@ coff_alloc_type (int index) + We will fill it in later if we find out how. */ + if (type == NULL) + { +- type = alloc_type (current_objfile); ++ type = alloc_type (current_objfile, NULL); + *type_addr = type; + } + return type; +@@ -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 */ ++ NULL, /* sym_read_psymbols */ + coff_symfile_finish, /* sym_finish: finished with file, cleanup */ + 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 f2d56a0..0909c80 100644 +--- a/gdb/config.in ++++ b/gdb/config.in +@@ -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 + +-/* 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 + + /* Define to be a string naming the default host character set. */ +@@ -641,6 +640,9 @@ + 'ptrdiff_t'. */ + #undef PTRDIFF_T_SUFFIX + ++/* Define to install path for Python sources */ ++#undef PYTHONDIR + -+/* 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. */ + /* 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. + -+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; ++ This file is part of GDB. + -+ for (i = 0; i < length && p < limit && isxdigit (*p); ++i, ++p) -+ result = (result << 4) + host_hex_value (*p); ++ 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. + -+ for (i = 3; i >= 0; --i) -+ { -+ data[i] = result & 0xff; -+ result >>= 8; -+ } ++ 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. + -+ convert_between_encodings ("UCS-4BE", dest_charset, data, 4, 4, output, -+ translit_none); ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + -+ return p; -+} ++#ifndef NM_I386_H ++#define NM_I386_H 1 + -+/* Emit a character, VALUE, which was specified numerically, to -+ OUTPUT. TYPE is the target character type. */ ++/* Hardware-assisted breakpoints and watchpoints. */ + -+static void -+emit_numeric_character (struct type *type, unsigned long value, -+ struct obstack *output) -+{ -+ gdb_byte *buffer; ++/* Targets should define this to use the generic x86 watchpoint support. */ ++#ifdef I386_USE_GENERIC_WATCHPOINTS + -+ buffer = alloca (TYPE_LENGTH (type)); -+ pack_long (buffer, type, value); -+ obstack_grow (output, buffer, TYPE_LENGTH (type)); -+} ++/* 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 *); + -+/* 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. */ ++/* Clear the reference counts and forget everything we knew about DRi. */ ++extern void i386_cleanup_dregs (void); + -+static char * -+convert_octal (struct type *type, char *p, char *limit, struct obstack *output) -+{ -+ unsigned long value = 0; ++/* 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); + -+ while (p < limit && isdigit (*p) && *p != '8' && *p != '9') -+ { -+ value = 8 * value + host_hex_value (*p); -+ ++p; -+ } ++/* 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); + -+ emit_numeric_character (type, value, output); ++/* 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 p; -+} ++/* Return non-zero if the inferior has some break/watchpoint that ++ triggered. */ ++extern int i386_stopped_by_hwbp (void); + -+/* 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. */ ++/* 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 *); + -+static char * -+convert_hex (struct type *type, char *p, char *limit, struct obstack *output) -+{ -+ unsigned long value = 0; ++/* 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); + -+ while (p < limit && isxdigit (*p)) -+ { -+ value = 16 * value + host_hex_value (*p); -+ ++p; -+ } ++/* 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); + -+ emit_numeric_character (type, value, output); ++extern int i386_stopped_by_watchpoint (void); + -+ return p; -+} ++#ifndef I386_WATCHPOINTS_IN_TARGET_VECTOR + -+#define ADVANCE \ -+ do { \ -+ ++p; \ -+ if (p == limit) \ -+ error (_("Malformed escape sequence")); \ -+ } while (0) ++/* 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. + -+/* 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. */ ++ 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. */ + -+static char * -+convert_escape (struct type *type, const char *dest_charset, -+ char *p, char *limit, struct obstack *output) -+{ -+ /* Skip the backslash. */ -+ ADVANCE; ++#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1 + -+ switch (*p) -+ { -+ case '\\': -+ obstack_1grow (output, '\\'); -+ ++p; -+ break; ++/* Returns non-zero if we can use hardware watchpoints to watch a ++ region whose address is ADDR and whose length is LEN. */ + -+ case 'x': -+ ADVANCE; -+ if (!isxdigit (*p)) -+ error (_("\\x used with no following hex digits.")); -+ p = convert_hex (type, p, limit, output); -+ break; ++#define TARGET_REGION_OK_FOR_HW_WATCHPOINT(addr, len) \ ++ i386_region_ok_for_watchpoint (addr, len) + -+ case '0': -+ case '1': -+ case '2': -+ case '3': -+ case '4': -+ case '5': -+ case '6': -+ case '7': -+ p = convert_octal (type, p, limit, output); -+ break; ++/* 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. */ + -+ 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); -+ } -+ } ++#define HAVE_CONTINUABLE_WATCHPOINT 1 + -+ return p; -+} ++#define STOPPED_BY_WATCHPOINT(W) (i386_stopped_by_watchpoint () != 0) + -+/* 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. */ ++#define target_stopped_data_address(target, x) \ ++ i386_stopped_data_address(target, x) + -+static void -+parse_one_string (struct obstack *output, char *data, int len, -+ const char *dest_charset, struct type *type) -+{ -+ char *limit; ++/* Use these macros for watchpoint insertion/removal. */ + -+ limit = data + len; ++#define target_insert_watchpoint(addr, len, type) \ ++ i386_insert_watchpoint (addr, len, type) + -+ 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; -+ } -+} ++#define target_remove_watchpoint(addr, len, type) \ ++ i386_remove_watchpoint (addr, len, type) + -+/* Expression evaluator for the C language family. Most operations -+ are delegated to evaluate_subexp_standard; see that function for a -+ description of the arguments. */ ++#define target_insert_hw_breakpoint(bp_tgt) \ ++ i386_insert_hw_breakpoint (bp_tgt) + -+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; ++#define target_remove_hw_breakpoint(bp_tgt) \ ++ i386_remove_hw_breakpoint (bp_tgt) + -+ 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); ++#endif /* I386_WATCHPOINTS_IN_TARGET_VECTOR */ + -+ ++*pos; -+ while (*pos < limit) -+ { -+ int len; ++#endif /* I386_USE_GENERIC_WATCHPOINTS */ + -+ len = longest_to_int (exp->elts[*pos].longconst); ++#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. + -+ ++*pos; -+ if (noside != EVAL_SKIP) -+ parse_one_string (&output, &exp->elts[*pos].string, len, -+ dest_charset, type); -+ *pos += BYTES_TO_EXP_ELEM (len); -+ } ++ Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 ++ Free Software Foundation, Inc. + -+ /* Skip the trailing length and opcode. */ -+ *pos += 2; ++ Contributed by Jiri Smid, SuSE Labs. + -+ if (noside == EVAL_SKIP) -+ return NULL; ++ This file is part of GDB. + -+ if ((dest_type & C_CHAR) != 0) -+ { -+ LONGEST value; ++ 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. + -+ 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; ++ 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. + -+ 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 -+}; ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + - const struct language_defn c_language_defn = - { - "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 -+ }; ++#ifndef NM_LINUX64_H ++#define NM_LINUX64_H + -+/* Defined in c-exp.y. */ ++/* GNU/Linux supports the i386 hardware debugging registers. */ ++#define I386_USE_GENERIC_WATCHPOINTS ++#define I386_WATCHPOINTS_IN_TARGET_VECTOR + -+extern int c_parse (void); ++#include "i386/nm-i386.h" ++#include "config/nm-linux.h" + -+extern void c_error (char *); ++/* Support for 8-byte wide hardware watchpoints. */ ++#define TARGET_HAS_DR_LEN_8 1 + -+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); - -diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c -index 0929516..c005fe4 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, - char *varstring, int staticp, - struct ui_file *stream); - --static void c_type_print_args (struct type *, struct ui_file *); -- - 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, - fprintf_filtered (stream, "void"); - - fprintf_filtered (stream, ")"); ++/* Provide access to the i386 hardware debugging registers. */ + -+ /* For non-static methods, read qualifiers from the type of -+ THIS. */ -+ if (!staticp) -+ { -+ struct type *domain; ++extern void amd64_linux_dr_set_control (unsigned long control); ++#define I386_DR_LOW_SET_CONTROL(control) \ ++ amd64_linux_dr_set_control (control) + -+ gdb_assert (nargs > 0); -+ gdb_assert (TYPE_CODE (args[0].type) == TYPE_CODE_PTR); -+ domain = TYPE_TARGET_TYPE (args[0].type); ++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) + -+ if (TYPE_CONST (domain)) -+ fprintf_filtered (stream, " const"); ++extern void amd64_linux_dr_reset_addr (int regnum); ++#define I386_DR_LOW_RESET_ADDR(regnum) \ ++ amd64_linux_dr_reset_addr (regnum) + -+ if (TYPE_VOLATILE (domain)) -+ fprintf_filtered (stream, " volatile"); -+ } - } - - -@@ -354,10 +369,12 @@ 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. */ - --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 i, len; - struct field *args; -@@ -369,6 +386,9 @@ c_type_print_args (struct type *type, struct ui_file *stream) - - for (i = 0; i < TYPE_NFIELDS (type); i++) - { -+ if (TYPE_FIELD_ARTIFICIAL (type, i) && !show_artificial) -+ continue; -+ - if (printed_any) - { - fprintf_filtered (stream, ", "); -@@ -559,7 +579,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, - fprintf_filtered (stream, ")"); - - fprintf_filtered (stream, "["); -- if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 -+ if (TYPE_ARRAY_BOUND_IS_DWARF_BLOCK (type, 1)) -+ { -+ /* No _() - printed sources should not be locale dependent. */ -+ fprintf_filtered (stream, "variable"); -+ } -+ else if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 - && !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, - 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_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; ++extern unsigned long amd64_linux_dr_get_status (void); ++#define I386_DR_LOW_GET_STATUS() \ ++ amd64_linux_dr_get_status () + -+ /* 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 ++#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..59c64c5 +index 0000000..49ac420 --- /dev/null -+++ b/gdb/charset-list.h -@@ -0,0 +1,1190 @@ -+/* List of character set names for GDB. ++++ b/gdb/config/mips/nm-irix5.h +@@ -0,0 +1,44 @@ ++/* Definitions for native support of irix5. + -+ Copyright (C) 2009 Free Software Foundation, Inc. ++ Copyright 1993, 1996, 1998, 1999, 2000, 2007, 2008, 2009 ++ Free Software Foundation, Inc. + + This file is part of GDB. + @@ -7712,27668 +1490,12532 @@ index 0000000..59c64c5 + 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. ++#define TARGET_HAS_HARDWARE_WATCHPOINTS + - 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. */ ++/* 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 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 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` +@@ -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-curses use the curses library instead of the termcap + library +@@ -7218,6 +7222,75 @@ _ACEOF --#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 + fi; --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 ++# GDB's datadir relocation + -+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); ++gdbdatadir=${datadir}/gdb ++ ++ ++# Check whether --with-gdb-datadir or --without-gdb-datadir was given. ++if test "${with_gdb_datadir+set}" = set; then ++ withval="$with_gdb_datadir" ++ gdbdatadir="${withval}" ++fi; ++ ++ ++ test "x$prefix" = xNONE && prefix="$ac_default_prefix" ++ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ac_define_dir=`eval echo $gdbdatadir` ++ ac_define_dir=`eval echo $ac_define_dir` ++ ++cat >>confdefs.h <<_ACEOF ++#define GDB_DATADIR "$ac_define_dir" ++_ACEOF ++ ++ ++ ++if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then ++ if test "x$prefix" = xNONE; then ++ test_prefix=/usr/local + 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); - } ++ test_prefix=$prefix ++ fi ++else ++ test_prefix=$exec_prefix ++fi ++ ++case ${gdbdatadir} in ++ "${test_prefix}"|"${test_prefix}/"*|\ ++ '${exec_prefix}'|'${exec_prefix}/'*) ++ ++cat >>confdefs.h <<\_ACEOF ++#define GDB_DATADIR_RELOCATABLE 1 ++_ACEOF ++ ++ ;; ++esac ++GDB_DATADIR_PATH=${gdbdatadir} ++ ++ ++ ++# Check whether --with-pythondir or --without-pythondir was given. ++if test "${with_pythondir+set}" = set; then ++ withval="$with_pythondir" ++ pythondir="${withval}" ++else ++ pythondir=no ++fi; ++ ++# If the user passed in a path, define it. Otherwise, compute it at ++# runtime based on the possibly-relocatable datadir. ++if test "$pythondir" = "no"; then ++ pythondir='$(GDB_DATADIR_PATH)/python' ++else ++ ++cat >>confdefs.h <<_ACEOF ++#define PYTHONDIR "$pythondir" ++_ACEOF ++ ++fi ++ ++ ++ -- --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 - }; + subdirs="$subdirs doc testsuite" +@@ -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)" ++ CONFIG_INSTALL="$CONFIG_INSTALL install-python" ++ CONFIG_UNINSTALL="$CONFIG_UNINSTALL uninstall-python" + ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" --/* The global list of all the charsets GDB knows about. */ --static struct charset *all_charsets; -+static const char **charset_enum; + # Flags needed to compile Python code (taken from python-config --cflags). +@@ -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 +diff --git a/gdb/configure.ac b/gdb/configure.ac +index 77f8436..bca368c 100644 +--- a/gdb/configure.ac ++++ b/gdb/configure.ac +@@ -109,6 +109,51 @@ AS_HELP_STRING([--with-relocated-sources=PATH], [automatically relocate this pat + [Relocated directory for source files. ]) + ]) -+ -+/* 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; ++# GDB's datadir relocation ++ ++gdbdatadir=${datadir}/gdb ++ ++AC_ARG_WITH([gdb-datadir], ++ [AS_HELP_STRING([--with-gdb-datadir], ++ [look for global separate data files in this path [DATADIR/gdb]])], [gdbdatadir="${withval}"]) ++ ++AC_DEFINE_DIR(GDB_DATADIR, gdbdatadir, ++ [Global directory for GDB data files. ]) ++ ++if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then ++ if test "x$prefix" = xNONE; then ++ test_prefix=/usr/local ++ else ++ test_prefix=$prefix ++ fi ++else ++ test_prefix=$exec_prefix ++fi ++ ++case ${gdbdatadir} in ++ "${test_prefix}"|"${test_prefix}/"*|\ ++ '${exec_prefix}'|'${exec_prefix}/'*) ++ AC_DEFINE(GDB_DATADIR_RELOCATABLE, 1, [Define if GDB datadir should be relocated when GDB is moved.]) ++ ;; ++esac ++GDB_DATADIR_PATH=${gdbdatadir} ++AC_SUBST(GDB_DATADIR_PATH) ++ ++AC_ARG_WITH([pythondir], ++ [AS_HELP_STRING([--with-pythondir], ++ [install Python data files in this path [DATADIR/gdb/python]])], [pythondir="${withval}"], [pythondir=no]) ++ ++# If the user passed in a path, define it. Otherwise, compute it at ++# runtime based on the possibly-relocatable datadir. ++if test "$pythondir" = "no"; then ++ pythondir='$(GDB_DATADIR_PATH)/python' ++else ++ AC_DEFINE_UNQUOTED(PYTHONDIR, "$pythondir", ++ [Define to install path for Python sources]) ++fi ++AC_SUBST(pythondir) ++ ++ + AC_CONFIG_SUBDIRS(doc testsuite) --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. */ + # Check whether to support alternative target configurations +@@ -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)" ++ CONFIG_INSTALL="$CONFIG_INSTALL install-python" ++ CONFIG_UNINSTALL="$CONFIG_UNINSTALL uninstall-python" + ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" --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]; -+ } -+ } - } + # Flags needed to compile Python code (taken from python-config --cflags). +diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y +index 62800b8..97d587b 100644 +--- a/gdb/cp-name-parser.y ++++ b/gdb/cp-name-parser.y +@@ -1,7 +1,6 @@ + /* YACC parser for C++ names, for GDB. -- --/* 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. */ +- Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 +- Free Software Foundation, Inc. ++ Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. - 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 (); + Parts of the lexer are based on c-exp.y from GDB. -- return 0; --} -- -- -- --/* Constructing charsets. */ +@@ -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); } - --/* 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 (); - } ++ | 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 d2d8f2e..3166818 100644 +--- a/gdb/cp-namespace.c ++++ b/gdb/cp-namespace.c +@@ -35,15 +35,7 @@ + static struct using_direct *cp_copy_usings (struct using_direct *using, + struct obstack *obstack); +-static 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); - -- --/* 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 struct symbol *lookup_symbol_file (const char *name, +- const char *linkage_name, + const struct block *block, + 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 (dest, src); ++ cp_add_using_directive (dest, src, "", "", 0); + } + /* The "+ 2" is for the "::". */ + previous_component = next_component + 2; +@@ -134,7 +126,8 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) + has already been added, don't add it twice. */ -- --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) + void +-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) { -- *ctrl_char = (c & 037); -- return 1; -+ validate (); - } + struct using_direct *current; + struct using_direct *new; +@@ -148,7 +141,8 @@ cp_add_using_directive (const char *dest, const char *src) + return; + } + +- using_directives = cp_add_using (dest, src, using_directives); ++ using_directives = cp_add_using (dest, src, alias, declaration, ++ line_number, using_directives); -- --/* 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 (); +@@ -201,7 +195,10 @@ cp_is_anonymous (const char *namespace) } -- --/* 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) + /* 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. */ +@@ -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, + struct using_direct *next) { -- 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); - } + struct using_direct *retval; -- - --/* EBCDIC family functions. */ -- -- --static int --ebcdic_print_literally (void *baton, int c) --{ -- c &= 0xff; -- -- return (64 <= c && c <= 254); --} -- -+/* Accessor functions. */ + retval = xmalloc (sizeof (struct using_direct)); +- 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; --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; - } + return retval; +@@ -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->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); -- --/* Construct an EBCDIC-like character set. */ --static struct charset * --ebcdic_family_charset (const char *name) -+const char * -+target_charset (void) + xfree (using->import_src); + xfree (using->import_dest); ++ xfree (using->alias); ++ xfree (using->declaration); + xfree (using); + + return retval; +@@ -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 simple_charset (name, 0, -- ebcdic_print_literally, 0, -- ebcdic_to_control, 0); -+ return target_charset_name; +- 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); ++ } ++ ++ ++ if (sym != NULL) ++ return sym; ++ ++ return lookup_symbol_file(name, block, domain, 0); } -- -- -- -- -- --/* 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) + /* Lookup NAME at namespace scope (or, in C terms, in static and +@@ -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 struct block *block, + const domain_enum domain, + const char *scope, +- int scope_len) ++ int scope_len, ++ int declaration_only) { -- 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; - } + char *namespace; -- /* 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; +@@ -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, +- block, domain); ++ return cp_lookup_symbol_namespace (namespace, name, block, domain, ++ declaration_only); } -- --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) ++/* Searches the for the given NAME in the given NAMESPACE, using import ++ statements implied by the given BLOCK, *and its' parents*. */ ++struct symbol * ++cp_lookup_symbol_namespace_incremental (const char *namespace, ++ const char *name, ++ const struct block *block, ++ const domain_enum domain, ++ int declaration_only) ++{ ++ struct symbol *sym; ++ const struct block *global_block = block_global_block (block); ++ ++ /* Check if either no block is specified or it's a global block. */ ++ ++ if (global_block == NULL) ++ return NULL; ++ ++ while (block != global_block) ++ { ++ sym = cp_lookup_symbol_namespace (namespace, name, block, domain, ++ declaration_only); ++ ++ if (sym != NULL) ++ return sym; ++ ++ block = BLOCK_SUPERBLOCK (block); ++ } ++ ++ /* We've reached the global block without finding a result. */ ++ ++ return NULL; ++} ++ ++ + /* 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. */ +@@ -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) { -- errno = EINVAL; -- return -1; -+ if (c == '?') -+ return 0177; -+ return c & 0237; - } + const struct using_direct *current; +- struct symbol *sym; ++ struct symbol *sym = NULL; --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. */ + /* 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 +@@ -346,15 +407,60 @@ cp_lookup_symbol_namespace (const char *namespace, + current != NULL; + current = current->next) + { +- 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->import_dest) == 0 && current->line_number < current_line) + { +- sym = cp_lookup_symbol_namespace (current->import_src, +- name, +- linkage_name, +- block, +- domain); +- if (sym != NULL) ++ ++ /* 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->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->import_src, ++ name, ++ block, ++ domain, ++ declaration_only); ++ } ++ } ++ ++ 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->import_src, ++ block, ++ 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->import_src, ++ name, ++ block, ++ domain, ++ declaration_only); ++ } ++ ++ if (sym != NULL){ + return sym; ++ } + } + } --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) +@@ -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' && !declaration_only) + { +- return lookup_symbol_file (name, linkage_name, block, +- domain, 0); ++ 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) { -- *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'; - } + struct symbol *sym = NULL; -- - --/* 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. */ +- sym = lookup_symbol_static (name, linkage_name, block, domain); ++ sym = lookup_symbol_static (name, block, domain); + if (sym != NULL) + return sym; -+/* A cleanup function which is run to close an iconv descriptor. */ +@@ -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); + } --/* 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); - } + 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, -+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; -+ } + 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); -- --/* 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; + if (sym == NULL) + { +@@ -749,7 +852,7 @@ lookup_possible_namespace_symbol (const char *name) + struct symbol *sym; --static int --table_convert_char (void *baton, int from, int *to) --{ -- int *table = (int *) baton; -+ space_request = num_bytes; + sym = lookup_block_symbol (get_possible_namespace_block (objfile), +- name, NULL, VAR_DOMAIN); ++ name, VAR_DOMAIN); -- 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; + if (sym != NULL) + return sym; +diff --git a/gdb/cp-support.c b/gdb/cp-support.c +index f12d785..ca10007 100644 +--- a/gdb/cp-support.c ++++ b/gdb/cp-support.c +@@ -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). + -+ old_size = obstack_object_size (output); -+ obstack_blank (output, space_request); ++ 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 */ ++ }; + -+ outp = obstack_base (output) + old_size; -+ outleft = space_request; + /* 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; + } + +-/* Return the name of the class containing method PHYSNAME. */ ++/* Return the name of the class or namespace containing ++ function, method, or variable PHYSNAME. */ + + 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) + -+ r = iconv (desc, &inp, &inleft, &outp, &outleft); ++/* 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; + -+ /* Now make sure that the object on the obstack only includes -+ bytes we have converted. */ -+ obstack_blank (output, - (int) outleft); ++ /* 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; + -+ if (r == (size_t) -1) ++ SKIP_SPACE (p); ++ for (i = 0; i < sizeof (operator_tokens) / sizeof (operator_tokens[0]); ++ ++i) + { -+ switch (errno) ++ 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) + { -+ case EILSEQ: -+ { -+ int i; ++ const char *op = p; ++ valid = 1; ++ p += length; + -+ /* Invalid input sequence. */ -+ if (translit == translit_none) -+ error (_("Could not convert character to `%s' character set"), -+ to); ++ if (strncmp (op, "new", 3) == 0 ++ || strncmp (op, "delete", 6) == 0) ++ { + -+ /* We emit escape sequence for the bytes, skip them, -+ and try again. */ -+ for (i = 0; i < width; ++i) -+ { -+ char octal[5]; ++ /* Special case: new[] and delete[]. We must be careful ++ to swallow whitespace before/in "[]".*/ ++ SKIP_SPACE (p); + -+ sprintf (octal, "\\%.3o", *inp & 0xff); -+ obstack_grow_str (output, octal); ++ if (*p == '[') ++ { ++ ++p; ++ SKIP_SPACE (p); ++ if (*p == ']') ++ ++p; ++ else ++ valid = 0; ++ } ++ } + -+ ++inp; -+ --inleft; -+ } -+ } + break; ++ } ++ } + -+ case E2BIG: -+ /* We ran out of space in the output buffer. Make it -+ bigger next time around. */ -+ space_request *= 2; -+ break; ++ if (!valid) ++ p = input; ++ } + -+ case EINVAL: -+ /* Incomplete input sequence. FIXME: ought to report this -+ to the caller somehow. */ -+ inleft = 0; -+ break; ++ return (p - input); ++} + -+ default: -+ perror_with_name ("Internal error while converting character sets"); -+ } -+ } - } -- else -- return 0; --} -- + void + _initialize_cp_support (void) + { +diff --git a/gdb/cp-support.h b/gdb/cp-support.h +index b5a5c5f..0381686 100644 +--- a/gdb/cp-support.h ++++ b/gdb/cp-support.h +@@ -38,14 +38,29 @@ struct demangle_component; --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); - } + /* This struct is designed to store data from using directives. It + 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 ++ statement represents one. Eg: ++ using A::x; ++ Where x is variable in namespace A. declaration is set to x. ++*/ -- --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) + struct using_direct { -- 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; + char *import_src; + char *import_dest; + -+ ++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; ++ char *alias; + -+ default: -+ perror_with_name ("Internal error while converting character sets"); -+ } -+ } ++ char *declaration; + -+ /* 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; - } ++ int line_number; + -+ /* Really done. */ -+ *out_result = wchar_iterate_eof; -+ return -1; - } - - --/* Accessor functions. */ -+/* The charset.c module initialization function. */ + struct using_direct *next; + }; --const char * --host_charset (void) --{ -- return current_host_charset->name; --} -+extern initialize_file_ftype _initialize_charset; /* -Wmissing-prototype */ +@@ -54,6 +69,7 @@ struct using_direct --const char * --target_charset (void) --{ -- return current_target_charset->name; --} -+typedef char *char_ptr; -+DEF_VEC_P (char_ptr); + extern char *cp_canonicalize_string (const char *string); -+static VEC (char_ptr) *charsets; ++ + extern char *cp_class_name_from_physname (const char *physname); -- --/* Public character management functions. */ -+#ifdef HAVE_ICONVLIST + extern char *method_name_from_physname (const char *physname); +@@ -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); -+/* A helper function that adds some character sets to the vector of -+ all character sets. This is a callback function for iconvlist. */ ++extern int cp_validate_operator (const char *input); ++ + /* Functions/variables from cp-namespace.c. */ --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; + extern int cp_is_anonymous (const char *namespace); -+ for (i = 0; i < count; ++i) -+ VEC_safe_push (char_ptr, charsets, xstrdup (names[i])); + 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); --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; - } + 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); -- --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); - } + 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); -+#else + extern struct symbol *cp_lookup_symbol_nonlocal (const char *name, +- const char *linkage_name, + const struct block *block, + const domain_enum domain); --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; ++extern struct symbol *lookup_namespace_scope (const char *name, ++ const struct block *block, ++ const domain_enum domain, ++ const char *scope, ++ int scope_len, ++ int declaration_only); ++ ++extern struct symbol *cp_lookup_symbol_namespace_incremental (const char *namespace, ++ const char *name, ++ const struct block *block, ++ const domain_enum domain, ++ int declaration_only); ++ + extern 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 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 7cb016d..bb9e35a 100644 +--- a/gdb/dbxread.c ++++ b/gdb/dbxread.c +@@ -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 */ ++ NULL, /* sym_read_psymbols */ + 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/doc/gdb.texinfo b/gdb/doc/gdb.texinfo +index fab05fc..44cc1f2 100644 +--- a/gdb/doc/gdb.texinfo ++++ b/gdb/doc/gdb.texinfo +@@ -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} +-Execute @value{GDBN} commands from file @var{file}. @xref{Command +-Files,, Command files}. ++Execute commands from file @var{file}. If @var{file} ends in ++@samp{.py}, then the file is evaluated as Python code. If Python ++support is not enabled in this @value{GDBN}, then an error occurs. ++@xref{Command Files,, Command files}. -+ in = popen ("iconv -l", "r"); -+ /* It is ok to ignore errors; we'll fall back on a default. */ -+ if (!in) -+ return; + @item -eval-command @var{command} + @itemx -ex @var{command} +@@ -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. --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)); -+ } ++@item -P ++@cindex @code{-P} ++@itemx --python ++@cindex @code{--python} ++Change interpretation of command line so that the argument immediately ++following this switch is taken to be the name of a Python script file. ++This option stops option processing; subsequent options are passed to ++Python as @code{sys.argv}. This option is only available if Python ++scripting support was enabled when @value{GDBN} was configured. ++ + @c resolve the situation of these eventually + @item -tui + @cindex @code{--tui} +@@ -18427,7 +18439,7 @@ command: + @table @code + @kindex source + @cindex execute commands from a file +-@item source [@code{-v}] @var{filename} ++@item source [@code{-v}] [@code{-p}] @var{filename} + Execute the command file @var{filename}. + @end table -+ pclose (in); +@@ -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. --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); - } ++If @var{filename} ends in @samp{.py}, or if @code{-p}, for Python, is ++given then @value{GDBN} evaluates the contents of the file as Python ++code. If Python support is not compiled in to @value{GDBN}, then an ++error occurs. ++ + 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 +@@ -18705,8 +18722,6 @@ containing @code{end}. For example: -- -- --/* The charset.c module initialization function. */ -- --extern initialize_file_ftype _initialize_charset; /* -Wmissing-prototype */ -+#endif /* HAVE_ICONVLIST */ + @smallexample + (@value{GDBP}) python +-Type python script +-End with a line saying just "end". + >print 23 + >end + 23 +@@ -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. ++ ++@kindex maint set python auto-load ++@item maint set python auto-load ++By default, @value{GDBN} will attempt to automatically load Python ++code when an object file is opened. This can be controlled using ++@code{maint set python auto-load}: if @code{on}, the default, then ++Python auto-loading is enabled; if @code{off}, then Python ++auto-loading is disabled. + @end table - void - _initialize_charset (void) - { - struct cmd_list_element *new_cmd; + @node Python API +@@ -18726,6 +18749,14 @@ disabled. + @cindex python api + @cindex programming in python -- /* 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); ++You can get quick online help for @value{GDBN}'s Python API by issuing ++the command @w{@kbd{python help (gdb)}}. + -+#ifdef HAVE_LANGINFO_CODESET -+ auto_host_charset_name = nl_langinfo (CODESET); -+ target_charset_name = auto_host_charset_name; ++Functions and methods which have two or more optional arguments allow ++them to be specified using keyword syntax. This allows passing some ++optional arguments while skipping others. Example: ++@w{@code{gdb.some_function ('foo', bar = 1, baz = 2)}}. + -+ 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); + @cindex python stdout + @cindex python pagination + At startup, @value{GDBN} overrides Python's @code{sys.stdout} and +@@ -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:: ++* Values From Inferior:: Python representation of 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. ++* Breakpoints In Python:: Manipulating breakpoints using Python. + * Frames In Python:: Acessing inferior stack frames from Python. + @end menu + +@@ -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.breakpoints ++@defun breakpoints ++Return a sequence holding all of @value{GDBN}'s breakpoints. ++@xref{Breakpoints In Python}, for more information. ++@end defun + -+/* 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 -+ }; + @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. ++ + 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 + ++@findex gdb.parse_and_eval ++@defun parse_and_eval expression ++Parse @var{expression} as an expression in the current language, ++evaluate it, and return the result as a @code{gdb.Value}. ++@var{expression} must be a string. ++@end defun + -+/* 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 -+ }; ++@findex gdb.post_event ++@defun post_event event ++Put @var{event}, a callable object taking no arguments, into ++@value{GDBN}'s internal event queue. This callable will be invoked at ++some later point, during @value{GDBN}'s event processing. Events ++posted using @code{post_event} will be run in the order in which they ++were posted; however, there is no way to know when they will be ++processed relative to other events inside @value{GDBN}. + -+/* Declaration of the opaque wchar iterator type. */ -+struct wchar_iterator; ++@value{GDBN} is not thread-safe. If your Python program uses multiple ++threads, you must be careful to only call @value{GDBN}-specific ++functions in the main @value{GDBN} thread. @code{post_event} ensures ++this. ++@end defun + -+/* 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. + @findex gdb.write + @defun write string + Print a string to @value{GDBN}'s paginated standard output stream. +@@ -18812,6 +18876,11 @@ Flush @value{GDBN}'s paginated standard output stream. Flushing + function. + @end defun + ++@findex gdb.solib_address ++@defun solib_address @var{address} ++Return the name of the shared library holding the given address, or None. ++@end defun + -+ 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. + @node Exception Handling + @subsubsection Exception Handling + @cindex python exceptions +@@ -18948,6 +19017,13 @@ The type of this @code{gdb.Value}. The value of this attribute is a + The following methods are provided: + + @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 + -+ A zero result means one of several unusual results. *OUT_RESULT is -+ set to indicate the type of un-ordinary return. + @defmethod Value dereference + 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. + -+ wchar_iterate_invalid means that an invalid input character was -+ seen. The iterator is advanced by WIDTH (the argument to -+ make_wchar_iterator) bytes. + 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 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 + +@@ -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 + -+ 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); ++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. + -+ ++The following inferior-related functions are available in the @code{gdb} ++module: + -+/* GDB needs to know a few details of its execution character set. -+ This knowledge is isolated here and in charset.c. */ ++@defun inferiors ++Return a tuple containing all inferior objects. ++@end defun + -+/* The escape character. */ -+#define HOST_ESCAPE_CHAR 27 ++A @code{gdb.Inferior} object has the following attributes: + -+/* Convert a letter, like 'c', to its corresponding control -+ character. */ -+char host_letter_to_control_character (char c); ++@table @code ++@defivar Inferior num ++ID of inferior, as assigned by GDB. ++@end defivar + -+/* 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 ---- a/gdb/cli/cli-cmds.c -+++ b/gdb/cli/cli-cmds.c -@@ -45,6 +45,8 @@ - #include "cli/cli-setshow.h" - #include "cli/cli-cmds.h" - -+#include "python/python.h" ++@defivar Inferior pid ++Process ID of the inferior, assigned by the underlying OS. ++@end defivar + - #ifdef TUI - #include "tui/tui.h" /* For tui_active et.al. */ - #endif -@@ -178,6 +180,7 @@ struct cmd_list_element *showchecklist; - - /* Command tracing state. */ - -+static int source_python = 0; - int source_verbose = 0; - int trace_commands = 0; - -@@ -439,6 +442,7 @@ source_script (char *file, int from_tty) - struct cleanup *old_cleanups; - char *full_pathname = NULL; - int fd; -+ int is_python; - - if (file == NULL || *file == 0) - { -@@ -471,8 +475,16 @@ source_script (char *file, int from_tty) - } - } - -+ is_python = source_python; -+ if (strlen (file) > 3 && !strcmp (&file[strlen (file) - 3], ".py")) -+ is_python = 1; ++@defivar Inferior was_attached ++Boolean signaling whether the inferior was created using `attach', or ++started by @value{GDBN} itself. ++@end defivar ++@end table + - stream = fdopen (fd, FOPEN_RT); -- script_from_file (stream, file); ++A @code{gdb.Inferior} object has the following methods: + -+ if (is_python) -+ source_python_script (stream, file); -+ else -+ script_from_file (stream, file); - - do_cleanups (old_cleanups); - } -@@ -486,15 +498,30 @@ source_verbose_cleanup (void *old_value) - xfree (old_value); - } - -+/* A helper for source_command. Look for an argument in *ARGS. -+ Update *ARGS by stripping leading whitespace. If an argument is -+ found, return it (a character). Otherwise, return 0. */ -+static int -+find_argument (char **args) -+{ -+ int result = 0; -+ while (isspace ((*args)[0])) -+ ++*args; -+ if ((*args)[0] == '-' && isalpha ((*args)[1])) -+ { -+ result = (*args)[1]; -+ *args += 3; -+ } -+ return result; -+} ++@table @code ++@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 + - static void - source_command (char *args, int from_tty) - { - struct cleanup *old_cleanups; -- char *file = args; -- int *old_source_verbose = xmalloc (sizeof(int)); - -- *old_source_verbose = source_verbose; -- old_cleanups = make_cleanup (source_verbose_cleanup, old_source_verbose); -+ old_cleanups = make_cleanup_restore_integer (&source_verbose); -+ make_cleanup_restore_integer (&source_python); ++@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 ++ ++@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 ++ ++@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 ++ ++@node Threads In Python ++@subsubsection Threads In Python ++ ++Python scripts can access information about and manipulate inferior threads ++controlled by @value{GDBN} via objects of the @code{gdb.InferiorThread} class. ++ ++The following inferior-related functions are available in the @code{gdb} ++module: ++ ++@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 ++ ++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 - /* -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) +@@ -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. - if (args) - { -- /* Make sure leading white space does not break the comparisons. */ -- while (isspace(args[0])) -- args++; -- -- /* Is -v the first thing in the string? */ -- if (args[0] == '-' && args[1] == 'v' && isspace (args[2])) -+ while (1) - { -- source_verbose = 1; -- -- /* Trim -v and whitespace from the filename. */ -- file = &args[3]; -- while (isspace (file[0])) -- file++; -+ int arg = find_argument (&args); -+ if (!arg) -+ break; -+ switch (arg) -+ { -+ case 'v': -+ source_verbose = 1; -+ break; -+ case 'p': -+ source_python = 1; -+ break; -+ default: -+ error (_("unrecognized option -%c"), arg); -+ } - } - } - -- source_script (file, from_tty); -+ source_script (args, from_tty); -+ -+ do_cleanups (old_cleanups); - } - - -@@ -1282,7 +1314,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\ --when GDB is started."), gdbinit); -+when GDB is started.\n\ -+Optional -p switch (before the filename) causes FILE to be evaluated\n\ -+as Python code."), gdbinit); - 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 ---- a/gdb/coffread.c -+++ b/gdb/coffread.c -@@ -346,7 +346,7 @@ coff_alloc_type (int index) - We will fill it in later if we find out how. */ - if (type == NULL) - { -- type = alloc_type (current_objfile); -+ type = alloc_type (current_objfile, NULL); - *type_addr = type; - } - return type; -@@ -2101,6 +2101,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 */ -+ NULL, /* sym_read_psymbols */ - coff_symfile_finish, /* sym_finish: finished with file, cleanup */ - 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 ---- a/gdb/config.in -+++ b/gdb/config.in -@@ -42,6 +42,12 @@ - language is requested. */ - #undef ENABLE_NLS - -+/* Global directory for GDB data files. */ -+#undef GDB_DATADIR -+ -+/* Define if GDB datadir should be relocated when GDB is moved. */ -+#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 ++@node Parameters In Python ++@subsubsection Parameters In Python + - /* 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 ++@cindex parameters in python ++@cindex python parameters ++@tindex gdb.Parameter ++@tindex Parameter ++You can implement new @value{GDBN} parameters using Python. A new ++parameter is implemented as an instance of the @code{gdb.Parameter} ++class. Parameters are exposed to the user via the @code{set} and ++@code{show} commands. + - /* Define if your file defines LC_MESSAGES. */ - #undef HAVE_LC_MESSAGES - -@@ -618,6 +630,9 @@ - 'ptrdiff_t'. */ - #undef PTRDIFF_T_SUFFIX - -+/* Define to install path for Python sources */ -+#undef PYTHONDIR ++@defmethod Parameter __init__ name @var{command-class} @var{parameter-class} @r{[}@var{enum-sequence}@r{]} ++The object initializer for @code{Parameter} registers the new ++parameter with @value{GDBN}. This initializer is normally invoked ++from the subclass' own @code{__init__} method. + - /* Bug reporting address */ - #undef REPORT_BUGS_TO - -diff --git a/gdb/configure b/gdb/configure -index 7579c84..3a5b582 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_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 -+ --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 - - Some influential environment variables: - CC C compiler command -@@ -7130,6 +7134,75 @@ _ACEOF - ;; - esac - -+# GDB's datadir relocation ++@var{name} is the name of the new parameter. If @var{name} consists ++of multiple words, then the initial words are looked for as prefix ++commands. In this case, if one of the prefix commands does not exist, ++an exception is raised. + -+gdbdatadir=${datadir}/gdb ++@var{command-class} should be one of the @samp{COMMAND_} constants ++(@pxref{Commands In Python}). This argument tells @value{GDBN} how to ++categorize the new parameter in the help system. + ++@var{parameter-class} should be one of the @samp{PARAM_} constants ++defined below. This argument tells @value{GDBN} the type of the new ++parameter; this information is used for input validation and ++completion. + -+# Check whether --with-gdb-datadir or --without-gdb-datadir was given. -+if test "${with_gdb_datadir+set}" = set; then -+ withval="$with_gdb_datadir" -+ gdbdatadir="${withval}" -+fi; ++If @var{parameter-class} is @code{PARAM_ENUM}, then ++@var{enum-sequence} must be a sequence of strings. These strings ++represent the possible values for the parameter. + ++If @var{parameter-class} is not @code{PARAM_ENUM}, then the presence ++of a fourth argument will cause an exception to be thrown. + -+ test "x$prefix" = xNONE && prefix="$ac_default_prefix" -+ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -+ ac_define_dir=`eval echo $gdbdatadir` -+ ac_define_dir=`eval echo $ac_define_dir` ++The help text for the new parameter is taken from the Python ++documentation string for the parameter's class, if there is one. If ++there is no documentation string, a default value is used. ++@end defmethod + -+cat >>confdefs.h <<_ACEOF -+#define GDB_DATADIR "$ac_define_dir" -+_ACEOF ++@defivar Parameter set_doc ++If this attribute exists, and is a string, then its value is used as ++the help text for this parameter's @code{set} command. The value is ++examined when @code{Parameter.__init__} is invoked; subsequent changes ++have no effect. ++@end defivar + ++@defivar Parameter show_doc ++If this attribute exists, and is a string, then its value is used as ++the help text for this parameter's @code{show} command. The value is ++examined when @code{Parameter.__init__} is invoked; subsequent changes ++have no effect. ++@end defivar + ++@defivar Parameter value ++The @code{value} attribute holds the underlying value of the ++parameter. It can be read and assigned to just as any other ++attribute. @value{GDBN} does validation when assignments are made. ++@end defivar + -+if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then -+ if test "x$prefix" = xNONE; then -+ test_prefix=/usr/local -+ else -+ test_prefix=$prefix -+ fi -+else -+ test_prefix=$exec_prefix -+fi + -+case ${gdbdatadir} in -+ "${test_prefix}"|"${test_prefix}/"*|\ -+ '${exec_prefix}'|'${exec_prefix}/'*) ++When a new parameter is defined, its type must be specified. The ++available types are represented by constants defined in the @code{gdb} ++module: + -+cat >>confdefs.h <<\_ACEOF -+#define GDB_DATADIR_RELOCATABLE 1 -+_ACEOF ++@table @code ++@findex PARAM_BOOLEAN ++@findex gdb.PARAM_BOOLEAN ++@item PARAM_BOOLEAN ++The value is a plain boolean. The Python boolean values, @code{True} ++and @code{False} are the only valid values. + -+ ;; -+esac -+GDB_DATADIR_PATH=${gdbdatadir} ++@findex PARAM_AUTO_BOOLEAN ++@findex gdb.PARAM_AUTO_BOOLEAN ++@item PARAM_AUTO_BOOLEAN ++The value has three possible states: true, false, and @samp{auto}. In ++Python, true and false are represented using boolean constants, and ++@samp{auto} is represented using @code{None}. + ++@findex PARAM_UINTEGER ++@findex gdb.PARAM_UINTEGER ++@item PARAM_UINTEGER ++The value is an unsigned integer. The value of 0 should be ++interpreted to mean ``unlimited''. + ++@findex PARAM_INTEGER ++@findex gdb.PARAM_INTEGER ++@item PARAM_INTEGER ++The value is a signed integer. The value of 0 should be interpreted ++to mean ``unlimited''. + -+# Check whether --with-pythondir or --without-pythondir was given. -+if test "${with_pythondir+set}" = set; then -+ withval="$with_pythondir" -+ pythondir="${withval}" -+else -+ pythondir=no -+fi; ++@findex PARAM_STRING ++@findex gdb.PARAM_STRING ++@item PARAM_STRING ++The value is a string. When the user modifies the string, escapes are ++translated. + -+# If the user passed in a path, define it. Otherwise, compute it at -+# runtime based on the possibly-relocatable datadir. -+if test "$pythondir" = "no"; then -+ pythondir='$(GDB_DATADIR_PATH)/python' -+else ++@findex PARAM_STRING_NOESCAPE ++@findex gdb.PARAM_STRING_NOESCAPE ++@item PARAM_STRING_NOESCAPE ++The value is a string. When the user modifies the string, escapes are ++passed through untranslated. + -+cat >>confdefs.h <<_ACEOF -+#define PYTHONDIR "$pythondir" -+_ACEOF ++@findex PARAM_OPTIONAL_FILENAME ++@findex gdb.PARAM_OPTIONAL_FILENAME ++@item PARAM_OPTIONAL_FILENAME ++The value is a either a filename (a string), or @code{None}. + -+fi ++@findex PARAM_FILENAME ++@findex gdb.PARAM_FILENAME ++@item PARAM_FILENAME ++The value is a filename (a string). + ++@findex PARAM_ZINTEGER ++@findex gdb.PARAM_ZINTEGER ++@item PARAM_ZINTEGER ++The value is an integer. This is like @code{PARAM_INTEGER}, except 0 ++is interpreted as itself. + ++@findex PARAM_ENUM ++@findex gdb.PARAM_ENUM ++@item PARAM_ENUM ++The value is a string, which must be one of a collection string ++constants provided when the parameter is created. ++@end table + + @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 - subdirs="$subdirs doc testsuite" -@@ -9989,6 +10062,226 @@ if test "$ac_cv_search_dlgetmodinfo" != no; then - fi - - -+ ++@node Breakpoints In Python ++@subsubsection Manipulating breakpoints using Python + ++@cindex breakpoints in python ++@cindex python breakpoints ++@tindex gdb.Breakpoint ++@tindex Breakpoint ++Python code can manipulate breakpoints via the @code{gdb.Breakpoint} ++class. + -+# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. -+if test "${with_libiconv_prefix+set}" = set; then -+ withval="$with_libiconv_prefix" ++@defmethod Breakpoint __init__ location ++Create a new breakpoint. @var{location} is a string naming the ++location of the breakpoint. The contents can be any location ++recognized by the @code{break} command. ++@end defmethod + -+ 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 ++@defmethod Breakpoint is_valid ++Return @code{True} if this @code{Breakpoint} object is valid, ++@code{False} otherwise. A @code{Breakpoint} object can become invalid ++if the user deletes the breakpoint. In this case, the object still ++exists, but the underlying breakpoint does not. ++@end defmethod + -+fi; ++@defivar Breakpoint enabled ++This attribute is @code{True} if the breakpoint is enabled, and ++@code{False} otherwise. This attribute is writable. ++@end defivar + -+ 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 ++@defivar Breakpoint silent ++This attribute is @code{True} if the breakpoint is silent, and ++@code{False} otherwise. This attribute is writable. + -+ 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 ++Note that a breakpoint can also be silent if it has commands and the ++first command is @code{silent}. This is not reported by the ++@code{silent} attribute. ++@end defivar + -+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 ++@defivar Breakpoint thread ++If the breakpoint is thread-specific, this attribute holds the thread ++id. If the breakpoint is not thread-specific, this attribute is ++@code{None}. This attribute is writable. ++@end defivar + -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+ LIBS="$am_save_LIBS" -+ fi ++@defivar Breakpoint ignore_count ++This attribute holds the ignore count for the breakpoint, an integer. ++This attribute is writable. ++@end defivar + -+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 ++@defivar Breakpoint number ++This attribute holds the breakpoint's number -- the identifier used by ++the user to manipulate the breakpoint. This attribute is not writable. ++@end defivar + -+cat >>confdefs.h <<\_ACEOF -+#define HAVE_ICONV 1 -+_ACEOF ++@defivar Breakpoint hit_count ++This attribute holds the hit count for the breakpoint, an integer. ++This attribute is writable, but currently it can only be set to zero. ++@end defivar + -+ 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 ++@defivar Breakpoint location ++This attribute holds the location of the breakpoint, as specified by ++the user. It is a string. This attribute is not writable. ++@end defivar + -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ ++@defivar Breakpoint condition ++This attribute holds the condition of the breakpoint, as specified by ++the user. It is a string. If there is no condition, this attribute's ++value is @code{None}. This attribute is writable. ++@end defivar + -+#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 ++@defivar Breakpoint commands ++This attribute holds the commands attached to the breakpoint. If ++there are commands, this returns a string holding all the commands, ++separated by newlines. If there are no commands, this attribute is ++@code{None}. This attribute is not writable. ++@end defivar + -+int -+main () -+{ + @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 (@pxref{Block,,Code Blocks and Scopes}). ++@end defmethod + -+ ; -+ 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 ++@defmethod Frame function ++Returns the symbol for the function corresponding to this frame. @c (@pxref{Symbols In Python}). ++@end defmethod + -+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 + @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 (@pxref{Symtab_and_line,, Symtab and line}). ++@end defmethod + -+ 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 + @defmethod Frame read_var variable + Return the value of the given variable in this frame. @var{variable} must + be a string. + @end defmethod + -+cat >>confdefs.h <<_ACEOF -+#define ICONV_CONST $am_cv_proto_iconv_arg1 -+_ACEOF ++@defmethod Frame select ++Set this frame to be the user's selected frame. ++@end defmethod + @end table + + @node Interpreters +@@ -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 + -+ fi -+ LIBICONV= -+ if test "$am_cv_lib_iconv" = yes; then -+ LIBICONV="-liconv" -+ fi ++@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} + +@@ -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. + ++@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: + + @table @var +@@ -23449,6 +23898,10 @@ Otherwise this result is not present. + + @item frozen + If the variable object is frozen, this variable will be present with a value of 1. + - # 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 - CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" - CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)" - CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)" -+ CONFIG_INSTALL="$CONFIG_INSTALL install-python" -+ CONFIG_UNINSTALL="$CONFIG_UNINSTALL uninstall-python" - ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" ++@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 - # Flags needed to compile Python code (taken from python-config --cflags). -@@ -15445,10 +15740,11 @@ fi + @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 c620067..6c4faf1 100644 +--- a/gdb/dwarf2-frame.c ++++ b/gdb/dwarf2-frame.c +@@ -38,6 +38,7 @@ + + #include "complaints.h" + #include "dwarf2-frame.h" ++#include "addrmap.h" + struct comp_unit; +@@ -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")); ++} + - 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 ++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); -+ 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 () +- 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) +{ -+char* cs = nl_langinfo(CODESET); -+ ; -+ return 0; ++ if (! frame_base_is (this_frame, &dwarf2_frame_base)) ++ error (_("can't compute CFA for this frame")); ++ return get_frame_base_address (this_frame); +} -+_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 + + 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; + ++ if (objfile->quick_addrmap) ++ { ++ if (!addrmap_find (objfile->quick_addrmap, *pc)) ++ continue; ++ } ++ /* FIXME: Read-in only .debug_frame/.eh_frame without .debug_info? */ ++ require_partial_symbols (objfile); + -+am_cv_langinfo_codeset=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext + 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. */ + -+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 ++CORE_ADDR dwarf2_frame_cfa (struct frame_info *this_frame); + -+cat >>confdefs.h <<\_ACEOF -+#define HAVE_LANGINFO_CODESET 1 -+_ACEOF + #endif /* dwarf2-frame.h */ +diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c +index 8dbf976..aec7b92 100644 +--- a/gdb/dwarf2expr.c ++++ b/gdb/dwarf2expr.c +@@ -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) + } + } + + -+ fi ++/* 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); ++} + - # 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 + /* 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; - - cat >>confdefs.h <<\_ACEOF --#define GDB_DEFAULT_HOST_CHARSET "ISO-8859-1" -+#define GDB_DEFAULT_HOST_CHARSET "UTF-8" - _ACEOF ++ 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"); -- -- -- --# 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 - s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;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 ---- 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 + result = reg; +- ctx->in_reg = 1; ++ ctx->location = DWARF_VALUE_REGISTER; + break; -+# GDB's datadir relocation -+ -+gdbdatadir=${datadir}/gdb ++ 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; + -+AC_ARG_WITH([gdb-datadir], -+ [AS_HELP_STRING([--with-gdb-datadir], -+ [look for global separate data files in this path [DATADIR/gdb]])], [gdbdatadir="${withval}"]) -+ -+AC_DEFINE_DIR(GDB_DATADIR, gdbdatadir, -+ [Global directory for GDB data files. ]) -+ -+if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then -+ if test "x$prefix" = xNONE; then -+ test_prefix=/usr/local -+ else -+ test_prefix=$prefix -+ fi -+else -+ test_prefix=$exec_prefix -+fi -+ -+case ${gdbdatadir} in -+ "${test_prefix}"|"${test_prefix}/"*|\ -+ '${exec_prefix}'|'${exec_prefix}/'*) -+ AC_DEFINE(GDB_DATADIR_RELOCATABLE, 1, [Define if GDB datadir should be relocated when GDB is moved.]) -+ ;; -+esac -+GDB_DATADIR_PATH=${gdbdatadir} -+AC_SUBST(GDB_DATADIR_PATH) -+ -+AC_ARG_WITH([pythondir], -+ [AS_HELP_STRING([--with-pythondir], -+ [install Python data files in this path [DATADIR/gdb/python]])], [pythondir="${withval}"], [pythondir=no]) -+ -+# If the user passed in a path, define it. Otherwise, compute it at -+# runtime based on the possibly-relocatable datadir. -+if test "$pythondir" = "no"; then -+ pythondir='$(GDB_DATADIR_PATH)/python' -+else -+ AC_DEFINE_UNQUOTED(PYTHONDIR, "$pythondir", -+ [Define to install path for Python sources]) -+fi -+AC_SUBST(pythondir) -+ -+ - AC_CONFIG_SUBDIRS(doc testsuite) + 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; - # 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]) +@@ -755,6 +796,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, + ctx->initialized = 0; + goto no_push; -+AM_ICONV ++ case DW_OP_push_object_address: ++ if (ctx->get_object_address == NULL) ++ error (_("DWARF-2 expression error: DW_OP_push_object_address must " ++ "have a value to push.")); ++ result = (ctx->get_object_address) (ctx->baton); ++ break; + - # 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 - CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" - CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)" - CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)" -+ CONFIG_INSTALL="$CONFIG_INSTALL install-python" -+ CONFIG_UNINSTALL="$CONFIG_UNINSTALL uninstall-python" - 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 ---- a/gdb/cp-name-parser.y -+++ b/gdb/cp-name-parser.y -@@ -1,7 +1,6 @@ - /* YACC parser for C++ names, for GDB. - -- Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 -- Free Software Foundation, Inc. -+ Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. - - 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); } - ; -diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c -index c6c5617..eace9c4 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); -- - static struct using_direct *cp_copy_usings (struct using_direct *using, - struct obstack *obstack); + default: + error (_("Unhandled dwarf expression opcode 0x%x"), op); + } +diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h +index 7047922..232208d 100644 +--- a/gdb/dwarf2expr.h ++++ b/gdb/dwarf2expr.h +@@ -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); --static 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); -- - static struct symbol *lookup_symbol_file (const char *name, - const char *linkage_name, - const struct block *block, -@@ -78,31 +65,6 @@ static struct symbol *lookup_possible_namespace_symbol (const char *name); ++ /* 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); ++#endif - static void maintenance_cplus_namespace (char *args, int from_tty); + /* Return the `object address' for DW_OP_push_object_address. */ + CORE_ADDR (*get_object_address) (void *baton); +-#endif --/* 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; -- } --} + /* 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; - - /* 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 - 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); - } - /* The "+ 2" is for the "::". */ - previous_component = next_component + 2; -@@ -154,32 +119,27 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) - } - } +- /* 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; --/* 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. */ + /* The length of the piece, in bytes. */ + ULONGEST size; +diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c +index 071b5ac..07bb8ba 100644 +--- a/gdb/dwarf2loc.c ++++ b/gdb/dwarf2loc.c +@@ -36,6 +36,7 @@ + #include "dwarf2.h" + #include "dwarf2expr.h" + #include "dwarf2loc.h" ++#include "dwarf2-frame.h" - 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) + #include "gdb_string.h" + #include "gdb_assert.h" +@@ -115,6 +116,9 @@ struct dwarf_expr_baton { - struct using_direct *current; - struct using_direct *new; - - /* Has it already been added? */ + struct frame_info *frame; + struct objfile *objfile; ++ /* From DW_TAG_variable's DW_AT_location (not DW_TAG_type's ++ DW_AT_data_location) for DW_OP_push_object_address. */ ++ CORE_ADDR object_address; + }; -- for (current = using_list; current != NULL; current = current->next) -+ for (current = using_directives; current != NULL; current = current->next) + /* Helper functions for dwarf2_evaluate_loc_desc. */ +@@ -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_COMPUTED_OPS (framefunc) == &dwarf2_locexpr_funcs) { -- 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) - return; + struct dwarf2_locexpr_baton *symbaton; ++ + symbaton = SYMBOL_LOCATION_BATON (framefunc); +- if (symbaton != NULL) +- { +- *length = symbaton->size; +- *start = symbaton->data; +- } +- else +- *start = NULL; ++ gdb_assert (symbaton != NULL); ++ *start = symbaton->data; ++ *length = symbaton->size; ++ } ++ else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_missing_funcs) ++ { ++ struct dwarf2_locexpr_baton *symbaton; ++ ++ symbaton = SYMBOL_LOCATION_BATON (framefunc); ++ gdb_assert (symbaton == NULL); ++ *start = NULL; ++ *length = 0; /* unused */ } ++ else ++ internal_error (__FILE__, __LINE__, ++ _("Unsupported SYMBOL_COMPUTED_OPS %p for \"%s\""), ++ SYMBOL_COMPUTED_OPS (framefunc), ++ SYMBOL_PRINT_NAME (framefunc)); -- 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); + 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); } - /* Record the namespace that the function defined by SYMBOL was -@@ -230,26 +190,31 @@ cp_is_anonymous (const char *namespace) - != NULL); + /* Using the objfile specified in BATON, find the address for the +@@ -204,6 +226,118 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) + return target_translate_tls_address (debaton->objfile, offset); } --/* 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 -+ 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, -+ const char *alias, -+ const char *declaration, -+ const int line_number, - struct using_direct *next) - { - 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->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), - 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->alias); -+ xfree (using->declaration); - xfree (using); - - return retval; -@@ -299,8 +270,14 @@ cp_lookup_symbol_nonlocal (const char *name, - const struct block *block, - const domain_enum domain) - { -- return lookup_namespace_scope (name, linkage_name, block, domain, -- block_scope (block), 0); ++static CORE_ADDR ++dwarf_expr_object_address (void *baton) ++{ ++ struct dwarf_expr_baton *debaton = baton; + -+ struct symbol* sym = lookup_namespace_scope(name, linkage_name, block, -+ domain, block_scope(block), 0); ++ /* The message is suppressed in DWARF_BLOCK_EXEC. */ ++ if (debaton->object_address == 0) ++ error (_("Cannot resolve DW_OP_push_object_address for a missing object")); + -+ if (sym != NULL) -+ return sym; ++ return debaton->object_address; ++} + -+ return lookup_symbol_file(name, linkage_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, - "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 struct block *block, -@@ -354,10 +331,43 @@ 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); - } - -+/* Searches the for the given NAME in the given NAMESPACE, using import -+ statements implied by the given BLOCK, *and its' parents*. */ -+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) ++/* Address of the variable we are currently referring to. It is set from ++ DW_TAG_variable's DW_AT_location (not DW_TAG_type's DW_AT_data_location) for ++ DW_OP_push_object_address. */ ++ ++static CORE_ADDR object_address; ++ ++/* Callers use object_address_set while their callers use the result set so we ++ cannot run the cleanup at the local block of our direct caller. Still we ++ should reset OBJECT_ADDRESS at least for the next GDB command. */ ++ ++static void ++object_address_cleanup (void *prev_save_voidp) +{ -+ struct symbol *sym; -+ const struct block *global_block = block_global_block (block); ++ CORE_ADDR *prev_save = prev_save_voidp; + -+ /* Check if either no block is specified or it's a global block. */ ++ object_address = *prev_save; ++ xfree (prev_save); ++} + -+ if (global_block == NULL) -+ return NULL; ++/* Set the base address - DW_AT_location - of a variable. It is being later ++ used to derive other object addresses by DW_OP_push_object_address. + -+ while (block != global_block) -+ { -+ sym = cp_lookup_symbol_namespace (namespace, name, linkage_name, block, domain); ++ It would be useful to sanity check ADDRESS - such as for some objects with ++ unset value_raw_address - but some valid addresses may be zero (such as first ++ objects in relocatable .o files). */ + -+ if (sym != NULL) -+ return sym; ++void ++object_address_set (CORE_ADDR address) ++{ ++ CORE_ADDR *prev_save; + -+ block = BLOCK_SUPERBLOCK (block); -+ } ++ prev_save = xmalloc (sizeof *prev_save); ++ *prev_save = object_address; ++ make_cleanup (object_address_cleanup, prev_save); + -+ /* We've reached the global block without finding a result. */ ++ object_address = address; ++} + -+ return NULL; ++/* Evaluate DWARF expression at DATA ... DATA + SIZE with its result readable ++ by dwarf_expr_fetch (RETVAL, 0). FRAME parameter can be NULL to call ++ get_selected_frame to find it. Returned dwarf_expr_context freeing is ++ pushed on the cleanup chain. */ ++ ++static struct dwarf_expr_context * ++dwarf_expr_prep_ctx (struct frame_info *frame, gdb_byte *data, ++ unsigned short size, struct dwarf2_per_cu_data *per_cu) ++{ ++ struct dwarf_expr_context *ctx; ++ struct dwarf_expr_baton baton; ++ ++ if (!frame) ++ frame = get_selected_frame (NULL); ++ ++ baton.frame = frame; ++ baton.objfile = dwarf2_per_cu_objfile (per_cu); ++ baton.object_address = object_address; ++ ++ ctx = new_dwarf_expr_context (); ++ ctx->gdbarch = get_objfile_arch (baton.objfile); ++ ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); ++ ctx->baton = &baton; ++ 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; ++ ++ make_cleanup ((make_cleanup_ftype *) free_dwarf_expr_context, ctx); ++ ++ dwarf_expr_eval (ctx, data, size); ++ ++ /* It was used only during dwarf_expr_eval. */ ++ ctx->baton = NULL; ++ ++ return ctx; +} + ++/* Evaluate DWARF expression at DLBATON expecting it produces exactly one ++ CORE_ADDR result on the DWARF stack stack. */ + - /* 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) ++CORE_ADDR ++dwarf_locexpr_baton_eval (struct dwarf2_locexpr_baton *dlbaton) ++{ ++ struct dwarf_expr_context *ctx; ++ CORE_ADDR retval; ++ struct cleanup *back_to = make_cleanup (null_cleanup, 0); ++ ++ ctx = dwarf_expr_prep_ctx (NULL, dlbaton->data, dlbaton->size, ++ dlbaton->per_cu); ++ if (ctx->num_pieces > 0) ++ error (_("DW_OP_*piece is unsupported for DW_FORM_block")); ++ ++ retval = dwarf_expr_fetch (ctx, 0); ++ ++ do_cleanups (back_to); ++ ++ return retval; ++} ++ + /* Evaluate a location description, starting at DATA and with length + SIZE, to find the current location of variable VAR in the context + of FRAME. */ +@@ -213,8 +347,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, + struct dwarf2_per_cu_data *per_cu) { - const struct using_direct *current; -- struct symbol *sym; -+ struct symbol *sym = NULL; + struct value *retval; +- struct dwarf_expr_baton baton; + struct dwarf_expr_context *ctx; ++ struct cleanup *back_to = make_cleanup (null_cleanup, 0); - /* 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, - current != NULL; - current = current->next) + if (size == 0) { -- if (strcmp (namespace, current->outer) == 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) - { -- sym = cp_lookup_symbol_namespace (current->inner, -- name, -- linkage_name, -- block, -- domain); -- if (sym != NULL) -+ -+ /* 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 -+ 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); -+ } -+ -+ } -+ else 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, -+ block, -+ domain); -+ }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, -+ name, -+ linkage_name, -+ block, -+ domain); -+ } -+ -+ if (sym != NULL){ - return sym; -+ } - } +@@ -224,19 +358,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, + return retval; } -@@ -398,8 +443,10 @@ cp_lookup_symbol_namespace (const char *namespace, - - if (namespace[0] == '\0') +- baton.frame = frame; +- baton.objfile = dwarf2_per_cu_objfile (per_cu); ++ ctx = dwarf_expr_prep_ctx (frame, data, size, per_cu); + +- ctx = new_dwarf_expr_context (); +- ctx->gdbarch = get_objfile_arch (baton.objfile); +- ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); +- ctx->baton = &baton; +- ctx->read_reg = dwarf_expr_read_reg; +- ctx->read_mem = dwarf_expr_read_mem; +- ctx->get_frame_base = dwarf_expr_frame_base; +- ctx->get_tls_address = dwarf_expr_tls_address; +- +- dwarf_expr_eval (ctx, data, size); + if (ctx->num_pieces > 0) { -- return lookup_symbol_file (name, linkage_name, block, -- domain, 0); -+ sym = lookup_symbol_file (name, linkage_name, -+ block, domain, -+ cp_is_anonymous (namespace)); -+ return sym; + int i; +@@ -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; ++ ++ 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 { -diff --git a/gdb/cp-support.c b/gdb/cp-support.c -index bf42636..9f04c86 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, - return ret; - } +- 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")); ++ } + } --/* Return the name of the class containing method PHYSNAME. */ -+/* Return the name of the class or namespace containing -+ function, method, or variable PHYSNAME. */ + set_value_initialized (retval, ctx->initialized); - char * - cp_class_name_from_physname (const char *physname) -diff --git a/gdb/cp-support.h b/gdb/cp-support.h -index 837ca6c..23f8d5b 100644 ---- a/gdb/cp-support.h -+++ b/gdb/cp-support.h -@@ -38,14 +38,28 @@ struct demangle_component; +- free_dwarf_expr_context (ctx); ++ do_cleanups (back_to); - /* 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: -+ namespace C=A::B; -+ ALIAS = "C" -+ DECLARATION is the name of the imported declaration, if this import -+ statement represents one. Eg: -+ using A::x; -+ Where x is variable in namespace A. declaration is set to x. -+*/ + return retval; + } +@@ -327,6 +529,15 @@ needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length) + nf_baton->needs_frame = 1; + } - struct using_direct - { - char *inner; - char *outer; -+ -+ char *alias; -+ -+ char *declaration; -+ -+ int line_number; -+ - struct using_direct *next; - }; ++/* 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; -@@ -54,6 +68,7 @@ struct using_direct + dwarf_expr_eval (ctx, data, size); - extern char *cp_canonicalize_string (const char *string); +- in_reg = ctx->in_reg; ++ in_reg = ctx->location == DWARF_VALUE_REGISTER; -+ - extern char *cp_class_name_from_physname (const char *physname); + 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; + } - extern char *method_name_from_physname (const char *physname); -@@ -76,9 +91,18 @@ extern struct type *cp_lookup_rtti_type (const char *name, +@@ -601,7 +813,7 @@ static int + loclist_describe_location (struct symbol *symbol, struct ui_file *stream) + { + /* FIXME: Could print the entire list of locations. */ +- fprintf_filtered (stream, "a variable with multiple locations"); ++ fprintf_filtered (stream, _("a variable with multiple locations")); + return 1; + } - extern int cp_is_anonymous (const char *namespace); +@@ -617,16 +829,56 @@ loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, --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, -+ const char *alias, -+ const char *declaration, -+ const int line_number); -+ -+extern struct using_direct *cp_add_using (const char *outer, -+ const char *inner, -+ const char *alias, -+ const char *declaration, -+ const int line_number, -+ struct using_direct *next); + 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)); - extern void cp_initialize_namespace (void); + dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size); + } -@@ -98,6 +122,19 @@ extern struct symbol *cp_lookup_symbol_nonlocal (const char *name, - const struct block *block, - const domain_enum domain); +-/* 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_computed_ops dwarf2_loclist_funcs = { + loclist_read_variable, + loclist_read_needs_frame, + loclist_describe_location, + loclist_tracepoint_var_ref + }; ++ ++static struct value * ++missing_read_variable (struct symbol *symbol, struct frame_info *frame) ++{ ++ struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); ++ ++ gdb_assert (dlbaton == NULL); ++ error (_("Unable to resolve variable \"%s\""), SYMBOL_PRINT_NAME (symbol)); ++} ++ ++static int ++missing_read_needs_frame (struct symbol *symbol) ++{ ++ return 0; ++} ++ ++static int ++missing_describe_location (struct symbol *symbol, struct ui_file *stream) ++{ ++ fprintf_filtered (stream, _("a variable we are unable to resolve")); ++ return 1; ++} ++ ++static void ++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); ++ ++ gdb_assert (dlbaton == NULL); ++ error (_("Unable to resolve variable \"%s\""), SYMBOL_PRINT_NAME (symbol)); ++} ++ ++/* The set of location functions used with the DWARF-2 evaluator when we are ++ unable to resolve the symbols. */ ++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 0bfcfca..01018d6 100644 +--- a/gdb/dwarf2loc.h ++++ b/gdb/dwarf2loc.h +@@ -71,5 +71,11 @@ struct dwarf2_loclist_baton -+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); + 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 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); ++extern void object_address_set (CORE_ADDR address); + - 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" ++extern CORE_ADDR dwarf_locexpr_baton_eval ++ (struct dwarf2_locexpr_baton *dlbaton); - /* 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); + #endif /* dwarf2loc.h */ +diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c +index 445bab8..be2dc2a 100644 +--- a/gdb/dwarf2read.c ++++ b/gdb/dwarf2read.c +@@ -1,8 +1,7 @@ + /* DWARF 2 debugging format support for GDB. - 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; + Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +- 2004, 2005, 2006, 2007, 2008, 2009 +- Free Software Foundation, Inc. ++ 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - first_dont_print -@@ -470,7 +487,7 @@ cp_print_static_field (struct type *type, + Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, + Inc. with support from Florida State University (under contract +@@ -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 "vec.h" - 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, - } - } + #include + #include "gdb_string.h" +@@ -93,7 +97,7 @@ typedef struct pubnames_header + _PUBNAMES_HEADER; + #define _ACTUAL_PUBNAMES_HEADER_SIZE 13 -- 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); - } +-/* .debug_pubnames header ++/* .debug_aranges header + 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 +@@ -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 *); + }; -diff --git a/gdb/dbxread.c b/gdb/dbxread.c -index 115bdef..23ea50c 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. */ + struct dwarf2_per_objfile +@@ -474,8 +481,8 @@ struct partial_die_info + /* DWARF-2 tag for this DIE. */ + ENUM_BITFIELD(dwarf_tag) tag : 16; -+ 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; -+ } +- /* Language code associated with this DIE. This is only used +- for the compilation unit DIE. */ ++ /* 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. */ +@@ -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 +- sometimes DW_TAG_MIPS_linkage_name or a string computed in some +- other fashion. */ ++ sometimes a default name for unnamed DIEs. */ + char *name; + char *dirname; + +@@ -691,6 +697,11 @@ struct field_info + int nfnfields; + }; + ++/* 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; + - /* 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 = - 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 */ -+ NULL, /* sym_read_psymbols */ - 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; + /* 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 *); -+/* GDB datadir, used to store data files. */ -+extern char *gdb_datadir; +-static int pdi_needs_namespace (enum dwarf_tag tag); ++static gdb_byte *read_comp_unit_head (struct comp_unit_head *, gdb_byte *, ++ bfd *); + - /* Search path for separate debug files. */ - extern char *debug_file_directory; ++static int die_needs_namespace (struct die_info *, struct dwarf2_cu *); -@@ -366,6 +369,9 @@ extern struct cleanup *make_cleanup_fclose (FILE *file); + static void add_partial_namespace (struct partial_die_info *pdi, + CORE_ADDR *lowpc, CORE_ADDR *highpc, +@@ -827,6 +841,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *); - extern struct cleanup *make_cleanup_bfd_close (bfd *abfd); + static void psymtab_to_symtab_1 (struct partial_symtab *); -+struct obstack; -+extern struct cleanup *make_cleanup_obstack_free (struct obstack *obstack); ++static void dwarf2_read_section_1 (struct objfile *objfile, ++ struct obstack *obstack, ++ struct dwarf2_section_info *info); + - extern struct cleanup *make_cleanup_restore_integer (int *variable); + static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu); - 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 ---- 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. - @itemx -x @var{file} - @cindex @code{--command} - @cindex @code{-x} --Execute @value{GDBN} commands from file @var{file}. @xref{Command --Files,, Command files}. -+Execute commands from file @var{file}. If @var{file} ends in -+@samp{.py}, then the file is evaluated as Python code. If Python -+support is not enabled in this @value{GDBN}, then an error occurs. -+@xref{Command Files,, Command files}. + static void dwarf2_free_abbrev_table (void *); +@@ -947,8 +965,13 @@ static struct type *tag_type_to_type (struct die_info *, struct dwarf2_cu *); - @item -eval-command @var{command} - @itemx -ex @var{command} -@@ -1148,6 +1150,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. + static struct type *read_type_die (struct die_info *, struct dwarf2_cu *); -+@item -P -+@cindex @code{-P} -+@itemx --python -+@cindex @code{--python} -+Change interpretation of command line so that the argument immediately -+following this switch is taken to be the name of a Python script file. -+This option stops option processing; subsequent options are passed to -+Python as @code{sys.argv}. This option is only available if Python -+scripting support was enabled when @value{GDBN} was configured. ++static void physname_prefix_1 (struct ui_file *, struct die_info *, ++ struct dwarf2_cu *); + - @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. + static char *determine_prefix (struct die_info *die, struct dwarf2_cu *); -+@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 ++static char *physname_prefix (struct die_info *die, struct dwarf2_cu *); + -+Here is an example of catching a system call by name: + 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 *, +- CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *); ++ CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *, ++ struct partial_symtab *pst); + + static void get_scope_pc_bounds (struct die_info *, + CORE_ADDR *, CORE_ADDR *, +@@ -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 *); + ++static void read_import_statement (struct die_info *die, struct dwarf2_cu *); + -+@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. + static void read_module (struct die_info *die, struct dwarf2_cu *cu); -+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 + static void read_import_statement (struct die_info *die, struct dwarf2_cu *); +@@ -1078,7 +1101,14 @@ static int is_ref_attr (struct attribute *); --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 + static unsigned int dwarf2_get_ref_die_offset (struct attribute *); + +-static int dwarf2_get_attr_constant_value (struct attribute *, int); ++enum get_attr_constant_value ++ { ++ dwarf2_attr_unknown, ++ dwarf2_attr_const, ++ dwarf2_attr_block ++ }; ++static enum get_attr_constant_value get_attr_constant_value ++ (struct attribute *attr, int *val_return); - 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. + 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); -+@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 + static void free_one_cached_comp_unit (void *); + ++static void fetch_die_type_attrs (struct die_info *die, struct type *type, ++ struct dwarf2_cu *cu); + - @node Registers - @section Registers + static struct type *set_die_type (struct die_info *, struct type *, + struct dwarf2_cu *); -@@ -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. +@@ -1169,22 +1202,31 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *); - @end table + static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu); --@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: ++static void destroy_section (struct dwarf2_section_info *info); + -+@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 ++static struct dwarf2_locexpr_baton *dwarf2_attr_to_locexpr_baton ++ (struct attribute *attr, struct dwarf2_cu *cu); + - @node Calling - @section Calling Program Functions - -@@ -17815,7 +17971,7 @@ command: - @table @code - @kindex source - @cindex execute commands from a file --@item source [@code{-v}] @var{filename} -+@item source [@code{-v}] [@code{-p}] @var{filename} - Execute the command file @var{filename}. - @end table + /* Try to locate the sections we need for DWARF 2 debugging + information and return true if we have enough to do something. */ -@@ -17832,6 +17988,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. + int + dwarf2_has_info (struct objfile *objfile) + { +- struct dwarf2_per_objfile *data; +- +- /* 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); +- dwarf2_per_objfile = data; ++ 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; -+If @var{filename} ends in @samp{.py}, or if @code{-p}, for Python, is -+given then @value{GDBN} evaluates the contents of the file as Python -+code. If Python support is not compiled in to @value{GDBN}, then an -+error occurs. -+ - 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: +- bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, 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); + } - @smallexample - (@value{GDBP}) python --Type python script --End with a line saying just "end". - >print 23 - >end - 23 -@@ -18107,6 +18266,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. -+ -+@kindex maint set python auto-load -+@item maint set python auto-load -+By default, @value{GDBN} will attempt to automatically load Python -+code when an object file is opened. This can be controlled using -+@code{maint set python auto-load}: if @code{on}, the default, then -+Python auto-loading is enabled; if @code{off}, then Python -+auto-loading is disabled. - @end table + /* When loading sections, we can either look for ".", or for +@@ -1277,10 +1319,13 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) + } - @node Python API -@@ -18114,6 +18281,14 @@ disabled. - @cindex python api - @cindex programming in python + /* 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. */ -+You can get quick online help for @value{GDBN}'s Python API by issuing -+the command @w{@kbd{python help (gdb)}}. -+ -+Functions and methods which have two or more optional arguments allow -+them to be specified using keyword syntax. This allows passing some -+optional arguments while skipping others. Example: -+@w{@code{gdb.some_function ('foo', bar = 1, baz = 2)}}. -+ - @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 - * Basic Python:: Basic Python Functions. - * Exception Handling:: --* 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. -+* 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. -+* Breakpoints In Python:: Manipulating breakpoints using Python. -+* Frames In Python:: Acessing inferior stack frames from Python. - @end menu + 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; +@@ -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; - @node Basic Python -@@ -18152,10 +18336,30 @@ 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 + 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) + { +@@ -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); --@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 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. ++ if (old) ++ discard_cleanups (old); + do_cleanups (cleanup); + *outbuf = uncompressed_buffer; + *outsize = uncompressed_size; + #endif + } -@@ -18179,6 +18383,28 @@ If no exception is raised, the return value is always an instance of - @code{gdb.Value} (@pxref{Values From Inferior}). - @end defun +-/* 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. */ -+@findex gdb.parse_and_eval -+@defun parse_and_eval expression -+Parse @var{expression} as an expression in the current language, -+evaluate it, and return the result as a @code{gdb.Value}. -+@var{expression} must be a string. -+@end defun + static void +-dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) ++destroy_section_cleanup (void *arg) ++{ ++ destroy_section (arg); ++} + -+@findex gdb.post_event -+@defun post_event event -+Put @var{event}, a callable object taking no arguments, into -+@value{GDBN}'s internal event queue. This callable will be invoked at -+some later point, during @value{GDBN}'s event processing. Events -+posted using @code{post_event} will be run in the order in which they -+were posted; however, there is no way to know when they will be -+processed relative to other events inside @value{GDBN}. ++/* Read the .debug_aranges section and construct an address map. */ + -+@value{GDBN} is not thread-safe. If your Python program uses multiple -+threads, you must be careful to only call @value{GDBN}-specific -+functions in the main @value{GDBN} thread. @code{post_event} ensures -+this. -+@end defun ++void ++dwarf2_create_quick_addrmap (struct objfile *objfile) ++{ ++ char *aranges_buffer, *aranges_ptr; ++ bfd *abfd = objfile->obfd; ++ CORE_ADDR baseaddr; ++ struct cleanup *old; ++ struct obstack temp_obstack; ++ struct addrmap *mutable_map; + - @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 - function. - @end defun - -+@findex gdb.frames -+@defun frames -+Return a tuple of all frame objects. -+@end defun ++ if (!dwarf2_per_objfile->aranges.asection) ++ return; + -+@findex gdb.newest_frame -+@defun newest_frame -+Return the newest frame object. -+@end defun ++ baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + -+@findex gdb.selected_frame -+@defun selected_frame -+Return the selected frame object. -+@end defun ++ dwarf2_read_section_1 (objfile, NULL, &dwarf2_per_objfile->aranges); ++ aranges_buffer = dwarf2_per_objfile->aranges.buffer; ++ aranges_ptr = aranges_buffer; ++ old = make_cleanup (destroy_section_cleanup, &dwarf2_per_objfile->aranges); + -+@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 ++ obstack_init (&temp_obstack); ++ make_cleanup_obstack_free (&temp_obstack); ++ mutable_map = addrmap_create_mutable (&temp_obstack); + -+@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 ++ while ((aranges_ptr - aranges_buffer) < dwarf2_per_objfile->aranges.size) ++ { ++ struct comp_unit_head cu_header; ++ unsigned int bytes_read, segment_size, delta; ++ LONGEST info_offset; ++ struct dwarf2_cu cu; + -+@findex gdb.solib_address -+@defun solib_address @var{address} -+Return the name of the shared library holding the given address, or None. -+@end defun ++ cu_header.initial_length_size = 0; ++ aranges_ptr = read_comp_unit_head (&cu_header, aranges_ptr, abfd); + - @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. - -+@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: ++ segment_size = read_1_byte (abfd, aranges_ptr); ++ aranges_ptr += 1; + -+@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 ++ /* Align the pointer to twice the pointer size. I didn't see ++ this in the spec but it appears to be required. */ ++ delta = (aranges_ptr - aranges_buffer) % (2 * cu_header.addr_size); ++ delta = (2 * cu_header.addr_size - delta) % (2 * cu_header.addr_size); ++ aranges_ptr += delta; + -+@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 ++ memset (&cu, 0, sizeof (cu)); ++ cu.header.addr_size = cu_header.addr_size; + -+@defivar Value type -+The type of this @code{gdb.Value}. The result is a @code{gdb.Type} -+object. -+@end defivar -+@end table ++ while (1) ++ { ++ CORE_ADDR address, length; + -+The following methods are provided: ++ address = read_address (abfd, aranges_ptr, &cu, &bytes_read); ++ aranges_ptr += bytes_read; + -+@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}. - @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. - @end defmethod -+@end table ++ length = read_address (abfd, aranges_ptr, &cu, &bytes_read); ++ aranges_ptr += bytes_read; + -+@node Types In Python -+@subsubsection Types In Python -+@cindex types in Python -+@cindex Python, working with types ++ if (address == 0 && length == 0) ++ break; + -+@tindex gdb.Type -+@value{GDBN} represents types from the inferior using the class -+@code{gdb.Type}. ++ address += baseaddr; + -+The following type-related functions are available in the @code{gdb} -+module: ++ addrmap_set_empty (mutable_map, address, address + length, objfile); ++ } ++ } + -+@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. ++ objfile->quick_addrmap = addrmap_create_fixed (mutable_map, ++ &objfile->objfile_obstack); ++ do_cleanups (old); ++} + -+If @var{block} is given, then @var{name} is looked up in that scope. -+Otherwise, it is searched for globally. ++/* Free a section buffer allocated with xmalloc. */ + -+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 ++static void ++xfree_section_buffer (struct dwarf2_section_info *info) ++{ ++ xfree (info->buffer); ++} + -+An instance of @code{Type} has the following attributes: ++/* If section described by INFO was mmapped, munmap it now. */ + -+@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. -+@end defivar ++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 ++} + -+@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. -+@end defivar ++/* 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. */ + -+@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. -+@end defivar -+@end table ++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; + + 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)); + -+The following methods are provided: ++ if (old) ++ discard_cleanups (old); ++} + -+@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 -+@end defmethod ++/* 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. */ + -+@defmethod Type const -+Return a new @code{gdb.Type} object which represents a -+@code{const}-qualified variant of this type. -+@end defmethod ++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 +- partial symtab for each of these included files. +- +- This procedure assumes that there *is* a Line Number Program in +- the given CU. Callers should check that PDI->HAS_STMT_LIST is set +- before calling this procedure. */ ++ partial symtab for each of these included files. */ + + static void + dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, +@@ -1690,6 +1869,37 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, + free_line_header (lh); + } + ++/* Find the base address of the compilation unit for range lists and ++ location lists. It will normally be specified by DW_AT_low_pc. ++ In DWARF-3 draft 4, the base address could be overridden by ++ DW_AT_entry_pc. It's been removed, but GCC still uses this for ++ compilation units with discontinuous ranges. */ + -+@defmethod Type volatile -+Return a new @code{gdb.Type} object which represents a -+@code{volatile}-qualified variant of this type. -+@end defmethod ++static void ++dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu) ++{ ++ struct attribute *attr; + -+@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 ++ cu->base_known = 0; ++ cu->base_address = 0; + -+@defmethod Type reference -+Return a new @code{gdb.Type} object which represents a reference to this -+type. -+@end defmethod ++ attr = dwarf2_attr (die, DW_AT_entry_pc, cu); ++ if (attr) ++ { ++ cu->base_address = DW_ADDR (attr); ++ cu->base_known = 1; ++ } ++ else ++ { ++ attr = dwarf2_attr (die, DW_AT_low_pc, cu); ++ if (attr) ++ { ++ cu->base_address = DW_ADDR (attr); ++ cu->base_known = 1; ++ } ++ } ++} + -+@defmethod Type strip_typedefs -+Return a new @code{gdb.Type} that represents the real type, -+after removing all layers of typedefs. -+@end defmethod + static hashval_t + hash_type_signature (const void *item) + { +@@ -1812,8 +2022,7 @@ lookup_signatured_type (struct objfile *objfile, ULONGEST sig) + return entry; + } + +-/* 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); ++ set_cu_language (comp_unit_die.language, &cu); + + /* 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"), +- parent->tag, pdi->offset); ++ parent->tag, real_pdi->offset); + parent->scope = grandparent_scope; + } + +@@ -2376,12 +2585,22 @@ partial_die_full_name (struct partial_die_info *pdi, + struct dwarf2_cu *cu) + { + char *parent_scope; ++ struct partial_die_info *real_pdi; + +- parent_scope = partial_die_parent_scope (pdi, cu); +- if (parent_scope == NULL) +- return NULL; +- else ++ /* We need to look at our parent DIE; if we have a DW_AT_specification, ++ then this means the parent of the specification DIE. ++ partial_die_parent_scope does this loop also, but we do it here ++ since we need to examine real_pdi->parent ourselves. */ + -+@defmethod Type target -+Return a new @code{gdb.Type} object which represents the target type -+of this type. ++ real_pdi = pdi; ++ while (real_pdi->has_specification) ++ real_pdi = find_partial_die (real_pdi->spec_offset, cu); + -+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. ++ parent_scope = partial_die_parent_scope (real_pdi, cu); ++ if (parent_scope != NULL) + return typename_concat (NULL, parent_scope, pdi->name, cu); + -+If the type does not have a target, this method will throw an -+exception. -+@end defmethod ++ return NULL; + } + + static void +@@ -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)) +- { +- 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; + } + +- /* 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); +- + if (built_actual_name) + xfree (actual_name); + } +@@ -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_member: + return 1; + -+@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. ++ 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; + -+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. -+@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: + default: + return 0; + } +@@ -2700,27 +2916,6 @@ guess_structure_name (struct partial_die_info *struct_pdi, + + 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; +- } + } + } + +@@ -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; +- struct attribute *attr; + CORE_ADDR baseaddr; + + baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); +@@ -3180,30 +3374,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu) + + cu->list_in_scope = &file_symbols; + +- /* Find the base address of the compilation unit for range lists and +- location lists. It will normally be specified by DW_AT_low_pc. +- In DWARF-3 draft 4, the base address could be overridden by +- DW_AT_entry_pc. It's been removed, but GCC still uses this for +- compilation units with discontinuous ranges. */ +- +- cu->base_known = 0; +- cu->base_address = 0; +- +- attr = dwarf2_attr (cu->dies, DW_AT_entry_pc, cu); +- if (attr) +- { +- cu->base_address = DW_ADDR (attr); +- cu->base_known = 1; +- } +- else +- { +- attr = dwarf2_attr (cu->dies, DW_AT_low_pc, cu); +- if (attr) +- { +- cu->base_address = DW_ADDR (attr); +- cu->base_known = 1; +- } +- } ++ dwarf2_find_base_address (cu->dies, cu); + + /* Do line number decoding in read_file_scope () */ + process_die (cu->dies, 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) + { + -+@smallexample -+import gdb.libstdcxx.v6 -+gdb.libstdcxx.v6.register_printers (gdb.current_objfile ()) -+@end smallexample + switch (die->tag) + { + case DW_TAG_padding: +@@ -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. + -+@node Threads In Python -+@subsubsection Threads In Python ++ The output string will be canonicalized (if C++/Java). */ + + 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; + + 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) +- 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') +- name = typename_concat (&cu->objfile->objfile_obstack, prefix, +- name, cu); ++ name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, ++ &length); ++ ui_file_delete (buf); + -+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: ++ if (cu->language == language_cplus) ++ { ++ char *cname ++ = dwarf2_canonicalize_name (name, cu, ++ &cu->objfile->objfile_obstack); ++ if (cname != NULL) ++ name = cname; ++ } ++ } ++ } + + 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 const int dwarf2_read_decl_line (struct die_info *die, struct dwarf2_cu *cu){ ++ struct attribute *line_attr; + -+@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 ++ line_attr = dwarf2_attr (die, DW_AT_decl_line, cu); ++ if (line_attr){ ++ return DW_UNSND (line_attr); ++ } + -+@findex gdb.current_thread -+@defun current_thread -+This function returns the thread ID of the selected thread. If there -+is no selected thread, this will return @code{None}. -+@end defun ++ return -1; ++} + -+@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 ++/* Read the import statement specified by the given die and record it. */ - @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 - Python code is read into @value{GDBN}, you may need to import the - @code{gdb} module explicitly. + 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; ++ ++ int line_number = -1; ++ ++ int is_anonymous = 0; ++ + 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){ ++ import_alias = ""; ++ } ++ ++ /* Determine the line number at which the import was made */ ++ line_number = dwarf2_read_decl_line(die, cu); ++ ++ /* Figure out where the statement is being imported to */ + 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); +- +- 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); +- } +- else +- { ++ }else{ + 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, ++ canonical_name, ++ import_alias, ++ imported_declaration, ++ line_number, ++ using_directives); + } + + 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; ++ struct die_info *child_die; ++ ++ attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); ++ ++ /* GCC currently uses DW_AT_specification to indicate die inheritence ++ in the case of import statements. The following is to accommodate that */ ++ if(!attr){ ++ attr = dwarf2_attr (die, DW_AT_specification, 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; + -+@node Parameters In Python -+@subsubsection Parameters In Python ++ 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); + -+@cindex parameters in python -+@cindex python parameters -+@tindex gdb.Parameter -+@tindex Parameter -+You can implement new @value{GDBN} parameters using Python. A new -+parameter is implemented as an instance of the @code{gdb.Parameter} -+class. Parameters are exposed to the user via the @code{set} and -+@code{show} commands. ++ offsets = xmalloc (sizeof (*offsets) * die_children); ++ cleanups = make_cleanup (xfree, offsets); + -+@defmethod Parameter __init__ name @var{command-class} @var{parameter-class} @r{[}@var{enum-sequence}@r{]} -+The object initializer for @code{Parameter} registers the new -+parameter with @value{GDBN}. This initializer is normally invoked -+from the subclass' own @code{__init__} method. ++ offsets_end = offsets; ++ child_die = die->child; ++ while (child_die && child_die->tag) ++ { ++ 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; + -+@var{name} is the name of the new parameter. If @var{name} consists -+of multiple words, then the initial words are looked for as prefix -+commands. In this case, if one of the prefix commands does not exist, -+an exception is raised. -+ -+@var{command-class} should be one of the @samp{COMMAND_} constants -+(@pxref{Commands In Python}). This argument tells @value{GDBN} how to -+categorize the new parameter in the help system. ++ 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); ++ } + -+@var{parameter-class} should be one of the @samp{PARAM_} constants -+defined below. This argument tells @value{GDBN} the type of the new -+parameter; this information is used for input validation and -+completion. ++ 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); ++ } + -+If @var{parameter-class} is @code{PARAM_ENUM}, then -+@var{enum-sequence} must be a sequence of strings. These strings -+represent the possible values for the parameter. ++ do_cleanups (cleanups); ++ } ++} ++ + /* 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 = 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)); + +- name = dwarf2_linkage_name (die, cu); ++ name = dwarf2_name (die, cu); + + /* Ignore functions with missing or empty names and functions with + missing or invalid low and high pc attributes. */ +- if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu)) ++ if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)){ ++ /* explore abstract origins if present. They might contain useful information ++ such as import statements. */ ++ child_die = die->child; ++ while (child_die && child_die->tag) ++ { ++ child_die = sibling_die (child_die); ++ die_children++; ++ } ++ explore_abstract_origin(die, cu, &die_children); + return; +- ++ } ++ + lowpc += baseaddr; + highpc += baseaddr; + +@@ -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) ++ child_die = die->child; ++ 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++; + } + ++ explore_abstract_origin(die, cu, &die_children); + inherit_abstract_dies (die, cu); + + new = pop_context (); +@@ -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. */ +- if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu)) ++ if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) + return; + lowpc += baseaddr; + highpc += baseaddr; +@@ -3922,7 +4240,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) + } + new = pop_context (); + +- if (local_symbols != NULL) ++ if (local_symbols != NULL || using_directives!= NULL ) + { + struct block *block + = finish_block (0, &local_symbols, new->old_blocks, new->start_addr, +@@ -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, +- CORE_ADDR *highpc, struct dwarf2_cu *cu) ++ CORE_ADDR *highpc, struct dwarf2_cu *cu, ++ struct partial_symtab *pst) + { + struct attribute *attr; + CORE_ADDR low = 0; +@@ -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. */ +- if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, NULL)) ++ if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, pst)) + return 0; + /* Found discontinuous range of addresses. */ + ret = -1; +@@ -4144,7 +4463,7 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die, + CORE_ADDR low, high; + struct die_info *child = die->child; + +- if (dwarf2_get_pc_bounds (die, &low, &high, cu)) ++ if (dwarf2_get_pc_bounds (die, &low, &high, cu, NULL)) + { + *lowpc = min (*lowpc, low); + *highpc = max (*highpc, high); +@@ -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; + +- if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu)) ++ if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu, NULL)) + { + best_low = current_low; + best_high = current_high; +@@ -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)) +- byte_offset = dwarf2_get_attr_constant_value (attr, 0); ++ { ++ enum get_attr_constant_value type; ++ ++ type = get_attr_constant_value (attr, &byte_offset); ++ gdb_assert (type == dwarf2_attr_const); ++ } + else + byte_offset = decode_locdesc (DW_BLOCK (attr), cu); + +@@ -4476,7 +4800,11 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, + if (fieldname == NULL) + return; + +- /* Get physical name. */ ++ /* Get physical name. We prefer the linkage name if one was specified, ++ because this lets GDB find a non-debugging version of the symbol. ++ Otherwise construct the full name from type information. Ideally, ++ when GDB supports canonicalization of C++ symbol names, we will not ++ need the linkage name for anything. */ + physname = dwarf2_linkage_name (die, cu); + + /* The name is already allocated along with this objfile, so we don't +@@ -4607,7 +4935,11 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, + if (fieldname == NULL) + return; + +- /* Get the mangled name. */ ++ /* Get physical name. We prefer the linkage name if one was specified, ++ because this lets GDB find a non-debugging version of the symbol. ++ Otherwise construct the full name from type information. Ideally, ++ when GDB supports canonicalization of C++ symbol names, we will not ++ need the linkage name for anything. */ + physname = dwarf2_linkage_name (die, cu); + + /* Look up member function name in fieldlist. */ +@@ -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 : ""; +- fnp->type = alloc_type (objfile); ++ fnp->type = alloc_type (objfile, NULL); + this_type = read_type_die (die, cu); + if (this_type && TYPE_CODE (this_type) == TYPE_CODE_FUNC) + { +@@ -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)); +- type = alloc_type (objfile); ++ type = alloc_type (objfile, NULL); + smash_to_method_type (type, domain_type, TYPE_TARGET_TYPE (pfn_type), + TYPE_FIELDS (pfn_type), TYPE_NFIELDS (pfn_type), + TYPE_VARARGS (pfn_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); +@@ -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); +@@ -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 +- = language_class_name_from_physname (cu->language_defn, +- dwarf2_linkage_name +- (child, 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); + } + ++/* Create a new array dimension referencing its target type TYPE. + -+If @var{parameter-class} is not @code{PARAM_ENUM}, then the presence -+of a fourth argument will cause an exception to be thrown. ++ Multidimensional arrays are internally represented as a stack of ++ singledimensional arrays being referenced by their TYPE_TARGET_TYPE. */ + -+The help text for the new parameter is taken from the Python -+documentation string for the parameter's class, if there is one. If -+there is no documentation string, a default value is used. -+@end defmethod -+ -+@defivar Parameter set_doc -+If this attribute exists, and is a string, then its value is used as -+the help text for this parameter's @code{set} command. The value is -+examined when @code{Parameter.__init__} is invoked; subsequent changes -+have no effect. -+@end defivar -+ -+@defivar Parameter show_doc -+If this attribute exists, and is a string, then its value is used as -+the help text for this parameter's @code{show} command. The value is -+examined when @code{Parameter.__init__} is invoked; subsequent changes -+have no effect. -+@end defivar -+ -+@defivar Parameter value -+The @code{value} attribute holds the underlying value of the -+parameter. It can be read and assigned to just as any other -+attribute. @value{GDBN} does validation when assignments are made. -+@end defivar -+ -+ -+When a new parameter is defined, its type must be specified. The -+available types are represented by constants defined in the @code{gdb} -+module: -+ -+@table @code -+@findex PARAM_BOOLEAN -+@findex gdb.PARAM_BOOLEAN -+@item PARAM_BOOLEAN -+The value is a plain boolean. The Python boolean values, @code{True} -+and @code{False} are the only valid values. -+ -+@findex PARAM_AUTO_BOOLEAN -+@findex gdb.PARAM_AUTO_BOOLEAN -+@item PARAM_AUTO_BOOLEAN -+The value has three possible states: true, false, and @samp{auto}. In -+Python, true and false are represented using boolean constants, and -+@samp{auto} is represented using @code{None}. -+ -+@findex PARAM_UINTEGER -+@findex gdb.PARAM_UINTEGER -+@item PARAM_UINTEGER -+The value is an unsigned integer. The value of 0 should be -+interpreted to mean ``unlimited''. -+ -+@findex PARAM_INTEGER -+@findex gdb.PARAM_INTEGER -+@item PARAM_INTEGER -+The value is a signed integer. The value of 0 should be interpreted -+to mean ``unlimited''. -+ -+@findex PARAM_STRING -+@findex gdb.PARAM_STRING -+@item PARAM_STRING -+The value is a string. When the user modifies the string, escapes are -+translated. -+ -+@findex PARAM_STRING_NOESCAPE -+@findex gdb.PARAM_STRING_NOESCAPE -+@item PARAM_STRING_NOESCAPE -+The value is a string. When the user modifies the string, escapes are -+passed through untranslated. -+ -+@findex PARAM_OPTIONAL_FILENAME -+@findex gdb.PARAM_OPTIONAL_FILENAME -+@item PARAM_OPTIONAL_FILENAME -+The value is a either a filename (a string), or @code{None}. -+ -+@findex PARAM_FILENAME -+@findex gdb.PARAM_FILENAME -+@item PARAM_FILENAME -+The value is a filename (a string). -+ -+@findex PARAM_ZINTEGER -+@findex gdb.PARAM_ZINTEGER -+@item PARAM_ZINTEGER -+The value is an integer. This is like @code{PARAM_INTEGER}, except 0 -+is interpreted as itself. -+ -+@findex PARAM_ENUM -+@findex gdb.PARAM_ENUM -+@item PARAM_ENUM -+The value is a string, which must be one of a collection string -+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 ++static struct type * ++create_single_array_dimension (struct type *type, struct type *range_type, ++ struct die_info *die, struct dwarf2_cu *cu) ++{ ++ type = create_array_type (NULL, type, range_type); + -+The following code snippet shows how a trivial convenience function can -+be implemented in Python: ++ /* These generic type attributes need to be fetched by ++ evaluate_subexp_standard 's call of ++ value_subscripted_rvalue only for the innermost array type. */ ++ fetch_die_type_attrs (die, type, cu); + -+@smallexample -+class Greet (gdb.Function): -+ """Return string to greet someone. -+Takes a name as argument.""" ++ /* These generic type attributes are checked for allocated/associated ++ validity while accessing FIELD_LOC_KIND_DWARF_BLOCK. */ ++ fetch_die_type_attrs (die, range_type, cu); + -+ def __init__ (self): -+ super (Greet, self).__init__ ("greet") ++ return type; ++} + -+ def invoke (self, name): -+ return "Hello, %s!" % name.string () + /* 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. */ +@@ -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; +- int ndim = 0; ++ int ndim = 0, i; + struct cleanup *back_to; + char *name; + +@@ -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) +- { +- int i = 0; +- while (i < ndim) +- type = create_array_type (NULL, type, range_types[i++]); +- } +- else +- { +- while (ndim-- > 0) +- type = create_array_type (NULL, type, range_types[ndim]); +- } ++ for (i = 0; i < ndim; i++) ++ type = create_single_array_dimension (type, range_types[i], die, cu); ++ else /* (read_array_order (die, cu) == DW_ORD_row_major) */ ++ for (i = ndim - 1; i >= 0; i--) ++ type = create_single_array_dimension (type, range_types[i], die, cu); + + /* Understand Dwarf2 support for vector types (like they occur on + the PowerPC w/ AltiVec). Gcc just adds another attribute to the +@@ -5401,12 +5710,14 @@ read_set_type (struct die_info *die, struct dwarf2_cu *cu) + return set_die_type (die, set_type, cu); + } + +-/* First cut: install each common block member as a global variable. */ ++/* Create appropriate locally-scoped variables for all the DW_TAG_common_block ++ entries. Create also TYPE_CODE_STRUCT listing all such variables to be ++ available for `info common'. COMMON_BLOCK_DOMAIN is used to sepate the ++ common blocks name namespace from regular variable names. */ + + static void + read_common_block (struct die_info *die, struct dwarf2_cu *cu) + { +- struct die_info *child_die; + struct attribute *attr; + struct symbol *sym; + CORE_ADDR base = (CORE_ADDR) 0; +@@ -5431,10 +5742,40 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu) + } + if (die->child != NULL) + { ++ struct objfile *objfile = cu->objfile; ++ struct die_info *child_die; ++ struct type *type; ++ struct field *field; ++ char *name; ++ struct symbol *sym; + -+Greet () -+@end smallexample ++ type = alloc_type (objfile, NULL); ++ TYPE_CODE (type) = TYPE_CODE_STRUCT; ++ /* Artificial type to be used only by `info common'. */ ++ TYPE_NAME (type) = ""; + -+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. + child_die = die->child; + while (child_die && child_die->tag) + { ++ TYPE_NFIELDS (type)++; ++ child_die = sibling_die (child_die); ++ } + -+@defivar Objfile filename -+The file name of the objfile as a string. -+@end defivar ++ TYPE_FIELDS (type) = obstack_alloc (&objfile->objfile_obstack, ++ sizeof (*TYPE_FIELDS (type)) ++ * TYPE_NFIELDS (type)); ++ memset (TYPE_FIELDS (type), 0, sizeof (*TYPE_FIELDS (type)) ++ * TYPE_NFIELDS (type)); ++ ++ field = TYPE_FIELDS (type); ++ 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); + -+@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 ++ /* Undocumented in DWARF3, when it can be present? */ + attr = dwarf2_attr (child_die, DW_AT_data_member_location, cu); + if (attr) + { +@@ -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); + } + -+@node Breakpoints In Python -+@subsubsection Manipulating breakpoints using Python ++ if (SYMBOL_CLASS (sym) == LOC_STATIC) ++ SET_FIELD_PHYSADDR (*field, SYMBOL_VALUE_ADDRESS (sym)); ++ else ++ SET_FIELD_PHYSNAME (*field, SYMBOL_LINKAGE_NAME (sym)); ++ FIELD_TYPE (*field) = SYMBOL_TYPE (sym); ++ FIELD_NAME (*field) = SYMBOL_NATURAL_NAME (sym); ++ field++; + child_die = sibling_die (child_die); + } + -+@cindex breakpoints in python -+@cindex python breakpoints -+@tindex gdb.Breakpoint -+@tindex Breakpoint -+Python code can manipulate breakpoints via the @code{gdb.Breakpoint} -+class. ++ /* TYPE_LENGTH (type) is left 0 - it is only a virtual structure even ++ with no consecutive address space. */ + -+@defmethod Breakpoint __init__ location -+Create a new breakpoint. @var{location} is a string naming the -+location of the breakpoint. The contents can be any location -+recognized by the @code{break} command. -+@end defmethod ++ sym = new_symbol (die, type, cu); ++ /* SYMBOL_VALUE_ADDRESS never gets used as all its fields are static. */ ++ SYMBOL_VALUE_ADDRESS (sym) = base; + -+@defmethod Breakpoint is_valid -+Return @code{True} if this @code{Breakpoint} object is valid, -+@code{False} otherwise. A @code{Breakpoint} object can become invalid -+if the user deletes the breakpoint. In this case, the object still -+exists, but the underlying breakpoint does not. -+@end defmethod ++ set_die_type (die, type, 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 (previous_prefix, TYPE_NAME (type)); ++ cp_add_using_directive (previous_prefix, TYPE_NAME (type), "", "", dwarf2_read_decl_line(die, cu)); + } + } + +@@ -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; + -+@defivar Breakpoint enabled -+This attribute is @code{True} if the breakpoint is enabled, and -+@code{False} otherwise. This attribute is writable. -+@end defivar ++ 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); + -+@defivar Breakpoint silent -+This attribute is @code{True} if the breakpoint is silent, and -+@code{False} otherwise. This attribute is writable. -+ -+Note that a breakpoint can also be silent if it has commands and the -+first command is @code{silent}. This is not reported by the -+@code{silent} attribute. -+@end defivar -+ -+@defivar Breakpoint thread -+If the breakpoint is thread-specific, this attribute holds the thread -+id. If the breakpoint is not thread-specific, this attribute is -+@code{None}. This attribute is writable. -+@end defivar -+ -+@defivar Breakpoint ignore_count -+This attribute holds the ignore count for the breakpoint, an integer. -+This attribute is writable. -+@end defivar -+ -+@defivar Breakpoint number -+This attribute holds the breakpoint's number -- the identifier used by -+the user to manipulate the breakpoint. This attribute is not writable. -+@end defivar -+ -+@defivar Breakpoint hit_count -+This attribute holds the hit count for the breakpoint, an integer. -+This attribute is writable, but currently it can only be set to zero. -+@end defivar -+ -+@defivar Breakpoint location -+This attribute holds the location of the breakpoint, as specified by -+the user. It is a string. This attribute is not writable. -+@end defivar -+ -+@defivar Breakpoint condition -+This attribute holds the condition of the breakpoint, as specified by -+the user. It is a string. If there is no condition, this attribute's -+value is @code{None}. This attribute is writable. -+@end defivar -+ -+@defivar Breakpoint commands -+This attribute holds the commands attached to the breakpoint. If -+there are commands, this returns a string holding all the commands, -+separated by newlines. If there are no commands, this attribute is -+@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 -+ -+@defmethod Frame block -+Returns the frame's code block. @c (see @xref{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. -+@end defmethod -+ -+@defmethod Frame find_sal -+Return the frame's symtab and line object. @c (see @xref{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 -+ - @node Interpreters - @chapter Command Interpreters - @cindex command interpreters -@@ -22273,6 +23452,103 @@ Unfreezing a variable does not update it, only subsequent - (gdb) - @end smallexample ++ /* C/C++ should probably have the low bound 0 but C/C++ does not use ++ DW_TAG_string_type. */ ++ TYPE_LOW_BOUND (range_type) = 1; -+@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. + attr = dwarf2_attr (die, DW_AT_string_length, cu); +- if (attr) +- { +- length = DW_UNSND (attr); +- } +- else +- { +- /* check for the DW_AT_byte_size attribute */ ++ switch (get_attr_constant_value (attr, &length)) ++ { ++ case dwarf2_attr_const: ++ /* We currently do not support a constant address where the location ++ should be read from - DWARF2_ATTR_BLOCK is expected instead. See ++ DWARF for the DW_AT_STRING_LENGTH vs. DW_AT_BYTE_SIZE difference. */ ++ /* PASSTHRU */ ++ case dwarf2_attr_unknown: + attr = dwarf2_attr (die, DW_AT_byte_size, cu); +- if (attr) +- { +- length = DW_UNSND (attr); +- } +- else +- { +- length = 1; +- } ++ switch (get_attr_constant_value (attr, &length)) ++ { ++ case dwarf2_attr_unknown: ++ length = 1; ++ /* PASSTHRU */ ++ case dwarf2_attr_const: ++ TYPE_HIGH_BOUND (range_type) = length; ++ break; ++ case dwarf2_attr_block: ++ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 1); ++ TYPE_FIELD_DWARF_BLOCK (range_type, 1) = ++ dwarf2_attr_to_locexpr_baton (attr, cu); ++ TYPE_DYNAMIC (range_type) = 1; ++ break; ++ } ++ break; ++ case dwarf2_attr_block: ++ /* Security check for a size overflow. */ ++ if (DW_BLOCK (attr)->size + 2 < DW_BLOCK (attr)->size) ++ { ++ TYPE_HIGH_BOUND (range_type) = 1; ++ break; ++ } ++ /* Extend the DWARF block by a new DW_OP_deref/DW_OP_deref_size ++ instruction as DW_AT_string_length specifies the length location, not ++ its value. */ ++ { ++ struct dwarf2_locexpr_baton *length_baton; ++ struct attribute *size_attr; + -+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. ++ length_baton = obstack_alloc (&cu->comp_unit_obstack, ++ sizeof (*length_baton)); ++ length_baton->per_cu = cu->per_cu; ++ length_baton->data = obstack_alloc (&cu->comp_unit_obstack, ++ DW_BLOCK (attr)->size + 2); ++ memcpy (length_baton->data, DW_BLOCK (attr)->data, ++ DW_BLOCK (attr)->size); + -+@subsubheading Example ++ /* DW_AT_BYTE_SIZE existing together with DW_AT_STRING_LENGTH specifies ++ the size of an integer to fetch. */ + -+@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 ++ size_attr = dwarf2_attr (die, DW_AT_byte_size, cu); ++ if (size_attr) ++ { ++ length_baton->size = DW_BLOCK (attr)->size + 2; ++ length_baton->data[DW_BLOCK (attr)->size] = DW_OP_deref_size; ++ length_baton->data[DW_BLOCK (attr)->size + 1] ++ = DW_UNSND (size_attr); ++ if (length_baton->data[DW_BLOCK (attr)->size + 1] ++ != DW_UNSND (size_attr)) ++ complaint (&symfile_complaints, ++ _("DW_AT_string_length's DW_AT_byte_size integer " ++ "exceeds the byte size storage")); ++ } ++ else ++ { ++ length_baton->size = DW_BLOCK (attr)->size + 1; ++ length_baton->data[DW_BLOCK (attr)->size] = DW_OP_deref; ++ } + ++ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 1); ++ TYPE_FIELD_DWARF_BLOCK (range_type, 1) = length_baton; ++ TYPE_DYNAMIC (range_type) = 1; ++ } ++ break; + } - @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. - -@@ -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. - --@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 -diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c -index ce11d89..eaa6a13 100644 ---- a/gdb/dwarf2-frame.c -+++ b/gdb/dwarf2-frame.c -@@ -38,6 +38,7 @@ +- index_type = objfile_type (objfile)->builtin_int; +- range_type = create_range_type (NULL, index_type, 1, length); + char_type = language_string_char_type (cu->language_defn, gdbarch); + type = create_string_type (NULL, char_type, range_type); - #include "complaints.h" - #include "dwarf2-frame.h" -+#include "addrmap.h" +@@ -5822,7 +6246,6 @@ static struct type * + read_typedef (struct die_info *die, struct dwarf2_cu *cu) + { + struct objfile *objfile = cu->objfile; +- struct attribute *attr; + const char *name = NULL; + struct type *this_type; - struct comp_unit; +@@ -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; +- int low = 0; +- int high = -1; ++ int low, high, byte_stride_int; ++ enum get_attr_constant_value high_type; + char *name; + + base_type = die_type (die, cu); +@@ -5944,42 +6367,90 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) + 0, NULL, cu->objfile); + } -@@ -1499,6 +1500,14 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) - struct dwarf2_fde *fde; - CORE_ADDR offset; +- if (cu->language == language_fortran) +- { +- /* FORTRAN implies a lower bound of 1, if not given. */ +- low = 1; +- } ++ /* LOW_BOUND and HIGH_BOUND are set for real below. */ ++ range_type = create_range_type (NULL, base_type, 0, -1); -+ if (objfile->quick_addrmap) +- /* FIXME: For variable sized arrays either of these could be +- a variable rather than a constant value. We'll allow it, +- but we don't know how to handle it. */ + attr = dwarf2_attr (die, DW_AT_lower_bound, cu); +- if (attr) +- low = dwarf2_get_attr_constant_value (attr, 0); ++ switch (get_attr_constant_value (attr, &low)) ++ { ++ case dwarf2_attr_unknown: ++ if (cu->language == language_fortran) + { -+ if (!addrmap_find (objfile->quick_addrmap, *pc)) -+ continue; -+ } -+ /* FIXME: Read-in only .debug_frame/.eh_frame without .debug_info? */ -+ require_partial_symbols (objfile); -+ - fde = objfile_data (objfile, dwarf2_frame_objfile_data); - if (fde == NULL) - continue; -diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c -index 75a4ec7..aa8ab33 100644 ---- a/gdb/dwarf2expr.c -+++ b/gdb/dwarf2expr.c -@@ -752,6 +752,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, - ctx->initialized = 0; - goto no_push; - -+ case DW_OP_push_object_address: -+ if (ctx->get_object_address == NULL) -+ error (_("DWARF-2 expression error: DW_OP_push_object_address must " -+ "have a value to push.")); -+ result = (ctx->get_object_address) (ctx->baton); -+ break; -+ - default: - error (_("Unhandled dwarf expression opcode 0x%x"), op); - } -diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h -index 7047922..a287b6f 100644 ---- a/gdb/dwarf2expr.h -+++ b/gdb/dwarf2expr.h -@@ -67,10 +67,10 @@ 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); -+#endif - - /* Return the `object address' for DW_OP_push_object_address. */ - CORE_ADDR (*get_object_address) (void *baton); --#endif - - /* The current depth of dwarf expression recursion, via DW_OP_call*, - DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum -diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c -index cad3db8..2251e48 100644 ---- a/gdb/dwarf2loc.c -+++ b/gdb/dwarf2loc.c -@@ -107,6 +107,9 @@ struct dwarf_expr_baton - { - struct frame_info *frame; - struct objfile *objfile; -+ /* From DW_TAG_variable's DW_AT_location (not DW_TAG_type's -+ DW_AT_data_location) for DW_OP_push_object_address. */ -+ CORE_ADDR object_address; - }; ++ /* FORTRAN implies a lower bound of 1, if not given. */ ++ low = 1; ++ } ++ else ++ { ++ /* According to DWARF we should assume the value 0 only for ++ LANGUAGE_C and LANGUAGE_CPLUS. */ ++ low = 0; ++ } ++ /* PASSTHRU */ ++ case dwarf2_attr_const: ++ TYPE_LOW_BOUND (range_type) = low; ++ if (low >= 0) ++ TYPE_UNSIGNED (range_type) = 1; ++ break; ++ case dwarf2_attr_block: ++ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 0); ++ TYPE_FIELD_DWARF_BLOCK (range_type, 0) = dwarf2_attr_to_locexpr_baton ++ (attr, cu); ++ TYPE_DYNAMIC (range_type) = 1; ++ /* For setting a default if DW_AT_UPPER_BOUND would be missing. */ ++ low = 0; ++ break; ++ } - /* Helper functions for dwarf2_evaluate_loc_desc. */ -@@ -163,22 +166,32 @@ 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) - { - struct dwarf2_locexpr_baton *symbaton; -+ - symbaton = SYMBOL_LOCATION_BATON (framefunc); -- if (symbaton != NULL) -- { -- *length = symbaton->size; -- *start = symbaton->data; -- } + attr = dwarf2_attr (die, DW_AT_upper_bound, cu); +- if (attr) +- { +- if (attr->form == DW_FORM_block1) +- { +- /* GCC encodes arrays with unspecified or dynamic length +- with a DW_FORM_block1 attribute. +- FIXME: GDB does not yet know how to handle dynamic +- arrays properly, treat them as arrays with unspecified +- length for now. +- +- FIXME: jimb/2003-09-22: GDB does not really know +- how to handle arrays of unspecified length +- either; we just represent them as zero-length +- arrays. Choose an appropriate upper bound given +- the lower bound we've computed above. */ +- high = low - 1; +- } - else -- *start = NULL; -+ gdb_assert (symbaton != NULL); -+ *start = symbaton->data; -+ *length = symbaton->size; +- high = dwarf2_get_attr_constant_value (attr, 1); ++ high_type = get_attr_constant_value (attr, &high); ++ if (high_type == dwarf2_attr_unknown) ++ { ++ attr = dwarf2_attr (die, DW_AT_count, cu); ++ high_type = get_attr_constant_value (attr, &high); ++ /* It does not hurt but it is needlessly ineffective in check_typedef. */ ++ if (high_type != dwarf2_attr_unknown) ++ { ++ TYPE_RANGE_HIGH_BOUND_IS_COUNT (range_type) = 1; ++ TYPE_DYNAMIC (range_type) = 1; ++ } ++ /* Pass it now as the regular DW_AT_upper_bound. */ + } -+ else if (SYMBOL_OPS (framefunc) == &dwarf2_missing_funcs) ++ switch (high_type) + { -+ struct dwarf2_locexpr_baton *symbaton; -+ -+ symbaton = SYMBOL_LOCATION_BATON (framefunc); -+ gdb_assert (symbaton == NULL); -+ *start = NULL; -+ *length = 0; /* unused */ ++ case dwarf2_attr_unknown: ++ TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (range_type) = 1; ++ high = low - 1; ++ /* PASSTHRU */ ++ case dwarf2_attr_const: ++ TYPE_HIGH_BOUND (range_type) = high; ++ break; ++ case dwarf2_attr_block: ++ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 1); ++ TYPE_FIELD_DWARF_BLOCK (range_type, 1) = dwarf2_attr_to_locexpr_baton ++ (attr, cu); ++ TYPE_DYNAMIC (range_type) = 1; ++ break; } -+ else -+ internal_error (__FILE__, __LINE__, -+ _("Unsupported SYMBOL_OPS %p for \"%s\""), -+ SYMBOL_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)); +- range_type = create_range_type (NULL, base_type, low, high); ++ /* DW_AT_bit_stride is currently unsupported as we count in bytes. */ ++ attr = dwarf2_attr (die, DW_AT_byte_stride, cu); ++ switch (get_attr_constant_value (attr, &byte_stride_int)) ++ { ++ case dwarf2_attr_unknown: ++ break; ++ case dwarf2_attr_const: ++ if (byte_stride_int == 0) ++ complaint (&symfile_complaints, ++ _("Found DW_AT_byte_stride with unsupported value 0")); ++ TYPE_BYTE_STRIDE (range_type) = byte_stride_int; ++ break; ++ case dwarf2_attr_block: ++ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 2); ++ TYPE_FIELD_DWARF_BLOCK (range_type, 2) = dwarf2_attr_to_locexpr_baton ++ (attr, cu); ++ TYPE_DYNAMIC (range_type) = 1; ++ break; ++ } + + name = dwarf2_name (die, cu); + if (name) +@@ -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: +- part_die->name = DW_STRING (&attr); +- break; + case DW_AT_low_pc: + has_low_pc_attr = 1; + part_die->lowpc = DW_ADDR (&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; +@@ -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; + +- if (base_address_type != base_address_none && !cu->base_known) +- { +- gdb_assert (part_die->tag == DW_TAG_compile_unit); +- cu->base_known = 1; +- cu->base_address = base_address; +- } +- + return info_ptr; } - /* Using the objfile specified in BATON, find the address for the -@@ -191,6 +204,119 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) - return target_translate_tls_address (debaton->objfile, offset); +@@ -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->is_external)) + { + struct partial_die_info *spec_die; + +@@ -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 +- or memory numbers show me otherwise. */ ++ or memory numbers show me otherwise. ++ ++ SYMBOL_CLASS may get overriden by dwarf2_symbol_mark_computed. */ + +- dwarf2_symbol_mark_computed (attr, sym, cu); + SYMBOL_CLASS (sym) = LOC_COMPUTED; ++ dwarf2_symbol_mark_computed (attr, sym, cu); } -+static CORE_ADDR -+dwarf_expr_object_address (void *baton) -+{ -+ struct dwarf_expr_baton *debaton = baton; + /* Given a pointer to a DWARF information entry, figure out if we need +@@ -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) +- name = dwarf2_linkage_name (die, cu); +- else +- name = TYPE_NAME (type); +- ++ name = dwarf2_name (die, cu); + if (name) + { ++ const char *linkagename; + -+ /* The message is suppressed in DWARF_BLOCK_EXEC. */ -+ if (debaton->object_address == 0) -+ error (_("Cannot resolve DW_OP_push_object_address for a missing object")); + sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack, + sizeof (struct symbol)); + OBJSTAT (objfile, n_syms++); + memset (sym, 0, sizeof (struct symbol)); ++ /* 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; +- SYMBOL_SET_NAMES (sym, name, strlen (name), objfile); + -+ return debaton->object_address; -+} ++ /* Cache this symbol's name and the name's demangled form (if any). */ + -+/* Address of the variable we are currently referring to. It is set from -+ DW_TAG_variable's DW_AT_location (not DW_TAG_type's DW_AT_data_location) for -+ DW_OP_push_object_address. */ ++ linkagename = dwarf2_linkage_name (die, cu); ++ SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), objfile); + + /* Default assumptions. + Use the passed type or decode it from the die. */ +@@ -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); + -+static CORE_ADDR object_address; + attr2 = dwarf2_attr (die, DW_AT_external, cu); + -+/* Callers use object_address_set while their callers use the result set so we -+ cannot run the cleanup at the local block of our direct caller. Still we -+ should reset OBJECT_ADDRESS at least for the next GDB command. */ ++ /* Fortran explicitely imports any global symbols to the local ++ scope by DW_TAG_common_block. */ ++ if (cu->language == language_fortran && die->parent ++ && die->parent->tag == DW_TAG_common_block) ++ attr2 = NULL; + -+static void -+object_address_cleanup (void *prev_save_voidp) -+{ -+ CORE_ADDR *prev_save = prev_save_voidp; + if (attr2 && (DW_UNSND (attr2) != 0)) + add_symbol_to_list (sym, &global_symbols); + else +@@ -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; + 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; ++ case DW_TAG_common_block: ++ SYMBOL_CLASS (sym) = LOC_STATIC; ++ SYMBOL_DOMAIN (sym) = COMMON_BLOCK_DOMAIN; ++ add_symbol_to_list (sym, cu->list_in_scope); ++ break; + default: + /* Not a tag we recognize. Hopefully we aren't processing + trash data, but since we must specifically ignore things +@@ -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; + } + ++ if (this_type) ++ finalize_type (this_type); + -+ object_address = *prev_save; -+ xfree (prev_save); -+} + return this_type; + } + +@@ -8889,10 +9371,97 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) + So it does not need a prefix. */ + return ""; + default: +- return determine_prefix (parent, cu); ++ return determine_prefix (parent, cu); + } + } + ++/* 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. */ + -+/* Set the base address - DW_AT_location - of a variable. It is being later -+ used to derive other object addresses by DW_OP_push_object_address. ++static char * ++physname_prefix (struct die_info *die, struct dwarf2_cu *cu) ++{ ++ long length; ++ struct ui_file *buf; ++ struct die_info *d, *spec_die; ++ struct dwarf2_cu *spec_cu; ++ ++ /* 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; + -+ 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 -+ objects in relocatable .o files). */ ++ spec_die = die_specification (d, &spec_cu); ++ if (spec_die != NULL) ++ d = spec_die; + -+void -+object_address_set (CORE_ADDR address) -+{ -+ CORE_ADDR *prev_save; ++ VEC_quick_push (die_info_p, die_list, d); ++ d = d->parent; ++ } + -+ prev_save = xmalloc (sizeof *prev_save); -+ *prev_save = object_address; -+ make_cleanup (object_address_cleanup, prev_save); ++ /* 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); + -+ object_address = address; -+} ++ if (!VEC_empty (die_info_p, die_list)) ++ { ++ if (cu->language == language_cplus) ++ fputs_unfiltered ("::", buf); ++ else ++ fputs_unfiltered (".", buf); ++ } ++ } + -+/* Evaluate DWARF expression at DATA ... DATA + SIZE with its result readable -+ by dwarf_expr_fetch (RETVAL, 0). FRAME parameter can be NULL to call -+ get_selected_frame to find it. Returned dwarf_expr_context freeing is -+ pushed on the cleanup chain. */ ++ return ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, &length); ++} + -+static struct dwarf_expr_context * -+dwarf_expr_prep_ctx (struct frame_info *frame, gdb_byte *data, -+ unsigned short size, struct dwarf2_per_cu_data *per_cu) ++static void ++physname_prefix_1 (struct ui_file *buf, struct die_info *die, ++ struct dwarf2_cu *cu) +{ -+ struct dwarf_expr_context *ctx; -+ struct dwarf_expr_baton baton; ++ const char *name = NULL; ++ gdb_assert (buf != NULL); + -+ if (!frame) -+ frame = get_selected_frame (NULL); ++ if (die != NULL) ++ { ++ switch (die->tag) ++ { ++ case DW_TAG_namespace: ++ name = dwarf2_name (die, cu); ++ if (name == NULL) ++ name = "(anonymous namespace)"; ++ break; + -+ baton.frame = frame; -+ baton.objfile = dwarf2_per_cu_objfile (per_cu); -+ baton.object_address = object_address; ++ 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; + -+ ctx = new_dwarf_expr_context (); -+ ctx->gdbarch = get_objfile_arch (baton.objfile); -+ ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); -+ ctx->baton = &baton; -+ ctx->read_reg = dwarf_expr_read_reg; -+ ctx->read_mem = dwarf_expr_read_mem; -+ ctx->get_frame_base = dwarf_expr_frame_base; -+ ctx->get_tls_address = dwarf_expr_tls_address; -+ ctx->get_object_address = dwarf_expr_object_address; ++ default: ++ break; ++ } ++ } + -+ make_cleanup ((make_cleanup_ftype *) free_dwarf_expr_context, ctx); ++ if (name != NULL) ++ fputs_unfiltered (name, buf); ++} + -+ dwarf_expr_eval (ctx, data, size); + /* 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; + -+ /* It was used only during dwarf_expr_eval. */ -+ ctx->baton = NULL; ++ name = dwarf2_name (die, cu); + -+ return ctx; -+} ++ /* These are the only languages we know how to qualify names in. */ ++ if (cu->language != language_cplus ++ && cu->language != language_java) ++ return name; + -+/* Evaluate DWARF expression at DLBATON expecting it produces exactly one -+ CORE_ADDR result on the DWARF stack stack. */ ++ if (die_needs_namespace (die, cu)) ++ { ++ long length; ++ char *prefix; ++ struct ui_file *buf; + -+CORE_ADDR -+dwarf_locexpr_baton_eval (struct dwarf2_locexpr_baton *dlbaton) -+{ -+ struct dwarf_expr_context *ctx; -+ CORE_ADDR retval; -+ struct cleanup *back_to = make_cleanup (null_cleanup, 0); ++ prefix = physname_prefix (die, cu); ++ buf = mem_fileopen (); ++ if (*prefix != '\0') ++ { ++ char *prefixed_name = typename_concat (NULL, prefix, name, cu); ++ fputs_unfiltered (prefixed_name, buf); ++ xfree (prefixed_name); ++ } ++ else ++ fputs_unfiltered (name ? name : "", buf); + -+ ctx = dwarf_expr_prep_ctx (NULL, dlbaton->data, dlbaton->size, -+ 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")); ++ /* 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); + -+ retval = dwarf_expr_fetch (ctx, 0); ++ c_type_print_args (type, buf, 0, cu->language); + -+ do_cleanups (back_to); ++ 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); ++ } ++ } + -+ return retval; -+} ++ name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, ++ &length); ++ ui_file_delete (buf); + - /* 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, - struct dwarf2_per_cu_data *per_cu) - { - struct value *retval; -- struct dwarf_expr_baton baton; - struct dwarf_expr_context *ctx; -+ struct cleanup *back_to = make_cleanup (null_cleanup, 0); - - if (size == 0) - { -@@ -211,19 +337,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, - return retval; - } - -- baton.frame = frame; -- baton.objfile = dwarf2_per_cu_objfile (per_cu); -+ ctx = dwarf_expr_prep_ctx (frame, data, size, per_cu); ++ if (cu->language == language_cplus) ++ { ++ char *cname ++ = dwarf2_canonicalize_name (name, cu, ++ &cu->objfile->objfile_obstack); ++ if (cname != NULL) ++ name = cname; ++ } ++ } -- ctx = new_dwarf_expr_context (); -- ctx->gdbarch = get_objfile_arch (baton.objfile); -- ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); -- ctx->baton = &baton; -- ctx->read_reg = dwarf_expr_read_reg; -- ctx->read_mem = dwarf_expr_read_mem; -- ctx->get_frame_base = dwarf_expr_frame_base; -- ctx->get_tls_address = dwarf_expr_tls_address; -- -- dwarf_expr_eval (ctx, data, size); - 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); +- attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); +- if (attr && DW_STRING (attr)) +- return DW_STRING (attr); +- return dwarf2_name (die, cu); ++ return name; + } -+ /* 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); -- VALUE_ADDRESS (retval) = address; -+ set_value_address (retval, address); - } +-/* Get name of a die, return NULL if not found. */ ++/* Canonicalize the name of the given DIE. */ - set_value_initialized (retval, ctx->initialized); + 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; + } -- free_dwarf_expr_context (ctx); -+ do_cleanups (back_to); +-/* Return the constant value held by the given attribute. Return -1 +- if the value held by the attribute is not constant. */ ++/* (*val_return) is filled only if returning dwarf2_attr_const. */ - return retval; - } -@@ -587,7 +706,7 @@ static int - loclist_describe_location (struct symbol *symbol, struct ui_file *stream) +-static int +-dwarf2_get_attr_constant_value (struct attribute *attr, int default_value) ++static enum get_attr_constant_value ++get_attr_constant_value (struct attribute *attr, int *val_return) { - /* FIXME: Could print the entire list of locations. */ -- fprintf_filtered (stream, "a variable with multiple locations"); -+ fprintf_filtered (stream, _("a variable with multiple locations")); - return 1; ++ if (attr == NULL) ++ return dwarf2_attr_unknown; + if (attr->form == DW_FORM_sdata) +- return DW_SND (attr); +- else if (attr->form == DW_FORM_udata +- || attr->form == DW_FORM_data1 +- || attr->form == DW_FORM_data2 +- || attr->form == DW_FORM_data4 +- || attr->form == DW_FORM_data8) +- return DW_UNSND (attr); +- else + { +- complaint (&symfile_complaints, _("Attribute value is not a constant (%s)"), +- dwarf_form_name (attr->form)); +- 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 ++ || attr->form == DW_FORM_data4 ++ || attr->form == DW_FORM_data8) ++ { ++ *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 ++ || attr->form == DW_FORM_block4) ++ return dwarf2_attr_block; ++ complaint (&symfile_complaints, _("Attribute value is not a constant (%s)"), ++ dwarf_form_name (attr->form)); ++ return dwarf2_attr_unknown; } -@@ -603,16 +722,56 @@ loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax, + /* THIS_CU has a reference to PER_CU. If necessary, load the new compilation +@@ -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; +- int at_commandline; - 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)); + if (dwarf2_per_objfile->macinfo.buffer == NULL) + { +@@ -10999,29 +11636,19 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, + return; + } - dwarf2_tracepoint_var_ref (symbol, 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 = { - loclist_read_variable, - loclist_read_needs_frame, - loclist_describe_location, - loclist_tracepoint_var_ref - }; -+ -+static struct value * -+missing_read_variable (struct symbol *symbol, struct frame_info *frame) -+{ -+ struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); -+ -+ gdb_assert (dlbaton == NULL); -+ error (_("Unable to resolve variable \"%s\""), SYMBOL_PRINT_NAME (symbol)); -+} -+ -+static int -+missing_read_needs_frame (struct symbol *symbol) -+{ -+ return 0; -+} -+ -+static int -+missing_describe_location (struct symbol *symbol, struct ui_file *stream) -+{ -+ fprintf_filtered (stream, _("a variable we are unable to resolve")); -+ return 1; -+} -+ -+static void -+missing_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax, -+ struct axs_value *value) -+{ -+ struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); -+ -+ gdb_assert (dlbaton == NULL); -+ error (_("Unable to resolve variable \"%s\""), SYMBOL_PRINT_NAME (symbol)); -+} -+ -+/* 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 = { -+ 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 ---- 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 void object_address_set (CORE_ADDR address); -+ -+extern CORE_ADDR dwarf_locexpr_baton_eval -+ (struct dwarf2_locexpr_baton *dlbaton); - - #endif /* dwarf2loc.h */ -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c -index 55868da..9bc1386 100644 ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -1,8 +1,7 @@ - /* DWARF 2 debugging format support for GDB. - - Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, -- 2004, 2005, 2006, 2007, 2008, 2009 -- Free Software Foundation, Inc. -+ 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - 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" - #include "gdbcmd.h" - #include "addrmap.h" -+#include "f-lang.h" -+#include "c-lang.h" -+#include "typeprint.h" -+#include "block.h" - - #include - #include "gdb_string.h" -@@ -103,7 +106,7 @@ typedef struct pubnames_header - _PUBNAMES_HEADER; - #define _ACTUAL_PUBNAMES_HEADER_SIZE 13 - --/* .debug_pubnames header -+/* .debug_aranges header - 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; +- /* 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. - - /* 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; - }; - - /* Persistent data held for a compilation unit, even when not -@@ -451,17 +461,12 @@ 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; +- 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. */ - - /* 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; - - /* Flag set if the SCOPE field of this structure has been -@@ -472,10 +477,12 @@ struct partial_die_info - unsigned int has_byte_size : 1; + mac_ptr = dwarf2_per_objfile->macinfo.buffer + offset; + mac_end = dwarf2_per_objfile->macinfo.buffer + + dwarf2_per_objfile->macinfo.size; - /* The name of this DIE. Normally the value of DW_AT_name, but -- sometimes DW_TAG_MIPS_linkage_name or a string computed in some -- other fashion. */ -+ sometimes a default name for unnamed DIEs. */ - char *name; -- char *dirname; +- do ++ for (;;) + { ++ enum dwarf_macinfo_record_type macinfo_type; + -+ /* The linkage name of this DIE, from DW_AT_MIPS_linkage_name, or -+ NULL if no linkage name was present. */ -+ char *linkage_name; - - /* 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; + /* Do we at least have room for a macinfo type byte? */ + if (mac_ptr >= mac_end) + { +- /* 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; + } -- /* If HAS_STMT_LIST, the offset of the Line Number Information data. */ -- unsigned int line_offset; + macinfo_type = read_1_byte (abfd, mac_ptr); +@@ -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: +- break; - - /* 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; - }; - -+/* 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 -+ }; -+ - /* 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 *, - static void add_partial_symbol (struct partial_die_info *, - struct dwarf2_cu *); +- 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; -+static gdb_byte *read_comp_unit_head (struct comp_unit_head *, gdb_byte *, -+ bfd *); -+ - static int pdi_needs_namespace (enum dwarf_tag tag); + case DW_MACINFO_define: + case DW_MACINFO_undef: +@@ -11132,31 +11674,19 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, + mac_ptr += bytes_read; - static void add_partial_namespace (struct partial_die_info *pdi, -@@ -794,6 +810,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *); + 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 ((line == 0 && !at_commandline) || (line != 0 && at_commandline)) + complaint (&symfile_complaints, +- _("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", +- 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; - static void psymtab_to_symtab_1 (struct partial_symtab *); +@@ -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; -+static gdb_byte *dwarf2_read_section_1 (struct objfile *objfile, -+ struct obstack *obstack, -+ asection *sectp); -+ - gdb_byte *dwarf2_read_section (struct objfile *, asection *); +- 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; - 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 *, - struct dwarf2_cu *, struct partial_symtab *); +@@ -11239,7 +11756,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, + } + break; + } +- } while (macinfo_type != 0); ++ } + } - static int dwarf2_get_pc_bounds (struct die_info *, -- CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *); -+ CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *, -+ struct partial_symtab *pst); + /* Check if the attribute's form is a DW_FORM_block* +@@ -11272,7 +11789,7 @@ attr_form_is_section_offset (struct attribute *attr) - 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 *); + /* Return non-zero if ATTR's value falls in the 'constant' class, or + zero otherwise. When this function returns true, you can apply +- dwarf2_get_attr_constant_value to it. ++ get_attr_constant_value to it. - static void read_namespace (struct die_info *die, struct dwarf2_cu *); + However, note that for some attributes you must check + attr_form_is_section_offset before using this test. DW_FORM_data4 +@@ -11299,6 +11816,34 @@ attr_form_is_constant (struct attribute *attr) + } + } -+static void read_import_statement (struct die_info *die, struct dwarf2_cu *); ++/* Convert DW_BLOCK into struct dwarf2_locexpr_baton. ATTR must be a DW_BLOCK ++ attribute type. */ + - 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 struct dwarf2_locexpr_baton * ++dwarf2_attr_to_locexpr_baton (struct attribute *attr, struct dwarf2_cu *cu) ++{ ++ struct dwarf2_locexpr_baton *baton; ++ ++ gdb_assert (attr_form_is_block (attr)); + -+static void read_fortran_imported_module (struct die_info *die, -+ struct dwarf2_cu *cu); ++ baton = obstack_alloc (&cu->objfile->objfile_obstack, sizeof (*baton)); ++ baton->per_cu = cu->per_cu; ++ gdb_assert (baton->per_cu); + -+static void read_fortran_imported_declaration (struct die_info *die, -+ struct dwarf2_cu *cu); ++ /* Note that we're just copying the block's data pointer ++ here, not the actual data. We're still pointing into the ++ info_buffer for SYM's objfile; right now we never release ++ that buffer, but when we do clean up properly this may ++ need to change. */ ++ baton->size = DW_BLOCK (attr)->size; ++ baton->data = DW_BLOCK (attr)->data; ++ gdb_assert (baton->size == 0 || baton->data != NULL); + - 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); ++ return baton; ++} + -+static char *dwarf2_canonicalize_name (char *, struct dwarf2_cu *, -+ struct obstack *); ++/* SYM may get its SYMBOL_CLASS overriden on invalid ATTR content. */ + - 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 + dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym, + struct dwarf2_cu *cu) +@@ -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_COMPUTED_OPS (sym) = &dwarf2_locexpr_funcs; ++ SYMBOL_LOCATION_BATON (sym) = dwarf2_attr_to_locexpr_baton (attr, cu); ++ } + else + { +- struct dwarf2_locexpr_baton *baton; ++ dwarf2_invalid_attrib_class_complaint ("location description", ++ SYMBOL_NATURAL_NAME (sym)); - static unsigned int dwarf2_get_ref_die_offset (struct attribute *); - --static int dwarf2_get_attr_constant_value (struct attribute *, int); -+enum get_attr_constant_value -+ { -+ dwarf2_attr_unknown, -+ dwarf2_attr_const, -+ dwarf2_attr_block -+ }; -+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 void free_one_cached_comp_unit (void *); +- baton = obstack_alloc (&cu->objfile->objfile_obstack, +- sizeof (struct dwarf2_locexpr_baton)); +- baton->per_cu = cu->per_cu; +- gdb_assert (baton->per_cu); ++ /* Some methods are called w/o checking SYMBOL_COMPUTED_OPS validity. */ -+static void fetch_die_type_attrs (struct die_info *die, struct type *type, -+ struct dwarf2_cu *cu); +- if (attr_form_is_block (attr)) +- { +- /* Note that we're just copying the block's data pointer +- here, not the actual data. We're still pointing into the +- info_buffer for SYM's objfile; right now we never release +- that buffer, but when we do clean up properly this may +- need to change. */ +- baton->size = DW_BLOCK (attr)->size; +- baton->data = DW_BLOCK (attr)->data; +- } +- else +- { +- dwarf2_invalid_attrib_class_complaint ("location description", +- SYMBOL_NATURAL_NAME (sym)); +- baton->size = 0; +- baton->data = NULL; +- } +- +- SYMBOL_COMPUTED_OPS (sym) = &dwarf2_locexpr_funcs; +- SYMBOL_LOCATION_BATON (sym) = baton; ++ SYMBOL_COMPUTED_OPS (sym) = &dwarf2_missing_funcs; ++ SYMBOL_LOCATION_BATON (sym) = NULL; + - 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 *); ++ /* 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) ++ SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT; + } + } - static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu); +@@ -11644,6 +12179,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) + return ofs_lhs->offset == ofs_rhs->offset; + } -+static struct dwarf2_locexpr_baton *dwarf2_attr_to_locexpr_baton -+ (struct attribute *attr, struct dwarf2_cu *cu); ++/* Fill in generic attributes applicable for type DIEs. */ + - /* Try to locate the sections we need for DWARF 2 debugging - information and return true if we have enough to do something. */ ++static void ++fetch_die_type_attrs (struct die_info *die, struct type *type, ++ struct dwarf2_cu *cu) ++{ ++ struct attribute *attr; ++ ++ attr = dwarf2_attr (die, DW_AT_data_location, cu); ++ if (attr_form_is_block (attr)) ++ TYPE_DATA_LOCATION_DWARF_BLOCK (type) = dwarf2_attr_to_locexpr_baton (attr, ++ cu); ++ gdb_assert (!TYPE_DATA_LOCATION_IS_ADDR (type)); ++ ++ attr = dwarf2_attr (die, DW_AT_allocated, cu); ++ if (attr_form_is_block (attr)) ++ TYPE_ALLOCATED (type) = dwarf2_attr_to_locexpr_baton (attr, cu); ++ gdb_assert (!TYPE_NOT_ALLOCATED (type)); ++ ++ attr = dwarf2_attr (die, DW_AT_associated, cu); ++ if (attr_form_is_block (attr)) ++ TYPE_ASSOCIATED (type) = dwarf2_attr_to_locexpr_baton (attr, cu); ++ gdb_assert (!TYPE_NOT_ASSOCIATED (type)); ++} ++ + /* Set the type associated with DIE to TYPE. Save it in CU's hash + table if necessary. For convenience, return TYPE. */ - int - dwarf2_has_info (struct objfile *objfile) +@@ -11652,6 +12212,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) { -- struct dwarf2_per_objfile *data; -+ int update_sizes = 0; - - /* 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); -- dwarf2_per_objfile = data; -+ dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); -+ if (!dwarf2_per_objfile) -+ { -+ 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; -+ } + struct dwarf2_offset_and_type **slot, ofs; - 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); ++ fetch_die_type_attrs (die, type, cu); ++ + 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, ""); } -@@ -1149,51 +1207,61 @@ section_is_p (asection *sectp, const char *name) - in. */ +-/* If section described by INFO was mmapped, munmap it now. */ ++/* A helper function to destroy a debug section. */ static void --dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) -+dwarf2_locate_sections (bfd *abfd, asection *sectp, void *user_data) +-munmap_section_buffer (struct dwarf2_section_info *info) ++destroy_section (struct dwarf2_section_info *info) { -+ int update_sizes = * (int *) user_data; - if (section_is_p (sectp, INFO_SECTION)) - { -- 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; +- 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 6e79d4a..198bae3 100644 +--- a/gdb/elfread.c ++++ b/gdb/elfread.c +@@ -728,10 +728,18 @@ elf_symfile_read (struct objfile *objfile, int mainline) + str_sect->filepos, + bfd_section_size (abfd, str_sect)); } - else if (section_is_p (sectp, FRAME_SECTION)) ++ ++ if (dwarf2_has_info (objfile)) ++ dwarf2_create_quick_addrmap (objfile); ++} ++ ++static void ++read_psyms (struct objfile *objfile) ++{ + if (dwarf2_has_info (objfile)) { -- 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; - } + /* DWARF 2 sections */ +- dwarf2_build_psymtabs (objfile, mainline); ++ dwarf2_build_psymtabs (objfile, 0); } - 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; + + /* FIXME: kettenis/20030504: This still needs to be integrated with +@@ -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 */ ++ read_psyms, /* sym_read_psymbols */ + elf_symfile_finish, /* sym_finish: finished with file, cleanup */ + 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 7e41d39..37ffe23 100644 +--- a/gdb/eval.c ++++ b/gdb/eval.c +@@ -39,8 +39,12 @@ + #include "exceptions.h" + #include "regcache.h" + #include "user-regs.h" ++#include "python/python.h" + #include "valprint.h" ++#include "gdb_obstack.h" ++#include "objfiles.h" + #include "python/python.h" ++#include "dwarf2loc.h" + + #include "gdb_assert.h" + +@@ -651,6 +655,36 @@ ptrmath_type_p (struct type *type) } - -@@ -1250,6 +1320,86 @@ dwarf2_resize_section (asection *sectp, bfd_size_type new_size) - sectp->name); } -+/* A cleanup that frees an obstack. */ ++/* Constructs a fake method with the given parameter types. */ +static void -+finalize_obstack (void *o) ++free_param_types (void *arg) +{ -+ struct obstack *ob = o; -+ obstack_free (o, 0); ++ struct type *type = (struct type *) arg; ++ xfree (TYPE_FIELDS (type)); ++ xfree (TYPE_MAIN_TYPE (type)); ++ xfree (type); +} + -+/* Read the .debug_aranges section and construct an address map. */ -+ -+void -+dwarf2_create_quick_addrmap (struct objfile *objfile) ++static struct type * ++make_params (int num_types, struct type **param_types) +{ -+ char *aranges_buffer, *aranges_ptr; -+ bfd *abfd = objfile->obfd; -+ CORE_ADDR baseaddr; -+ struct cleanup *old; -+ struct obstack temp_obstack; -+ struct addrmap *mutable_map; -+ -+ if (!dwarf_aranges_section) -+ return; -+ -+ baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); -+ -+ aranges_buffer = dwarf2_read_section_1 (objfile, NULL, dwarf_aranges_section); -+ aranges_ptr = aranges_buffer; -+ old = make_cleanup (xfree, aranges_buffer); -+ -+ obstack_init (&temp_obstack); -+ make_cleanup (finalize_obstack, &temp_obstack); -+ mutable_map = addrmap_create_mutable (&temp_obstack); -+ -+ while ((aranges_ptr - aranges_buffer) < dwarf2_per_objfile->aranges_size) -+ { -+ struct comp_unit_head cu_header; -+ unsigned int bytes_read, segment_size, delta; -+ LONGEST info_offset; -+ struct dwarf2_cu cu; -+ -+ cu_header.initial_length_size = 0; -+ aranges_ptr = read_comp_unit_head (&cu_header, aranges_ptr, abfd); -+ -+ segment_size = read_1_byte (abfd, aranges_ptr); -+ aranges_ptr += 1; -+ -+ /* Align the pointer to twice the pointer size. I didn't see -+ this in the spec but it appears to be required. */ -+ delta = (aranges_ptr - aranges_buffer) % (2 * cu_header.addr_size); -+ delta = (2 * cu_header.addr_size - delta) % (2 * cu_header.addr_size); -+ aranges_ptr += delta; -+ -+ memset (&cu, 0, sizeof (cu)); -+ cu.header.addr_size = cu_header.addr_size; -+ -+ while (1) -+ { -+ CORE_ADDR address, length; -+ -+ address = read_address (abfd, aranges_ptr, &cu, &bytes_read); -+ aranges_ptr += bytes_read; -+ -+ length = read_address (abfd, aranges_ptr, &cu, &bytes_read); -+ aranges_ptr += bytes_read; -+ -+ if (address == 0 && length == 0) -+ break; -+ -+ address += baseaddr; ++ 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_ZALLOC (type, sizeof (struct field) * num_types); + -+ addrmap_set_empty (mutable_map, address, address + length, objfile); -+ } -+ } ++ while (num_types-- > 0) ++ TYPE_FIELD_TYPE (type, num_types) = param_types[num_types]; + -+ objfile->quick_addrmap = addrmap_create_fixed (mutable_map, -+ &objfile->objfile_obstack); -+ do_cleanups (old); ++ make_cleanup (free_param_types, type); ++ return type; +} + -+ - /* Build a partial symbol table. */ - - void -@@ -1453,22 +1603,24 @@ 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 -- partial symtab for each of these included files. -- -- This procedure assumes that there *is* a Line Number Program in -- the given CU. Callers should check that PDI->HAS_STMT_LIST is set -- before calling this procedure. */ -+ partial symtab for each of these included files. */ + struct value * + evaluate_subexp_standard (struct type *expect_type, + struct expression *exp, int *pos, +@@ -671,6 +705,7 @@ evaluate_subexp_standard (struct type *expect_type, + long mem_offset; + struct type **arg_types; + int save_pos1; ++ struct cleanup *old_chain; - 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; + pc = (*pos)++; + op = exp->elts[pc].opcode; +@@ -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, +- 0, noside); ++ expect_type, 0, noside); + if (arg1 == NULL) + error (_("There is no field named %s"), &exp->elts[pc + 3].string); + return arg1; +@@ -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) + { +- nargs++; + /* First, evaluate the structure into arg2 */ + pc2 = (*pos)++; -- 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. */ +@@ -1317,21 +1351,40 @@ evaluate_subexp_standard (struct type *expect_type, -@@ -1477,6 +1629,36 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu, - free_line_header (lh); - } + arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); -+/* Find the base address of the compilation unit for range lists and -+ location lists. It will normally be specified by DW_AT_low_pc. -+ In DWARF-3 draft 4, the base address could be overridden by -+ DW_AT_entry_pc. It's been removed, but GCC still uses this for -+ compilation units with discontinuous ranges. */ +- if (TYPE_CODE (check_typedef (value_type (arg1))) +- != TYPE_CODE_METHODPTR) +- error (_("Non-pointer-to-member value used in pointer-to-member " +- "construct")); +- +- if (noside == EVAL_AVOID_SIDE_EFFECTS) ++ type = check_typedef (value_type (arg1)); ++ switch (TYPE_CODE (type)) + { +- struct type *method_type = check_typedef (value_type (arg1)); +- arg1 = value_zero (method_type, not_lval); ++ case TYPE_CODE_METHODPTR: ++ if (noside == EVAL_AVOID_SIDE_EFFECTS) ++ arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval); ++ else ++ arg1 = cplus_method_ptr_to_value (&arg2, arg1); + -+static void -+dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu) -+{ -+ struct attribute *attr; ++ /* Now, say which argument to start evaluating from */ ++ nargs++; ++ tem = 2; ++ argvec[1] = arg2; ++ break; + -+ cu->base_known = 0; -+ cu->base_address = 0; ++ case TYPE_CODE_MEMBERPTR: ++ /* Now, convert these values to an address. */ ++ arg2 = value_cast (lookup_pointer_type (TYPE_DOMAIN_TYPE (type)), ++ arg2); + -+ attr = dwarf2_attr (die, DW_AT_entry_pc, cu); -+ if (attr) -+ { -+ cu->base_address = DW_ADDR (attr); -+ cu->base_known = 1; -+ } -+ else -+ { -+ attr = dwarf2_attr (die, DW_AT_low_pc, cu); -+ if (attr) -+ { -+ cu->base_address = DW_ADDR (attr); -+ cu->base_known = 1; -+ } -+ } -+} - - /* 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); ++ mem_offset = value_as_long (arg1); ++ ++ arg1 = value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)), ++ value_as_long (arg2) + mem_offset); ++ arg1 = value_ind (arg1); ++ tem = 1; ++ break; ++ ++ default: ++ error (_("Non-pointer-to-member value used in pointer-to-member " ++ "construct")); + } +- else +- arg1 = cplus_method_ptr_to_value (&arg2, arg1); -- if (comp_unit_die.tag == DW_TAG_partial_unit) -+ if (comp_unit_die->tag == DW_TAG_partial_unit) +- /* Now, say which argument to start evaluating from */ +- tem = 2; ++ argvec[0] = arg1; + } + else if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR) { - 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) +@@ -1457,8 +1510,7 @@ evaluate_subexp_standard (struct type *expect_type, } - - /* 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) + else if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { - 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; - } +- argvec[1] = arg2; +- argvec[0] = arg1; ++ /* Pointer to member. argvec is already set up. */ } -- 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); + else if (op == OP_VAR_VALUE) + { +@@ -1542,7 +1594,10 @@ evaluate_subexp_standard (struct type *expect_type, - do_cleanups (back_to_inner); - } -@@ -1690,11 +1878,12 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile) - { - 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; + /* 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_raw_address (arg1)); + type = check_typedef (value_type (arg1)); ++ do_cleanups (old_chain); + code = TYPE_CODE (type); - 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); + if (code == TYPE_CODE_PTR) +@@ -1709,6 +1764,37 @@ evaluate_subexp_standard (struct type *expect_type, + error (_("non-pointer-to-member value used in pointer-to-member construct")); + } - /* 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); ++ case TYPE_INSTANCE: ++ nargs = longest_to_int (exp->elts[pc + 1].longconst); ++ arg_types = (struct type **) alloca (nargs * sizeof (struct type *)); ++ for (ix = 0; ix < nargs; ++ix) ++ arg_types[ix] = exp->elts[pc + 1 + ix + 1].type; ++ ++ expect_type = make_params (nargs, arg_types); ++ *(pos) += 3 + nargs; ++ return evaluate_subexp_standard (expect_type, exp, pos, noside); ++ ++ case TYPE_INSTANCE_LOOKUP: ++ { ++ int i; ++ struct symbol *sym; ++ struct type **arg_types; ++ (*pos) += 3; ++ printf ("TYPE_INSTANCE_LOOKUP\n"); ++ arg_types = (struct type **) alloca (TYPE_NFIELDS (expect_type) ++ * sizeof (struct type *)); ++ for (i = 0; i < TYPE_NFIELDS (expect_type); ++i) ++ arg_types[i] = TYPE_FIELD_TYPE (expect_type, i); ++ (void) find_overload_match (arg_types, TYPE_NFIELDS (expect_type), ++ NULL /* no need for name */, ++ 0 /* not method */, ++ 0 /* strict match */, ++ NULL, exp->elts[pc + 1].symbol, NULL, ++ &sym, NULL); ++ i = 0; ++ } ++ break; ++ + case BINOP_CONCAT: + arg1 = evaluate_subexp_with_coercion (exp, pos, noside); + arg2 = evaluate_subexp_with_coercion (exp, pos, noside); +@@ -1980,13 +2066,19 @@ evaluate_subexp_standard (struct type *expect_type, + { + int subscript_array[MAX_FORTRAN_DIMS]; + int array_size_array[MAX_FORTRAN_DIMS]; ++ int byte_stride_array[MAX_FORTRAN_DIMS]; + int ndimensions = 1, i; + struct type *tmp_type; + int offset_item; /* The array offset where the item lives */ ++ CORE_ADDR offset_byte; /* byte_stride based offset */ ++ unsigned element_size; - /* 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); - - /* 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); + if (nargs > MAX_FORTRAN_DIMS) + error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS); - do_cleanups (back_to); -@@ -1948,7 +2140,7 @@ partial_die_parent_scope (struct partial_die_info *pdi, - ignoring them. */ - complaint (&symfile_complaints, - _("unhandled containing DIE tag %d for DIE at %d"), -- parent->tag, pdi->offset); -+ parent->tag, real_pdi->offset); - parent->scope = grandparent_scope; - } ++ old_chain = make_cleanup (null_cleanup, 0); ++ object_address_set (value_raw_address (arg1)); ++ + tmp_type = check_typedef (value_type (arg1)); + ndimensions = calc_f77_array_dims (type); -@@ -1963,12 +2155,37 @@ partial_die_full_name (struct partial_die_info *pdi, - struct dwarf2_cu *cu) - { - char *parent_scope; -+ struct partial_die_info *real_pdi; +@@ -2016,6 +2108,9 @@ evaluate_subexp_standard (struct type *expect_type, + upper = f77_get_upperbound (tmp_type); + lower = f77_get_lowerbound (tmp_type); -- parent_scope = partial_die_parent_scope (pdi, cu); -- if (parent_scope == NULL) -- return NULL; -- else -+ /* We need to look at our parent DIE; if we have a DW_AT_specification, -+ then this means the parent of the specification DIE. -+ partial_die_parent_scope does this loop also, but we do it here -+ since we need to examine real_pdi->parent ourselves. */ -+ -+ real_pdi = pdi; -+ while (real_pdi->has_specification) -+ real_pdi = find_partial_die (real_pdi->spec_offset, cu); -+ -+ parent_scope = partial_die_parent_scope (real_pdi, cu); -+ 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; -+ } -+ } ++ byte_stride_array[nargs - i - 1] = ++ TYPE_ARRAY_BYTE_STRIDE_VALUE (tmp_type); + -+ return NULL; - } + array_size_array[nargs - i - 1] = upper - lower + 1; - static void -@@ -1984,7 +2201,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) + /* Zero-normalize subscripts so that offsetting will work. */ +@@ -2034,13 +2129,25 @@ evaluate_subexp_standard (struct type *expect_type, + tmp_type = check_typedef (TYPE_TARGET_TYPE (tmp_type)); + } - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); ++ /* Kept for the f77_get_upperbound / f77_get_lowerbound calls above. */ ++ do_cleanups (old_chain); ++ + /* Now let us calculate the offset for this item */ -- 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); - 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 -- && 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); +- offset_item = subscript_array[ndimensions - 1]; ++ offset_item = 0; ++ offset_byte = 0; ++ ++ for (i = ndimensions - 1; i >= 0; --i) ++ { ++ offset_item *= array_size_array[i]; ++ if (byte_stride_array[i] == 0) ++ offset_item += subscript_array[i]; ++ else ++ offset_byte += subscript_array[i] * byte_stride_array[i]; ++ } - if (built_actual_name) - xfree (actual_name); -@@ -2158,6 +2382,14 @@ 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; - 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. */ +- 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; -- FIXME: Support the separate Fortran module namespaces. */ -+ add_partial_symbol (pdi, cu); + /* Let us now play a dirty trick: we will take arg1 + which is a value node pointing to the topmost level +@@ -2050,7 +2157,7 @@ evaluate_subexp_standard (struct type *expect_type, + returns the correct type value */ -- 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. */ - } + deprecated_set_value_type (arg1, tmp_type); +- return value_subscripted_rvalue (arg1, offset_item, 0); ++ return value_subscripted_rvalue (arg1, offset_byte); + } - /* 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, + case BINOP_LOGICAL_AND: +@@ -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, +- 1, noside); ++ NULL, 1, noside); + if (x == NULL) + error (_("There is no field named %s"), &exp->elts[pc + 3].string); + return x; +@@ -2636,7 +2743,7 @@ evaluate_subexp_with_coercion (struct expression *exp, + { + enum exp_opcode op; + int pc; +- struct value *val; ++ struct value *val = NULL; + struct symbol *var; + struct type *type; - while (child_pdi != NULL) +@@ -2647,12 +2754,17 @@ evaluate_subexp_with_coercion (struct expression *exp, + { + case OP_VAR_VALUE: + var = exp->elts[pc + 2].symbol; ++ /* address_of_variable will call object_address_set for check_typedef. ++ Call it only if required as it can error-out on VAR in register. */ ++ if (TYPE_DYNAMIC (SYMBOL_TYPE (var))) ++ val = address_of_variable (var, exp->elts[pc + 1].block); + type = check_typedef (SYMBOL_TYPE (var)); + if (TYPE_CODE (type) == TYPE_CODE_ARRAY + && CAST_IS_CONVERSION) { -- 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) - CORE_ADDR lowpc, highpc; - struct symtab *symtab; - struct cleanup *back_to; -- struct attribute *attr; - 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) - - cu->list_in_scope = &file_symbols; + (*pos) += 4; +- val = address_of_variable (var, exp->elts[pc + 1].block); ++ if (!val) ++ val = address_of_variable (var, exp->elts[pc + 1].block); + return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)), + val); + } +@@ -2704,9 +2816,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos) -- /* Find the base address of the compilation unit for range lists and -- location lists. It will normally be specified by DW_AT_low_pc. -- In DWARF-3 draft 4, the base address could be overridden by -- DW_AT_entry_pc. It's been removed, but GCC still uses this for -- compilation units with discontinuous ranges. */ -- -- cu->base_known = 0; -- cu->base_address = 0; -- -- attr = dwarf2_attr (cu->dies, DW_AT_entry_pc, cu); -- if (attr) -- { -- cu->base_address = DW_ADDR (attr); -- cu->base_known = 1; -- } -- else -- { -- attr = dwarf2_attr (cu->dies, DW_AT_low_pc, cu); -- if (attr) -- { -- cu->base_address = DW_ADDR (attr); -- cu->base_known = 1; -- } -- } -+ dwarf2_find_base_address (cu->dies, cu); + case OP_VAR_VALUE: + (*pos) += 4; +- type = check_typedef (SYMBOL_TYPE (exp->elts[pc + 2].symbol)); +- return +- value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type)); ++ /* We do not need to call read_var_value but the object evaluation may ++ need to have executed object_address_set which needs valid ++ SYMBOL_VALUE_ADDRESS of the symbol. Still VALUE returned by ++ read_var_value we left as lazy. */ ++ type = value_type (read_var_value (exp->elts[pc + 2].symbol, ++ deprecated_safe_get_selected_frame ())); ++ return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type)); - /* 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) - static void - process_die (struct die_info *die, struct dwarf2_cu *cu) - { -+ - switch (die->tag) - { - case DW_TAG_padding: -@@ -2849,6 +3058,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) - - 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; - - /* 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; + val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS); +diff --git a/gdb/expression.h b/gdb/expression.h +index 12163e3..bf2b518 100644 +--- a/gdb/expression.h ++++ b/gdb/expression.h +@@ -88,6 +88,16 @@ enum exp_opcode + when X is a pointer instead of an aggregate. */ + STRUCTOP_MPTR, - 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); -+ } -+ -+ if (cu->language == language_cplus && die->tag == DW_TAG_subprogram) -+ { -+ struct type *type = read_type_die (die, cu); ++ /* TYPE_INSTANCE is used when the user specifies a specific ++ type instantiation for overloaded methods/functions. The format ++ is: TYPE_INSTANCE num_types type0 ... typeN num_types TYPE_INSTANCE*/ ++ TYPE_INSTANCE, + -+ if (buf == NULL) -+ { -+ buf = mem_fileopen (); -+ fputs_unfiltered (name, buf); -+ } ++ /* TYPE_INSTANCE_LOOKUP is used when the user specifies a specific ++ type instantiation of a function (not a method). In this case, ++ we must toss the results of the parser and manually do the lookup. */ ++ TYPE_INSTANCE_LOOKUP, + -+ c_type_print_args (type, buf, 0); -+ } + /* end of C++. */ + + /* For Modula-2 integer division DIV */ +@@ -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 *); + + -+ if (buf != NULL) -+ { -+ long length; -+ name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, -+ &length); -+ ui_file_delete (buf); -+ } + #endif /* !defined (EXPRESSION_H) */ +diff --git a/gdb/f-exp.y b/gdb/f-exp.y +index c04c8f4..ddcd460 100644 +--- a/gdb/f-exp.y ++++ b/gdb/f-exp.y +@@ -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 ++%token LOGICAL_S8_KEYWORD + %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 +@@ -606,6 +607,8 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */ + { $$ = parse_f_type->builtin_integer_s2; } + | CHARACTER + { $$ = parse_f_type->builtin_character; } ++ | LOGICAL_S8_KEYWORD ++ { $$ = parse_f_type->builtin_logical_s8;} + | LOGICAL_KEYWORD + { $$ = parse_f_type->builtin_logical; } + | LOGICAL_S2_KEYWORD +@@ -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 }, ++ { "logical_8", LOGICAL_S8_KEYWORD, BINOP_END }, + { "complex_8", COMPLEX_S8_KEYWORD, BINOP_END }, + { "integer", INT_KEYWORD, BINOP_END }, + { "logical", LOGICAL_KEYWORD, BINOP_END }, +diff --git a/gdb/f-lang.c b/gdb/f-lang.c +index 19c1316..8d2a538 100644 +--- a/gdb/f-lang.c ++++ b/gdb/f-lang.c +@@ -55,20 +55,6 @@ typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR; + /* Local functions */ - return name; - } + extern void _initialize_f_language (void); +-#if 0 +-static void clear_function_list (void); +-static long get_bf_for_fcn (long); +-static void clear_bf_list (void); +-static void patch_all_commons_by_name (char *, CORE_ADDR, int); +-static SAVED_F77_COMMON_PTR find_first_common_named (char *); +-static void add_common_entry (struct symbol *); +-static void add_common_block (char *, CORE_ADDR, int, char *); +-static SAVED_FUNCTION *allocate_saved_function_node (void); +-static SAVED_BF_PTR allocate_saved_bf_node (void); +-static COMMON_ENTRY_PTR allocate_common_entry_node (void); +-static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void); +-static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int); +-#endif -+/* 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){ -+ struct attribute *line_attr; + 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, ++ f_primitive_type_logical_s8, + f_primitive_type_integer, + f_primitive_type_integer_s2, + f_primitive_type_real, +@@ -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; ++ lai->primitive_type_vector [f_primitive_type_logical_s8] ++ = builtin->builtin_logical_s8; + lai->primitive_type_vector [f_primitive_type_real] + = builtin->builtin_real; + lai->primitive_type_vector [f_primitive_type_real_s8] +@@ -372,6 +361,10 @@ build_fortran_types (struct gdbarch *gdbarch) + = arch_boolean_type (gdbarch, gdbarch_short_bit (gdbarch), 1, + "logical*2"); + ++ builtin_f_type->builtin_logical_s8 ++ = arch_boolean_type (gdbarch, gdbarch_long_long_bit (gdbarch), 1, ++ "logical*8"); + -+ line_attr = dwarf2_attr (die, DW_AT_decl_line, cu); -+ if (line_attr){ -+ return DW_UNSND (line_attr); -+ } -+ -+ return -1; -+} -+ -+/* 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; -+ const char *import_alias; -+ const char *imported_declaration = ""; -+ const char *import_prefix; -+ -+ int line_number = -1; -+ -+ 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; -+ } -+ -+ /* Figure out the local name after import. */ -+ import_alias = dwarf2_name(die, cu); -+ if(import_alias == NULL){ -+ import_alias = ""; -+ } -+ -+ /* Determine the line number at which the import was made */ -+ line_number = dwarf2_read_decl_line(die, cu); -+ -+ /* Figure out where the statement is being imported to */ -+ 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 -+ */ -+ imported_name_prefix = determine_prefix (imported_die, cu); -+ -+ 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); -+ }else{ -+ canonical_name = alloca (strlen (imported_name) + 1); -+ strcpy (canonical_name, imported_name); -+ } -+ } -+ -+ using_directives = cp_add_using (import_prefix, -+ canonical_name, -+ import_alias, -+ 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 explore_abstract_origin(struct die_info *die, struct dwarf2_cu *cu, unsigned* die_children_p){ -+ struct attribute *attr; -+ unsigned die_children = *die_children_p; -+ struct die_info *child_die; -+ -+ attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); -+ -+ /* GCC currently uses DW_AT_specification to indicate die inheritence -+ in the case of import statements. The following is to accommodate that */ -+ if(!attr){ -+ attr = dwarf2_attr (die, DW_AT_specification, 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) -+ { -+ 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); -+ } -+ -+} -+ - 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) - char *name; - CORE_ADDR baseaddr; - struct block *block; -+ unsigned die_children; - - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - -- name = dwarf2_linkage_name (die, cu); -+ name = dwarf2_name (die, cu); - - /* Ignore functions with missing or empty names and functions with - missing or invalid low and high pc attributes. */ -- if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu)) -+ if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)){ -+ /* 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); -+ die_children++; -+ } -+ 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) - - 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) -+ { -+ 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); - } + builtin_f_type->builtin_integer + = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, + "integer"); +@@ -418,395 +411,3 @@ _initialize_f_language (void) - 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) - as multiple lexical blocks? Handling children in a sane way would - be nasty. Might be easier to properly extend generic blocks to - describe ranges. */ -- if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu)) -+ if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)) - return; - lowpc += baseaddr; - highpc += baseaddr; -@@ -3197,7 +3722,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu) - } - new = pop_context (); - -- if (local_symbols != NULL) -+ if (local_symbols != NULL || using_directives!= NULL ) - { - 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, - discontinuous, i.e. derived from DW_AT_ranges information. */ - static int - dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, -- CORE_ADDR *highpc, struct dwarf2_cu *cu) -+ CORE_ADDR *highpc, struct dwarf2_cu *cu, -+ struct partial_symtab *pst) - { - struct attribute *attr; - CORE_ADDR low = 0; -@@ -3379,7 +3906,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. */ -- if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, NULL)) -+ if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, pst)) - return 0; - /* Found discontinuous range of addresses. */ - ret = -1; -@@ -3418,7 +3945,7 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die, - CORE_ADDR low, high; - struct die_info *child = die->child; - -- if (dwarf2_get_pc_bounds (die, &low, &high, cu)) -+ if (dwarf2_get_pc_bounds (die, &low, &high, cu, NULL)) - { - *lowpc = min (*lowpc, low); - *highpc = max (*highpc, high); -@@ -3455,7 +3982,7 @@ get_scope_pc_bounds (struct die_info *die, - CORE_ADDR best_high = (CORE_ADDR) 0; - CORE_ADDR current_low, current_high; - -- if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu)) -+ if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu, NULL)) - { - best_low = current_low; - best_high = current_high; -@@ -3667,7 +4194,12 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, - byte_offset = 0; - } - else if (attr_form_is_constant (attr)) -- byte_offset = dwarf2_get_attr_constant_value (attr, 0); -+ { -+ enum get_attr_constant_value type; -+ -+ type = get_attr_constant_value (attr, &byte_offset); -+ gdb_assert (type == dwarf2_attr_const); -+ } - else - byte_offset = decode_locdesc (DW_BLOCK (attr), cu); - -@@ -3750,8 +4282,14 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, - if (fieldname == NULL) - return; - -- /* Get physical name. */ -+ /* Get physical name. We prefer the linkage name if one was specified, -+ because this lets GDB find a non-debugging version of the symbol. -+ Otherwise construct the full name from type information. Ideally, -+ 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, - if (fieldname == NULL) - return; - -- /* Get the mangled name. */ -+ /* Get physical name. We prefer the linkage name if one was specified, -+ because this lets GDB find a non-debugging version of the symbol. -+ Otherwise construct the full name from type information. Ideally, -+ 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, - /* The name is already allocated along with this objfile, so we don't - need to duplicate it for the type. */ - fnp->physname = physname ? physname : ""; -- fnp->type = alloc_type (objfile); -+ fnp->type = alloc_type (objfile, NULL); - 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) - return NULL; - - domain_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (pfn_type, 0)); -- type = alloc_type (objfile); -+ type = alloc_type (objfile, NULL); - 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; - -- 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; - -- 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) - { -- 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, -- 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) - new_symbol (die, this_type, cu); + add_language (&f_language_defn); } - -+/* Create a new array dimension referencing its target type TYPE. -+ -+ Multidimensional arrays are internally represented as a stack of -+ singledimensional arrays being referenced by their TYPE_TARGET_TYPE. */ -+ -+static struct type * -+create_single_array_dimension (struct type *type, struct type *range_type, -+ struct die_info *die, struct dwarf2_cu *cu) -+{ -+ type = create_array_type (NULL, type, range_type); -+ -+ /* These generic type attributes need to be fetched by -+ evaluate_subexp_standard 's call of -+ value_subscripted_rvalue only for the innermost array type. */ -+ fetch_die_type_attrs (die, type, cu); -+ -+ /* These generic type attributes are checked for allocated/associated -+ validity while accessing FIELD_LOC_KIND_DWARF_BLOCK. */ -+ fetch_die_type_attrs (die, range_type, cu); -+ -+ return type; -+} -+ - /* 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) - struct type *element_type, *range_type, *index_type; - struct type **range_types = NULL; - struct attribute *attr; -- int ndim = 0; -+ int ndim = 0, i; - struct cleanup *back_to; - char *name; - -@@ -4570,16 +5142,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) +- +-#if 0 +-static SAVED_BF_PTR +-allocate_saved_bf_node (void) +-{ +- SAVED_BF_PTR new; +- +- new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF)); +- return (new); +-} +- +-static SAVED_FUNCTION * +-allocate_saved_function_node (void) +-{ +- SAVED_FUNCTION *new; +- +- new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION)); +- return (new); +-} +- +-static SAVED_F77_COMMON_PTR +-allocate_saved_f77_common_node (void) +-{ +- SAVED_F77_COMMON_PTR new; +- +- new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON)); +- return (new); +-} +- +-static COMMON_ENTRY_PTR +-allocate_common_entry_node (void) +-{ +- COMMON_ENTRY_PTR new; +- +- new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY)); +- return (new); +-} +-#endif +- +-SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */ +-SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */ +-SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */ +- +-#if 0 +-static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function) +- list */ +-static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */ +-static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list +- */ +- +-static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use +- in macros */ +- +-/* The following function simply enters a given common block onto +- the global common block chain */ +- +-static void +-add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab) +-{ +- SAVED_F77_COMMON_PTR tmp; +- char *c, *local_copy_func_stab; +- +- /* If the COMMON block we are trying to add has a blank +- name (i.e. "#BLNK_COM") then we set it to __BLANK +- because the darn "#" character makes GDB's input +- parser have fits. */ +- +- +- if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0 +- || strcmp (name, BLANK_COMMON_NAME_MF77) == 0) - { -- int i = 0; -- while (i < ndim) -- type = create_array_type (NULL, type, range_types[i++]); +- +- xfree (name); +- name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1); +- strcpy (name, BLANK_COMMON_NAME_LOCAL); - } +- +- tmp = allocate_saved_f77_common_node (); +- +- local_copy_func_stab = xmalloc (strlen (func_stab) + 1); +- strcpy (local_copy_func_stab, func_stab); +- +- tmp->name = xmalloc (strlen (name) + 1); +- +- /* local_copy_func_stab is a stabstring, let us first extract the +- function name from the stab by NULLing out the ':' character. */ +- +- +- c = NULL; +- c = strchr (local_copy_func_stab, ':'); +- +- if (c) +- *c = '\0'; - else +- error (_("Malformed function STAB found in add_common_block()")); +- +- +- tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1); +- +- strcpy (tmp->owning_function, local_copy_func_stab); +- +- strcpy (tmp->name, name); +- tmp->offset = offset; +- tmp->next = NULL; +- tmp->entries = NULL; +- tmp->secnum = secnum; +- +- current_common = tmp; +- +- if (head_common_list == NULL) - { -- while (ndim-- > 0) -- type = create_array_type (NULL, type, range_types[ndim]); +- head_common_list = tail_common_list = tmp; - } -+ for (i = 0; i < ndim; i++) -+ type = create_single_array_dimension (type, range_types[i], die, cu); -+ else /* (read_array_order (die, cu) == DW_ORD_row_major) */ -+ for (i = ndim - 1; i >= 0; i--) -+ type = create_single_array_dimension (type, range_types[i], die, cu); - - /* 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) - return set_die_type (die, set_type, cu); - } - --/* First cut: install each common block member as a global variable. */ -+/* Create appropriate locally-scoped variables for all the DW_TAG_common_block -+ entries. Create also TYPE_CODE_STRUCT listing all such variables to be -+ available for `info common'. COMMON_BLOCK_DOMAIN is used to sepate the -+ common blocks name namespace from regular variable names. */ - - static void - read_common_block (struct die_info *die, struct dwarf2_cu *cu) - { -- struct die_info *child_die; - 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) - } - if (die->child != NULL) - { -+ struct objfile *objfile = cu->objfile; -+ struct die_info *child_die; -+ struct type *type; -+ struct field *field; -+ char *name; -+ struct symbol *sym; -+ -+ type = alloc_type (objfile, NULL); -+ TYPE_CODE (type) = TYPE_CODE_STRUCT; -+ /* Artificial type to be used only by `info common'. */ -+ TYPE_NAME (type) = ""; -+ -+ child_die = die->child; -+ while (child_die && child_die->tag) -+ { -+ TYPE_NFIELDS (type)++; -+ child_die = sibling_die (child_die); -+ } -+ -+ TYPE_FIELDS (type) = obstack_alloc (&objfile->objfile_obstack, -+ sizeof (*TYPE_FIELDS (type)) -+ * TYPE_NFIELDS (type)); -+ memset (TYPE_FIELDS (type), 0, sizeof (*TYPE_FIELDS (type)) -+ * TYPE_NFIELDS (type)); -+ -+ field = TYPE_FIELDS (type); - 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); -+ -+ /* Undocumented in DWARF3, when it can be present? */ - 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) - base + decode_locdesc (DW_BLOCK (attr), cu); - add_symbol_to_list (sym, &global_symbols); - } -+ -+ if (SYMBOL_CLASS (sym) == LOC_STATIC) -+ SET_FIELD_PHYSADDR (*field, SYMBOL_VALUE_ADDRESS (sym)); -+ else -+ SET_FIELD_PHYSNAME (*field, SYMBOL_LINKAGE_NAME (sym)); -+ FIELD_TYPE (*field) = SYMBOL_TYPE (sym); -+ FIELD_NAME (*field) = SYMBOL_NATURAL_NAME (sym); -+ field++; - child_die = sibling_die (child_die); - } -+ -+ /* TYPE_LENGTH (type) is left 0 - it is only a virtual structure even -+ with no consecutive address space. */ -+ -+ sym = new_symbol (die, type, cu); -+ /* SYMBOL_VALUE_ADDRESS never gets used as all its fields are static. */ -+ SYMBOL_VALUE_ADDRESS (sym) = base; -+ -+ set_die_type (die, type, cu); - } - } - -@@ -4756,9 +5372,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), "", "", 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; - 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); -+ /* LOW_BOUND and HIGH_BOUND are set for real below. */ -+ range_type = create_range_type (range_type, index_type, 0, -1); -+ -+ /* C/C++ should probably have the low bound 0 but C/C++ does not use -+ DW_TAG_string_type. */ -+ TYPE_LOW_BOUND (range_type) = 1; - - attr = dwarf2_attr (die, DW_AT_string_length, cu); -- if (attr) +- else - { -- length = DW_UNSND (attr); +- tail_common_list->next = tmp; +- tail_common_list = tmp; - } +-} +-#endif +- +-/* The following function simply enters a given common entry onto +- the "current_common" block that has been saved away. */ +- +-#if 0 +-static void +-add_common_entry (struct symbol *entry_sym_ptr) +-{ +- COMMON_ENTRY_PTR tmp; +- +- +- +- /* The order of this list is important, since +- we expect the entries to appear in decl. +- order when we later issue "info common" calls */ +- +- tmp = allocate_common_entry_node (); +- +- tmp->next = NULL; +- tmp->symbol = entry_sym_ptr; +- +- if (current_common == NULL) +- error (_("Attempt to add COMMON entry with no block open!")); - else - { -- /* check for the DW_AT_byte_size attribute */ -+ switch (get_attr_constant_value (attr, &length)) -+ { -+ case dwarf2_attr_const: -+ /* We currently do not support a constant address where the location -+ should be read from - DWARF2_ATTR_BLOCK is expected instead. See -+ DWARF for the DW_AT_STRING_LENGTH vs. DW_AT_BYTE_SIZE difference. */ -+ /* PASSTHRU */ -+ case dwarf2_attr_unknown: - attr = dwarf2_attr (die, DW_AT_byte_size, cu); -- if (attr) -- { -- length = DW_UNSND (attr); -- } +- if (current_common->entries == NULL) +- { +- current_common->entries = tmp; +- current_common->end_of_entries = tmp; +- } - else -- { -- length = 1; -- } -+ switch (get_attr_constant_value (attr, &length)) -+ { -+ case dwarf2_attr_unknown: -+ length = 1; -+ /* PASSTHRU */ -+ case dwarf2_attr_const: -+ TYPE_HIGH_BOUND (range_type) = length; -+ break; -+ case dwarf2_attr_block: -+ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 1); -+ TYPE_FIELD_DWARF_BLOCK (range_type, 1) = -+ dwarf2_attr_to_locexpr_baton (attr, cu); -+ TYPE_DYNAMIC (range_type) = 1; -+ break; -+ } -+ break; -+ case dwarf2_attr_block: -+ /* Security check for a size overflow. */ -+ if (DW_BLOCK (attr)->size + 2 < DW_BLOCK (attr)->size) -+ { -+ TYPE_HIGH_BOUND (range_type) = 1; -+ break; -+ } -+ /* Extend the DWARF block by a new DW_OP_deref/DW_OP_deref_size -+ instruction as DW_AT_string_length specifies the length location, not -+ its value. */ -+ { -+ struct dwarf2_locexpr_baton *length_baton; -+ struct attribute *size_attr; -+ -+ length_baton = obstack_alloc (&cu->comp_unit_obstack, -+ sizeof (*length_baton)); -+ length_baton->per_cu = cu->per_cu; -+ length_baton->data = obstack_alloc (&cu->comp_unit_obstack, -+ DW_BLOCK (attr)->size + 2); -+ memcpy (length_baton->data, DW_BLOCK (attr)->data, -+ DW_BLOCK (attr)->size); -+ -+ /* DW_AT_BYTE_SIZE existing together with DW_AT_STRING_LENGTH specifies -+ the size of an integer to fetch. */ -+ -+ size_attr = dwarf2_attr (die, DW_AT_byte_size, cu); -+ if (size_attr) -+ { -+ length_baton->size = DW_BLOCK (attr)->size + 2; -+ length_baton->data[DW_BLOCK (attr)->size] = DW_OP_deref_size; -+ length_baton->data[DW_BLOCK (attr)->size + 1] -+ = DW_UNSND (size_attr); -+ if (length_baton->data[DW_BLOCK (attr)->size + 1] -+ != DW_UNSND (size_attr)) -+ complaint (&symfile_complaints, -+ _("DW_AT_string_length's DW_AT_byte_size integer " -+ "exceeds the byte size storage")); -+ } -+ else -+ { -+ length_baton->size = DW_BLOCK (attr)->size + 1; -+ length_baton->data[DW_BLOCK (attr)->size] = DW_OP_deref; -+ } -+ -+ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 1); -+ TYPE_FIELD_DWARF_BLOCK (range_type, 1) = length_baton; -+ TYPE_DYNAMIC (range_type) = 1; -+ } -+ break; - } - -- index_type = builtin_type_int32; -- range_type = create_range_type (NULL, index_type, 1, length); - type = create_string_type (NULL, range_type); - - return set_die_type (die, type, cu); -@@ -5067,7 +5882,6 @@ static struct type * - read_typedef (struct die_info *die, struct dwarf2_cu *cu) - { - struct objfile *objfile = cu->objfile; -- struct attribute *attr; - const char *name = NULL; - struct type *this_type; - -@@ -5175,8 +5989,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) - struct type *base_type; - struct type *range_type; - struct attribute *attr; -- int low = 0; -- int high = -1; -+ int low, high, byte_stride_int; -+ enum get_attr_constant_value high_type; - char *name; - - base_type = die_type (die, cu); -@@ -5189,42 +6003,90 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) - 0, NULL, cu->objfile); - } - -- if (cu->language == language_fortran) -- { -- /* FORTRAN implies a lower bound of 1, if not given. */ -- low = 1; +- { +- current_common->end_of_entries->next = tmp; +- current_common->end_of_entries = tmp; +- } - } -+ /* LOW_BOUND and HIGH_BOUND are set for real below. */ -+ range_type = create_range_type (NULL, base_type, 0, -1); - -- /* FIXME: For variable sized arrays either of these could be -- a variable rather than a constant value. We'll allow it, -- but we don't know how to handle it. */ - attr = dwarf2_attr (die, DW_AT_lower_bound, cu); -- if (attr) -- low = dwarf2_get_attr_constant_value (attr, 0); -+ switch (get_attr_constant_value (attr, &low)) -+ { -+ case dwarf2_attr_unknown: -+ if (cu->language == language_fortran) -+ { -+ /* FORTRAN implies a lower bound of 1, if not given. */ -+ low = 1; -+ } -+ else -+ { -+ /* According to DWARF we should assume the value 0 only for -+ LANGUAGE_C and LANGUAGE_CPLUS. */ -+ low = 0; -+ } -+ /* PASSTHRU */ -+ case dwarf2_attr_const: -+ TYPE_LOW_BOUND (range_type) = low; -+ if (low >= 0) -+ TYPE_UNSIGNED (range_type) = 1; -+ break; -+ case dwarf2_attr_block: -+ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 0); -+ TYPE_FIELD_DWARF_BLOCK (range_type, 0) = dwarf2_attr_to_locexpr_baton -+ (attr, cu); -+ TYPE_DYNAMIC (range_type) = 1; -+ /* For setting a default if DW_AT_UPPER_BOUND would be missing. */ -+ low = 0; -+ break; -+ } - - attr = dwarf2_attr (die, DW_AT_upper_bound, cu); -- if (attr) -- { -- if (attr->form == DW_FORM_block1) -- { -- /* GCC encodes arrays with unspecified or dynamic length -- with a DW_FORM_block1 attribute. -- FIXME: GDB does not yet know how to handle dynamic -- arrays properly, treat them as arrays with unspecified -- length for now. +-} +-#endif - -- FIXME: jimb/2003-09-22: GDB does not really know -- how to handle arrays of unspecified length -- either; we just represent them as zero-length -- arrays. Choose an appropriate upper bound given -- the lower bound we've computed above. */ -- high = low - 1; -- } +-/* This routine finds the first encountred COMMON block named "name" */ +- +-#if 0 +-static SAVED_F77_COMMON_PTR +-find_first_common_named (char *name) +-{ +- +- SAVED_F77_COMMON_PTR tmp; +- +- tmp = head_common_list; +- +- while (tmp != NULL) +- { +- if (strcmp (tmp->name, name) == 0) +- return (tmp); - else -- high = dwarf2_get_attr_constant_value (attr, 1); -+ high_type = get_attr_constant_value (attr, &high); -+ if (high_type == dwarf2_attr_unknown) -+ { -+ attr = dwarf2_attr (die, DW_AT_count, cu); -+ high_type = get_attr_constant_value (attr, &high); -+ /* It does not hurt but it is needlessly ineffective in check_typedef. */ -+ if (high_type != dwarf2_attr_unknown) -+ { -+ TYPE_RANGE_HIGH_BOUND_IS_COUNT (range_type) = 1; -+ TYPE_DYNAMIC (range_type) = 1; -+ } -+ /* Pass it now as the regular DW_AT_upper_bound. */ -+ } -+ switch (high_type) -+ { -+ case dwarf2_attr_unknown: -+ TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (range_type) = 1; -+ high = low - 1; -+ /* PASSTHRU */ -+ case dwarf2_attr_const: -+ TYPE_HIGH_BOUND (range_type) = high; -+ break; -+ case dwarf2_attr_block: -+ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 1); -+ TYPE_FIELD_DWARF_BLOCK (range_type, 1) = dwarf2_attr_to_locexpr_baton -+ (attr, cu); -+ TYPE_DYNAMIC (range_type) = 1; -+ break; - } - -- range_type = create_range_type (NULL, base_type, low, high); -+ /* DW_AT_bit_stride is currently unsupported as we count in bytes. */ -+ attr = dwarf2_attr (die, DW_AT_byte_stride, cu); -+ switch (get_attr_constant_value (attr, &byte_stride_int)) -+ { -+ case dwarf2_attr_unknown: -+ break; -+ case dwarf2_attr_const: -+ if (byte_stride_int == 0) -+ complaint (&symfile_complaints, -+ _("Found DW_AT_byte_stride with unsupported value 0")); -+ TYPE_BYTE_STRIDE (range_type) = byte_stride_int; -+ break; -+ case dwarf2_attr_block: -+ TYPE_RANGE_BOUND_SET_DWARF_BLOCK (range_type, 2); -+ TYPE_FIELD_DWARF_BLOCK (range_type, 2) = dwarf2_attr_to_locexpr_baton -+ (attr, cu); -+ TYPE_DYNAMIC (range_type) = 1; -+ break; -+ } - - 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 +- tmp = tmp->next; +- } +- return (NULL); +-} +-#endif +- +-/* This routine finds the first encountred COMMON block named "name" +- that belongs to function funcname */ +- +-SAVED_F77_COMMON_PTR +-find_common_for_function (char *name, char *funcname) +-{ +- +- SAVED_F77_COMMON_PTR tmp; +- +- tmp = head_common_list; +- +- while (tmp != NULL) - { -- base_address_none, -- base_address_low_pc, -- /* Overrides BASE_ADDRESS_LOW_PC. */ -- base_address_entry_pc +- if (strcmp (tmp->name, name) == 0 +- && strcmp (tmp->owning_function, funcname) == 0) +- return (tmp); +- else +- tmp = tmp->next; - } -- 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: +- return (NULL); +-} - -- /* 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; -+ } - break; - case DW_AT_MIPS_linkage_name: -- part_die->name = DW_STRING (&attr); -+ part_die->linkage_name = DW_STRING (&attr); - 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); - 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, - || dwarf2_per_objfile->has_section_at_zero)) - part_die->has_pc_info = 1; - -- if (base_address_type != base_address_none && !cu->base_known) +- +-#if 0 +- +-/* The following function is called to patch up the offsets +- for the statics contained in the COMMON block named +- "name." */ +- +-static void +-patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum) +-{ +- COMMON_ENTRY_PTR entry; +- +- blk->offset = offset; /* Keep this around for future use. */ +- +- entry = blk->entries; +- +- while (entry != NULL) - { -- gdb_assert (part_die->tag == DW_TAG_compile_unit); -- cu->base_known = 1; -- cu->base_address = base_address; +- SYMBOL_VALUE (entry->symbol) += offset; +- SYMBOL_SECTION (entry->symbol) = secnum; +- +- entry = entry->next; - } +- blk->secnum = secnum; +-} - - return info_ptr; - } - -@@ -6173,7 +7034,9 @@ 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)) - { - 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, - (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 -- or memory numbers show me otherwise. */ -+ or memory numbers show me otherwise. -+ -+ SYMBOL_CLASS may get overriden by dwarf2_symbol_mark_computed. */ - -- dwarf2_symbol_mark_computed (attr, sym, cu); - SYMBOL_CLASS (sym) = LOC_COMPUTED; -+ dwarf2_symbol_mark_computed (attr, sym, cu); - } - - /* 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) - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - - if (die->tag != DW_TAG_namespace) -- name = dwarf2_linkage_name (die, cu); -+ name = dwarf2_name (die, cu); - else - name = TYPE_NAME (type); - - if (name) - { -+ const char *linkagename; -+ - sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack, - 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; - -- /* Cache this symbol's name and the name's demangled form (if any). */ - SYMBOL_LANGUAGE (sym) = cu->language; -- SYMBOL_SET_NAMES (sym, name, strlen (name), objfile); -+ -+ /* 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); -+ } - - /* 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) - if (attr) - { - var_decode_location (attr, sym, cu); -+ - attr2 = dwarf2_attr (die, DW_AT_external, cu); -+ -+ /* Fortran explicitely imports any global symbols to the local -+ scope by DW_TAG_common_block. */ -+ if (cu->language == language_fortran && die->parent -+ && die->parent->tag == DW_TAG_common_block) -+ 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); -+ } - 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); - } - } - break; -@@ -7780,6 +8696,16 @@ 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; -+ case DW_TAG_common_block: -+ 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)); - break; - } - -+ if (this_type) -+ finalize_type (this_type); -+ - 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. - 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); - } -@@ -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. */ -+ -+static char * -+fortran_module_linkage_name (struct die_info *die, struct dwarf2_cu *cu) -+{ -+ char *name; -+ -+ gdb_assert (cu->language == language_fortran); -+ -+ name = dwarf2_name (die, cu); -+ -+ if (name && die->parent && die->parent->tag == DW_TAG_module) -+ { -+ char *module_name = dwarf2_name (die->parent, cu); -+ -+ if (module_name) -+ { -+ char *retval; -+ -+ /* `__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); -+ -+ return retval; -+ } -+ } -+ -+ 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; +-/* Patch all commons named "name" that need patching.Since COMMON +- blocks occur with relative infrequency, we simply do a linear scan on +- the name. Eventually, the best way to do this will be a +- hashed-lookup. Secnum is the section number for the .bss section +- (which is where common data lives). */ +- +-static void +-patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum) +-{ +- +- SAVED_F77_COMMON_PTR tmp; +- +- /* For blank common blocks, change the canonical reprsentation +- of a blank name */ +- +- if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0 +- || strcmp (name, BLANK_COMMON_NAME_MF77) == 0) +- { +- xfree (name); +- name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1); +- strcpy (name, BLANK_COMMON_NAME_LOCAL); +- } +- +- tmp = head_common_list; +- +- while (tmp != NULL) +- { +- if (COMMON_NEEDS_PATCHING (tmp)) +- if (strcmp (tmp->name, name) == 0) +- patch_common_entries (tmp, offset, secnum); +- +- tmp = tmp->next; +- } +-} +-#endif +- +-/* This macro adds the symbol-number for the start of the function +- (the symbol number of the .bf) referenced by symnum_fcn to a +- list. This list, in reality should be a FIFO queue but since +- #line pragmas sometimes cause line ranges to get messed up +- we simply create a linear list. This list can then be searched +- first by a queueing algorithm and upon failure fall back to +- a linear scan. */ +- +-#if 0 +-#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \ +- \ +- if (saved_bf_list == NULL) \ +-{ \ +- tmp_bf_ptr = allocate_saved_bf_node(); \ +- \ +- tmp_bf_ptr->symnum_bf = (bf_sym); \ +- tmp_bf_ptr->symnum_fcn = (fcn_sym); \ +- tmp_bf_ptr->next = NULL; \ +- \ +- current_head_bf_list = saved_bf_list = tmp_bf_ptr; \ +- saved_bf_list_end = tmp_bf_ptr; \ +- } \ +-else \ +-{ \ +- tmp_bf_ptr = allocate_saved_bf_node(); \ +- \ +- tmp_bf_ptr->symnum_bf = (bf_sym); \ +- tmp_bf_ptr->symnum_fcn = (fcn_sym); \ +- tmp_bf_ptr->next = NULL; \ +- \ +- saved_bf_list_end->next = tmp_bf_ptr; \ +- saved_bf_list_end = tmp_bf_ptr; \ +- } +-#endif +- +-/* This function frees the entire (.bf,function) list */ +- +-#if 0 +-static void +-clear_bf_list (void) +-{ +- +- SAVED_BF_PTR tmp = saved_bf_list; +- SAVED_BF_PTR next = NULL; +- +- while (tmp != NULL) +- { +- next = tmp->next; +- xfree (tmp); +- tmp = next; +- } +- saved_bf_list = NULL; +-} +-#endif +- +-int global_remote_debug; +- +-#if 0 +- +-static long +-get_bf_for_fcn (long the_function) +-{ +- SAVED_BF_PTR tmp; +- int nprobes = 0; +- +- /* First use a simple queuing algorithm (i.e. look and see if the +- item at the head of the queue is the one you want) */ +- +- if (saved_bf_list == NULL) +- internal_error (__FILE__, __LINE__, +- _("cannot get .bf node off empty list")); +- +- if (current_head_bf_list != NULL) +- if (current_head_bf_list->symnum_fcn == the_function) +- { +- if (global_remote_debug) +- fprintf_unfiltered (gdb_stderr, "*"); +- +- tmp = current_head_bf_list; +- current_head_bf_list = current_head_bf_list->next; +- return (tmp->symnum_bf); +- } +- +- /* If the above did not work (probably because #line directives were +- used in the sourcefile and they messed up our internal tables) we now do +- the ugly linear scan */ +- +- if (global_remote_debug) +- fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n"); +- +- nprobes = 0; +- tmp = saved_bf_list; +- while (tmp != NULL) +- { +- nprobes++; +- if (tmp->symnum_fcn == the_function) +- { +- if (global_remote_debug) +- fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes); +- current_head_bf_list = tmp->next; +- return (tmp->symnum_bf); +- } +- tmp = tmp->next; +- } +- +- return (-1); +-} +- +-static SAVED_FUNCTION_PTR saved_function_list = NULL; +-static SAVED_FUNCTION_PTR saved_function_list_end = NULL; +- +-static void +-clear_function_list (void) +-{ +- SAVED_FUNCTION_PTR tmp = saved_function_list; +- SAVED_FUNCTION_PTR next = NULL; +- +- while (tmp != NULL) +- { +- next = tmp->next; +- xfree (tmp); +- tmp = next; +- } +- +- saved_function_list = NULL; +-} +-#endif +diff --git a/gdb/f-lang.h b/gdb/f-lang.h +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 */ + extern void f_print_type (struct type *, char *, struct ui_file *, int, + int); - attr = dwarf2_attr (die, DW_AT_name, cu); -- if (attr && DW_STRING (attr)) -- return DW_STRING (attr); -- return NULL; -+ if (!attr || !DW_STRING (attr)) -+ return NULL; ++extern const char *f_object_address_data_valid_print_to_stream ++ (struct type *type, struct ui_file *stream); ++extern void f_object_address_data_valid_or_error (struct type *type); + -+ 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 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; - } - --/* Return the constant value held by the given attribute. Return -1 -- if the value held by the attribute is not constant. */ -+/* (*val_return) is filled only if returning dwarf2_attr_const. */ + extern int f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR, + struct ui_file *, int, + const struct value_print_options *); +@@ -47,41 +51,8 @@ enum f90_range_type + NONE_BOUND_DEFAULT /* "(low:high)" */ + }; --static int --dwarf2_get_attr_constant_value (struct attribute *attr, int default_value) -+static enum get_attr_constant_value -+get_attr_constant_value (struct attribute *attr, int *val_return) - { -+ if (attr == NULL) -+ return dwarf2_attr_unknown; - if (attr->form == DW_FORM_sdata) -- return DW_SND (attr); -- else if (attr->form == DW_FORM_udata -- || attr->form == DW_FORM_data1 -- || attr->form == DW_FORM_data2 -- || attr->form == DW_FORM_data4 -- || attr->form == DW_FORM_data8) -- return DW_UNSND (attr); -- else - { -- complaint (&symfile_complaints, _("Attribute value is not a constant (%s)"), -- dwarf_form_name (attr->form)); -- 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 -+ || attr->form == DW_FORM_data4 -+ || attr->form == DW_FORM_data8) -+ { -+ *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 -+ || attr->form == DW_FORM_block4) -+ return dwarf2_attr_block; -+ complaint (&symfile_complaints, _("Attribute value is not a constant (%s)"), -+ dwarf_form_name (attr->form)); -+ return dwarf2_attr_unknown; - } - - /* 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, - { - 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; - - if (dwarf2_per_objfile->macinfo_buffer == NULL) - { -@@ -9970,19 +11019,24 @@ 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; +-struct common_entry +- { +- struct symbol *symbol; /* The symbol node corresponding +- to this component */ +- struct common_entry *next; /* The next component */ +- }; +- +-struct saved_f77_common +- { +- char *name; /* Name of COMMON */ +- char *owning_function; /* Name of parent function */ +- int secnum; /* Section # of .bss */ +- CORE_ADDR offset; /* Offset from .bss for +- this block */ +- struct common_entry *entries; /* List of block's components */ +- struct common_entry *end_of_entries; /* ptr. to end of components */ +- struct saved_f77_common *next; /* Next saved COMMON block */ +- }; +- +-typedef struct saved_f77_common SAVED_F77_COMMON, *SAVED_F77_COMMON_PTR; +- +-typedef struct common_entry COMMON_ENTRY, *COMMON_ENTRY_PTR; +- +-extern SAVED_F77_COMMON_PTR head_common_list; /* Ptr to 1st saved COMMON */ +-extern SAVED_F77_COMMON_PTR tail_common_list; /* Ptr to last saved COMMON */ +-extern SAVED_F77_COMMON_PTR current_common; /* Ptr to current COMMON */ +- +-extern SAVED_F77_COMMON_PTR find_common_for_function (char *, char *); +- +-#define UNINITIALIZED_SECNUM -1 +-#define COMMON_NEEDS_PATCHING(blk) ((blk)->secnum == UNINITIALIZED_SECNUM) +- + #define BLANK_COMMON_NAME_ORIGINAL "#BLNK_COM" /* XLF assigned */ + #define BLANK_COMMON_NAME_MF77 "__BLNK__" /* MF77 assigned */ +-#define BLANK_COMMON_NAME_LOCAL "__BLANK" /* Local GDB */ -- for (;;) -+ do - { -- enum dwarf_macinfo_record_type macinfo_type; + /* When reasonable array bounds cannot be fetched, such as when + you ask to 'mt print symbols' and there is no stack frame and +@@ -113,6 +84,7 @@ struct builtin_f_type + struct type *builtin_logical; + struct type *builtin_logical_s1; + struct type *builtin_logical_s2; ++ struct type *builtin_logical_s8; + struct type *builtin_real; + struct type *builtin_real_s8; + struct type *builtin_real_s16; +diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c +index 6c9668f..852b9a8 100644 +--- a/gdb/f-typeprint.c ++++ b/gdb/f-typeprint.c +@@ -31,7 +31,7 @@ + #include "gdbcore.h" + #include "target.h" + #include "f-lang.h" - - /* Do we at least have room for a macinfo type byte? */ - if (mac_ptr >= mac_end) - { - dwarf2_macros_too_long_complaint (); -- return; -+ break; - } ++#include "dwarf2loc.h" + #include "gdb_string.h" + #include - macinfo_type = read_1_byte (abfd, mac_ptr); -@@ -9993,7 +11047,81 @@ 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; +@@ -48,6 +48,34 @@ void f_type_print_varspec_prefix (struct type *, struct ui_file *, + void f_type_print_base (struct type *, struct ui_file *, int, int); + + ++const char * ++f_object_address_data_valid_print_to_stream (struct type *type, ++ struct ui_file *stream) ++{ ++ const char *msg; + -+ default: -+ break; -+ } -+ } while (macinfo_type != 0 && current_file == NULL); ++ msg = object_address_data_not_valid (type); ++ if (msg != NULL) ++ { ++ /* Assuming the content printed to STREAM should not be localized. */ ++ fprintf_filtered (stream, "<%s>", msg); ++ } + -+ /* Here is the second pass to read in the macros starting from the ones -+ defined at the command line. */ ++ return msg; ++} + -+ mac_ptr = dwarf2_per_objfile->macinfo_buffer + offset; -+ at_commandline = 1; ++void ++f_object_address_data_valid_or_error (struct type *type) ++{ ++ const char *msg; + -+ do ++ msg = object_address_data_not_valid (type); ++ if (msg != NULL) + { -+ /* 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++; ++ error (_("Cannot access it because the %s."), _(msg)); ++ } ++} + -+ switch (macinfo_type) -+ { -+ /* A zero macinfo type indicates the end of the macro -+ information. */ -+ case 0: -+ break; + /* LEVEL is the depth to indent lines by. */ - case DW_MACINFO_define: - case DW_MACINFO_undef: -@@ -10008,19 +11136,31 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, - mac_ptr += bytes_read; + void +@@ -57,6 +85,9 @@ f_print_type (struct type *type, char *varstring, struct ui_file *stream, + enum type_code code; + int demangled_args; - 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)) - 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"), - 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); - } - break; ++ if (f_object_address_data_valid_print_to_stream (type, stream) != NULL) ++ return; ++ + f_type_print_base (type, stream, show, level); + code = TYPE_CODE (type); + if ((varstring != NULL && *varstring != '\0') +@@ -166,6 +197,9 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, -@@ -10034,9 +11174,22 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, - file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read); - mac_ptr += bytes_read; + QUIT; -- 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 (TYPE_CODE (type) != TYPE_CODE_TYPEDEF) ++ CHECK_TYPEDEF (type); + -+ 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); - } - break; + switch (TYPE_CODE (type)) + { + case TYPE_CODE_ARRAY: +diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c +index 0a57404..a9ccc77 100644 +--- a/gdb/f-valprint.c ++++ b/gdb/f-valprint.c +@@ -34,10 +34,8 @@ + #include "gdbcore.h" + #include "command.h" + #include "block.h" +- +-#if 0 +-static int there_is_a_visible_common_named (char *); +-#endif ++#include "dictionary.h" ++#include "gdb_assert.h" -@@ -10090,7 +11243,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset, - } - break; - } -- } -+ } while (macinfo_type != 0); - } + extern void _initialize_f_valprint (void); + static void info_common_command (char *, int); +@@ -54,15 +52,17 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2]; + /* The following macro gives us the size of the nth dimension, Where + n is 1 based. */ - /* Check if the attribute's form is a DW_FORM_block* -@@ -10123,7 +11276,7 @@ attr_form_is_section_offset (struct attribute *attr) +-#define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1]) ++#define F77_DIM_COUNT(n) (f77_array_offset_tbl[n][1]) - /* Return non-zero if ATTR's value falls in the 'constant' class, or - zero otherwise. When this function returns true, you can apply -- dwarf2_get_attr_constant_value to it. -+ get_attr_constant_value to it. +-/* The following gives us the offset for row n where n is 1-based. */ ++/* The following gives us the element size for row n where n is 1-based. */ - 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) - } - } +-#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0]) ++#define F77_DIM_BYTE_STRIDE(n) (f77_array_offset_tbl[n][0]) -+/* Convert DW_BLOCK into struct dwarf2_locexpr_baton. ATTR must be a DW_BLOCK -+ attribute type. */ + int + f77_get_lowerbound (struct type *type) + { ++ f_object_address_data_valid_or_error (type); + -+static struct dwarf2_locexpr_baton * -+dwarf2_attr_to_locexpr_baton (struct attribute *attr, struct dwarf2_cu *cu) -+{ -+ struct dwarf2_locexpr_baton *baton; + if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type)) + error (_("Lower bound may not be '*' in F77")); + +@@ -72,14 +72,17 @@ f77_get_lowerbound (struct type *type) + int + f77_get_upperbound (struct type *type) + { ++ f_object_address_data_valid_or_error (type); + -+ gdb_assert (attr_form_is_block (attr)); -+ -+ baton = obstack_alloc (&cu->objfile->objfile_obstack, sizeof (*baton)); -+ baton->per_cu = cu->per_cu; -+ gdb_assert (baton->per_cu); -+ -+ /* Note that we're just copying the block's data pointer -+ here, not the actual data. We're still pointing into the -+ info_buffer for SYM's objfile; right now we never release -+ that buffer, but when we do clean up properly this may -+ need to change. */ -+ baton->size = DW_BLOCK (attr)->size; -+ baton->data = DW_BLOCK (attr)->data; -+ gdb_assert (baton->size == 0 || baton->data != NULL); -+ -+ return baton; -+} -+ -+/* SYM may get its SYMBOL_CLASS overriden on invalid ATTR content. */ -+ - 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; - SYMBOL_LOCATION_BATON (sym) = baton; - } -+ else if (attr_form_is_block (attr)) -+ { -+ SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs; -+ SYMBOL_LOCATION_BATON (sym) = dwarf2_attr_to_locexpr_baton (attr, cu); -+ } - else + if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) { -- struct dwarf2_locexpr_baton *baton; -+ dwarf2_invalid_attrib_class_complaint ("location description", -+ SYMBOL_NATURAL_NAME (sym)); - -- baton = obstack_alloc (&cu->objfile->objfile_obstack, -- 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; +- /* We have an assumed size array on our hands. Assume that +- upper_bound == lower_bound so that we show at least 1 element. +- If the user wants to see more elements, let him manually ask for 'em +- and we'll subscript the array and show him. */ ++ /* We have an assumed size array on our hands. As type_length_get ++ already assumes a length zero of arrays with underfined bounds VALADDR ++ passed to the Fortran functions does not contained the real inferior ++ memory content. User should request printing of specific array ++ elements instead. */ -- if (attr_form_is_block (attr)) -- { -- /* Note that we're just copying the block's data pointer -- here, not the actual data. We're still pointing into the -- info_buffer for SYM's objfile; right now we never release -- that buffer, but when we do clean up properly this may -- need to change. */ -- baton->size = DW_BLOCK (attr)->size; -- baton->data = DW_BLOCK (attr)->data; -- } -- else -- { -- dwarf2_invalid_attrib_class_complaint ("location description", -- SYMBOL_NATURAL_NAME (sym)); -- baton->size = 0; -- baton->data = NULL; -- } -- -- SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs; -- SYMBOL_LOCATION_BATON (sym) = baton; -+ /* 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) -+ SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT; +- return f77_get_lowerbound (type); ++ return f77_get_lowerbound (type) - 1; } - } -@@ -10482,6 +11652,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) - return ofs_lhs->offset == ofs_rhs->offset; - } + return TYPE_ARRAY_UPPER_BOUND_VALUE (type); +@@ -135,24 +138,29 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream) + upper = f77_get_upperbound (tmp_type); + lower = f77_get_lowerbound (tmp_type); -+/* Fill in generic attributes applicable for type DIEs. */ -+ -+static void -+fetch_die_type_attrs (struct die_info *die, struct type *type, -+ struct dwarf2_cu *cu) -+{ -+ struct attribute *attr; -+ -+ attr = dwarf2_attr (die, DW_AT_data_location, cu); -+ if (attr_form_is_block (attr)) -+ TYPE_DATA_LOCATION_DWARF_BLOCK (type) = dwarf2_attr_to_locexpr_baton (attr, -+ cu); -+ gdb_assert (!TYPE_DATA_LOCATION_IS_ADDR (type)); -+ -+ attr = dwarf2_attr (die, DW_AT_allocated, cu); -+ if (attr_form_is_block (attr)) -+ TYPE_ALLOCATED (type) = dwarf2_attr_to_locexpr_baton (attr, cu); -+ gdb_assert (!TYPE_NOT_ALLOCATED (type)); -+ -+ attr = dwarf2_attr (die, DW_AT_associated, cu); -+ if (attr_form_is_block (attr)) -+ TYPE_ASSOCIATED (type) = dwarf2_attr_to_locexpr_baton (attr, cu); -+ gdb_assert (!TYPE_NOT_ASSOCIATED (type)); -+} +- F77_DIM_SIZE (ndimen) = upper - lower + 1; ++ F77_DIM_COUNT (ndimen) = upper - lower + 1; + - /* Set the type associated with DIE to TYPE. Save it in CU's hash - table if necessary. For convenience, return TYPE. */ ++ F77_DIM_BYTE_STRIDE (ndimen) = ++ TYPE_ARRAY_BYTE_STRIDE_VALUE (tmp_type); -@@ -10490,6 +11685,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) - { - struct dwarf2_offset_and_type **slot, ofs; + tmp_type = TYPE_TARGET_TYPE (tmp_type); + ndimen++; + } -+ fetch_die_type_attrs (die, type, cu); -+ - if (cu->type_hash == NULL) +- /* Now we multiply eltlen by all the offsets, so that later we ++ /* Now we multiply eltlen by all the BYTE_STRIDEs, so that later we + can print out array elements correctly. Up till now we +- know an offset to apply to get the item but we also ++ know an eltlen to apply to get the item but we also + have to know how much to add to get to the next item */ + + ndimen--; + eltlen = TYPE_LENGTH (tmp_type); +- F77_DIM_OFFSET (ndimen) = eltlen; ++ if (F77_DIM_BYTE_STRIDE (ndimen) == 0) ++ F77_DIM_BYTE_STRIDE (ndimen) = eltlen; + while (--ndimen > 0) { - gdb_assert (cu->per_cu != NULL); -diff --git a/gdb/elfread.c b/gdb/elfread.c -index ff220a2..13158f4 100644 ---- a/gdb/elfread.c -+++ b/gdb/elfread.c -@@ -727,10 +727,18 @@ elf_symfile_read (struct objfile *objfile, int mainline) - str_sect->filepos, - bfd_section_size (abfd, str_sect)); +- eltlen *= F77_DIM_SIZE (ndimen + 1); +- F77_DIM_OFFSET (ndimen) = eltlen; ++ eltlen *= F77_DIM_COUNT (ndimen + 1); ++ if (F77_DIM_BYTE_STRIDE (ndimen) == 0) ++ F77_DIM_BYTE_STRIDE (ndimen) = eltlen; } -+ -+ if (dwarf2_has_info (objfile)) -+ dwarf2_create_quick_addrmap (objfile); -+} -+ -+static void -+read_psyms (struct objfile *objfile) -+{ - if (dwarf2_has_info (objfile)) + } + +@@ -172,34 +180,34 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, + + if (nss != ndimensions) { - /* DWARF 2 sections */ -- dwarf2_build_psymtabs (objfile, mainline); -+ dwarf2_build_psymtabs (objfile, 0); +- for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max); i++) ++ for (i = 0; (i < F77_DIM_COUNT (nss) && (*elts) < options->print_max); i++) + { + fprintf_filtered (stream, "( "); + f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type), +- valaddr + i * F77_DIM_OFFSET (nss), +- address + i * F77_DIM_OFFSET (nss), ++ valaddr + i * F77_DIM_BYTE_STRIDE (nss), ++ address + i * F77_DIM_BYTE_STRIDE (nss), + stream, recurse, options, elts); + fprintf_filtered (stream, ") "); + } +- if (*elts >= options->print_max && i < F77_DIM_SIZE (nss)) ++ if (*elts >= options->print_max && i < F77_DIM_COUNT (nss)) + fprintf_filtered (stream, "..."); } + else + { +- for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max; ++ for (i = 0; i < F77_DIM_COUNT (nss) && (*elts) < options->print_max; + i++, (*elts)++) + { + val_print (TYPE_TARGET_TYPE (type), +- valaddr + i * F77_DIM_OFFSET (ndimensions), ++ valaddr + i * F77_DIM_BYTE_STRIDE (ndimensions), + 0, +- address + i * F77_DIM_OFFSET (ndimensions), ++ address + i * F77_DIM_BYTE_STRIDE (ndimensions), + stream, recurse, options, current_language); - /* FIXME: kettenis/20030504: This still needs to be integrated with -@@ -880,6 +888,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 */ -+ read_psyms, /* sym_read_psymbols */ - elf_symfile_finish, /* sym_finish: finished with file, cleanup */ - 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 ---- a/gdb/eval.c -+++ b/gdb/eval.c -@@ -39,10 +39,16 @@ - #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" +- if (i != (F77_DIM_SIZE (nss) - 1)) ++ if (i != (F77_DIM_COUNT (nss) - 1)) + fprintf_filtered (stream, ", "); - #include "gdb_assert.h" + if ((*elts == options->print_max - 1) +- && (i != (F77_DIM_SIZE (nss) - 1))) ++ && (i != (F77_DIM_COUNT (nss) - 1))) + fprintf_filtered (stream, "..."); + } + } +@@ -253,6 +261,9 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, + CORE_ADDR addr; + int index; -+#include ++ if (f_object_address_data_valid_print_to_stream (type, stream) != NULL) ++ return 0; + - /* This is defined in valops.c */ - extern int overload_resolution; - -@@ -651,6 +657,64 @@ ptrmath_type_p (struct type *type) - } + CHECK_TYPEDEF (type); + switch (TYPE_CODE (type)) + { +@@ -467,22 +478,54 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, + return 0; } -+/* 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; +-static void +-list_all_visible_commons (char *funname) ++static int ++info_common_command_for_block (struct block *block, struct frame_info *frame, ++ const char *comname) + { +- SAVED_F77_COMMON_PTR tmp; +- +- tmp = head_common_list; +- +- printf_filtered (_("All COMMON blocks visible at this level:\n\n")); +- +- while (tmp != NULL) +- { +- if (strcmp (tmp->owning_function, funname) == 0) +- printf_filtered ("%s\n", tmp->name); +- +- tmp = tmp->next; +- } ++ struct dict_iterator iter; ++ struct symbol *sym; ++ int values_printed = 0; ++ const char *name; ++ struct value_print_options opts; + -+ /* 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; ++ get_user_print_options (&opts); + -+ 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; -+ } ++ ALL_BLOCK_SYMBOLS (block, iter, sym) ++ if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN) ++ { ++ struct type *type = SYMBOL_TYPE (sym); ++ int index; + -+ return 1; -+ } ++ gdb_assert (SYMBOL_CLASS (sym) == LOC_STATIC); ++ gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT); + -+ return 0; -+} ++ if (comname && (!SYMBOL_LINKAGE_NAME (sym) ++ || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0)) ++ continue; + -+/* Constructs a fake method with the given parameter types. */ ++ values_printed = 1; ++ if (SYMBOL_PRINT_NAME (sym)) ++ printf_filtered (_("Contents of F77 COMMON block '%s':\n"), ++ SYMBOL_PRINT_NAME (sym)); ++ else ++ printf_filtered (_("Contents of blank COMMON block:\n")); ++ ++ for (index = 0; index < TYPE_NFIELDS (type); index++) ++ { ++ struct value *val; + -+static struct type * -+make_params (int num_types, struct type **param_types) -+{ -+ struct type *type = alloc_type (NULL, NULL); -+ TYPE_LENGTH (type) = 1; -+ TYPE_CODE (type) = TYPE_CODE_METHOD; -+ 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); ++ gdb_assert (field_is_static (&TYPE_FIELD (type, index))); ++ val = value_static_field (type, index); + -+ while (num_types-- > 0) -+ TYPE_FIELD_TYPE (type, num_types) = param_types[num_types]; ++ printf_filtered ("%s = ", TYPE_FIELD_NAME (type, index)); ++ value_print (val, gdb_stdout, &opts); ++ putchar_filtered ('\n'); ++ } + -+ return type; -+} ++ putchar_filtered ('\n'); ++ } + - 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, - long mem_offset; - struct type **arg_types; - int save_pos1; -+ struct cleanup *old_chain; - - pc = (*pos)++; - op = exp->elts[pc].opcode; -@@ -684,7 +749,7 @@ evaluate_subexp_standard (struct type *expect_type, - goto nosideret; - arg1 = value_aggregate_elt (exp->elts[pc + 1].type, - &exp->elts[pc + 3].string, -- 0, noside); -+ expect_type, 0, noside); - 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, - argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 3)); - if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) - { -- nargs++; - /* First, evaluate the structure into arg2 */ - pc2 = (*pos)++; ++ return values_printed; + } -@@ -1308,21 +1372,40 @@ evaluate_subexp_standard (struct type *expect_type, + /* This function is used to print out the values in a given COMMON +@@ -492,11 +535,9 @@ list_all_visible_commons (char *funname) + static void + info_common_command (char *comname, int from_tty) + { +- SAVED_F77_COMMON_PTR the_common; +- COMMON_ENTRY_PTR entry; + struct frame_info *fi; +- char *funname = 0; +- struct symbol *func; ++ struct block *block; ++ int values_printed = 0; - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + /* We have been told to display the contents of F77 COMMON + block supposedly visible in this function. Let us +@@ -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() */ -- if (TYPE_CODE (check_typedef (value_type (arg1))) -- != TYPE_CODE_METHODPTR) -- error (_("Non-pointer-to-member value used in pointer-to-member " -- "construct")); +- func = find_pc_function (get_frame_pc (fi)); +- if (func) +- { +- /* In certain pathological cases, the symtabs give the wrong +- function (when we are in the first function in a file which +- is compiled without debugging symbols, the previous function +- is compiled with debugging symbols, and the "foo.o" symbol +- that is supposed to tell us where the file with debugging symbols +- ends has been truncated by ar because it is longer than 15 +- characters). - -- if (noside == EVAL_AVOID_SIDE_EFFECTS) -+ type = check_typedef (value_type (arg1)); -+ switch (TYPE_CODE (type)) - { -- struct type *method_type = check_typedef (value_type (arg1)); -- arg1 = value_zero (method_type, not_lval); -+ case TYPE_CODE_METHODPTR: -+ if (noside == EVAL_AVOID_SIDE_EFFECTS) -+ arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval); -+ else -+ arg1 = cplus_method_ptr_to_value (&arg2, arg1); -+ -+ /* Now, say which argument to start evaluating from */ -+ nargs++; -+ tem = 2; -+ argvec[1] = arg2; -+ break; -+ -+ case TYPE_CODE_MEMBERPTR: -+ /* Now, convert these values to an address. */ -+ arg2 = value_cast (lookup_pointer_type (TYPE_DOMAIN_TYPE (type)), -+ arg2); -+ -+ mem_offset = value_as_long (arg1); -+ -+ arg1 = value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)), -+ value_as_long (arg2) + mem_offset); -+ arg1 = value_ind (arg1); -+ tem = 1; -+ break; -+ -+ default: -+ error (_("Non-pointer-to-member value used in pointer-to-member " -+ "construct")); - } -- else -- arg1 = cplus_method_ptr_to_value (&arg2, arg1); - -- /* Now, say which argument to start evaluating from */ -- tem = 2; -+ argvec[0] = arg1; - } - 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, - } - else if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) - { -- argvec[1] = arg2; -- argvec[0] = arg1; -+ /* Pointer to member. argvec is already set up. */ - } - 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 */ +- So look in the minimal symbol tables as well, and if it comes +- up with a larger address for the function use that instead. +- I don't think this can ever cause any problems; there shouldn't +- be any minimal symbols in the middle of a function. +- FIXME: (Not necessarily true. What about text labels) */ +- +- struct minimal_symbol *msymbol = +- lookup_minimal_symbol_by_pc (get_frame_pc (fi)); +- +- if (msymbol != NULL +- && (SYMBOL_VALUE_ADDRESS (msymbol) +- > BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) +- funname = SYMBOL_LINKAGE_NAME (msymbol); +- else +- funname = SYMBOL_LINKAGE_NAME (func); +- } +- else +- { +- struct minimal_symbol *msymbol = +- lookup_minimal_symbol_by_pc (get_frame_pc (fi)); +- +- if (msymbol != NULL) +- funname = SYMBOL_LINKAGE_NAME (msymbol); +- else /* Got no 'funname', code below will fail. */ +- error (_("No function found for frame.")); +- } +- +- /* If comname is NULL, we assume the user wishes to see the +- which COMMON blocks are visible here and then return */ +- +- if (comname == 0) ++ block = get_frame_block (fi, 0); ++ if (block == NULL) + { +- list_all_visible_commons (funname); ++ printf_filtered (_("No symbol table info available.\n")); + return; + } -@@ -1529,7 +1614,10 @@ evaluate_subexp_standard (struct type *expect_type, +- the_common = find_common_for_function (comname, funname); +- +- if (the_common) ++ while (block) + { +- if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0) +- printf_filtered (_("Contents of blank COMMON block:\n")); +- else +- printf_filtered (_("Contents of F77 COMMON block '%s':\n"), comname); +- +- printf_filtered ("\n"); +- entry = the_common->entries; +- +- while (entry != NULL) +- { +- print_variable_and_value (NULL, entry->symbol, fi, gdb_stdout, 0); +- entry = entry->next; +- } ++ if (info_common_command_for_block (block, fi, comname)) ++ values_printed = 1; ++ /* After handling the function's top-level block, stop. Don't ++ continue to its superblock, the block of per-file symbols. */ ++ if (BLOCK_FUNCTION (block)) ++ break; ++ block = BLOCK_SUPERBLOCK (block); + } +- else +- printf_filtered (_("Cannot locate the common block %s in function '%s'\n"), +- comname, funname); +-} +- +-/* This function is used to determine whether there is a +- F77 common block visible at the current scope called 'comname'. */ +- +-#if 0 +-static int +-there_is_a_visible_common_named (char *comname) +-{ +- SAVED_F77_COMMON_PTR the_common; +- struct frame_info *fi; +- char *funname = 0; +- struct symbol *func; +- +- if (comname == NULL) +- error (_("Cannot deal with NULL common name!")); - /* 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)); - type = check_typedef (value_type (arg1)); -+ do_cleanups (old_chain); - code = TYPE_CODE (type); +- fi = get_selected_frame (_("No frame selected")); +- +- /* The following is generally ripped off from stack.c's routine +- print_frame_info() */ +- +- func = find_pc_function (fi->pc); +- if (func) ++ if (!values_printed) + { +- /* In certain pathological cases, the symtabs give the wrong +- function (when we are in the first function in a file which +- is compiled without debugging symbols, the previous function +- is compiled with debugging symbols, and the "foo.o" symbol +- that is supposed to tell us where the file with debugging symbols +- ends has been truncated by ar because it is longer than 15 +- characters). +- +- So look in the minimal symbol tables as well, and if it comes +- up with a larger address for the function use that instead. +- I don't think this can ever cause any problems; there shouldn't +- be any minimal symbols in the middle of a function. +- FIXME: (Not necessarily true. What about text labels) */ +- +- struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); +- +- if (msymbol != NULL +- && (SYMBOL_VALUE_ADDRESS (msymbol) +- > BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) +- funname = SYMBOL_LINKAGE_NAME (msymbol); ++ if (comname) ++ printf_filtered (_("No common block '%s'.\n"), comname); + else +- funname = SYMBOL_LINKAGE_NAME (func); ++ printf_filtered (_("No common blocks.\n")); + } +- else +- { +- struct minimal_symbol *msymbol = +- lookup_minimal_symbol_by_pc (fi->pc); +- +- if (msymbol != NULL) +- funname = SYMBOL_LINKAGE_NAME (msymbol); +- } +- +- the_common = find_common_for_function (comname, funname); +- +- return (the_common ? 1 : 0); + } +-#endif - if (code == TYPE_CODE_PTR) -@@ -1696,6 +1784,37 @@ evaluate_subexp_standard (struct type *expect_type, - error (_("non-pointer-to-member value used in pointer-to-member construct")); - } + void + _initialize_f_valprint (void) +diff --git a/gdb/findcmd.c b/gdb/findcmd.c +index 1d28914..d176341 100644 +--- a/gdb/findcmd.c ++++ b/gdb/findcmd.c +@@ -27,7 +27,7 @@ -+ case TYPE_INSTANCE: -+ nargs = longest_to_int (exp->elts[pc + 1].longconst); -+ arg_types = (struct type **) alloca (nargs * sizeof (struct type *)); -+ for (ix = 0; ix < nargs; ++ix) -+ arg_types[ix] = exp->elts[pc + 1 + ix + 1].type; + /* Copied from bfd_put_bits. */ + +-static void ++void + put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) + { + int i; +@@ -45,6 +45,41 @@ put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p) + } + } + ++/* Allocates a buffer in *PATTERN_BUF, with a hard-coded initial size which ++ will be returned in *PATTERN_BUF_SIZE. *PATTERN_BUF_END points to the same ++ place as *PATTERN_BUF, indicating that the buffer is initially empty. */ + -+ expect_type = make_params (nargs, arg_types); -+ *(pos) += 3 + nargs; -+ return evaluate_subexp_standard (expect_type, exp, pos, noside); ++void ++allocate_pattern_buffer (char **pattern_buf, char **pattern_buf_end, ++ ULONGEST *pattern_buf_size) ++{ ++#define INITIAL_PATTERN_BUF_SIZE 100 ++ *pattern_buf_size = INITIAL_PATTERN_BUF_SIZE; ++ *pattern_buf = xmalloc (*pattern_buf_size); ++ *pattern_buf_end = *pattern_buf; ++} + -+ case TYPE_INSTANCE_LOOKUP: ++/* Grows *PATTERN_BUF by a factor of two if it's not large enough to hold ++ VAL_BYTES more bytes or a 64-bit value, whichever is larger. ++ *PATTERN_BUF_END is updated as necessary. */ ++ ++void ++increase_pattern_buffer (char **pattern_buf, char **pattern_buf_end, ++ ULONGEST *pattern_buf_size, int val_bytes) ++{ ++ /* Keep it simple and assume size == 'g' when watching for when we ++ need to grow the pattern buf. */ ++ if ((*pattern_buf_end - *pattern_buf + max (val_bytes, sizeof (int64_t))) ++ > *pattern_buf_size) + { -+ int i; -+ struct symbol *sym; -+ struct type **arg_types; -+ (*pos) += 3; -+ printf ("TYPE_INSTANCE_LOOKUP\n"); -+ arg_types = (struct type **) alloca (TYPE_NFIELDS (expect_type) -+ * sizeof (struct type *)); -+ for (i = 0; i < TYPE_NFIELDS (expect_type); ++i) -+ arg_types[i] = TYPE_FIELD_TYPE (expect_type, i); -+ (void) find_overload_match (arg_types, TYPE_NFIELDS (expect_type), -+ NULL /* no need for name */, -+ 0 /* not method */, -+ 0 /* strict match */, -+ NULL, exp->elts[pc + 1].symbol, NULL, -+ &sym, NULL); -+ i = 0; ++ size_t current_offset = *pattern_buf_end - *pattern_buf; ++ ++ *pattern_buf_size *= 2; ++ *pattern_buf = xrealloc (*pattern_buf, *pattern_buf_size); ++ *pattern_buf_end = *pattern_buf + current_offset; + } -+ break; ++} + - 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, - { - int subscript_array[MAX_FORTRAN_DIMS]; - int array_size_array[MAX_FORTRAN_DIMS]; -+ int byte_stride_array[MAX_FORTRAN_DIMS]; - int ndimensions = 1, i; - struct type *tmp_type; - int offset_item; /* The array offset where the item lives */ -+ CORE_ADDR offset_byte; /* byte_stride based offset */ -+ unsigned element_size; - - if (nargs > MAX_FORTRAN_DIMS) - error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS); + /* Subroutine of find_command to simplify it. + Parse the arguments of the "find" command. */ -+ old_chain = make_cleanup (null_cleanup, 0); -+ object_address_set (VALUE_ADDRESS (arg1)); -+ - tmp_type = check_typedef (value_type (arg1)); - ndimensions = calc_f77_array_dims (type); +@@ -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. */ +-#define INITIAL_PATTERN_BUF_SIZE 100 +- ULONGEST pattern_buf_size = INITIAL_PATTERN_BUF_SIZE; ++ ULONGEST pattern_buf_size; + /* Pointer to one past the last in-use part of pattern_buf. */ + char *pattern_buf_end; + ULONGEST pattern_len; +@@ -75,8 +109,7 @@ parse_find_args (char *args, ULONGEST *max_countp, + if (args == NULL) + error (_("Missing search parameters.")); -@@ -1999,6 +2124,9 @@ evaluate_subexp_standard (struct type *expect_type, - upper = f77_get_upperbound (tmp_type); - lower = f77_get_lowerbound (tmp_type); +- pattern_buf = xmalloc (pattern_buf_size); +- pattern_buf_end = pattern_buf; ++ allocate_pattern_buffer (&pattern_buf, &pattern_buf_end, &pattern_buf_size); + old_cleanups = make_cleanup (free_current_contents, &pattern_buf); -+ byte_stride_array[nargs - i - 1] = -+ TYPE_ARRAY_BYTE_STRIDE_VALUE (tmp_type); -+ - array_size_array[nargs - i - 1] = upper - lower + 1; + /* Get search granularity and/or max count if specified. +@@ -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)); - /* Zero-normalize subscripts so that offsetting will work. */ -@@ -2017,17 +2145,25 @@ evaluate_subexp_standard (struct type *expect_type, - tmp_type = check_typedef (TYPE_TARGET_TYPE (tmp_type)); - } +- /* Keep it simple and assume size == 'g' when watching for when we +- need to grow the pattern buf. */ +- if ((pattern_buf_end - pattern_buf + max (val_bytes, sizeof (int64_t))) +- > pattern_buf_size) +- { +- size_t current_offset = pattern_buf_end - pattern_buf; +- pattern_buf_size *= 2; +- pattern_buf = xrealloc (pattern_buf, pattern_buf_size); +- pattern_buf_end = pattern_buf + current_offset; +- } ++ increase_pattern_buffer (&pattern_buf, &pattern_buf_end, ++ &pattern_buf_size, val_bytes); -- /* Now let us calculate the offset for this item */ -+ /* Kept for the f77_get_upperbound / f77_get_lowerbound calls above. */ -+ do_cleanups (old_chain); + if (size != '\0') + { +@@ -237,6 +262,45 @@ parse_find_args (char *args, ULONGEST *max_countp, + discard_cleanups (old_cleanups); + } -- offset_item = subscript_array[ndimensions - 1]; -+ /* Now let us calculate the offset for this item */ ++/* Drives target_search_memory to sweep through the specified search space, ++ possibly in several iterations (with one call to this function for each ++ iteration). *START_ADDR is the address where the search starts, and is ++ updated to the next starting address to continue the search. ++ *SEARCH_SPACE_LEN is the amount of bytes which will be searched, and is ++ updated for the next iteration. PATTERN_BUF holds the pattern to be searched ++ for, PATTERN_LEN is the size of the pattern in bytes. If a match is found, ++ it's address is put in *FOUND_ADDR. ++ ++ Returns 1 if found, 0 if not found, and -1 if there was an error requiring ++ halting of the search (e.g. memory read error). */ ++ ++int ++search_memory (CORE_ADDR *start_addr, ULONGEST *search_space_len, ++ const char *pattern_buf, ULONGEST pattern_len, ++ CORE_ADDR *found_addr) ++{ ++ /* Offset from start of this iteration to the next iteration. */ ++ ULONGEST next_iter_incr; ++ int found; ++ ++ found = target_search_memory (*start_addr, *search_space_len, ++ pattern_buf, pattern_len, found_addr); ++ if (found <= 0) ++ return found; ++ ++ /* Begin next iteration at one byte past this match. */ ++ next_iter_incr = (*found_addr - *start_addr) + 1; ++ ++ /* For robustness, we don't let search_space_len go -ve here. */ ++ if (*search_space_len >= next_iter_incr) ++ *search_space_len -= next_iter_incr; ++ else ++ *search_space_len = 0; ++ *start_addr += next_iter_incr; ++ ++ return found; ++} ++ + static void + 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) + { +- /* Offset from start of this iteration to the next iteration. */ +- ULONGEST next_iter_incr; + CORE_ADDR found_addr; +- int found = target_search_memory (start_addr, search_space_len, +- pattern_buf, pattern_len, &found_addr); ++ int found; -- 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; ++ found = search_memory (&start_addr, &search_space_len, pattern_buf, ++ pattern_len, &found_addr); + if (found <= 0) + break; -- /* Construct a value node with the value of the offset */ -+ for (i = ndimensions - 1; i >= 0; --i) -+ { -+ offset_item *= array_size_array[i]; -+ if (byte_stride_array[i] == 0) -+ offset_item += subscript_array[i]; -+ else -+ offset_byte += subscript_array[i] * byte_stride_array[i]; -+ } - -- arg2 = value_from_longest (builtin_type_int32, offset_item); -+ 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, - returns the correct type value */ +@@ -280,16 +343,6 @@ find_command (char *args, int from_tty) + printf_filtered ("\n"); + ++found_count; + last_found_addr = found_addr; +- +- /* Begin next iteration at one byte past this match. */ +- next_iter_incr = (found_addr - start_addr) + 1; +- +- /* For robustness, we don't let search_space_len go -ve here. */ +- if (search_space_len >= next_iter_incr) +- search_space_len -= next_iter_incr; +- else +- search_space_len = 0; +- start_addr += next_iter_incr; + } - deprecated_set_value_type (arg1, tmp_type); -- return value_subscripted_rvalue (arg1, arg2, 0); -+ return value_subscripted_rvalue (arg1, offset_byte); - } + /* Record and print the results. */ +diff --git a/gdb/findvar.c b/gdb/findvar.c +index 8c027c9..d201f76 100644 +--- a/gdb/findvar.c ++++ b/gdb/findvar.c +@@ -35,6 +35,7 @@ + #include "user-regs.h" + #include "block.h" + #include "objfiles.h" ++#include "dwarf2loc.h" - 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")); + /* 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. */ +@@ -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. +- If the variable cannot be found, return a zero pointer. */ ++ If the variable cannot be found, return a zero pointer. ++ We have to first find the address of the variable before allocating struct ++ value to return as its size may depend on DW_OP_PUSH_OBJECT_ADDRESS possibly ++ used by its type. */ -@@ -2568,7 +2714,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, -- 1, noside); -+ NULL, 1, noside); - 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, + struct value * + read_var_value (struct symbol *var, struct frame_info *frame) { - enum exp_opcode op; - int pc; -- struct value *val; -+ struct value *val = NULL; - struct symbol *var; - struct type *type; +- struct value *v; + struct type *type = SYMBOL_TYPE (var); + CORE_ADDR addr; +- int len; +- +- if (SYMBOL_CLASS (var) == LOC_COMPUTED +- || SYMBOL_CLASS (var) == LOC_REGISTER) +- /* These cases do not use V. */ +- v = NULL; +- else +- { +- v = allocate_value (type); +- VALUE_LVAL (v) = lval_memory; /* The most likely possibility. */ +- } +- +- len = TYPE_LENGTH (type); -@@ -2624,12 +2770,17 @@ evaluate_subexp_with_coercion (struct expression *exp, + if (symbol_read_needs_frame (var)) + gdb_assert (frame); +@@ -422,32 +412,40 @@ read_var_value (struct symbol *var, struct frame_info *frame) + switch (SYMBOL_CLASS (var)) { - case OP_VAR_VALUE: - var = exp->elts[pc + 2].symbol; -+ /* address_of_variable will call object_address_set for check_typedef. -+ Call it only if required as it can error-out on VAR in register. */ -+ if (TYPE_DYNAMIC (SYMBOL_TYPE (var))) -+ val = address_of_variable (var, exp->elts[pc + 1].block); - type = check_typedef (SYMBOL_TYPE (var)); - if (TYPE_CODE (type) == TYPE_CODE_ARRAY - && CAST_IS_CONVERSION) - { - (*pos) += 4; -- val = address_of_variable (var, exp->elts[pc + 1].block); -+ if (!val) -+ val = address_of_variable (var, exp->elts[pc + 1].block); - return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)), - val); - } -@@ -2681,9 +2832,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos) + 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; ++ { ++ /* Put the constant back in target format. */ ++ 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; ++ } - case OP_VAR_VALUE: - (*pos) += 4; -- type = check_typedef (SYMBOL_TYPE (exp->elts[pc + 2].symbol)); -- return -- value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type)); -+ /* We do not need to call read_var_value but the object evaluation may -+ need to have executed object_address_set which needs valid -+ SYMBOL_VALUE_ADDRESS of the symbol. Still VALUE returned by -+ read_var_value we left as lazy. */ -+ type = value_type (read_var_value (exp->elts[pc + 2].symbol, -+ deprecated_safe_get_selected_frame ())); -+ return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type)); + case LOC_LABEL: +- /* Put the constant back in target format. */ +- if (overlay_debugging) +- { +- CORE_ADDR addr +- = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var), +- SYMBOL_OBJ_SECTION (var)); +- store_typed_address (value_contents_raw (v), type, addr); +- } +- else +- store_typed_address (value_contents_raw (v), type, +- SYMBOL_VALUE_ADDRESS (var)); +- VALUE_LVAL (v) = not_lval; +- return v; ++ { ++ /* Put the constant back in target format. */ ++ struct value *v = allocate_value (type); ++ VALUE_LVAL (v) = not_lval; ++ if (overlay_debugging) ++ { ++ CORE_ADDR addr ++ = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var), ++ SYMBOL_OBJ_SECTION (var)); ++ store_typed_address (value_contents_raw (v), type, addr); ++ } ++ else ++ store_typed_address (value_contents_raw (v), type, ++ SYMBOL_VALUE_ADDRESS (var)); ++ return v; ++ } - 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); + case LOC_CONST_BYTES: + { +- memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), len); ++ struct value *v = allocate_value (type); + VALUE_LVAL (v) = not_lval; ++ memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), ++ TYPE_LENGTH (type)); + return v; } - 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 ---- a/gdb/expression.h -+++ b/gdb/expression.h -@@ -88,6 +88,16 @@ enum exp_opcode - when X is a pointer instead of an aggregate. */ - STRUCTOP_MPTR, +@@ -489,12 +487,23 @@ read_var_value (struct symbol *var, struct frame_info *frame) + break; -+ /* TYPE_INSTANCE is used when the user specifies a specific -+ type instantiation for overloaded methods/functions. The format -+ is: TYPE_INSTANCE num_types type0 ... typeN num_types TYPE_INSTANCE*/ -+ TYPE_INSTANCE, -+ -+ /* TYPE_INSTANCE_LOOKUP is used when the user specifies a specific -+ type instantiation of a function (not a method). In this case, -+ we must toss the results of the parser and manually do the lookup. */ -+ TYPE_INSTANCE_LOOKUP, + case LOC_BLOCK: +- if (overlay_debugging) +- set_value_address (v, symbol_overlayed_address +- (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var))); +- else +- set_value_address (v, BLOCK_START (SYMBOL_BLOCK_VALUE (var))); +- return v; ++ { ++ CORE_ADDR addr; ++ struct value *v; + - /* end of C++. */ ++ if (overlay_debugging) ++ addr = symbol_overlayed_address ++ (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var)); ++ else ++ addr = BLOCK_START (SYMBOL_BLOCK_VALUE (var)); ++ /* ADDR is set here for ALLOCATE_VALUE's CHECK_TYPEDEF for ++ DW_OP_push_object_address. */ ++ object_address_set (addr); ++ v = allocate_value (type); ++ VALUE_LVAL (v) = lval_memory; ++ set_value_address (v, addr); ++ return v; ++ } - /* 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); + case LOC_REGISTER: + case LOC_REGPARM_ADDR: +@@ -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); +- VALUE_LVAL (v) = lval_memory; + } + else + { +@@ -556,18 +564,33 @@ read_var_value (struct symbol *var, struct frame_info *frame) + break; -+extern int compare_parameters (struct type *, struct type *); + case LOC_OPTIMIZED_OUT: +- VALUE_LVAL (v) = not_lval; +- set_value_optimized_out (v, 1); +- return v; ++ { ++ struct value *v = allocate_value (type); + - /* From expprint.c */ ++ VALUE_LVAL (v) = not_lval; ++ set_value_optimized_out (v, 1); ++ return v; ++ } - extern void print_expression (struct expression *, struct ui_file *); -@@ -435,4 +447,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 *); + default: + error (_("Cannot look up value of a botched symbol.")); + break; + } +- set_value_address (v, addr); +- set_value_lazy (v, 1); +- return v; ++ { ++ struct value *v; + - #endif /* !defined (EXPRESSION_H) */ -diff --git a/gdb/f-exp.y b/gdb/f-exp.y -index d91c413..c984e85 100644 ---- a/gdb/f-exp.y -+++ b/gdb/f-exp.y -@@ -198,6 +198,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 -+%token LOGICAL_S8_KEYWORD - %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 */ - { $$ = parse_f_type->builtin_integer_s2; } - | CHARACTER - { $$ = parse_f_type->builtin_character; } -+ | LOGICAL_S8_KEYWORD -+ { $$ = parse_f_type->builtin_logical_s8;} - | LOGICAL_KEYWORD - { $$ = parse_f_type->builtin_logical; } - | LOGICAL_S2_KEYWORD -@@ -860,6 +863,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 }, -+ { "logical_8", LOGICAL_S8_KEYWORD, BINOP_END }, - { "complex_8", COMPLEX_S8_KEYWORD, BINOP_END }, - { "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 ---- 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; - /* Local functions */ - - extern void _initialize_f_language (void); --#if 0 --static void clear_function_list (void); --static long get_bf_for_fcn (long); --static void clear_bf_list (void); --static void patch_all_commons_by_name (char *, CORE_ADDR, int); --static SAVED_F77_COMMON_PTR find_first_common_named (char *); --static void add_common_entry (struct symbol *); --static void add_common_block (char *, CORE_ADDR, int, char *); --static SAVED_FUNCTION *allocate_saved_function_node (void); --static SAVED_BF_PTR allocate_saved_bf_node (void); --static COMMON_ENTRY_PTR allocate_common_entry_node (void); --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); ++ /* ADDR is set here for ALLOCATE_VALUE's CHECK_TYPEDEF for ++ DW_OP_PUSH_OBJECT_ADDRESS. */ ++ object_address_set (addr); ++ v = allocate_value (type); ++ VALUE_LVAL (v) = lval_memory; ++ set_value_address (v, addr); + -+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. */ ++ set_value_lazy (v, 1); ++ ++ return v; ++ } + } - 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) + /* Install default attributes for register values. */ +@@ -604,10 +627,11 @@ struct value * + value_from_register (struct type *type, int regnum, struct frame_info *frame) { - c &= 0xFF; /* Avoid sign bit follies */ + struct gdbarch *gdbarch = get_frame_arch (frame); +- struct type *type1 = check_typedef (type); + struct value *v; -@@ -126,10 +115,10 @@ f_emit_char (int c, struct ui_file *stream, int quoter) - be replaced with a true F77version. */ +- if (gdbarch_convert_register_p (gdbarch, regnum, type1)) ++ type = check_typedef (type); ++ ++ if (gdbarch_convert_register_p (gdbarch, regnum, type)) + { + /* The ISA/ABI need to something weird when obtaining the + specified value from this register. It might need to +@@ -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, +- frame, regnum, type1, value_contents_raw (v)); ++ frame, regnum, type, value_contents_raw (v)); + } + else + { +diff --git a/gdb/frame.c b/gdb/frame.c +index 67e0607..1eb7f9d 100644 +--- a/gdb/frame.c ++++ b/gdb/frame.c +@@ -1109,6 +1109,14 @@ has_stack_frames (void) + if (ptid_equal (inferior_ptid, null_ptid)) + return 0; - 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); ++ /* 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; ++ + /* 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); } -@@ -141,14 +130,15 @@ f_printchar (int c, struct ui_file *stream) - be replaced with a true F77 version. */ ++/* Return true if the frame base for frame FI is BASE; false ++ otherwise. */ ++ ++int ++frame_base_is (struct frame_info *fi, const struct frame_base *base) ++{ ++ if (fi->base == NULL) ++ fi->base = frame_base_find_by_frame (fi); ++ return fi->base == base; ++} ++ + /* Level of the selected frame: 0 for innermost, 1 for its caller, ... + or -1 for a NULL frame. */ - 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); +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); - 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 { - f_primitive_type_logical, - f_primitive_type_logical_s1, - f_primitive_type_logical_s2, -+ f_primitive_type_logical_s8, - f_primitive_type_integer, - f_primitive_type_integer_s2, - f_primitive_type_real, -@@ -287,6 +278,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; -+ lai->primitive_type_vector [f_primitive_type_logical_s8] -+ = builtin->builtin_logical_s8; - 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; - } + extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc); + ++/* Return true if the frame base for frame FI is BASE; false ++ otherwise. */ ++ ++extern int frame_base_is (struct frame_info *fi, const struct frame_base *base); ++ + #endif /* !defined (FRAME_H) */ +diff --git a/gdb/gdbinit.in b/gdb/gdbinit.in +index ffb7f53..a2e7e94 100644 +--- a/gdb/gdbinit.in ++++ b/gdb/gdbinit.in +@@ -1,5 +1,15 @@ + echo Setting up the environment for debugging gdb.\n + ++# Set up the Python library and "require" command. ++python ++from os.path import abspath ++gdb.datadir = abspath ('@srcdir@/python/lib') ++gdb.pythonlibdir = gdb.datadir ++gdb.__path__ = [gdb.datadir + '/gdb'] ++sys.path.insert(0, gdb.datadir) ++end ++source @srcdir@/python/lib/gdb/__init__.py ++ + set complaints 1 -+/* Find if NAME is not contained in any of the Fortran modules imported by the -+ Fortran USE statement. + b internal_error +diff --git a/gdb/gdbserver/linux-i386-low.c b/gdb/gdbserver/linux-i386-low.c +new file mode 100644 +index 0000000..b95c1b1 +--- /dev/null ++++ b/gdb/gdbserver/linux-i386-low.c +@@ -0,0 +1,210 @@ ++/* GNU/Linux/i386 specific low level interface, for the remote server for GDB. ++ Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 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" ++ ++#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); + -+ 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) ++/* 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[] = +{ -+ struct fortran_using *use; ++ 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 ++}; + -+ if (!block) -+ return NULL; ++/* Called by libthread_db. */ + -+ for (use = BLOCK_FORTRAN_USE (block); use; use = use->next) -+ { -+ struct symbol *sym; -+ struct type *type; -+ struct symbol *retval; ++ps_err_e ++ps_get_thread_area (const struct ps_prochandle *ph, ++ lwpid_t lwpid, int idx, void **base) ++{ ++ unsigned int desc[4]; + -+ sym = lookup_symbol_global (use->module_name, NULL, block, MODULE_DOMAIN); ++ if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, ++ (void *) idx, (unsigned long) &desc) < 0) ++ return PS_ERR; + -+ /* Module name lookup should not fail with correct debug info. */ -+ if (sym == NULL) -+ continue; ++ *(int *)base = desc[1]; ++ return PS_OK; ++} + -+ type = SYMBOL_TYPE (sym); -+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_MODULE); -+ gdb_assert (TYPE_MODULE_BLOCK (type) != NULL); ++static int ++i386_cannot_store_register (int regno) ++{ ++ return (regno >= i386_num_regs); ++} + -+ retval = lookup_block_symbol (TYPE_MODULE_BLOCK (type), name, -+ linkage_name, domain); -+ if (retval) -+ return retval; -+ } ++static int ++i386_cannot_fetch_register (int regno) ++{ ++ return (regno >= i386_num_regs); ++} + -+ 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) - - add_language (&f_language_defn); - } -- --#if 0 --static SAVED_BF_PTR --allocate_saved_bf_node (void) --{ -- SAVED_BF_PTR new; -- -- new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF)); -- return (new); --} -- --static SAVED_FUNCTION * --allocate_saved_function_node (void) --{ -- SAVED_FUNCTION *new; -- -- new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION)); -- return (new); --} -- --static SAVED_F77_COMMON_PTR --allocate_saved_f77_common_node (void) --{ -- SAVED_F77_COMMON_PTR new; -- -- new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON)); -- return (new); --} -- --static COMMON_ENTRY_PTR --allocate_common_entry_node (void) --{ -- COMMON_ENTRY_PTR new; -- -- new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY)); -- return (new); --} --#endif -- --SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */ --SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */ --SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */ -- --#if 0 --static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function) -- list */ --static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */ --static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list -- */ -- --static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use -- in macros */ -- --/* The following function simply enters a given common block onto -- the global common block chain */ -- --static void --add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab) --{ -- SAVED_F77_COMMON_PTR tmp; -- char *c, *local_copy_func_stab; -- -- /* If the COMMON block we are trying to add has a blank -- name (i.e. "#BLNK_COM") then we set it to __BLANK -- because the darn "#" character makes GDB's input -- parser have fits. */ -- -- -- if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0 -- || strcmp (name, BLANK_COMMON_NAME_MF77) == 0) -- { -- -- xfree (name); -- name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1); -- strcpy (name, BLANK_COMMON_NAME_LOCAL); -- } -- -- tmp = allocate_saved_f77_common_node (); -- -- local_copy_func_stab = xmalloc (strlen (func_stab) + 1); -- strcpy (local_copy_func_stab, func_stab); -- -- tmp->name = xmalloc (strlen (name) + 1); -- -- /* local_copy_func_stab is a stabstring, let us first extract the -- function name from the stab by NULLing out the ':' character. */ -- -- -- c = NULL; -- c = strchr (local_copy_func_stab, ':'); -- -- if (c) -- *c = '\0'; ++ ++#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 79d33fe..aecd820 100644 +--- a/gdb/gdbthread.h ++++ b/gdb/gdbthread.h +@@ -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); + ++/* Prune dead threads from the list of threads. */ ++extern void prune_threads (void); ++ + /* Iterator function to call a user-provided callback function + 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 2f77dca..09f15dc 100644 +--- a/gdb/gdbtypes.c ++++ b/gdb/gdbtypes.c +@@ -38,6 +38,9 @@ + #include "cp-abi.h" + #include "gdb_assert.h" + #include "hashtab.h" ++#include "observer.h" ++#include "dwarf2expr.h" ++#include "dwarf2loc.h" + + + /* 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); + ++/* A reference count structure for the type reference count map. Each ++ type in a hierarchy of types is mapped to the same reference ++ count. */ ++struct type_refc_entry ++{ ++ /* One type in the hierarchy. Each type in the hierarchy gets its ++ own slot. */ ++ struct type *type; ++ ++ /* A pointer to the shared reference count. */ ++ int *refc; ++}; ++ ++/* 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; + + /* 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) ++alloc_type (struct objfile *objfile, struct type *parent) + { + struct type *type; + +@@ -148,6 +169,39 @@ alloc_type (struct objfile *objfile) + return type; + } + ++/* 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. */ ++ ++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); + } +@@ -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_copy (type); ++ ntype = alloc_type_as_parent (type); + if (typeptr) + *typeptr = ntype; + } +@@ -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_copy (type); ++ ntype = alloc_type_as_parent (type); + if (typeptr) + *typeptr = ntype; + } +@@ -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)); +- TYPE_NFIELDS (result_type) = 2; ++ TYPE_NFIELDS (result_type) = 3; + TYPE_FIELDS (result_type) = TYPE_ZALLOC (result_type, + TYPE_NFIELDS (result_type) + * sizeof (struct field)); + TYPE_LOW_BOUND (result_type) = low_bound; + TYPE_HIGH_BOUND (result_type) = high_bound; ++ TYPE_BYTE_STRIDE (result_type) = 0; + + if (low_bound >= 0) + TYPE_UNSIGNED (result_type) = 1; +@@ -826,26 +881,45 @@ create_array_type (struct type *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) +- low_bound = high_bound = 0; +- CHECK_TYPEDEF (element_type); +- /* Be careful when setting the array length. Ada arrays can be +- empty arrays with the high_bound being smaller than the low_bound. +- In such cases, the array length should be zero. */ +- if (high_bound < low_bound) +- TYPE_LENGTH (result_type) = 0; - else -- error (_("Malformed function STAB found in add_common_block()")); -- -- -- tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1); -- -- strcpy (tmp->owning_function, local_copy_func_stab); -- -- strcpy (tmp->name, name); -- tmp->offset = offset; -- tmp->next = NULL; -- tmp->entries = NULL; -- tmp->secnum = secnum; -- -- current_common = tmp; -- -- if (head_common_list == NULL) -- { -- head_common_list = tail_common_list = tmp; -- } -- else -- { -- tail_common_list->next = tmp; -- tail_common_list = tmp; -- } --} --#endif -- --/* The following function simply enters a given common entry onto -- the "current_common" block that has been saved away. */ -- --#if 0 --static void --add_common_entry (struct symbol *entry_sym_ptr) --{ -- COMMON_ENTRY_PTR tmp; -- -- -- -- /* The order of this list is important, since -- we expect the entries to appear in decl. -- order when we later issue "info common" calls */ -- -- tmp = allocate_common_entry_node (); -- -- tmp->next = NULL; -- tmp->symbol = entry_sym_ptr; -- -- if (current_common == NULL) -- error (_("Attempt to add COMMON entry with no block open!")); -- else -- { -- if (current_common->entries == NULL) -- { -- current_common->entries = tmp; -- current_common->end_of_entries = tmp; -- } -- else -- { -- current_common->end_of_entries->next = tmp; -- current_common->end_of_entries = tmp; -- } -- } --} --#endif -- --/* This routine finds the first encountred COMMON block named "name" */ -- --#if 0 --static SAVED_F77_COMMON_PTR --find_first_common_named (char *name) --{ -- -- SAVED_F77_COMMON_PTR tmp; -- -- tmp = head_common_list; -- -- while (tmp != NULL) -- { -- if (strcmp (tmp->name, name) == 0) -- return (tmp); -- else -- tmp = tmp->next; -- } -- return (NULL); --} --#endif -- --/* This routine finds the first encountred COMMON block named "name" -- that belongs to function funcname */ -- --SAVED_F77_COMMON_PTR --find_common_for_function (char *name, char *funcname) --{ -- -- SAVED_F77_COMMON_PTR tmp; -- -- tmp = head_common_list; -- -- while (tmp != NULL) -- { -- if (strcmp (tmp->name, name) == 0 -- && strcmp (tmp->owning_function, funcname) == 0) -- return (tmp); -- else -- tmp = tmp->next; -- } -- return (NULL); --} -- -- --#if 0 -- --/* The following function is called to patch up the offsets -- for the statics contained in the COMMON block named -- "name." */ -- --static void --patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum) --{ -- COMMON_ENTRY_PTR entry; -- -- blk->offset = offset; /* Keep this around for future use. */ -- -- entry = blk->entries; -- -- while (entry != NULL) -- { -- SYMBOL_VALUE (entry->symbol) += offset; -- SYMBOL_SECTION (entry->symbol) = secnum; -- -- entry = entry->next; -- } -- blk->secnum = secnum; --} -- --/* Patch all commons named "name" that need patching.Since COMMON -- blocks occur with relative infrequency, we simply do a linear scan on -- the name. Eventually, the best way to do this will be a -- hashed-lookup. Secnum is the section number for the .bss section -- (which is where common data lives). */ -- --static void --patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum) --{ -- -- SAVED_F77_COMMON_PTR tmp; -- -- /* For blank common blocks, change the canonical reprsentation -- of a blank name */ -- -- if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0 -- || strcmp (name, BLANK_COMMON_NAME_MF77) == 0) -- { -- xfree (name); -- name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1); -- strcpy (name, BLANK_COMMON_NAME_LOCAL); -- } -- -- tmp = head_common_list; -- -- while (tmp != NULL) -- { -- if (COMMON_NEEDS_PATCHING (tmp)) -- if (strcmp (tmp->name, name) == 0) -- patch_common_entries (tmp, offset, secnum); -- -- tmp = tmp->next; -- } --} --#endif -- --/* This macro adds the symbol-number for the start of the function -- (the symbol number of the .bf) referenced by symnum_fcn to a -- list. This list, in reality should be a FIFO queue but since -- #line pragmas sometimes cause line ranges to get messed up -- we simply create a linear list. This list can then be searched -- first by a queueing algorithm and upon failure fall back to -- a linear scan. */ -- --#if 0 --#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \ -- \ -- if (saved_bf_list == NULL) \ --{ \ -- tmp_bf_ptr = allocate_saved_bf_node(); \ -- \ -- tmp_bf_ptr->symnum_bf = (bf_sym); \ -- tmp_bf_ptr->symnum_fcn = (fcn_sym); \ -- tmp_bf_ptr->next = NULL; \ -- \ -- current_head_bf_list = saved_bf_list = tmp_bf_ptr; \ -- saved_bf_list_end = tmp_bf_ptr; \ -- } \ --else \ --{ \ -- tmp_bf_ptr = allocate_saved_bf_node(); \ -- \ -- tmp_bf_ptr->symnum_bf = (bf_sym); \ -- tmp_bf_ptr->symnum_fcn = (fcn_sym); \ -- tmp_bf_ptr->next = NULL; \ -- \ -- saved_bf_list_end->next = tmp_bf_ptr; \ -- saved_bf_list_end = tmp_bf_ptr; \ -- } --#endif -- --/* This function frees the entire (.bf,function) list */ -- --#if 0 --static void --clear_bf_list (void) --{ -- -- SAVED_BF_PTR tmp = saved_bf_list; -- SAVED_BF_PTR next = NULL; -- -- while (tmp != NULL) -- { -- next = tmp->next; -- xfree (tmp); -- tmp = next; -- } -- saved_bf_list = NULL; --} --#endif -- --int global_remote_debug; -- --#if 0 -- --static long --get_bf_for_fcn (long the_function) --{ -- SAVED_BF_PTR tmp; -- int nprobes = 0; -- -- /* First use a simple queuing algorithm (i.e. look and see if the -- item at the head of the queue is the one you want) */ -- -- if (saved_bf_list == NULL) -- internal_error (__FILE__, __LINE__, -- _("cannot get .bf node off empty list")); -- -- if (current_head_bf_list != NULL) -- if (current_head_bf_list->symnum_fcn == the_function) -- { -- if (global_remote_debug) -- fprintf_unfiltered (gdb_stderr, "*"); -- -- tmp = current_head_bf_list; -- current_head_bf_list = current_head_bf_list->next; -- return (tmp->symnum_bf); -- } -- -- /* If the above did not work (probably because #line directives were -- used in the sourcefile and they messed up our internal tables) we now do -- the ugly linear scan */ -- -- if (global_remote_debug) -- fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n"); -- -- nprobes = 0; -- tmp = saved_bf_list; -- while (tmp != NULL) -- { -- nprobes++; -- if (tmp->symnum_fcn == the_function) -- { -- if (global_remote_debug) -- fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes); -- current_head_bf_list = tmp->next; -- return (tmp->symnum_bf); -- } -- tmp = tmp->next; -- } -- -- return (-1); --} -- --static SAVED_FUNCTION_PTR saved_function_list = NULL; --static SAVED_FUNCTION_PTR saved_function_list_end = NULL; -- --static void --clear_function_list (void) --{ -- SAVED_FUNCTION_PTR tmp = saved_function_list; -- SAVED_FUNCTION_PTR next = NULL; -- -- while (tmp != NULL) -- { -- next = tmp->next; -- xfree (tmp); -- tmp = next; -- } -- -- saved_function_list = NULL; --} --#endif -diff --git a/gdb/f-lang.h b/gdb/f-lang.h -index 711bdba..9d7d92b 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 */ - extern void f_print_type (struct type *, char *, struct ui_file *, int, - int); - -+extern const char *f_object_address_data_valid_print_to_stream -+ (struct type *type, struct ui_file *stream); -+extern void f_object_address_data_valid_or_error (struct type *type); -+ - extern int f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR, - struct ui_file *, int, - const struct value_print_options *); -@@ -47,41 +51,8 @@ enum f90_range_type - NONE_BOUND_DEFAULT /* "(low:high)" */ - }; - --struct common_entry -- { -- struct symbol *symbol; /* The symbol node corresponding -- to this component */ -- struct common_entry *next; /* The next component */ -- }; -- --struct saved_f77_common -- { -- char *name; /* Name of COMMON */ -- char *owning_function; /* Name of parent function */ -- int secnum; /* Section # of .bss */ -- CORE_ADDR offset; /* Offset from .bss for -- this block */ -- struct common_entry *entries; /* List of block's components */ -- struct common_entry *end_of_entries; /* ptr. to end of components */ -- struct saved_f77_common *next; /* Next saved COMMON block */ -- }; -- --typedef struct saved_f77_common SAVED_F77_COMMON, *SAVED_F77_COMMON_PTR; -- --typedef struct common_entry COMMON_ENTRY, *COMMON_ENTRY_PTR; -- --extern SAVED_F77_COMMON_PTR head_common_list; /* Ptr to 1st saved COMMON */ --extern SAVED_F77_COMMON_PTR tail_common_list; /* Ptr to last saved COMMON */ --extern SAVED_F77_COMMON_PTR current_common; /* Ptr to current COMMON */ -- --extern SAVED_F77_COMMON_PTR find_common_for_function (char *, char *); -- --#define UNINITIALIZED_SECNUM -1 --#define COMMON_NEEDS_PATCHING(blk) ((blk)->secnum == UNINITIALIZED_SECNUM) -- - #define BLANK_COMMON_NAME_ORIGINAL "#BLNK_COM" /* XLF assigned */ - #define BLANK_COMMON_NAME_MF77 "__BLNK__" /* MF77 assigned */ --#define BLANK_COMMON_NAME_LOCAL "__BLANK" /* Local GDB */ - - /* When reasonable array bounds cannot be fetched, such as when - you ask to 'mt print symbols' and there is no stack frame and -@@ -113,6 +84,7 @@ struct builtin_f_type - struct type *builtin_logical; - struct type *builtin_logical_s1; - struct type *builtin_logical_s2; -+ struct type *builtin_logical_s8; - 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 -+++ b/gdb/f-typeprint.c -@@ -31,7 +31,7 @@ - #include "gdbcore.h" - #include "target.h" - #include "f-lang.h" -- -+#include "dwarf2loc.h" - #include "gdb_string.h" - #include - -@@ -48,6 +48,34 @@ void f_type_print_varspec_prefix (struct type *, struct ui_file *, - void f_type_print_base (struct type *, struct ui_file *, int, int); - - -+const char * -+f_object_address_data_valid_print_to_stream (struct type *type, -+ struct ui_file *stream) -+{ -+ const char *msg; -+ -+ msg = object_address_data_not_valid (type); -+ if (msg != NULL) -+ { -+ /* Assuming the content printed to STREAM should not be localized. */ -+ fprintf_filtered (stream, "<%s>", msg); -+ } -+ -+ return msg; -+} -+ -+void -+f_object_address_data_valid_or_error (struct type *type) -+{ -+ const char *msg; -+ -+ msg = object_address_data_not_valid (type); -+ if (msg != NULL) -+ { -+ error (_("Cannot access it because the %s."), _(msg)); -+ } -+} -+ - /* LEVEL is the depth to indent lines by. */ - - void -@@ -57,6 +85,9 @@ f_print_type (struct type *type, char *varstring, struct ui_file *stream, - enum type_code code; - int demangled_args; - -+ if (f_object_address_data_valid_print_to_stream (type, stream) != NULL) -+ return; -+ - f_type_print_base (type, stream, show, level); - code = TYPE_CODE (type); - if ((varstring != NULL && *varstring != '\0') -@@ -166,6 +197,9 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, - - QUIT; - -+ if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF) -+ CHECK_TYPEDEF (type); -+ - switch (TYPE_CODE (type)) - { - case TYPE_CODE_ARRAY: -diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c -index 5721041..2cff7bc 100644 ---- a/gdb/f-valprint.c -+++ b/gdb/f-valprint.c -@@ -34,10 +34,8 @@ - #include "gdbcore.h" - #include "command.h" - #include "block.h" -- --#if 0 --static int there_is_a_visible_common_named (char *); --#endif -+#include "dictionary.h" -+#include "gdb_assert.h" - - extern void _initialize_f_valprint (void); - static void info_common_command (char *, int); -@@ -54,15 +52,17 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2]; - /* The following macro gives us the size of the nth dimension, Where - n is 1 based. */ - --#define F77_DIM_SIZE(n) (f77_array_offset_tbl[n][1]) -+#define F77_DIM_COUNT(n) (f77_array_offset_tbl[n][1]) - --/* The following gives us the offset for row n where n is 1-based. */ -+/* The following gives us the element size for row n where n is 1-based. */ - --#define F77_DIM_OFFSET(n) (f77_array_offset_tbl[n][0]) -+#define F77_DIM_BYTE_STRIDE(n) (f77_array_offset_tbl[n][0]) - - int - f77_get_lowerbound (struct type *type) - { -+ f_object_address_data_valid_or_error (type); -+ - if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type)) - error (_("Lower bound may not be '*' in F77")); - -@@ -72,14 +72,17 @@ f77_get_lowerbound (struct type *type) - int - f77_get_upperbound (struct type *type) - { -+ f_object_address_data_valid_or_error (type); -+ - if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) - { -- /* We have an assumed size array on our hands. Assume that -- upper_bound == lower_bound so that we show at least 1 element. -- If the user wants to see more elements, let him manually ask for 'em -- and we'll subscript the array and show him. */ -+ /* We have an assumed size array on our hands. As type_length_get -+ already assumes a length zero of arrays with underfined bounds VALADDR -+ passed to the Fortran functions does not contained the real inferior -+ memory content. User should request printing of specific array -+ elements instead. */ - -- return f77_get_lowerbound (type); -+ return f77_get_lowerbound (type) - 1; - } - - return TYPE_ARRAY_UPPER_BOUND_VALUE (type); -@@ -135,24 +138,29 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream) - upper = f77_get_upperbound (tmp_type); - lower = f77_get_lowerbound (tmp_type); - -- F77_DIM_SIZE (ndimen) = upper - lower + 1; -+ F77_DIM_COUNT (ndimen) = upper - lower + 1; -+ -+ F77_DIM_BYTE_STRIDE (ndimen) = -+ TYPE_ARRAY_BYTE_STRIDE_VALUE (tmp_type); - - tmp_type = TYPE_TARGET_TYPE (tmp_type); - ndimen++; - } - -- /* Now we multiply eltlen by all the offsets, so that later we -+ /* Now we multiply eltlen by all the BYTE_STRIDEs, so that later we - can print out array elements correctly. Up till now we -- know an offset to apply to get the item but we also -+ know an eltlen to apply to get the item but we also - have to know how much to add to get to the next item */ - - ndimen--; - eltlen = TYPE_LENGTH (tmp_type); -- F77_DIM_OFFSET (ndimen) = eltlen; -+ if (F77_DIM_BYTE_STRIDE (ndimen) == 0) -+ F77_DIM_BYTE_STRIDE (ndimen) = eltlen; - while (--ndimen > 0) - { -- eltlen *= F77_DIM_SIZE (ndimen + 1); -- F77_DIM_OFFSET (ndimen) = eltlen; -+ eltlen *= F77_DIM_COUNT (ndimen + 1); -+ if (F77_DIM_BYTE_STRIDE (ndimen) == 0) -+ F77_DIM_BYTE_STRIDE (ndimen) = eltlen; - } - } - -@@ -172,34 +180,34 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, - - if (nss != ndimensions) - { -- for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < options->print_max); i++) -+ for (i = 0; (i < F77_DIM_COUNT (nss) && (*elts) < options->print_max); i++) - { - fprintf_filtered (stream, "( "); - f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type), -- valaddr + i * F77_DIM_OFFSET (nss), -- address + i * F77_DIM_OFFSET (nss), -+ valaddr + i * F77_DIM_BYTE_STRIDE (nss), -+ address + i * F77_DIM_BYTE_STRIDE (nss), - stream, recurse, options, elts); - fprintf_filtered (stream, ") "); - } -- if (*elts >= options->print_max && i < F77_DIM_SIZE (nss)) -+ if (*elts >= options->print_max && i < F77_DIM_COUNT (nss)) - fprintf_filtered (stream, "..."); - } - else - { -- for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < options->print_max; -+ for (i = 0; i < F77_DIM_COUNT (nss) && (*elts) < options->print_max; - i++, (*elts)++) - { - val_print (TYPE_TARGET_TYPE (type), -- valaddr + i * F77_DIM_OFFSET (ndimensions), -+ valaddr + i * F77_DIM_BYTE_STRIDE (ndimensions), - 0, -- address + i * F77_DIM_OFFSET (ndimensions), -+ address + i * F77_DIM_BYTE_STRIDE (ndimensions), - stream, recurse, options, current_language); - -- if (i != (F77_DIM_SIZE (nss) - 1)) -+ if (i != (F77_DIM_COUNT (nss) - 1)) - fprintf_filtered (stream, ", "); - - if ((*elts == options->print_max - 1) -- && (i != (F77_DIM_SIZE (nss) - 1))) -+ && (i != (F77_DIM_COUNT (nss) - 1))) - fprintf_filtered (stream, "..."); - } - } -@@ -251,12 +259,16 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, - CORE_ADDR addr; - int index; - -+ if (f_object_address_data_valid_print_to_stream (type, stream) != NULL) -+ return 0; -+ - 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, - return 0; - } - --static void --list_all_visible_commons (char *funname) -+static int -+info_common_command_for_block (struct block *block, struct frame_info *frame, -+ const char *comname) - { -- SAVED_F77_COMMON_PTR tmp; -- -- tmp = head_common_list; -- -- printf_filtered (_("All COMMON blocks visible at this level:\n\n")); -- -- while (tmp != NULL) -- { -- if (strcmp (tmp->owning_function, funname) == 0) -- printf_filtered ("%s\n", tmp->name); -- -- tmp = tmp->next; -- } -+ struct dict_iterator iter; -+ struct symbol *sym; -+ int values_printed = 0; -+ const char *name; -+ struct value_print_options opts; -+ -+ get_user_print_options (&opts); -+ -+ ALL_BLOCK_SYMBOLS (block, iter, sym) -+ if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN) -+ { -+ struct type *type = SYMBOL_TYPE (sym); -+ int index; -+ -+ gdb_assert (SYMBOL_CLASS (sym) == LOC_STATIC); -+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT); -+ -+ if (comname && (!SYMBOL_LINKAGE_NAME (sym) -+ || strcmp (comname, SYMBOL_LINKAGE_NAME (sym)) != 0)) -+ continue; -+ -+ values_printed = 1; -+ if (SYMBOL_PRINT_NAME (sym)) -+ printf_filtered (_("Contents of F77 COMMON block '%s':\n"), -+ SYMBOL_PRINT_NAME (sym)); -+ else -+ printf_filtered (_("Contents of blank COMMON block:\n")); -+ -+ for (index = 0; index < TYPE_NFIELDS (type); index++) -+ { -+ struct value *val; -+ -+ gdb_assert (field_is_static (&TYPE_FIELD (type, index))); -+ val = value_static_field (type, index); -+ -+ printf_filtered ("%s = ", TYPE_FIELD_NAME (type, index)); -+ value_print (val, gdb_stdout, &opts); -+ putchar_filtered ('\n'); -+ } -+ -+ putchar_filtered ('\n'); -+ } -+ -+ return values_printed; - } - - /* This function is used to print out the values in a given COMMON -@@ -489,11 +533,9 @@ list_all_visible_commons (char *funname) - static void - info_common_command (char *comname, int from_tty) - { -- SAVED_F77_COMMON_PTR the_common; -- COMMON_ENTRY_PTR entry; - struct frame_info *fi; -- char *funname = 0; -- struct symbol *func; -+ struct block *block; -+ int values_printed = 0; - - /* 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) - /* The following is generally ripped off from stack.c's routine - print_frame_info() */ - -- func = find_pc_function (get_frame_pc (fi)); -- if (func) -- { -- /* In certain pathological cases, the symtabs give the wrong -- function (when we are in the first function in a file which -- is compiled without debugging symbols, the previous function -- is compiled with debugging symbols, and the "foo.o" symbol -- that is supposed to tell us where the file with debugging symbols -- ends has been truncated by ar because it is longer than 15 -- characters). -- -- So look in the minimal symbol tables as well, and if it comes -- up with a larger address for the function use that instead. -- I don't think this can ever cause any problems; there shouldn't -- be any minimal symbols in the middle of a function. -- FIXME: (Not necessarily true. What about text labels) */ -- -- struct minimal_symbol *msymbol = -- lookup_minimal_symbol_by_pc (get_frame_pc (fi)); -- -- if (msymbol != NULL -- && (SYMBOL_VALUE_ADDRESS (msymbol) -- > BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) -- funname = SYMBOL_LINKAGE_NAME (msymbol); -- else -- funname = SYMBOL_LINKAGE_NAME (func); -- } -- else -- { -- struct minimal_symbol *msymbol = -- lookup_minimal_symbol_by_pc (get_frame_pc (fi)); -- -- if (msymbol != NULL) -- funname = SYMBOL_LINKAGE_NAME (msymbol); -- else /* Got no 'funname', code below will fail. */ -- error (_("No function found for frame.")); -- } -- -- /* If comname is NULL, we assume the user wishes to see the -- which COMMON blocks are visible here and then return */ -- -- if (comname == 0) -+ block = get_frame_block (fi, 0); -+ if (block == NULL) - { -- list_all_visible_commons (funname); -+ printf_filtered (_("No symbol table info available.\n")); - return; - } - -- the_common = find_common_for_function (comname, funname); -- -- if (the_common) -+ while (block) - { -- if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0) -- printf_filtered (_("Contents of blank COMMON block:\n")); -- else -- printf_filtered (_("Contents of F77 COMMON block '%s':\n"), comname); -- -- printf_filtered ("\n"); -- entry = the_common->entries; -- -- while (entry != NULL) -- { -- print_variable_and_value (NULL, entry->symbol, fi, gdb_stdout, 0); -- entry = entry->next; -- } -+ if (info_common_command_for_block (block, fi, comname)) -+ values_printed = 1; -+ /* After handling the function's top-level block, stop. Don't -+ continue to its superblock, the block of per-file symbols. */ -+ if (BLOCK_FUNCTION (block)) -+ break; -+ block = BLOCK_SUPERBLOCK (block); - } -- else -- printf_filtered (_("Cannot locate the common block %s in function '%s'\n"), -- comname, funname); --} -- --/* This function is used to determine whether there is a -- F77 common block visible at the current scope called 'comname'. */ -- --#if 0 --static int --there_is_a_visible_common_named (char *comname) --{ -- SAVED_F77_COMMON_PTR the_common; -- struct frame_info *fi; -- char *funname = 0; -- struct symbol *func; -- -- if (comname == NULL) -- error (_("Cannot deal with NULL common name!")); - -- fi = get_selected_frame (_("No frame selected")); -- -- /* The following is generally ripped off from stack.c's routine -- print_frame_info() */ -- -- func = find_pc_function (fi->pc); -- if (func) -+ if (!values_printed) - { -- /* In certain pathological cases, the symtabs give the wrong -- function (when we are in the first function in a file which -- is compiled without debugging symbols, the previous function -- is compiled with debugging symbols, and the "foo.o" symbol -- that is supposed to tell us where the file with debugging symbols -- ends has been truncated by ar because it is longer than 15 -- characters). -- -- So look in the minimal symbol tables as well, and if it comes -- up with a larger address for the function use that instead. -- I don't think this can ever cause any problems; there shouldn't -- be any minimal symbols in the middle of a function. -- FIXME: (Not necessarily true. What about text labels) */ -- -- struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc); -- -- if (msymbol != NULL -- && (SYMBOL_VALUE_ADDRESS (msymbol) -- > BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) -- funname = SYMBOL_LINKAGE_NAME (msymbol); -+ if (comname) -+ printf_filtered (_("No common block '%s'.\n"), comname); - else -- funname = SYMBOL_LINKAGE_NAME (func); -+ printf_filtered (_("No common blocks.\n")); - } -- else -- { -- struct minimal_symbol *msymbol = -- lookup_minimal_symbol_by_pc (fi->pc); -- -- if (msymbol != NULL) -- funname = SYMBOL_LINKAGE_NAME (msymbol); -- } -- -- the_common = find_common_for_function (comname, funname); -- -- return (the_common ? 1 : 0); - } --#endif - - void - _initialize_f_valprint (void) -diff --git a/gdb/findcmd.c b/gdb/findcmd.c -index 7ae43e5..2894948 100644 ---- a/gdb/findcmd.c -+++ b/gdb/findcmd.c -@@ -26,7 +26,7 @@ - - /* Copied from bfd_put_bits. */ - --static void -+void - 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) - } - } - -+/* Allocates a buffer in *PATTERN_BUF, with a hard-coded initial size which -+ will be returned in *PATTERN_BUF_SIZE. *PATTERN_BUF_END points to the same -+ place as *PATTERN_BUF, indicating that the buffer is initially empty. */ -+ -+void -+allocate_pattern_buffer (char **pattern_buf, char **pattern_buf_end, -+ ULONGEST *pattern_buf_size) -+{ -+#define INITIAL_PATTERN_BUF_SIZE 100 -+ *pattern_buf_size = INITIAL_PATTERN_BUF_SIZE; -+ *pattern_buf = xmalloc (*pattern_buf_size); -+ *pattern_buf_end = *pattern_buf; -+} -+ -+/* Grows *PATTERN_BUF by a factor of two if it's not large enough to hold -+ VAL_BYTES more bytes or a 64-bit value, whichever is larger. -+ *PATTERN_BUF_END is updated as necessary. */ -+ -+void -+increase_pattern_buffer (char **pattern_buf, char **pattern_buf_end, -+ ULONGEST *pattern_buf_size, int val_bytes) -+{ -+ /* Keep it simple and assume size == 'g' when watching for when we -+ need to grow the pattern buf. */ -+ if ((*pattern_buf_end - *pattern_buf + max (val_bytes, sizeof (int64_t))) -+ > *pattern_buf_size) -+ { -+ size_t current_offset = *pattern_buf_end - *pattern_buf; -+ -+ *pattern_buf_size *= 2; -+ *pattern_buf = xrealloc (*pattern_buf, *pattern_buf_size); -+ *pattern_buf_end = *pattern_buf + current_offset; -+ } -+} -+ - /* 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, - char *pattern_buf; - /* Current size of search pattern buffer. - We realloc space as needed. */ --#define INITIAL_PATTERN_BUF_SIZE 100 -- ULONGEST pattern_buf_size = INITIAL_PATTERN_BUF_SIZE; -+ ULONGEST pattern_buf_size; - /* 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, - if (args == NULL) - error (_("Missing search parameters.")); - -- pattern_buf = xmalloc (pattern_buf_size); -- pattern_buf_end = pattern_buf; -+ allocate_pattern_buffer (&pattern_buf, &pattern_buf_end, &pattern_buf_size); - 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, - v = parse_to_comma_and_eval (&s); - val_bytes = TYPE_LENGTH (value_type (v)); - -- /* Keep it simple and assume size == 'g' when watching for when we -- need to grow the pattern buf. */ -- if ((pattern_buf_end - pattern_buf + max (val_bytes, sizeof (int64_t))) -- > pattern_buf_size) -- { -- size_t current_offset = pattern_buf_end - pattern_buf; -- pattern_buf_size *= 2; -- pattern_buf = xrealloc (pattern_buf, pattern_buf_size); -- pattern_buf_end = pattern_buf + current_offset; -- } -+ increase_pattern_buffer (&pattern_buf, &pattern_buf_end, -+ &pattern_buf_size, val_bytes); - - if (size != '\0') - { -@@ -236,6 +261,45 @@ parse_find_args (char *args, ULONGEST *max_countp, - discard_cleanups (old_cleanups); - } - -+/* Drives target_search_memory to sweep through the specified search space, -+ possibly in several iterations (with one call to this function for each -+ iteration). *START_ADDR is the address where the search starts, and is -+ updated to the next starting address to continue the search. -+ *SEARCH_SPACE_LEN is the amount of bytes which will be searched, and is -+ updated for the next iteration. PATTERN_BUF holds the pattern to be searched -+ for, PATTERN_LEN is the size of the pattern in bytes. If a match is found, -+ it's address is put in *FOUND_ADDR. -+ -+ Returns 1 if found, 0 if not found, and -1 if there was an error requiring -+ halting of the search (e.g. memory read error). */ -+ -+int -+search_memory (CORE_ADDR *start_addr, ULONGEST *search_space_len, -+ const char *pattern_buf, ULONGEST pattern_len, -+ CORE_ADDR *found_addr) -+{ -+ /* Offset from start of this iteration to the next iteration. */ -+ ULONGEST next_iter_incr; -+ int found; -+ -+ found = target_search_memory (*start_addr, *search_space_len, -+ pattern_buf, pattern_len, found_addr); -+ if (found <= 0) -+ return found; -+ -+ /* Begin next iteration at one byte past this match. */ -+ next_iter_incr = (*found_addr - *start_addr) + 1; -+ -+ /* For robustness, we don't let search_space_len go -ve here. */ -+ if (*search_space_len >= next_iter_incr) -+ *search_space_len -= next_iter_incr; -+ else -+ *search_space_len = 0; -+ *start_addr += next_iter_incr; -+ -+ return found; -+} -+ - static void - find_command (char *args, int from_tty) - { -@@ -264,12 +328,11 @@ find_command (char *args, int from_tty) - while (search_space_len >= pattern_len - && found_count < max_count) - { -- /* Offset from start of this iteration to the next iteration. */ -- ULONGEST next_iter_incr; - CORE_ADDR found_addr; -- int found = target_search_memory (start_addr, search_space_len, -- pattern_buf, pattern_len, &found_addr); -+ int found; - -+ found = search_memory (&start_addr, &search_space_len, pattern_buf, -+ pattern_len, &found_addr); - if (found <= 0) - break; - -@@ -277,16 +340,6 @@ find_command (char *args, int from_tty) - printf_filtered ("\n"); - ++found_count; - last_found_addr = found_addr; -- -- /* Begin next iteration at one byte past this match. */ -- next_iter_incr = (found_addr - start_addr) + 1; -- -- /* For robustness, we don't let search_space_len go -ve here. */ -- if (search_space_len >= next_iter_incr) -- search_space_len -= next_iter_incr; -- else -- search_space_len = 0; -- start_addr += next_iter_incr; - } - - /* Record and print the results. */ -diff --git a/gdb/findvar.c b/gdb/findvar.c -index 1048887..b958ec6 100644 ---- a/gdb/findvar.c -+++ b/gdb/findvar.c -@@ -35,6 +35,7 @@ - #include "user-regs.h" - #include "block.h" - #include "objfiles.h" -+#include "dwarf2loc.h" - - /* 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) - /* 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. -- If the variable cannot be found, return a zero pointer. */ -+ If the variable cannot be found, return a zero pointer. -+ We have to first find the address of the variable before allocating struct -+ value to return as its size may depend on DW_OP_PUSH_OBJECT_ADDRESS possibly -+ used by its type. */ - - struct value * - read_var_value (struct symbol *var, struct frame_info *frame) - { -- struct value *v; - struct type *type = SYMBOL_TYPE (var); - CORE_ADDR addr; -- int len; -- -- if (SYMBOL_CLASS (var) == LOC_COMPUTED -- || SYMBOL_CLASS (var) == LOC_REGISTER) -- /* These cases do not use V. */ -- v = NULL; -- else -- { -- v = allocate_value (type); -- VALUE_LVAL (v) = lval_memory; /* The most likely possibility. */ -- } -- -- len = TYPE_LENGTH (type); - - if (symbol_read_needs_frame (var)) - gdb_assert (frame); -@@ -410,31 +400,39 @@ 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, -- (LONGEST) SYMBOL_VALUE (var)); -- VALUE_LVAL (v) = not_lval; -- return v; -+ { -+ /* Put the constant back in target format. */ -+ struct value *v = allocate_value (type); -+ VALUE_LVAL (v) = not_lval; -+ store_signed_integer (value_contents_raw (v), TYPE_LENGTH (type), -+ (LONGEST) SYMBOL_VALUE (var)); -+ return v; -+ } - - case LOC_LABEL: -- /* Put the constant back in target format. */ -- if (overlay_debugging) -- { -- CORE_ADDR addr -- = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var), -- SYMBOL_OBJ_SECTION (var)); -- store_typed_address (value_contents_raw (v), type, addr); -- } -- else -- store_typed_address (value_contents_raw (v), type, -- SYMBOL_VALUE_ADDRESS (var)); -- VALUE_LVAL (v) = not_lval; -- return v; -+ { -+ /* Put the constant back in target format. */ -+ struct value *v = allocate_value (type); -+ VALUE_LVAL (v) = not_lval; -+ if (overlay_debugging) -+ { -+ CORE_ADDR addr -+ = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var), -+ SYMBOL_OBJ_SECTION (var)); -+ store_typed_address (value_contents_raw (v), type, addr); -+ } -+ else -+ store_typed_address (value_contents_raw (v), type, -+ SYMBOL_VALUE_ADDRESS (var)); -+ return v; -+ } - - case LOC_CONST_BYTES: - { -- memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), len); -+ struct value *v = allocate_value (type); - VALUE_LVAL (v) = not_lval; -+ memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), -+ TYPE_LENGTH (type)); - return v; - } - -@@ -476,12 +474,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)); -- else -- VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (var)); -- return v; -+ { -+ CORE_ADDR addr; -+ struct value *v; -+ -+ if (overlay_debugging) -+ addr = symbol_overlayed_address -+ (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var)); -+ else -+ addr = BLOCK_START (SYMBOL_BLOCK_VALUE (var)); -+ /* ADDR is set here for ALLOCATE_VALUE's CHECK_TYPEDEF for -+ DW_OP_push_object_address. */ -+ object_address_set (addr); -+ v = allocate_value (type); -+ VALUE_ADDRESS (v) = addr; -+ VALUE_LVAL (v) = lval_memory; -+ return v; -+ } - - case LOC_REGISTER: - case LOC_REGPARM_ADDR: -@@ -499,7 +508,6 @@ read_var_value (struct symbol *var, struct frame_info *frame) - error (_("Value of register variable not available.")); - - addr = value_as_address (regval); -- VALUE_LVAL (v) = lval_memory; - } - else - { -@@ -542,18 +550,33 @@ read_var_value (struct symbol *var, struct frame_info *frame) - break; - - case LOC_OPTIMIZED_OUT: -- VALUE_LVAL (v) = not_lval; -- set_value_optimized_out (v, 1); -- return v; -+ { -+ struct value *v = allocate_value (type); -+ -+ VALUE_LVAL (v) = not_lval; -+ set_value_optimized_out (v, 1); -+ return v; -+ } - - default: - error (_("Cannot look up value of a botched symbol.")); - break; - } - -- VALUE_ADDRESS (v) = addr; -- set_value_lazy (v, 1); -- return v; -+ { -+ struct value *v; -+ -+ /* ADDR is set here for ALLOCATE_VALUE's CHECK_TYPEDEF for -+ DW_OP_PUSH_OBJECT_ADDRESS. */ -+ object_address_set (addr); -+ v = allocate_value (type); -+ VALUE_ADDRESS (v) = addr; -+ VALUE_LVAL (v) = lval_memory; -+ -+ set_value_lazy (v, 1); -+ -+ return v; -+ } - } - - /* Install default attributes for register values. */ -@@ -590,10 +613,11 @@ struct value * - value_from_register (struct type *type, int regnum, struct frame_info *frame) - { - struct gdbarch *gdbarch = get_frame_arch (frame); -- struct type *type1 = check_typedef (type); - struct value *v; - -- if (gdbarch_convert_register_p (gdbarch, regnum, type1)) -+ type = check_typedef (type); -+ -+ if (gdbarch_convert_register_p (gdbarch, regnum, type)) - { - /* 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) - VALUE_FRAME_ID (v) = get_frame_id (frame); - VALUE_REGNUM (v) = regnum; - gdbarch_register_to_value (gdbarch, -- frame, regnum, type1, value_contents_raw (v)); -+ frame, regnum, type, value_contents_raw (v)); - } - else - { -diff --git a/gdb/frame.c b/gdb/frame.c -index dfd6b3d..2ea37c3 100644 ---- a/gdb/frame.c -+++ b/gdb/frame.c -@@ -596,7 +596,7 @@ frame_register_unwind (struct frame_info *frame, int regnum, - - *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 -+ - #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, - } - - 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; -+} -+ -+int -+gdbarch_get_syscall_by_number_p (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ return gdbarch->get_syscall_by_number != NULL; -+} -+ -+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; - - 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); - -+/* 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); - -+/* Definition for an unknown syscall, used basically in error-cases. */ -+#define UNKNOWN_SYSCALL (-1) -+ - 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. -+ -+# 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 <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); - } - -@@ -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); -+ - return (type); - } - -@@ -248,7 +280,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); - 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) - - 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; - } -@@ -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)) - TYPE_TARGET_STUB (result_type) = 1; - else - TYPE_LENGTH (result_type) = TYPE_LENGTH (check_typedef (index_type)); -- TYPE_NFIELDS (result_type) = 2; -+ TYPE_NFIELDS (result_type) = 3; - TYPE_FIELDS (result_type) = TYPE_ZALLOC (result_type, - TYPE_NFIELDS (result_type) - * sizeof (struct field)); - TYPE_LOW_BOUND (result_type) = low_bound; - TYPE_HIGH_BOUND (result_type) = high_bound; -+ TYPE_BYTE_STRIDE (result_type) = 0; - - if (low_bound >= 0) - TYPE_UNSIGNED (result_type) = 1; -@@ -805,30 +847,56 @@ 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) -- low_bound = high_bound = 0; -- CHECK_TYPEDEF (element_type); -- /* Be careful when setting the array length. Ada arrays can be -- empty arrays with the high_bound being smaller than the low_bound. -- In such cases, the array length should be zero. */ -- if (high_bound < low_bound) -- TYPE_LENGTH (result_type) = 0; -- else -- TYPE_LENGTH (result_type) = -- TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); - 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; - -- /* TYPE_FLAG_TARGET_STUB will take care of zero length arrays */ -+ /* DWARF blocks may depend on runtime information like -+ DW_OP_PUSH_OBJECT_ADDRESS not being available during the -+ CREATE_ARRAY_TYPE time. */ -+ if (TYPE_RANGE_BOUND_IS_DWARF_BLOCK (range_type, 0) -+ || TYPE_RANGE_BOUND_IS_DWARF_BLOCK (range_type, 1) -+ || TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (range_type) -+ || TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (range_type) -+ || get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) -+ { -+ low_bound = 0; -+ high_bound = -1; -+ } -+ -+ /* Be careful when setting the array length. Ada arrays can be -+ empty arrays with the high_bound being smaller than the low_bound. -+ In such cases, the array length should be zero. TYPE_TARGET_STUB needs to -+ be checked as it may have dependencies on DWARF blocks depending on -+ runtime information not available during the CREATE_ARRAY_TYPE time. */ -+ if (high_bound < low_bound || TYPE_TARGET_STUB (element_type)) -+ TYPE_LENGTH (result_type) = 0; -+ else -+ { -+ CHECK_TYPEDEF (element_type); -+ TYPE_LENGTH (result_type) = -+ TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); -+ } -+ - if (TYPE_LENGTH (result_type) == 0) -- TYPE_TARGET_STUB (result_type) = 1; -+ { -+ /* The real size will be computed for specific instances by -+ CHECK_TYPEDEF. */ -+ TYPE_TARGET_STUB (result_type) = 1; -+ } - - 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) - complaint (&symfile_complaints, _("stub type has NULL name")); - } - -+/* Calculate the memory length of array TYPE. -+ -+ TARGET_TYPE should be set to `check_typedef (TYPE_TARGET_TYPE (type))' as -+ a performance hint. Feel free to pass NULL. Set FULL_SPAN to return the -+ size incl. the possible padding of the last element - it may differ from the -+ cleared FULL_SPAN return value (the expected SIZEOF) for non-zero -+ TYPE_BYTE_STRIDE values. */ -+ -+static CORE_ADDR -+type_length_get (struct type *type, struct type *target_type, int full_span) -+{ -+ struct type *range_type; -+ int count; -+ CORE_ADDR byte_stride = 0; /* `= 0' for a false GCC warning. */ -+ CORE_ADDR element_size; -+ -+ if (TYPE_CODE (type) != TYPE_CODE_ARRAY -+ && TYPE_CODE (type) != TYPE_CODE_STRING) -+ return TYPE_LENGTH (type); -+ -+ /* Avoid executing TYPE_HIGH_BOUND for invalid (unallocated/unassociated) -+ Fortran arrays. The allocated data will never be used so they can be -+ zero-length. */ -+ if (object_address_data_not_valid (type)) -+ return 0; -+ -+ range_type = TYPE_INDEX_TYPE (type); -+ if (TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (range_type) -+ || TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (range_type)) -+ return 0; -+ count = TYPE_HIGH_BOUND (range_type) - TYPE_LOW_BOUND (range_type) + 1; -+ /* It may happen for wrong DWARF annotations returning garbage data. */ -+ if (count < 0) -+ warning (_("Range for type %s has invalid bounds %d..%d"), -+ TYPE_NAME (type), TYPE_LOW_BOUND (range_type), -+ TYPE_HIGH_BOUND (range_type)); -+ /* The code below does not handle count == 0 right. */ -+ if (count <= 0) -+ return 0; -+ if (full_span || count > 1) -+ { -+ /* We do not use TYPE_ARRAY_BYTE_STRIDE_VALUE (type) here as we want to -+ force FULL_SPAN to 1. */ -+ byte_stride = TYPE_BYTE_STRIDE (range_type); -+ if (byte_stride == 0) -+ { -+ if (target_type == NULL) -+ target_type = check_typedef (TYPE_TARGET_TYPE (type)); -+ byte_stride = type_length_get (target_type, NULL, 1); -+ } -+ } -+ if (full_span) -+ return count * byte_stride; -+ if (target_type == NULL) -+ target_type = check_typedef (TYPE_TARGET_TYPE (type)); -+ element_size = type_length_get (target_type, NULL, 1); -+ return (count - 1) * byte_stride + element_size; -+} -+ -+/* Prepare TYPE after being read in by the backend. Currently this function -+ only propagates the TYPE_DYNAMIC flag. */ -+ -+void -+finalize_type (struct type *type) -+{ -+ int i; -+ -+ for (i = 0; i < TYPE_NFIELDS (type); ++i) -+ if (TYPE_FIELD_TYPE (type, i) && TYPE_DYNAMIC (TYPE_FIELD_TYPE (type, i))) -+ break; -+ -+ /* FIXME: cplus_stuff is ignored here. */ -+ if (i < TYPE_NFIELDS (type) -+ || (TYPE_VPTR_BASETYPE (type) && TYPE_DYNAMIC (TYPE_VPTR_BASETYPE (type))) -+ || (TYPE_TARGET_TYPE (type) && TYPE_DYNAMIC (TYPE_TARGET_TYPE (type)))) -+ TYPE_DYNAMIC (type) = 1; -+} -+ - /* 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) - /* 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 -- typedefs does not. */ -+ typedefs does not. Still original passed TYPE will have TYPE_LENGTH -+ updated. FIXME: Remove this dependency (only ada_to_fixed_type?). */ - - 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) - } - } - -- if (TYPE_TARGET_STUB (type)) -+ /* copy_type_recursive automatically makes the resulting type containing only -+ constant values expected by the callers of this function. */ -+ if (TYPE_DYNAMIC (type)) -+ { -+ htab_t copied_types; -+ struct type *type_old = type; -+ -+ copied_types = create_copied_types_hash (NULL); -+ type = copy_type_recursive (type, copied_types); -+ htab_delete (copied_types); -+ -+ gdb_assert (TYPE_DYNAMIC (type) == 0); -+ } -+ -+ if (!currently_reading_symtab -+ && (TYPE_TARGET_STUB (type) || TYPE_DYNAMIC (type))) - { -- struct type *range_type; - struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type)); - -+ if (TYPE_DYNAMIC (type)) -+ TYPE_TARGET_TYPE (type) = target_type; - if (TYPE_STUB (target_type) || TYPE_TARGET_STUB (target_type)) - { - /* Empty. */ - } - else if (TYPE_CODE (type) == TYPE_CODE_ARRAY -- && TYPE_NFIELDS (type) == 1 -- && (TYPE_CODE (range_type = TYPE_INDEX_TYPE (type)) -- == TYPE_CODE_RANGE)) -+ || TYPE_CODE (type) == TYPE_CODE_STRING) - { - /* Now recompute the length of the array type, based on its -- number of elements and the target type's length. -- Watch out for Ada null Ada arrays where the high bound -- is smaller than the low bound. */ -- const int low_bound = TYPE_LOW_BOUND (range_type); -- const int high_bound = TYPE_HIGH_BOUND (range_type); -- int nb_elements; -- -- if (high_bound < low_bound) -- nb_elements = 0; -- else -- nb_elements = high_bound - low_bound + 1; -- -- TYPE_LENGTH (type) = nb_elements * TYPE_LENGTH (target_type); -+ number of elements and the target type's length. */ -+ TYPE_LENGTH (type) = type_length_get (type, target_type, 0); - TYPE_TARGET_STUB (type) = 0; - } - else if (TYPE_CODE (type) == TYPE_CODE_RANGE) -@@ -1529,9 +1684,12 @@ check_typedef (struct type *type) - TYPE_LENGTH (type) = TYPE_LENGTH (target_type); - TYPE_TARGET_STUB (type) = 0; - } -+ TYPE_DYNAMIC (type) = 0; - } -+ - /* Cache TYPE_LENGTH for future use. */ - TYPE_LENGTH (orig_type) = TYPE_LENGTH (type); -+ - return type; - } - -@@ -1753,7 +1911,7 @@ init_type (enum type_code code, int length, int flags, - { - struct type *type; - -- type = alloc_type (objfile); -+ type = alloc_type (objfile, NULL); - 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, - { - INIT_CPLUS_SPECIFIC (type); - } -+ -+ if (!objfile) -+ type_incref (type); -+ - return (type); - } - -@@ -2916,33 +3087,47 @@ type_pair_eq (const void *item_lhs, const void *item_rhs) - } - - /* Allocate the hash table used by copy_type_recursive to walk -- types without duplicates. We use OBJFILE's obstack, because -- OBJFILE is about to be deleted. */ -+ types without duplicates. */ - - htab_t - create_copied_types_hash (struct objfile *objfile) - { -- return htab_create_alloc_ex (1, type_pair_hash, type_pair_eq, -- NULL, &objfile->objfile_obstack, -- hashtab_obstack_allocate, -- dummy_obstack_deallocate); -+ if (objfile == NULL) -+ { -+ /* NULL OBJFILE is for TYPE_DYNAMIC types already contained in -+ OBJFILE_MALLOC memory, such as those from VALUE_HISTORY_CHAIN. Table -+ element entries get allocated by xmalloc - so use xfree. */ -+ return htab_create (1, type_pair_hash, type_pair_eq, xfree); -+ } -+ else -+ { -+ /* Use OBJFILE's obstack, because OBJFILE is about to be deleted. Table -+ element entries get allocated by xmalloc - so use xfree. */ -+ return htab_create_alloc_ex (1, type_pair_hash, type_pair_eq, -+ xfree, &objfile->objfile_obstack, -+ hashtab_obstack_allocate, -+ dummy_obstack_deallocate); -+ } - } - --/* Recursively copy (deep copy) TYPE, if it is associated with -- 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. */ - --struct type * --copy_type_recursive (struct objfile *objfile, -- struct type *type, -- htab_t copied_types) -+static struct type * -+copy_type_recursive_1 (struct objfile *objfile, -+ struct type *type, -+ htab_t copied_types, -+ struct type **representative) - { - 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))) - 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; - - /* We must add the new type to the hash table immediately, in case -- we encounter this type again during a recursive call below. */ -- stored = obstack_alloc (&objfile->objfile_obstack, sizeof (struct type_pair)); -+ we encounter this type again during a recursive call below. Memory could -+ be allocated from OBJFILE in the case we will be removing OBJFILE, this -+ optimization is missed and xfree is called for it from COPIED_TYPES. */ -+ stored = xmalloc (sizeof (*stored)); - 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; - -+ /* 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; -+ TYPE_VPTR_BASETYPE (new_type) = NULL; -+ TYPE_NFIELDS (new_type) = 0; -+ TYPE_FIELDS (new_type) = NULL; -+ - 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, - TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); - TYPE_LENGTH (new_type) = TYPE_LENGTH (type); - -+ if (TYPE_ALLOCATED (new_type)) -+ { -+ gdb_assert (!TYPE_NOT_ALLOCATED (new_type)); -+ -+ if (!dwarf_locexpr_baton_eval (TYPE_ALLOCATED (new_type))) -+ TYPE_NOT_ALLOCATED (new_type) = 1; -+ TYPE_ALLOCATED (new_type) = NULL; -+ } -+ -+ if (TYPE_ASSOCIATED (new_type)) -+ { -+ gdb_assert (!TYPE_NOT_ASSOCIATED (new_type)); -+ -+ if (!dwarf_locexpr_baton_eval (TYPE_ASSOCIATED (new_type))) -+ TYPE_NOT_ASSOCIATED (new_type) = 1; -+ TYPE_ASSOCIATED (new_type) = NULL; -+ } -+ -+ if (!TYPE_DATA_LOCATION_IS_ADDR (new_type) -+ && TYPE_DATA_LOCATION_DWARF_BLOCK (new_type)) -+ { -+ if (TYPE_NOT_ALLOCATED (new_type) -+ || TYPE_NOT_ASSOCIATED (new_type)) -+ TYPE_DATA_LOCATION_DWARF_BLOCK (new_type) = NULL; -+ else -+ { -+ TYPE_DATA_LOCATION_IS_ADDR (new_type) = 1; -+ TYPE_DATA_LOCATION_ADDR (new_type) = dwarf_locexpr_baton_eval -+ (TYPE_DATA_LOCATION_DWARF_BLOCK (new_type)); -+ } -+ } -+ - /* Copy the fields. */ - if (TYPE_NFIELDS (type)) - { - int i, nfields; - - nfields = TYPE_NFIELDS (type); -+ TYPE_NFIELDS (new_type) = nfields; - TYPE_FIELDS (new_type) = XCALLOC (nfields, struct field); - for (i = 0; i < nfields; i++) - { -@@ -2990,8 +3219,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); - 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, - xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type, - i))); - break; -+ case FIELD_LOC_KIND_DWARF_BLOCK: -+ /* `struct dwarf2_locexpr_baton' is too bound to its objfile so -+ it is expected to be made constant by CHECK_TYPEDEF. */ -+ if (TYPE_NOT_ALLOCATED (new_type) -+ || TYPE_NOT_ASSOCIATED (new_type)) -+ SET_FIELD_DWARF_BLOCK (TYPE_FIELD (new_type, i), NULL); -+ else -+ SET_FIELD_BITPOS (TYPE_FIELD (new_type, i), -+ dwarf_locexpr_baton_eval (TYPE_FIELD_DWARF_BLOCK (type, i))); -+ break; - default: - internal_error (__FILE__, __LINE__, - _("Unexpected type field location kind: %d"), -@@ -3018,17 +3257,32 @@ copy_type_recursive (struct objfile *objfile, - } - } - -+ /* Convert TYPE_RANGE_HIGH_BOUND_IS_COUNT into a regular bound. */ -+ if (TYPE_CODE (type) == TYPE_CODE_RANGE -+ && TYPE_RANGE_HIGH_BOUND_IS_COUNT (type)) -+ { -+ TYPE_RANGE_HIGH_BOUND_IS_COUNT (new_type) = 0; -+ TYPE_HIGH_BOUND (new_type) = TYPE_LOW_BOUND (type) -+ + TYPE_HIGH_BOUND (type) - 1; -+ } -+ -+ /* Both FIELD_LOC_KIND_DWARF_BLOCK and TYPE_RANGE_HIGH_BOUND_IS_COUNT were -+ possibly converted. */ -+ TYPE_DYNAMIC (new_type) = 0; -+ - /* Copy pointers to other types. */ - if (TYPE_TARGET_TYPE (type)) - TYPE_TARGET_TYPE (new_type) = -- copy_type_recursive (objfile, -- TYPE_TARGET_TYPE (type), -- copied_types); -+ copy_type_recursive_1 (objfile, -+ TYPE_TARGET_TYPE (type), -+ copied_types, -+ representative); - if (TYPE_VPTR_BASETYPE (type)) - TYPE_VPTR_BASETYPE (new_type) = -- copy_type_recursive (objfile, -- TYPE_VPTR_BASETYPE (type), -- copied_types); -+ copy_type_recursive_1 (objfile, -+ TYPE_VPTR_BASETYPE (type), -+ copied_types, -+ representative); - /* 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, - return new_type; - } - -+/* Recursively copy (deep copy) TYPE. 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. */ -+ -+struct type * -+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); -+} -+ - /* 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) - return new_type; - } - -+static void delete_type (struct type *type); -+ -+/* 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) -+{ -+ int i; -+ void **slot; -+ struct -+ { -+ struct main_type *main_type; -+ } type_local = { main_type }, *type = &type_local; -+ -+ gdb_assert (TYPE_OBJFILE (type) == OBJFILE_MALLOC); -+ -+ xfree (TYPE_NAME (type)); -+ xfree (TYPE_TAG_NAME (type)); -+ -+ for (i = 0; i < TYPE_NFIELDS (type); ++i) -+ { -+ xfree (TYPE_FIELD_NAME (type, i)); -+ -+ if (TYPE_FIELD_LOC_KIND (type, i) == FIELD_LOC_KIND_PHYSNAME) -+ xfree (TYPE_FIELD_STATIC_PHYSNAME (type, i)); -+ } -+ 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)); -+ -+ 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. */ -+ -+static void -+delete_type_begin (void) -+{ -+ gdb_assert (deleted_main_types_hash == NULL); -+ -+ deleted_main_types_hash = htab_create_alloc (10, htab_hash_pointer, -+ htab_eq_pointer, NULL, xcalloc, xfree); -+} -+ -+/* 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. */ -+ -+static hashval_t -+type_refc_hash (const void *p) -+{ -+ const struct type_refc_entry *entry = p; -+ return htab_hash_pointer (entry->type); -+} -+ -+/* Equality function for type_refc_table. */ -+ -+static int -+type_refc_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; -+} -+ -+/* 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. */ -+ -+static void -+type_init_refc (struct type *new_type, struct type *parent_type) -+{ -+ int *refc; -+ void **slot; -+ struct type_refc_entry *new_entry; -+ -+ if (TYPE_OBJFILE (new_type)) -+ return; -+ -+ 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; -+ } -+ -+ 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; -+} -+ -+/* Increment the reference count for TYPE. */ -+ -+void -+type_incref (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); -+ ++*(found->refc); -+} -+ -+/* A traverse callback for type_refc_table which removes any entry -+ whose reference count is zero (unused entry). */ -+ -+static int -+type_refc_remove (void **slot, void *unused) -+{ -+ struct type_refc_entry *entry = *slot; -+ -+ if (*entry->refc == 0) -+ { -+ delete_type (entry->type); -+ -+ xfree (entry); -+ htab_clear_slot (type_refc_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. */ -+ -+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. */ -+ -+void -+free_all_types (void) -+{ -+ delete_type_begin (); -+ htab_traverse (type_refc_table, type_refc_remove, NULL); -+ delete_type_finish (); -+} -+ - 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); - - /* 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); - - /* 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) - { - 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); - - 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 ---- 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 - - #define TYPE_TARGET_STUB(t) (TYPE_MAIN_TYPE (t)->flag_target_stub) - -+/* Type needs to be evaluated on each CHECK_TYPEDEF and its results must not be -+ sticky. */ -+ -+#define TYPE_DYNAMIC(t) (TYPE_MAIN_TYPE (t)->flag_dynamic) -+ - /* 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) - -+/* Is HIGH_BOUND a low-bound relative count (1) or the high bound itself (0)? */ -+ -+#define TYPE_RANGE_HIGH_BOUND_IS_COUNT(range_type) \ -+ (TYPE_MAIN_TYPE (range_type)->flag_range_high_bound_is_count) -+ -+/* Not allocated. TYPE_ALLOCATED(t) must be NULL in such case. If this flag -+ is unset and TYPE_ALLOCATED(t) is NULL then the type is allocated. If this -+ flag is unset and TYPE_ALLOCATED(t) is not NULL then its DWARF block -+ determines the actual allocation state. */ -+ -+#define TYPE_NOT_ALLOCATED(t) (TYPE_MAIN_TYPE (t)->flag_not_allocated) -+ -+/* Not associated. TYPE_ASSOCIATED(t) must be NULL in such case. If this flag -+ is unset and TYPE_ASSOCIATED(t) is NULL then the type is associated. If -+ this flag is unset and TYPE_ASSOCIATED(t) is not NULL then its DWARF block -+ determines the actual association state. */ -+ -+#define TYPE_NOT_ASSOCIATED(t) (TYPE_MAIN_TYPE (t)->flag_not_associated) -+ -+/* Address of the actual data as for DW_AT_data_location. Its dwarf block must -+ not be evaluated unless both TYPE_NOT_ALLOCATED and TYPE_NOT_ASSOCIATED are -+ 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 -+ then its DWARF block determines the actual data address. */ -+ -+#define TYPE_DATA_LOCATION_IS_ADDR(t) \ -+ (TYPE_MAIN_TYPE (t)->flag_data_location_is_addr) -+ - /* 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; - unsigned int flag_nottext : 1; - unsigned int flag_fixed_instance : 1; -+ unsigned int flag_dynamic : 1; -+ unsigned int flag_range_high_bound_is_count : 1; -+ unsigned int flag_not_allocated : 1; -+ unsigned int flag_not_associated : 1; -+ unsigned int flag_data_location_is_addr : 1; - - /* 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 - - struct type *target_type; - -+ /* For DW_AT_data_location. */ -+ union -+ { -+ struct dwarf2_locexpr_baton *dwarf_block; -+ CORE_ADDR addr; -+ } -+ data_location; -+ -+ /* For DW_AT_allocated. */ -+ struct dwarf2_locexpr_baton *allocated; -+ -+ /* For DW_AT_associated. */ -+ struct dwarf2_locexpr_baton *associated; -+ - /* 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 *); - #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type - #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type - #define TYPE_CHAIN(thistype) (thistype)->chain --/* Note that if thistype is a TYPEDEF type, you have to call check_typedef. -- But check_typedef does set the TYPE_LENGTH of the TYPEDEF type, -- so you only have to call check_typedef once. Since allocate_value -+/* Note that if thistype is a TYPEDEF, ARRAY or STRING type, you have to call -+ check_typedef. But check_typedef does set the TYPE_LENGTH of the TYPEDEF -+ 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 *); - #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 -+#define TYPE_DATA_LOCATION_DWARF_BLOCK(thistype) TYPE_MAIN_TYPE (thistype)->data_location.dwarf_block -+#define TYPE_DATA_LOCATION_ADDR(thistype) TYPE_MAIN_TYPE (thistype)->data_location.addr -+#define TYPE_ALLOCATED(thistype) TYPE_MAIN_TYPE (thistype)->allocated -+#define TYPE_ASSOCIATED(thistype) TYPE_MAIN_TYPE (thistype)->associated - - #define TYPE_INDEX_TYPE(type) TYPE_FIELD_TYPE (type, 0) - #define TYPE_LOW_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 0) - #define TYPE_HIGH_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 1) -- --/* Moto-specific stuff for FORTRAN arrays */ -- --#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ -- (TYPE_FIELD_ARTIFICIAL(TYPE_INDEX_TYPE((arraytype)),1)) -+#define TYPE_BYTE_STRIDE(range_type) TYPE_FIELD_BITPOS (range_type, 2) -+ -+/* Whether we should use TYPE_FIELD_DWARF_BLOCK (and not TYPE_FIELD_BITPOS). */ -+#define TYPE_RANGE_BOUND_IS_DWARF_BLOCK(range_type, fieldno) \ -+ (TYPE_FIELD_LOC_KIND (range_type, fieldno) == FIELD_LOC_KIND_DWARF_BLOCK) -+#define TYPE_RANGE_BOUND_SET_DWARF_BLOCK(range_type, fieldno) \ -+ (TYPE_FIELD_LOC_KIND (range_type, fieldno) = FIELD_LOC_KIND_DWARF_BLOCK) -+#define TYPE_ARRAY_BOUND_IS_DWARF_BLOCK(array_type, fieldno) \ -+ TYPE_RANGE_BOUND_IS_DWARF_BLOCK (TYPE_INDEX_TYPE (array_type), fieldno) -+ -+/* Unbound arrays, such as GCC array[]; at end of struct. */ -+#define TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED(rangetype) \ -+ TYPE_FIELD_ARTIFICIAL((rangetype),0) -+#define TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED(rangetype) \ -+ TYPE_FIELD_ARTIFICIAL((rangetype),1) - #define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \ -- (TYPE_FIELD_ARTIFICIAL(TYPE_INDEX_TYPE((arraytype)),0)) -- --#define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ -- (TYPE_HIGH_BOUND(TYPE_INDEX_TYPE((arraytype)))) -+ TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (TYPE_INDEX_TYPE (arraytype)) -+#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ -+ TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (TYPE_INDEX_TYPE (arraytype)) - - #define TYPE_ARRAY_LOWER_BOUND_VALUE(arraytype) \ -- (TYPE_LOW_BOUND(TYPE_INDEX_TYPE((arraytype)))) -+ TYPE_LOW_BOUND (TYPE_INDEX_TYPE (arraytype)) -+#define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ -+ TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (arraytype)) -+/* TYPE_BYTE_STRIDE (TYPE_INDEX_TYPE (arraytype)) with a fallback to the -+ element size if no specific stride value is known. */ -+#define TYPE_ARRAY_BYTE_STRIDE_VALUE(arraytype) \ -+ (TYPE_BYTE_STRIDE (TYPE_INDEX_TYPE (arraytype)) == 0 \ -+ ? TYPE_LENGTH (TYPE_TARGET_TYPE (arraytype)) \ -+ : TYPE_BYTE_STRIDE (TYPE_INDEX_TYPE (arraytype))) - - /* 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)) - --extern struct type *alloc_type (struct objfile *); -+extern struct type *alloc_type (struct objfile *, 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 *, - struct type *); - -+extern CORE_ADDR type_range_any_field_internal (struct type *range_type, -+ int fieldno); -+ -+extern int type_range_high_bound_internal (struct type *range_type); -+ -+extern int type_range_count_bound_internal (struct type *range_type); -+ -+extern CORE_ADDR type_range_byte_stride_internal (struct type *range_type, -+ struct type *element_type); -+ -+extern void finalize_type (struct type *type); -+ - extern struct type *create_string_type (struct type *, struct type *); - - extern struct type *create_set_type (struct type *, struct type *); -@@ -1263,10 +1369,15 @@ extern void maintenance_print_type (char *, int); - - extern htab_t create_copied_types_hash (struct objfile *objfile); - --extern struct type *copy_type_recursive (struct objfile *objfile, -- struct type *type, -+extern struct type *copy_type_recursive (struct type *type, - htab_t copied_types); - - extern struct type *copy_type (const struct type *type); - -+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 ---- 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, - LONGEST adjustment) - { - int i; -- const char *physname; - - /* Search this class first. */ -- physname = NULL; - if (adjustment == 0) - { - int len; -@@ -615,13 +612,15 @@ gnuv3_print_method_ptr (const gdb_byte *contents, - { - char *demangled_name = cplus_demangle (physname, - DMGL_ANSI | DMGL_PARAMS); -- if (demangled_name != NULL) -+ fprintf_filtered (stream, "&virtual "); -+ if (demangled_name == NULL) -+ fputs_filtered (physname, stream); -+ else - { -- fprintf_filtered (stream, "&virtual "); - fputs_filtered (demangled_name, stream); - xfree (demangled_name); -- return; - } -+ 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) -+ { -+ 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; -+ } -+ 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; - - 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; -diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c -index b702ebf..a211adf 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) - { - 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.")); -diff --git a/gdb/language.h b/gdb/language.h -index 85826fd..e5f80ab 100644 ---- a/gdb/language.h -+++ b/gdb/language.h -@@ -186,14 +186,15 @@ struct language_defn - - 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)) - -diff --git a/gdb/linespec.c b/gdb/linespec.c -index 6579d42..b3ae6c0 100644 ---- a/gdb/linespec.c -+++ b/gdb/linespec.c -@@ -842,13 +842,33 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, - } - else if (paren_pointer != NULL) - { -- p = paren_pointer + 1; -+ /* We need to deal with method and function overloads -+ with no parameters. Gdb and gcc (and who knows about other -+ compilers) are very inconsistent with the keyword "void". -+ Canonicalizing C++ types is insufficient in this case, since -+ we still need to enforce the presence (or lack thereof) of -+ "void". For simplicity, omit the keyword "void" if present. */ -+ if (strncmp (paren_pointer - 5, "(void)", 6) == 0) -+ { -+ char *a, *b; -+ a = paren_pointer - 4; -+ b = paren_pointer; -+ while ((*(a++) = *(b++)) != '\0') ; -+ *a = '\0'; -+ p = paren_pointer - 3; -+ } -+ else -+ p = paren_pointer + 1; - } - else - { - p = skip_quoted (*argptr); - } - -+ /* Make sure we keep important kewords like "const" */ -+ 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 */ - -+/* 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) - { - int pid = ptid_get_lwp (ptid); -- int options; - - 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; - -- 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) -+ { -+ 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; -+ } -+ - internal_error (__FILE__, __LINE__, - _("unknown ptrace event %d"), event); - } -@@ -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 */ -diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c -index 9e4bb1b..9ca3ae1 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) - { - - 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++; -diff --git a/gdb/main.c b/gdb/main.c -index 5d4640b..6f9e61b 100644 ---- a/gdb/main.c -+++ b/gdb/main.c -@@ -40,6 +40,8 @@ - #include "interps.h" - #include "main.h" - -+#include "python/python.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) - char *cdarg = NULL; - char *ttyarg = NULL; - -+ int python_script = 0; -+ - /* 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) - {"args", no_argument, &set_args, 1}, - {"l", required_argument, 0, 'l'}, - {"return-child-result", no_argument, &return_child_result, 1}, -+#if HAVE_PYTHON -+ {"python", no_argument, 0, 'P'}, -+ {"P", no_argument, 0, 'P'}, -+#endif - {0, no_argument, 0, 0} - }; - -- while (1) -+ while (!python_script) - { - int option_index; - -@@ -462,6 +507,9 @@ captured_main (void *data) - case 0: - /* Long option that just sets a flag. */ - break; -+ case 'P': -+ python_script = 1; -+ break; - case OPT_SE: - symarg = optarg; - execarg = optarg; -@@ -638,7 +686,31 @@ extern int gdbtk_test (char *); - use_windows = 0; - } - -- if (set_args) -+ if (python_script) -+ { -+ /* The first argument is a python script to evaluate, and -+ subsequent arguments are passed to the script for -+ processing there. */ -+ if (optind >= argc) -+ { -+ fprintf_unfiltered (gdb_stderr, -+ _("%s: Python script file name required\n"), -+ argv[0]); -+ exit (1); -+ } -+ -+ /* FIXME: should handle inferior I/O intelligently here. -+ E.g., should be possible to run gdb in pipeline and have -+ Python (and gdb) output go to stderr or file; and if a -+ prompt is needed, open the tty. */ -+ quiet = 1; -+ /* FIXME: should read .gdbinit if, and only if, a prompt is -+ requested by the script. Though... maybe this is not -+ ideal? */ -+ /* FIXME: likewise, reading in history. */ -+ inhibit_gdbinit = 1; -+ } -+ else if (set_args) - { - /* 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.")); - xfree (cmdarg); - - /* Read in the old history after all the command files have been read. */ -- init_history (); -+ if (!python_script) -+ init_history (); - - if (batch) - { -@@ -895,13 +968,25 @@ Can't attach to process and specify a core file at the same time.")); - #endif - } - -- /* NOTE: cagney/1999-11-07: There is probably no reason for not -- moving this loop and the code found in captured_command_loop() -- into the command_loop() proper. The main thing holding back that -- change - SET_TOP_LEVEL() - has been eliminated. */ -- while (1) -+#if HAVE_PYTHON -+ if (python_script) - { -- catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL); -+ extern int pagination_enabled; -+ pagination_enabled = 0; -+ run_python_script (argc - optind, &argv[optind]); -+ return 1; -+ } -+ else -+#endif -+ { -+ /* NOTE: cagney/1999-11-07: There is probably no reason for not -+ moving this loop and the code found in captured_command_loop() -+ into the command_loop() proper. The main thing holding back that -+ change - SET_TOP_LEVEL() - has been eliminated. */ -+ while (1) -+ { -+ catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL); -+ } - } - /* No exit -- exit is through quit_command. */ - } -@@ -933,7 +1018,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\ -- gdb [options] --args executable-file [inferior-arguments ...]\n\n\ -+ gdb [options] --args executable-file [inferior-arguments ...]\n"), stream); -+#if HAVE_PYTHON -+ fputs_unfiltered (_("\ -+ gdb [options] [--python|-P] script-file [script-arguments ...]\n"), stream); -+#endif -+ fputs_unfiltered (_("\n\ - Options:\n\n\ - "), stream); - fputs_unfiltered (_("\ -@@ -971,7 +1061,13 @@ Options:\n\n\ - --nw Do not use a window interface.\n\ - --nx Do not read "), stream); - fputs_unfiltered (gdbinit, stream); -- fputs_unfiltered (_(" file.\n\ -+ fputs_unfiltered (_(" file.\n"), stream); -+#if HAVE_PYTHON -+ fputs_unfiltered (_("\ -+ --python, -P Following argument is Python script file; remaining\n\ -+ arguments are passed to script.\n"), stream); -+#endif -+ fputs_unfiltered (_("\ - --quiet Do not print version number on startup.\n\ - --readnow Fully read symbol files on first access.\n\ - "), stream); -diff --git a/gdb/maint.c b/gdb/maint.c -index 56cafe9..1b57ff5 100644 ---- a/gdb/maint.c -+++ b/gdb/maint.c -@@ -906,4 +906,12 @@ When enabled GDB is profiled."), - show_maintenance_profile_p, - &maintenance_set_cmdlist, - &maintenance_show_cmdlist); -+ add_setshow_filename_cmd ("gdb_datadir", class_maintenance, -+ &gdb_datadir, _("Set GDB's datadir path."), -+ _("Show GDB's datadir path."), -+ _("\ -+When set, GDB uses the specified path to search for data files."), -+ NULL, NULL, -+ &maintenance_set_cmdlist, -+ &maintenance_show_cmdlist); - } -diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c -index 7cbcc59..e507c3b 100644 ---- a/gdb/mdebugread.c -+++ b/gdb/mdebugread.c -@@ -4696,7 +4696,7 @@ new_type (char *name) - { - struct type *t; - -- t = alloc_type (current_objfile); -+ t = alloc_type (current_objfile, NULL); - TYPE_NAME (t) = name; - 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 ---- 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) - int numchild; - enum print_values print_values; - int ix; -+ int from, to; -+ 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) - else - print_values = PRINT_NO_VALUES; - -- if (VEC_length (varobj_p, children) == 0) -+ varobj_get_child_range (var, children, &from, &to); -+ if (from >= to) - return; - -+ 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"); -- 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, "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) -+ { -+ ui_out_field_string (uiout, "displayhint", display_hint); -+ xfree (display_hint); -+ } -+ -+ if (r->children_changed) -+ { -+ 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); -+ varobj_get_child_range (r->varobj, children, &from, &to); -+ -+ 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); -+ } -+ -+ do_cleanups (cleanup); -+ } - - if (mi_version (uiout) > 1) - do_cleanups (cleanup); -diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c -index 2610b6a..f31233b 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}, -diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h -index 39f16fb..291a07f 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; - 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; -diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c -index b905a9e..eaa5f12 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) - ui_out_field_string (uiout, NULL, "frozen-varobjs"); - ui_out_field_string (uiout, NULL, "pending-breakpoints"); - ui_out_field_string (uiout, NULL, "thread-info"); -+ -+#if HAVE_PYTHON -+ 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; - int i; - free_all_values (); -+ free_all_types (); - - 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; -diff --git a/gdb/mipsread.c b/gdb/mipsread.c -index a84003f..924c1c5 100644 ---- a/gdb/mipsread.c -+++ b/gdb/mipsread.c -@@ -394,6 +394,7 @@ static struct sym_fns ecoff_sym_fns = - mipscoff_new_init, /* sym_new_init: init anything gbl to entire symtab */ - mipscoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */ - mipscoff_symfile_read, /* sym_read: read a symbol file into symtab */ -+ NULL, /* sym_read_psymbols */ - 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 ---- a/gdb/objfiles.c -+++ b/gdb/objfiles.c -@@ -691,6 +691,20 @@ have_partial_symbols (void) - return 1; - } - } -+ -+ /* Try again, after reading partial symbols. We do this in two -+ passes because objfiles are always added to the head of the list, -+ and there might be a later objfile for which we've already read -+ partial symbols. */ -+ ALL_OBJFILES (ofp) -+ { -+ require_partial_symbols (ofp); -+ if (ofp->psymtabs != NULL) -+ { -+ return 1; -+ } -+ } -+ - return 0; - } - -diff --git a/gdb/objfiles.h b/gdb/objfiles.h -index 60d3143..b6fdd92 100644 ---- a/gdb/objfiles.h -+++ b/gdb/objfiles.h -@@ -212,6 +212,11 @@ struct objfile - - struct partial_symtab *psymtabs; - -+ /* An address map that can be used to quickly determine if an -+ address comes from this objfile. This can be NULL. */ -+ -+ struct addrmap *quick_addrmap; -+ - /* Map addresses to the entries of PSYMTABS. It would be more efficient to - have a map per the whole process but ADDRMAP cannot selectively remove - its items during FREE_OBJFILE. This mapping is already present even for -@@ -420,6 +425,15 @@ struct objfile - #define OBJF_KEEPBFD (1 << 4) /* Do not delete bfd */ - - -+/* Set if we have tried to read partial symtabs for this objfile. -+ This is used to allow lazy reading of partial symtabs. */ -+ -+#define OBJF_SYMTABS_READ (1 << 6) -+ -+/* This flag is set for the main objfile. */ -+ -+#define OBJF_MAIN (1 << 7) -+ - /* 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, - ALL_OBJFILES (objfile) \ - ALL_OBJFILE_PSYMTABS (objfile, p) - -+/* Like ALL_PSYMTABS, but ensure that partial symbols have been read -+ before examining the objfile. */ -+ -+#define ALL_PSYMTABS_REQUIRED(objfile, p) \ -+ ALL_OBJFILES (objfile) \ -+ ALL_OBJFILE_PSYMTABS (require_partial_symbols (objfile), p) -+ - /* 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 ---- 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, - args = 1 + longest_to_int (expr->elts[endpos - 2].longconst); - break; - -+ case TYPE_INSTANCE: -+ oplen = 4 + longest_to_int (expr->elts[endpos - 2].longconst); -+ args = 1; -+ break; -+ -+ case TYPE_INSTANCE_LOOKUP: -+ oplen = 3; -+ break; -+ - 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; - } - -+/* 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) -+{ -+ 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; -+ -+ /* Make sure we're in a 32- or 64-bit machine */ -+ gdb_assert (tdep->wordsize == 4 || tdep->wordsize == 8); -+ -+ buf = (gdb_byte *) xmalloc (tdep->wordsize * sizeof (gdb_byte)); -+ -+ cleanbuf = make_cleanup (xfree, buf); -+ -+ /* 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); -+ -+ ret = extract_signed_integer (buf, tdep->wordsize); -+ do_cleanups (cleanbuf); -+ -+ return ret; -+} -+ - static void - ppc_linux_write_pc (struct regcache *regcache, CORE_ADDR pc) - { -@@ -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; - -+ /* 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); - -+ /* Get the syscall number from the arch's register. */ -+ set_gdbarch_get_syscall_number (gdbarch, ppc_linux_get_syscall_number); -+ - 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); - -+ /* 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); - -+ /* Setting the correct XML syscall filename. */ -+ set_gdbarch_xml_syscall_filename (gdbarch, XML_SYSCALL_FILENAME_PPC64); -+ - /* Trampolines. */ - tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sigaction_tramp_frame); - tramp_frame_prepend_unwinder (gdbarch, &ppc64_linux_sighandler_tramp_frame); -diff --git a/gdb/printcmd.c b/gdb/printcmd.c -index 375f82e..8c3f476 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" - - #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) - else - val = access_value_history (0); - -+ /* Do not try to OBJECT_ADDRESS_SET here anything. We are interested in the -+ source variable base addresses as found by READ_VAR_VALUE. The value here -+ can be already a calculated expression address inappropriate for -+ DW_OP_push_object_address. */ -+ - 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; -+ -+ tem = value_as_address (val_args[i]); -+ -+ /* 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; -+ } -+ -+ /* 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); -+ -+ obstack_init (&output); -+ inner_cleanup = make_cleanup_obstack_free (&output); -+ -+ convert_between_encodings (target_wide_charset (), -+ host_charset (), -+ str, j, wcwidth, -+ &output, translit_char); -+ obstack_grow_str0 (&output, ""); -+ -+ 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]); -diff --git a/gdb/python/lib/gdb/FrameIterator.py b/gdb/python/lib/gdb/FrameIterator.py -new file mode 100644 -index 0000000..5654546 ---- /dev/null -+++ b/gdb/python/lib/gdb/FrameIterator.py -@@ -0,0 +1,33 @@ -+# Iterator over 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 . -+ -+class FrameIterator: -+ """An iterator that iterates over frames.""" -+ -+ def __init__ (self, frame): -+ "Initialize a FrameIterator. FRAME is the starting frame." -+ self.frame = frame -+ -+ def __iter__ (self): -+ return self -+ -+ def next (self): -+ result = self.frame -+ if result is None: -+ raise StopIteration -+ self.frame = result.older () -+ return result -diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py -new file mode 100644 -index 0000000..b375c68 ---- /dev/null -+++ b/gdb/python/lib/gdb/__init__.py -@@ -0,0 +1,19 @@ -+# Startup code. -+ -+# 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 . -+ -+# Load the require command by default. -+import gdb.command.require -diff --git a/gdb/python/lib/gdb/backtrace.py b/gdb/python/lib/gdb/backtrace.py -new file mode 100644 -index 0000000..2baab5f ---- /dev/null -+++ b/gdb/python/lib/gdb/backtrace.py -@@ -0,0 +1,42 @@ -+# Filtering backtrace. -+ -+# 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 . -+ -+import gdb -+import itertools -+ -+# Our only exports. -+__all__ = ['push_frame_filter', 'create_frame_filter'] -+ -+frame_filter = None -+ -+def push_frame_filter (constructor): -+ """Register a new backtrace filter class with the 'backtrace' command. -+The filter will be passed an iterator as an argument. The iterator -+will return gdb.Frame-like objects. The filter should in turn act as -+an iterator returning such objects.""" -+ global frame_filter -+ if frame_filter == None: -+ frame_filter = constructor -+ else: -+ frame_filter = lambda iterator: constructor (frame_filter (iterator)) -+ -+def create_frame_filter (iter): -+ global frame_filter -+ if frame_filter is None: -+ return iter -+ return frame_filter (iter) -+ -diff --git a/gdb/python/lib/gdb/command/__init__.py b/gdb/python/lib/gdb/command/__init__.py -new file mode 100644 -index 0000000..8b13789 ---- /dev/null -+++ b/gdb/python/lib/gdb/command/__init__.py -@@ -0,0 +1 @@ -+ -diff --git a/gdb/python/lib/gdb/command/alias.py b/gdb/python/lib/gdb/command/alias.py -new file mode 100644 -index 0000000..96b6618 ---- /dev/null -+++ b/gdb/python/lib/gdb/command/alias.py -@@ -0,0 +1,59 @@ -+# Alias command. -+ -+# 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 . -+ -+import gdb -+ -+class AliasImplementation (gdb.Command): -+ def __init__ (self, name, real, doc): -+ # Have to set __doc__ before the super init call. -+ # It would be nice if gdb's help looked up __doc__ dynamically. -+ self.__doc__ = doc -+ # Note: no good way to complete :( -+ super (AliasImplementation, self).__init__ (name, gdb.COMMAND_NONE) -+ self.real = real -+ -+ def invoke(self, arg, from_tty): -+ gdb.execute (self.real + ' ' + arg, from_tty) -+ -+class AliasCommand (gdb.Command): -+ """Alias one command to another. -+In the simplest form, the first word is the name of the alias, and -+the remaining words are the the expansion. -+An '=' by itself can be used to define a multi-word alias; words -+before the '=' are the name of the new command.""" -+ -+ def __init__ (self): -+ # Completion is not quite right here. -+ super (AliasCommand, self).__init__ ("alias", gdb.COMMAND_NONE, -+ gdb.COMPLETE_COMMAND) -+ -+ def invoke (self, arg, from_tty): -+ self.dont_repeat () -+ # Without some form of quoting we can't alias a multi-word -+ # command to another command. -+ args = arg.split() -+ try: -+ start = args.index ('=') -+ end = start + 1 -+ except ValueError: -+ start = 1 -+ end = 1 -+ target = " ".join(args[end:]) -+ AliasImplementation (" ".join (args[0:start]), target, -+ "This command is an alias for '%s'." % target) -+ -+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 ---- /dev/null -+++ b/gdb/python/lib/gdb/command/backtrace.py -@@ -0,0 +1,197 @@ -+# New backtrace command. -+ -+# 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 . -+ -+import gdb -+import gdb.backtrace -+import itertools -+from gdb.FrameIterator import FrameIterator -+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. -+Note that reverse backtraces are more expensive to compute.""" -+ -+ set_doc = "Enable or disable reverse backtraces." -+ show_doc = "Show whether backtraces will be printed in reverse order." -+ -+ def __init__(self): -+ gdb.Parameter.__init__ (self, "reverse-backtrace", -+ gdb.COMMAND_STACK, gdb.PARAM_BOOLEAN) -+ # Default to compatibility with gdb. -+ self.value = False -+ -+class FilteringBacktrace (gdb.Command): -+ """Print backtrace of all stack frames, or innermost COUNT frames. -+With a negative argument, print outermost -COUNT frames. -+Use of the 'full' qualifier also prints the values of the local variables. -+Use of the 'raw' qualifier avoids any filtering by loadable modules. -+""" -+ -+ def __init__ (self): -+ # FIXME: this is not working quite well enough to replace -+ # "backtrace" yet. -+ gdb.Command.__init__ (self, "new-backtrace", gdb.COMMAND_STACK) -+ self.reverse = ReverseBacktraceParameter() -+ -+ def reverse_iter (self, iter): -+ result = [] -+ for item in iter: -+ result.append (item) -+ result.reverse() -+ return result -+ -+ def final_n (self, iter, x): -+ result = [] -+ for item in iter: -+ result.append (item) -+ return result[x:] -+ -+ def invoke (self, arg, from_tty): -+ i = 0 -+ count = 0 -+ filter = True -+ full = False -+ -+ for word in arg.split (" "): -+ if word == '': -+ continue -+ elif word == 'raw': -+ filter = False -+ elif word == 'full': -+ full = True -+ else: -+ count = int (word) -+ -+ # FIXME: provide option to start at selected frame -+ # However, should still number as if starting from newest -+ iter = itertools.imap (FrameWrapper, -+ FrameIterator (gdb.newest_frame ())) -+ if filter: -+ iter = gdb.backtrace.create_frame_filter (iter) -+ -+ # Now wrap in an iterator that numbers the frames. -+ iter = itertools.izip (itertools.count (0), iter) -+ -+ # Reverse if the user wanted that. -+ if self.reverse.value: -+ iter = self.reverse_iter (iter) -+ -+ # Extract sub-range user wants. -+ if count < 0: -+ iter = self.final_n (iter, count) -+ elif count > 0: -+ iter = itertools.islice (iter, 0, count) -+ -+ for pair in iter: -+ sys.stdout.write ("#%-2d" % pair[0]) -+ pair[1].describe (sys.stdout, full) -+ -+FilteringBacktrace() -diff --git a/gdb/python/lib/gdb/command/ignore_errors.py b/gdb/python/lib/gdb/command/ignore_errors.py -new file mode 100644 -index 0000000..6fa48ff ---- /dev/null -+++ b/gdb/python/lib/gdb/command/ignore_errors.py -@@ -0,0 +1,37 @@ -+# Ignore errors in user commands. -+ -+# 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 . -+ -+import gdb -+ -+class IgnoreErrorsCommand (gdb.Command): -+ """Execute a single command, ignoring all errors. -+Only one-line commands are supported. -+This is primarily useful in scripts.""" -+ -+ def __init__ (self): -+ super (IgnoreErrorsCommand, self).__init__ ("ignore-errors", -+ gdb.COMMAND_OBSCURE, -+ # FIXME... -+ gdb.COMPLETE_COMMAND) -+ -+ def invoke (self, arg, from_tty): -+ try: -+ gdb.execute (arg, from_tty) -+ except: -+ pass -+ -+IgnoreErrorsCommand () -diff --git a/gdb/python/lib/gdb/command/pahole.py b/gdb/python/lib/gdb/command/pahole.py -new file mode 100644 -index 0000000..21a0bf0 ---- /dev/null -+++ b/gdb/python/lib/gdb/command/pahole.py -@@ -0,0 +1,75 @@ -+# pahole command for gdb -+ -+# 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 -+ -+class Pahole (gdb.Command): -+ """Show the holes in a structure. -+This command takes a single argument, a type name. -+It prints the type and displays comments showing where holes are.""" -+ -+ def __init__ (self): -+ super (Pahole, self).__init__ ("pahole", gdb.COMMAND_NONE, -+ gdb.COMPLETE_SYMBOL) -+ -+ def pahole (self, type, level, name): -+ if name is None: -+ name = '' -+ tag = type.tag -+ if tag is None: -+ tag = '' -+ print '%sstruct %s {' % (' ' * (2 * level), tag) -+ bitpos = 0 -+ for field in type.fields (): -+ # Skip static fields. -+ if not hasattr (field, ('bitpos')): -+ continue -+ -+ ftype = field.type.strip_typedefs() -+ -+ if bitpos != field.bitpos: -+ hole = field.bitpos - bitpos -+ print ' /* XXX %d bit hole, try to pack */' % hole -+ bitpos = field.bitpos -+ if field.bitsize > 0: -+ fieldsize = field.bitsize -+ else: -+ # TARGET_CHAR_BIT here... -+ fieldsize = 8 * ftype.sizeof -+ -+ # TARGET_CHAR_BIT -+ print ' /* %3d %3d */' % (int (bitpos / 8), int (fieldsize / 8)), -+ bitpos = bitpos + fieldsize -+ -+ if ftype.code == gdb.TYPE_CODE_STRUCT: -+ self.pahole (ftype, level + 1, field.name) -+ else: -+ print ' ' * (2 + 2 * level), -+ print '%s %s' % (str (ftype), field.name) -+ -+ print ' ' * (14 + 2 * level), -+ print '} %s' % name -+ -+ def invoke (self, arg, from_tty): -+ type = gdb.lookup_type (arg) -+ type = type.strip_typedefs () -+ if type.code != gdb.TYPE_CODE_STRUCT: -+ raise TypeError, '%s is not a struct type' % arg -+ print ' ' * 14, -+ self.pahole (type, 0, '') -+ -+Pahole() -diff --git a/gdb/python/lib/gdb/command/require.py b/gdb/python/lib/gdb/command/require.py -new file mode 100644 -index 0000000..1fbc1e8 ---- /dev/null -+++ b/gdb/python/lib/gdb/command/require.py -@@ -0,0 +1,57 @@ -+# Demand-loading commands. -+ -+# 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 os -+ -+class RequireCommand (gdb.Command): -+ """Prefix command for requiring features.""" -+ -+ def __init__ (self): -+ super (RequireCommand, self).__init__ ("require", -+ gdb.COMMAND_SUPPORT, -+ gdb.COMPLETE_NONE, -+ True) -+ -+class RequireSubcommand (gdb.Command): -+ """Demand-load a command by name.""" -+ -+ def __init__ (self, name): -+ self.__doc__ = "Demand-load a %s by name." % name -+ super (RequireSubcommand, self).__init__ ("require %s" % name, -+ gdb.COMMAND_SUPPORT) -+ self.name = name -+ -+ def invoke (self, arg, from_tty): -+ for cmd in arg.split(): -+ exec ('import gdb.' + self.name + '.' + cmd, globals ()) -+ -+ def complete (self, text, word): -+ dir = gdb.pythondir + '/gdb/' + self.name -+ result = [] -+ for file in os.listdir(dir): -+ if not file.startswith (word) or not file.endswith ('.py'): -+ continue -+ feature = file[0:-3] -+ if feature == 'require' or feature == '__init__': -+ continue -+ result.append (feature) -+ return result -+ -+RequireCommand() -+RequireSubcommand("command") -+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 ---- /dev/null -+++ b/gdb/python/lib/gdb/command/save_breakpoints.py -@@ -0,0 +1,65 @@ -+# Save breakpoints. -+ -+# 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 . -+ -+from __future__ import with_statement -+import gdb -+ -+class SavePrefixCommand (gdb.Command): -+ "Prefix command for saving things." -+ -+ def __init__ (self): -+ super (SavePrefixCommand, self).__init__ ("save", -+ gdb.COMMAND_SUPPORT, -+ gdb.COMPLETE_NONE, True) -+ -+class SaveBreakpointsCommand (gdb.Command): -+ """Save the current breakpoints to a file. -+This command takes a single argument, a file name. -+The breakpoints can be restored using the 'source' command.""" -+ -+ def __init__ (self): -+ super (SaveBreakpointsCommand, self).__init__ ("save breakpoints", -+ gdb.COMMAND_SUPPORT, -+ gdb.COMPLETE_FILENAME) -+ -+ def invoke (self, arg, from_tty): -+ self.dont_repeat () -+ bps = gdb.breakpoints () -+ if bps is None: -+ raise RuntimeError, 'No breakpoints to save' -+ with open (arg.strip (), 'w') as f: -+ for bp in bps: -+ print >> f, "break", bp.location, -+ if bp.thread is not None: -+ print >> f, " thread", bp.thread, -+ if bp.condition is not None: -+ print >> f, " if", bp.condition, -+ print >> f -+ if not bp.enabled: -+ print >> f, "disable %d" % bp.number -+ # Note: we don't save the ignore count; there doesn't -+ # seem to be much point. -+ commands = bp.commands -+ if commands is not None: -+ print >> f, "commands" -+ # Note that COMMANDS has a trailing newline. -+ print >> f, commands, -+ print >> f, "end" -+ print >> f -+ -+SavePrefixCommand () -+SaveBreakpointsCommand () -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 ---- /dev/null -+++ b/gdb/python/lib/gdb/function/__init__.py -@@ -0,0 +1 @@ -+ -diff --git a/gdb/python/lib/gdb/function/caller_is.py b/gdb/python/lib/gdb/function/caller_is.py -new file mode 100644 -index 0000000..2b9c5c7 ---- /dev/null -+++ b/gdb/python/lib/gdb/function/caller_is.py -@@ -0,0 +1,58 @@ -+# Caller-is functions. -+ -+# 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 . -+ -+import gdb -+import re -+ -+class CallerIs (gdb.Function): -+ """Return True if the calling function's name is equal to a string. -+This function takes one or two arguments. -+The first argument is the name of a function; if the calling function's -+name is equal to this argument, this function returns True. -+The optional second argument tells this function how many stack frames -+to traverse to find the calling function. The default is 1.""" -+ -+ def __init__ (self): -+ super (CallerIs, self).__init__ ("caller_is") -+ -+ def invoke (self, name, nframes = 1): -+ frame = gdb.selected_frame () -+ while nframes > 0: -+ frame = frame.older () -+ nframes = nframes - 1 -+ return frame.name () == name.string () -+ -+class CallerMatches (gdb.Function): -+ """Return True if the calling function's name matches a string. -+This function takes one or two arguments. -+The first argument is a regular expression; if the calling function's -+name is matched by this argument, this function returns True. -+The optional second argument tells this function how many stack frames -+to traverse to find the calling function. The default is 1.""" -+ -+ def __init__ (self): -+ super (CallerMatches, self).__init__ ("caller_matches") -+ -+ def invoke (self, name, nframes = 1): -+ frame = gdb.selected_frame () -+ while nframes > 0: -+ frame = frame.older () -+ nframes = nframes - 1 -+ return re.match (name.string (), frame.name ()) is not None -+ -+CallerIs() -+CallerMatches() -diff --git a/gdb/python/lib/gdb/function/in_scope.py b/gdb/python/lib/gdb/function/in_scope.py -new file mode 100644 -index 0000000..debb3bb ---- /dev/null -+++ b/gdb/python/lib/gdb/function/in_scope.py -@@ -0,0 +1,47 @@ -+# In-scope function. -+ -+# 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 . -+ -+import gdb -+ -+class InScope (gdb.Function): -+ """Return True if all the given variables or macros are in scope. -+Takes one argument for each variable name to be checked.""" -+ -+ def __init__ (self): -+ super (InScope, self).__init__ ("in_scope") -+ -+ def invoke (self, *vars): -+ if len (vars) == 0: -+ raise TypeError, "in_scope takes at least one argument" -+ -+ # gdb.Value isn't hashable so it can't be put in a map. -+ # Convert to string first. -+ wanted = set (map (lambda x: x.string (), vars)) -+ found = set () -+ block = gdb.selected_frame ().block () -+ while block: -+ for sym in block: -+ if (sym.is_argument or sym.is_constant -+ or sym.is_function or sym.is_variable): -+ if sym.name in wanted: -+ found.add (sym.name) -+ -+ block = block.superblock -+ -+ 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 ---- /dev/null -+++ b/gdb/python/python-block.c -@@ -0,0 +1,265 @@ -+/* Python interface to blocks. -+ -+ 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 "block.h" -+#include "dictionary.h" -+#include "symtab.h" -+#include "python-internal.h" -+ -+typedef struct { -+ PyObject_HEAD -+ struct block *block; -+} block_object; -+ -+typedef struct { -+ PyObject_HEAD -+ struct dictionary *dict; -+ struct dict_iterator iter; -+ int initialized_p; -+} block_syms_iterator_object; -+ -+static PyTypeObject block_syms_iterator_object_type; -+ -+static PyObject * -+blpy_iter (PyObject *self) -+{ -+ block_syms_iterator_object *block_iter_obj; -+ -+ block_iter_obj = PyObject_New (block_syms_iterator_object, -+ &block_syms_iterator_object_type); -+ if (block_iter_obj == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, -+ "Could not allocate iterator object."); -+ return NULL; -+ } -+ -+ block_iter_obj->dict = BLOCK_DICT (((block_object *) self)->block); -+ block_iter_obj->initialized_p = 0; -+ -+ return (PyObject *) block_iter_obj; -+} -+ -+static PyObject * -+blpy_get_start (PyObject *self, void *closure) -+{ -+ block_object *self_block = (block_object *) self; -+ -+ return PyLong_FromUnsignedLongLong (BLOCK_START (self_block->block)); -+} -+ -+static PyObject * -+blpy_get_end (PyObject *self, void *closure) -+{ -+ block_object *self_block = (block_object *) self; -+ -+ return PyLong_FromUnsignedLongLong (BLOCK_END (self_block->block)); -+} -+ -+static PyObject * -+blpy_get_function (PyObject *self, void *closure) -+{ -+ block_object *self_block = (block_object *) self; -+ struct symbol *sym; -+ -+ sym = BLOCK_FUNCTION (self_block->block); -+ if (sym) -+ return symbol_to_symbol_object (sym); -+ -+ Py_RETURN_NONE; -+} -+ -+static PyObject * -+blpy_get_superblock (PyObject *self, void *closure) -+{ -+ block_object *self_block = (block_object *) self; -+ struct block *block; -+ -+ block = BLOCK_SUPERBLOCK (self_block->block); -+ if (block) -+ return block_to_block_object (block); -+ -+ Py_RETURN_NONE; -+} -+ -+PyObject * -+block_to_block_object (struct block *block) -+{ -+ block_object *block_obj; -+ -+ block_obj = PyObject_New (block_object, &block_object_type); -+ if (block_obj == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, "Could not allocate block object."); -+ return NULL; -+ } -+ -+ block_obj->block = block; -+ -+ return (PyObject *) block_obj; -+} -+ -+struct block * -+block_object_to_block (PyObject *obj) -+{ -+ if (! PyObject_TypeCheck (obj, &block_object_type)) -+ return NULL; -+ return ((block_object *) obj)->block; -+} -+ -+static PyObject * -+blpy_block_syms_iter (PyObject *self) -+{ -+ return self; -+} -+ -+static PyObject * -+blpy_block_syms_iternext (PyObject *self) -+{ -+ block_syms_iterator_object *iter_obj = (block_syms_iterator_object *) self; -+ struct symbol *sym; -+ -+ if (!iter_obj->initialized_p) -+ { -+ sym = dict_iterator_first (iter_obj->dict, &(iter_obj->iter)); -+ iter_obj->initialized_p = 1; -+ } -+ else -+ sym = dict_iterator_next (&(iter_obj->iter)); -+ -+ return (sym == NULL)? NULL : symbol_to_symbol_object (sym); -+} -+ -+/* Return the innermost lexical block containing the specified pc value, -+ or 0 if there is none. */ -+ -+PyObject * -+gdbpy_block_for_pc (PyObject *self, PyObject *args) -+{ -+ unsigned PY_LONG_LONG pc; -+ struct block *block; -+ PyObject *sym_obj; -+ -+ if (!PyArg_ParseTuple (args, "K", &pc)) -+ return NULL; -+ -+ block = block_for_pc (pc); -+ if (block) -+ return block_to_block_object (block); -+ -+ Py_RETURN_NONE; -+} -+ -+void -+gdbpy_initialize_blocks (void) -+{ -+ block_object_type.tp_new = PyType_GenericNew; -+ if (PyType_Ready (&block_object_type) < 0) -+ return; -+ -+ block_syms_iterator_object_type.tp_new = PyType_GenericNew; -+ if (PyType_Ready (&block_syms_iterator_object_type) < 0) -+ return; -+ -+ Py_INCREF (&block_object_type); -+ PyModule_AddObject (gdb_module, "Block", (PyObject *) &block_object_type); -+ -+ Py_INCREF (&block_syms_iterator_object_type); -+ PyModule_AddObject (gdb_module, "BlockIterator", -+ (PyObject *) &block_syms_iterator_object_type); -+} -+ -+ -+ -+static PyGetSetDef block_object_getset[] = { -+ { "start", blpy_get_start, NULL, "Start address of the block.", NULL }, -+ { "end", blpy_get_end, NULL, "End address of the block.", NULL }, -+ { "function", blpy_get_function, NULL, -+ "Symbol that names the block, or None.", NULL }, -+ { "superblock", blpy_get_superblock, NULL, -+ "Block containing the block, or None.", NULL }, -+ { NULL } /* Sentinel */ -+}; -+ -+PyTypeObject block_object_type = { -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Block", /*tp_name*/ -+ sizeof (block_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 block object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ blpy_iter, /* tp_iter */ -+ 0, /* tp_iternext */ -+ 0, /* tp_methods */ -+ 0, /* tp_members */ -+ block_object_getset /* tp_getset */ -+}; -+ -+static PyTypeObject block_syms_iterator_object_type = { -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.BlockIterator", /*tp_name*/ -+ sizeof (block_syms_iterator_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 block syms iterator object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ blpy_block_syms_iter, /* tp_iter */ -+ blpy_block_syms_iternext, /* tp_iternext */ -+ 0 /* tp_methods */ -+}; -diff --git a/gdb/python/python-breakpoint.c b/gdb/python/python-breakpoint.c -new file mode 100644 -index 0000000..ec80419 ---- /dev/null -+++ b/gdb/python/python-breakpoint.c -@@ -0,0 +1,665 @@ -+/* Python interface to breakpoints -+ -+ 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 "breakpoint.h" -+#include "gdbcmd.h" -+#include "gdbthread.h" -+#include "observer.h" -+ -+ -+/* From breakpoint.c. */ -+extern struct breakpoint *breakpoint_chain; -+ -+ -+typedef struct breakpoint_object breakpoint_object; -+ -+static PyTypeObject breakpoint_object_type; -+ -+/* A dynamically allocated vector of breakpoint objects. Each -+ breakpoint has a number. A breakpoint is valid if its slot in this -+ vector is non-null. When a breakpoint is deleted, we drop our -+ reference to it and zero its slot; this is how we let the Python -+ object have a lifetime which is independent from that of the gdb -+ breakpoint. */ -+static breakpoint_object **bppy_breakpoints; -+ -+/* Number of slots in bppy_breakpoints. */ -+static int bppy_slots; -+ -+/* Number of live breakpoints. */ -+static int bppy_live; -+ -+/* Variables used to pass information between the Breakpoint -+ constructor and the breakpoint-created hook function. */ -+static breakpoint_object *bppy_pending_object; -+ -+struct breakpoint_object -+{ -+ PyObject_HEAD -+ -+ /* The breakpoint number according to gdb. */ -+ int number; -+ -+ /* The gdb breakpoint object, or NULL if the breakpoint has been -+ deleted. */ -+ struct breakpoint *bp; -+}; -+ -+/* Evaluate to true if the breakpoint NUM is valid, false otherwise. */ -+#define BPPY_VALID_P(Num) \ -+ ((Num) >= 0 \ -+ && (Num) < bppy_slots \ -+ && bppy_breakpoints[Num] != NULL) -+ -+/* Require that BREAKPOINT be a valid breakpoint ID; throw a Python -+ exception if it is invalid. */ -+#define BPPY_REQUIRE_VALID(Breakpoint) \ -+ do { \ -+ if (! BPPY_VALID_P ((Breakpoint)->number)) \ -+ return PyErr_Format (PyExc_RuntimeError, "breakpoint %d is invalid", \ -+ (Breakpoint)->number); \ -+ } while (0) -+ -+/* Require that BREAKPOINT be a valid breakpoint ID; throw a Python -+ exception if it is invalid. This macro is for use in setter functions. */ -+#define BPPY_SET_REQUIRE_VALID(Breakpoint) \ -+ do { \ -+ if (! BPPY_VALID_P ((Breakpoint)->number)) \ -+ { \ -+ PyErr_Format (PyExc_RuntimeError, "breakpoint %d is invalid", \ -+ (Breakpoint)->number); \ -+ return -1; \ -+ } \ -+ } while (0) -+ -+/* Python function which checks the validity of a breakpoint object. */ -+static PyObject * -+bppy_is_valid (PyObject *self, PyObject *args) -+{ -+ if (((breakpoint_object *) self)->bp) -+ Py_RETURN_TRUE; -+ Py_RETURN_FALSE; -+} -+ -+/* Python function to test whether or not the breakpoint is enabled. */ -+static PyObject * -+bppy_get_enabled (PyObject *self, void *closure) -+{ -+ if (! ((breakpoint_object *) self)->bp) -+ Py_RETURN_FALSE; -+ /* Not clear what we really want here. */ -+ if (((breakpoint_object *) self)->bp->enable_state == bp_enabled) -+ Py_RETURN_TRUE; -+ Py_RETURN_FALSE; -+} -+ -+/* Python function to test whether or not the breakpoint is silent. */ -+static PyObject * -+bppy_get_silent (PyObject *self, void *closure) -+{ -+ BPPY_REQUIRE_VALID ((breakpoint_object *) self); -+ if (((breakpoint_object *) self)->bp->silent) -+ Py_RETURN_TRUE; -+ Py_RETURN_FALSE; -+} -+ -+/* Python function to set the enabled state of a breakpoint. */ -+static int -+bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ int cmp; -+ -+ BPPY_SET_REQUIRE_VALID (self_bp); -+ -+ if (newvalue == NULL) -+ { -+ PyErr_SetString (PyExc_TypeError, "cannot delete `enabled' attribute"); -+ return -1; -+ } -+ else if (! PyBool_Check (newvalue)) -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "the value of `enabled' must be a boolean"); -+ return -1; -+ } -+ -+ cmp = PyObject_IsTrue (newvalue); -+ if (cmp < 0) -+ return -1; -+ else if (cmp == 1) -+ enable_breakpoint (self_bp->bp); -+ else -+ disable_breakpoint (self_bp->bp); -+ return 0; -+} -+ -+/* Python function to set the 'silent' state of a breakpoint. */ -+static int -+bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ int cmp; -+ -+ BPPY_SET_REQUIRE_VALID (self_bp); -+ -+ if (newvalue == NULL) -+ { -+ PyErr_SetString (PyExc_TypeError, "cannot delete `silent' attribute"); -+ return -1; -+ } -+ else if (! PyBool_Check (newvalue)) -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "the value of `silent' must be a boolean"); -+ return -1; -+ } -+ -+ cmp = PyObject_IsTrue (newvalue); -+ if (cmp < 0) -+ return -1; -+ else -+ self_bp->bp->silent = cmp; -+ -+ return 0; -+} -+ -+/* Python function to set the thread of a breakpoint. */ -+static int -+bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ int id; -+ -+ BPPY_SET_REQUIRE_VALID (self_bp); -+ -+ if (newvalue == NULL) -+ { -+ PyErr_SetString (PyExc_TypeError, "cannot delete `thread' attribute"); -+ return -1; -+ } -+ else if (PyInt_Check (newvalue)) -+ { -+ id = (int) PyInt_AsLong (newvalue); -+ if (! valid_thread_id (id)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "invalid thread id"); -+ return -1; -+ } -+ } -+ else if (newvalue == Py_None) -+ id = -1; -+ else -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "the value of `thread' must be an integer or None"); -+ return -1; -+ } -+ -+ self_bp->bp->thread = id; -+ -+ return 0; -+} -+ -+/* Python function to set the ignore count of a breakpoint. */ -+static int -+bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ long value; -+ -+ BPPY_SET_REQUIRE_VALID (self_bp); -+ -+ if (newvalue == NULL) -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "cannot delete `ignore_count' attribute"); -+ return -1; -+ } -+ else if (! PyInt_Check (newvalue)) -+ { -+ PyErr_SetString (PyExc_TypeError, -+ "the value of `ignore_count' must be an integer"); -+ return -1; -+ } -+ -+ value = PyInt_AsLong (newvalue); -+ if (value < 0) -+ value = 0; -+ set_ignore_count (self_bp->number, (int) value, 0); -+ -+ return 0; -+} -+ -+/* Python function to set the hit count of a breakpoint. */ -+static int -+bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ -+ BPPY_SET_REQUIRE_VALID (self_bp); -+ -+ if (newvalue == NULL) -+ { -+ PyErr_SetString (PyExc_TypeError, "cannot delete `hit_count' attribute"); -+ return -1; -+ } -+ else if (! PyInt_Check (newvalue) || PyInt_AsLong (newvalue) != 0) -+ { -+ PyErr_SetString (PyExc_AttributeError, -+ "the value of `hit_count' must be zero"); -+ return -1; -+ } -+ -+ self_bp->bp->hit_count = 0; -+ -+ return 0; -+} -+ -+/* Python function to get the location of a breakpoint. */ -+static PyObject * -+bppy_get_location (PyObject *self, void *closure) -+{ -+ char *str; -+ -+ BPPY_REQUIRE_VALID ((breakpoint_object *) self); -+ str = ((breakpoint_object *) self)->bp->addr_string; -+ /* FIXME: watchpoints? tracepoints? */ -+ if (! str) -+ str = ""; -+ return PyString_Decode (str, strlen (str), host_charset (), NULL); -+} -+ -+/* Python function to get the condition expression of a breakpoint. */ -+static PyObject * -+bppy_get_condition (PyObject *self, void *closure) -+{ -+ char *str; -+ BPPY_REQUIRE_VALID ((breakpoint_object *) self); -+ -+ str = ((breakpoint_object *) self)->bp->cond_string; -+ if (! str) -+ Py_RETURN_NONE; -+ return PyString_Decode (str, strlen (str), host_charset (), NULL); -+} -+ -+static int -+bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure) -+{ -+ char *exp; -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ volatile struct gdb_exception except; -+ -+ BPPY_SET_REQUIRE_VALID (self_bp); -+ -+ if (newvalue == NULL) -+ { -+ PyErr_SetString (PyExc_TypeError, "cannot delete `condition' attribute"); -+ return -1; -+ } -+ else if (newvalue == Py_None) -+ exp = ""; -+ else -+ { -+ exp = python_string_to_host_string (newvalue); -+ if (exp == NULL) -+ return -1; -+ } -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ set_breakpoint_condition (self_bp->bp, exp, 0); -+ } -+ GDB_PY_SET_HANDLE_EXCEPTION (except); -+ -+ return 0; -+} -+ -+/* Python function to get the commands attached to a breakpoint. */ -+static PyObject * -+bppy_get_commands (PyObject *self, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ long length; -+ volatile struct gdb_exception except; -+ struct ui_file *string_file; -+ struct cleanup *chain; -+ PyObject *result; -+ char *cmdstr; -+ -+ BPPY_REQUIRE_VALID (self_bp); -+ -+ if (! self_bp->bp->commands) -+ Py_RETURN_NONE; -+ -+ string_file = mem_fileopen (); -+ chain = make_cleanup_ui_file_delete (string_file); -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ /* FIXME: this can fail. Maybe we need to be making a new -+ ui_out object here? */ -+ ui_out_redirect (uiout, string_file); -+ print_command_lines (uiout, self_bp->bp->commands, 0); -+ ui_out_redirect (uiout, NULL); -+ } -+ cmdstr = ui_file_xstrdup (string_file, &length); -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL); -+ do_cleanups (chain); -+ xfree (cmdstr); -+ return result; -+} -+ -+/* Python function to get the breakpoint's number. */ -+static PyObject * -+bppy_get_number (PyObject *self, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ -+ BPPY_REQUIRE_VALID (self_bp); -+ -+ return PyInt_FromLong (self_bp->number); -+} -+ -+/* Python function to get the breakpoint's thread ID. */ -+static PyObject * -+bppy_get_thread (PyObject *self, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ -+ BPPY_REQUIRE_VALID (self_bp); -+ -+ if (self_bp->bp->thread == -1) -+ Py_RETURN_NONE; -+ -+ return PyInt_FromLong (self_bp->bp->thread); -+} -+ -+/* Python function to get the breakpoint's hit count. */ -+static PyObject * -+bppy_get_hit_count (PyObject *self, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ -+ BPPY_REQUIRE_VALID (self_bp); -+ -+ return PyInt_FromLong (self_bp->bp->hit_count); -+} -+ -+/* Python function to get the breakpoint's ignore count. */ -+static PyObject * -+bppy_get_ignore_count (PyObject *self, void *closure) -+{ -+ breakpoint_object *self_bp = (breakpoint_object *) self; -+ -+ BPPY_REQUIRE_VALID (self_bp); -+ -+ return PyInt_FromLong (self_bp->bp->ignore_count); -+} -+ -+/* Python function to create a new breakpoint. */ -+static PyObject * -+bppy_new (PyTypeObject *subtype, PyObject *args, PyObject *kwargs) -+{ -+ PyObject *result; -+ char *spec; -+ volatile struct gdb_exception except; -+ -+ /* FIXME: allow condition, thread, temporary, ... ? */ -+ if (! PyArg_ParseTuple (args, "s", &spec)) -+ return NULL; -+ result = subtype->tp_alloc (subtype, 0); -+ if (! result) -+ return NULL; -+ bppy_pending_object = (breakpoint_object *) result; -+ bppy_pending_object->number = -1; -+ bppy_pending_object->bp = NULL; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ set_breakpoint (spec, NULL, 0, 0, -1, 0, AUTO_BOOLEAN_TRUE, -+ 1 /*enabled*/); -+ } -+ if (except.reason < 0) -+ { -+ subtype->tp_free (result); -+ return PyErr_Format (except.reason == RETURN_QUIT -+ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, -+ "%s", except.message); -+ } -+ -+ BPPY_REQUIRE_VALID ((breakpoint_object *) result); -+ return result; -+} -+ -+ -+ -+/* Static function to return a tuple holding all breakpoints. */ -+ -+PyObject * -+gdbpy_breakpoints (PyObject *self, PyObject *args) -+{ -+ PyObject *result; -+ -+ if (bppy_live == 0) -+ Py_RETURN_NONE; -+ -+ result = PyTuple_New (bppy_live); -+ if (result) -+ { -+ int i, out = 0; -+ for (i = 0; out < bppy_live; ++i) -+ { -+ if (! bppy_breakpoints[i]) -+ continue; -+ Py_INCREF (bppy_breakpoints[i]); -+ PyTuple_SetItem (result, out, (PyObject *) bppy_breakpoints[i]); -+ ++out; -+ } -+ } -+ return result; -+} -+ -+ -+ -+/* Event callback functions. */ -+ -+/* Callback that is used when a breakpoint is created. This function -+ will create a new Python breakpoint object. */ -+static void -+gdbpy_breakpoint_created (int num) -+{ -+ breakpoint_object *newbp; -+ struct breakpoint *bp; -+ PyGILState_STATE state; -+ -+ if (num < 0) -+ return; -+ -+ for (bp = breakpoint_chain; bp; bp = bp->next) -+ if (bp->number == num) -+ break; -+ if (! bp) -+ return; -+ -+ if (num >= bppy_slots) -+ { -+ int old = bppy_slots; -+ bppy_slots = bppy_slots * 2 + 10; -+ bppy_breakpoints -+ = (breakpoint_object **) xrealloc (bppy_breakpoints, -+ (bppy_slots -+ * sizeof (breakpoint_object *))); -+ memset (&bppy_breakpoints[old], 0, -+ (bppy_slots - old) * sizeof (PyObject *)); -+ } -+ -+ ++bppy_live; -+ -+ state = PyGILState_Ensure (); -+ -+ if (bppy_pending_object) -+ { -+ newbp = bppy_pending_object; -+ bppy_pending_object = NULL; -+ } -+ else -+ newbp = PyObject_New (breakpoint_object, &breakpoint_object_type); -+ if (newbp) -+ { -+ PyObject *hookfn; -+ -+ newbp->number = num; -+ newbp->bp = bp; -+ bppy_breakpoints[num] = newbp; -+ -+ hookfn = gdbpy_get_hook_function ("new_breakpoint"); -+ if (hookfn) -+ { -+ PyObject *result; -+ result = PyObject_CallFunctionObjArgs (hookfn, newbp, NULL); -+ if (result) -+ { -+ Py_DECREF (result); -+ } -+ Py_DECREF (hookfn); -+ } -+ } -+ -+ /* Just ignore errors here. */ -+ PyErr_Clear (); -+ -+ PyGILState_Release (state); -+} -+ -+/* Callback that is used when a breakpoint is deleted. This will -+ invalidate the corresponding Python object. */ -+static void -+gdbpy_breakpoint_deleted (int num) -+{ -+ PyGILState_STATE state; -+ -+ state = PyGILState_Ensure (); -+ if (BPPY_VALID_P (num)) -+ { -+ bppy_breakpoints[num]->bp = NULL; -+ Py_DECREF (bppy_breakpoints[num]); -+ bppy_breakpoints[num] = NULL; -+ --bppy_live; -+ } -+ PyGILState_Release (state); -+} -+ -+ -+ -+/* Initialize the Python breakpoint code. */ -+void -+gdbpy_initialize_breakpoints (void) -+{ -+ breakpoint_object_type.tp_new = bppy_new; -+ if (PyType_Ready (&breakpoint_object_type) < 0) -+ return; -+ -+ Py_INCREF (&breakpoint_object_type); -+ PyModule_AddObject (gdb_module, "Breakpoint", -+ (PyObject *) &breakpoint_object_type); -+ -+ observer_attach_breakpoint_created (gdbpy_breakpoint_created); -+ observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted); -+} -+ -+ -+ -+static PyGetSetDef breakpoint_object_getset[] = { -+ { "enabled", bppy_get_enabled, bppy_set_enabled, -+ "Boolean telling whether the breakpoint is enabled.", NULL }, -+ { "silent", bppy_get_silent, bppy_set_silent, -+ "Boolean telling whether the breakpoint is silent.", NULL }, -+ { "thread", bppy_get_thread, bppy_set_thread, -+ "Thread ID for the breakpoint.\n\ -+If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\ -+If the value is None, then this breakpoint not thread-specific.\n\ -+No other type of value can be used.", NULL }, -+ { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count, -+ "Number of times this breakpoint should be automatically continued.", -+ NULL }, -+ { "number", bppy_get_number, NULL, -+ "Breakpoint's number assigned by GDB.", NULL }, -+ { "hit_count", bppy_get_hit_count, bppy_set_hit_count, -+ "Number of times the breakpoint has been hit.\n\ -+Can be set to zero to clear the count. No other value is valid\n\ -+when setting this property.", NULL }, -+ { "location", bppy_get_location, NULL, -+ "Location of the breakpoint, as specified by the user.", NULL}, -+ { "condition", bppy_get_condition, bppy_set_condition, -+ "Condition of the breakpoint, as specified by the user,\ -+or None if no condition set."}, -+ { "commands", bppy_get_commands, NULL, -+ "Commands of the breakpoint, as specified by the user."}, -+ { NULL } /* Sentinel. */ -+}; -+ -+static PyMethodDef breakpoint_object_methods[] = -+{ -+ { "is_valid", bppy_is_valid, METH_NOARGS, -+ "Return true if this breakpoint is valid, false if not." }, -+ { NULL } /* Sentinel. */ -+}; -+ -+static PyTypeObject breakpoint_object_type = -+{ -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Breakpoint", /*tp_name*/ -+ sizeof (breakpoint_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, /*tp_flags*/ -+ "GDB breakpoint object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ breakpoint_object_methods, /* tp_methods */ -+ 0, /* tp_members */ -+ breakpoint_object_getset /* tp_getset */ -+}; -diff --git a/gdb/python/python-cmd.c b/gdb/python/python-cmd.c -index 36cde34..e6e3ac0 100644 ---- a/gdb/python/python-cmd.c -+++ b/gdb/python/python-cmd.c -@@ -47,8 +47,7 @@ static struct cmdpy_completer completers[] = - - #define N_COMPLETERS (sizeof (completers) / sizeof (completers[0])) - --/* A gdb command. For the time being only ordinary commands (not -- set/show commands) are allowed. */ -+/* A gdb command. */ - struct cmdpy_object - { - PyObject_HEAD -@@ -68,7 +67,6 @@ typedef struct cmdpy_object cmdpy_object; - - static PyTypeObject cmdpy_object_type; - -- - /* 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) - *BASE_LIST is set to the final prefix command's list of - *sub-commands. - -+ START_LIST is the list in which the search starts. -+ - This function returns the xmalloc()d name of the new command. On - error sets the Python error and returns NULL. */ --static char * --parse_command_name (char *text, struct cmd_list_element ***base_list) -+char * -+gdbpy_parse_command_name (char *text, struct cmd_list_element ***base_list, -+ struct cmd_list_element **start_list) - { - struct cmd_list_element *elt; - int len = strlen (text); -@@ -301,7 +302,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) - ; - if (i < 0) - { -- *base_list = &cmdlist; -+ *base_list = start_list; - return result; - } - -@@ -310,7 +311,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) - prefix_text[i + 1] = '\0'; - - text = prefix_text; -- elt = lookup_cmd_1 (&text, cmdlist, NULL, 1); -+ elt = lookup_cmd_1 (&text, *start_list, NULL, 1); - 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) - return -1; - } - -- cmd_name = parse_command_name (name, &cmd_list); -+ cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist); - if (! cmd_name) - 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 -+++ 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); -+} -+ -+/* Implementation of gdb.Frame.block (self) -> gdb.Block. -+ Returns the frame's code block. */ -+ -+static PyObject * -+frapy_block (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ struct block *block = NULL; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ block = block_for_pc (get_frame_address_in_block (frame)); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ if (block) -+ return block_to_block_object (block); -+ -+ Py_RETURN_NONE; -+} -+ -+ -+/* Implementation of gdb.Frame.addr_in_block (self) -> Long. -+ Returns an address which falls within the frame's code block. */ -+ -+static PyObject * -+frapy_addr_in_block (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_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; -+} -+ -+/* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line. -+ Returns the frame's symtab and line. */ -+ -+static PyObject * -+frapy_find_sal (PyObject *self, PyObject *args) -+{ -+ struct frame_info *frame; -+ struct symtab_and_line sal; -+ volatile struct gdb_exception except; -+ PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */ -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ find_frame_sal (frame, &sal); -+ sal_obj = symtab_and_line_to_sal_object (sal); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return sal_obj; -+} -+ -+/* 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; -+ -+ 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; -+ -+ 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; -+ } -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); -+ -+ val = read_var_value (var, frame); -+ } -+ 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." }, -+ { "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." }, -+ { "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 */ -+}; -diff --git a/gdb/python/python-hooks.c b/gdb/python/python-hooks.c -new file mode 100644 -index 0000000..a3140bc ---- /dev/null -+++ b/gdb/python/python-hooks.c -@@ -0,0 +1,50 @@ -+/* Notifications from gdb to Python -+ -+ 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 "cli/cli-decode.h" -+#include "charset.h" -+#include "python.h" -+#include "python-internal.h" -+#include "observer.h" -+ -+PyObject * -+gdbpy_get_hook_function (const char *name) -+{ -+ PyObject *hooks; -+ PyObject *result; -+ -+ if (! PyObject_HasAttrString (gdb_module, "hooks")) -+ return NULL; -+ hooks = PyObject_GetAttrString (gdb_module, "hooks"); -+ if (! hooks) -+ return NULL; -+ /* The cast is because the Python function doesn't declare const argument. -+ This is a problem in Python version 2.4, but not in 2.5. */ -+ if (! PyObject_HasAttrString (hooks, (char *) name)) -+ { -+ Py_DECREF (hooks); -+ return NULL; -+ } -+ /* The cast is because the Python function doesn't declare const argument. -+ This is a problem in Python version 2.4, but not in 2.5. */ -+ result = PyObject_GetAttrString (hooks, (char *) name); -+ Py_DECREF (hooks); -+ return result; -+} -diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h -index 02dbfc4..5e43267 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; - #define PyEval_ReleaseLock() 0 - #endif - -+#include "command.h" -+ -+struct block; -+struct symbol; -+struct symtab_and_line; - struct value; - - extern PyObject *gdb_module; -+extern PyTypeObject block_object_type; - extern PyTypeObject value_object_type; -+extern PyTypeObject symbol_object_type; - - 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_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); -+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 *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 *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 *convert_value_from_python (PyObject *obj); -+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_symtabs (void); - void gdbpy_initialize_commands (void); -+void gdbpy_initialize_symbols (void); -+void gdbpy_initialize_types (void); -+void gdbpy_initialize_blocks (void); -+void gdbpy_initialize_functions (void); -+void gdbpy_initialize_objfile (void); -+void gdbpy_initialize_parameters (void); -+void gdbpy_initialize_membuf (void); - - struct cleanup *make_cleanup_py_decref (PyObject *py); - struct cleanup *make_cleanup_py_restore_gil (PyGILState_STATE *state); - -+char *gdbpy_parse_command_name (char *text, -+ struct cmd_list_element ***base_list, -+ struct cmd_list_element **start_list); -+ -+PyObject *gdbpy_parameter_value (enum var_types, void *); -+ - /* 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); - "%s", Exception.message); \ - } while (0) - -+/* Use this after a TRY_EXCEPT to throw the appropriate Python -+ exception. This macro is for use inside setter functions. */ -+#define GDB_PY_SET_HANDLE_EXCEPTION(Exception) \ -+ do { \ -+ if (Exception.reason < 0) \ -+ { \ -+ PyErr_Format (Exception.reason == RETURN_QUIT \ -+ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \ -+ "%s", Exception.message); \ -+ return -1; \ -+ } \ -+ } while (0) -+ - - void gdbpy_print_stack (void); - -@@ -95,6 +158,21 @@ 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); -+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; - -+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 ---- /dev/null -+++ b/gdb/python/python-membuf.c -@@ -0,0 +1,243 @@ -+/* Python interface to the inferior memory. -+ -+ 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 "exceptions.h" -+#include "gdbcore.h" -+#include "python-internal.h" -+ -+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; -+ -+/* 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. */ -+ -+PyObject * -+gdbpy_read_memory (PyObject *self, PyObject *args) -+{ -+ CORE_ADDR addr, length; -+ void *buffer; -+ membuf_object *membuf_obj; -+ struct cleanup *cleanups; -+ volatile struct gdb_exception except; -+ -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ if (! PyArg_ParseTuple (args, "kk", &addr, &length)) -+ return NULL; -+ -+ buffer = xmalloc (length); -+ cleanups = make_cleanup (xfree, buffer); -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ read_memory (addr, buffer, length); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ discard_cleanups (cleanups); -+ -+ membuf_obj = PyObject_New (membuf_object, &membuf_object_type); -+ if (membuf_obj == NULL) -+ { -+ xfree (buffer); -+ PyErr_SetString (PyExc_MemoryError, -+ "Could not allocate memory buffer object."); -+ return NULL; -+ } -+ -+ 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. */ -+ -+PyObject * -+gdbpy_write_memory (PyObject *self, PyObject *args) -+{ -+ int buf_len; -+ const char *buffer; -+ long length = -1; -+ CORE_ADDR addr; -+ volatile struct gdb_exception except; -+ -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ if (! PyArg_ParseTuple (args, "ks#|l", &addr, &buffer, &buf_len, &length)) -+ return NULL; -+ -+ if (length == -1) -+ length = buf_len; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ write_memory (addr, buffer, length); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ 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 (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; -+} -+ -+/* 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 */ -+}; -+ -+void -+gdbpy_initialize_membuf (void) -+{ -+ if (PyType_Ready (&membuf_object_type) < 0) -+ return; -+ -+ 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 ---- /dev/null -+++ b/gdb/python/python-param.c -@@ -0,0 +1,606 @@ -+/* gdb parameters 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" -+ -+/* Parameter constants and their values. */ -+struct parm_constant -+{ -+ char *name; -+ int value; -+}; -+ -+struct parm_constant parm_constants[] = -+{ -+ { "PARAM_BOOLEAN", var_boolean }, -+ { "PARAM_AUTO_BOOLEAN", var_auto_boolean }, -+ { "PARAM_UINTEGER", var_uinteger }, -+ { "PARAM_INTEGER", var_integer }, -+ { "PARAM_STRING", var_string }, -+ { "PARAM_STRING_NOESCAPE", var_string_noescape }, -+ { "PARAM_OPTIONAL_FILENAME", var_optional_filename }, -+ { "PARAM_FILENAME", var_filename }, -+ { "PARAM_ZINTEGER", var_zinteger }, -+ { "PARAM_ENUM", var_enum }, -+ { NULL, 0 } -+}; -+ -+/* A union that can hold anything described by enum var_types. */ -+union parmpy_variable -+{ -+ /* Hold an integer value, for boolean and integer types. */ -+ int intval; -+ -+ /* Hold an auto_boolean. */ -+ enum auto_boolean autoboolval; -+ -+ /* Hold an unsigned integer value, for uinteger. */ -+ unsigned int uintval; -+ -+ /* Hold a string, for the various string types. */ -+ char *stringval; -+ -+ /* Hold a string, for enums. */ -+ const char *cstringval; -+}; -+ -+/* A gdb parameter. */ -+struct parmpy_object -+{ -+ PyObject_HEAD -+ -+ /* The type of the parameter. */ -+ enum var_types type; -+ -+ /* The value of the parameter. */ -+ union parmpy_variable value; -+ -+ /* For an enum command, the possible values. The vector is -+ allocated with xmalloc, as is each element. It is -+ NULL-terminated. */ -+ const char **enumeration; -+}; -+ -+typedef struct parmpy_object parmpy_object; -+ -+static PyTypeObject parmpy_object_type; -+ -+/* Some handy string constants. */ -+static PyObject *set_doc_cst; -+static PyObject *show_doc_cst; -+ -+ -+ -+/* Get an attribute. */ -+static PyObject * -+get_attr (PyObject *obj, PyObject *attr_name) -+{ -+ if (PyString_Check (attr_name) -+ && ! strcmp (PyString_AsString (attr_name), "value")) -+ { -+ parmpy_object *self = (parmpy_object *) obj; -+ return gdbpy_parameter_value (self->type, &self->value); -+ } -+ -+ return PyObject_GenericGetAttr (obj, attr_name); -+} -+ -+/* Set a parameter value from a Python value. Return 0 on success, -1 -+ on failure. */ -+static int -+set_parameter_value (parmpy_object *self, PyObject *value) -+{ -+ int cmp; -+ -+ switch (self->type) -+ { -+ case var_string: -+ case var_string_noescape: -+ case var_optional_filename: -+ case var_filename: -+ if (! gdbpy_is_string (value) -+ && (self->type == var_filename -+ || value != Py_None)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "string required"); -+ return -1; -+ } -+ if (self->value.stringval) -+ xfree (self->value.stringval); -+ if (value == Py_None) -+ { -+ if (self->type == var_optional_filename) -+ self->value.stringval = xstrdup (""); -+ else -+ self->value.stringval = NULL; -+ } -+ else -+ self->value.stringval = python_string_to_host_string (value); -+ break; -+ -+ case var_enum: -+ { -+ int i; -+ char *str; -+ -+ if (! gdbpy_is_string (value)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "string required"); -+ return -1; -+ } -+ -+ str = python_string_to_host_string (value); -+ for (i = 0; self->enumeration[i]; ++i) -+ if (! strcmp (self->enumeration[i], str)) -+ break; -+ xfree (str); -+ if (! self->enumeration[i]) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "value must be member of enumeration"); -+ return -1; -+ } -+ self->value.cstringval = self->enumeration[i]; -+ break; -+ } -+ -+ case var_boolean: -+ if (! PyBool_Check (value)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "boolean required"); -+ return -1; -+ } -+ cmp = PyObject_IsTrue (value); -+ if (cmp < 0) -+ return -1; -+ self->value.intval = cmp; -+ break; -+ -+ case var_auto_boolean: -+ if (! PyBool_Check (value) && value != Py_None) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "boolean or None required"); -+ return -1; -+ } -+ -+ if (value == Py_None) -+ self->value.autoboolval = AUTO_BOOLEAN_AUTO; -+ else -+ { -+ cmp = PyObject_IsTrue (value); -+ if (cmp < 0 ) -+ return -1; -+ if (cmp == 1) -+ self->value.autoboolval = AUTO_BOOLEAN_TRUE; -+ else -+ self->value.autoboolval = AUTO_BOOLEAN_FALSE; -+ -+ break; -+ } -+ -+ case var_integer: -+ case var_zinteger: -+ case var_uinteger: -+ { -+ long l; -+ int ok; -+ -+ if (! PyInt_Check (value)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "value must be integer"); -+ return -1; -+ } -+ -+ l = PyInt_AsLong (value); -+ if (self->type == var_uinteger) -+ { -+ ok = (l >= 0 && l <= UINT_MAX); -+ if (l == 0) -+ l = UINT_MAX; -+ } -+ else if (self->type == var_integer) -+ { -+ ok = (l >= INT_MIN && l <= INT_MAX); -+ if (l == 0) -+ l = INT_MAX; -+ } -+ else -+ ok = (l >= INT_MIN && l <= INT_MAX); -+ -+ if (! ok) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "range exceeded"); -+ return -1; -+ } -+ -+ self->value.intval = (int) l; -+ break; -+ } -+ -+ default: -+ PyErr_SetString (PyExc_RuntimeError, "programmer error: unhandled type"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+/* Set an attribute. */ -+static int -+set_attr (PyObject *obj, PyObject *attr_name, PyObject *val) -+{ -+ if (PyString_Check (attr_name) -+ && ! strcmp (PyString_AsString (attr_name), "value")) -+ { -+ if (!val) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "cannot delete a parameter's value"); -+ return -1; -+ } -+ return set_parameter_value ((parmpy_object *) obj, val); -+ } -+ -+ return PyObject_GenericSetAttr (obj, attr_name, val); -+} -+ -+ -+ -+/* A helper function that dispatches to the appropriate add_setshow -+ function. */ -+static void -+add_setshow_generic (int parmclass, enum command_class cmdclass, -+ char *cmd_name, parmpy_object *self, -+ char *set_doc, char *show_doc, char *help_doc, -+ struct cmd_list_element **set_list, -+ struct cmd_list_element **show_list) -+{ -+ switch (parmclass) -+ { -+ case var_boolean: -+ add_setshow_boolean_cmd (cmd_name, cmdclass, &self->value.intval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_auto_boolean: -+ add_setshow_auto_boolean_cmd (cmd_name, cmdclass, -+ &self->value.autoboolval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_uinteger: -+ add_setshow_uinteger_cmd (cmd_name, cmdclass, &self->value.uintval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_integer: -+ add_setshow_integer_cmd (cmd_name, cmdclass, &self->value.intval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_string: -+ add_setshow_string_cmd (cmd_name, cmdclass, &self->value.stringval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_string_noescape: -+ add_setshow_string_noescape_cmd (cmd_name, cmdclass, -+ &self->value.stringval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_optional_filename: -+ add_setshow_optional_filename_cmd (cmd_name, cmdclass, -+ &self->value.stringval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_filename: -+ add_setshow_filename_cmd (cmd_name, cmdclass, &self->value.stringval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_zinteger: -+ add_setshow_zinteger_cmd (cmd_name, cmdclass, &self->value.intval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ break; -+ -+ case var_enum: -+ add_setshow_enum_cmd (cmd_name, cmdclass, self->enumeration, -+ &self->value.cstringval, -+ set_doc, show_doc, help_doc, -+ NULL, NULL, set_list, show_list); -+ /* Initialize the value, just in case. */ -+ self->value.cstringval = self->enumeration[0]; -+ break; -+ } -+} -+ -+/* A helper which computes enum values. Returns 1 on success, 0 on -+ error. */ -+static int -+compute_enum_values (parmpy_object *self, PyObject *enum_values) -+{ -+ Py_ssize_t size, i; -+ -+ if (! enum_values) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "enumeration required for PARAM_ENUM"); -+ return 0; -+ } -+ -+ if (! PySequence_Check (enum_values)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "enumeration is not a sequence"); -+ return 0; -+ } -+ -+ size = PySequence_Size (enum_values); -+ if (size < 0) -+ return 0; -+ if (size == 0) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "empty enumeration"); -+ return 0; -+ } -+ -+ self->enumeration = xmalloc ((size + 1) * sizeof (char *)); -+ memset (self->enumeration, 0, (size + 1) * sizeof (char *)); -+ -+ for (i = 0; i < size; ++i) -+ { -+ PyObject *item = PySequence_GetItem (enum_values, i); -+ if (! item) -+ return 0; -+ if (! gdbpy_is_string (item)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "enumeration item not a string"); -+ return 0; -+ } -+ self->enumeration[i] = python_string_to_host_string (item); -+ } -+ -+ return 1; -+} -+ -+/* A helper function which returns a documentation string for an -+ object. */ -+static char * -+get_doc_string (PyObject *object, PyObject *attr) -+{ -+ char *result = NULL; -+ if (PyObject_HasAttr (object, attr)) -+ { -+ PyObject *ds_obj = PyObject_GetAttr (object, attr); -+ if (ds_obj && gdbpy_is_string (ds_obj)) -+ result = python_string_to_host_string (ds_obj); -+ } -+ if (! result) -+ result = xstrdup ("This command is not documented."); -+ return result; -+} -+ -+/* Object initializer; sets up gdb-side structures for command. -+ -+ Use: __init__(NAME, CMDCLASS, PARMCLASS, [ENUM]) -+ -+ NAME is the name of the parameter. 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_* -+ constants defined in the gdb module. -+ -+ PARMCLASS is the type of the parameter. It should be one of the -+ PARAM_* constants defined in the gdb module. -+ -+ If PARMCLASS is PARAM_ENUM, then the final argument should be a -+ collection of strings. These strings are the valid values for this -+ parameter. -+ -+ The documentation for the parameter is taken from the doc string -+ for the python class. -+ -+*/ -+static int -+parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) -+{ -+ parmpy_object *obj = (parmpy_object *) self; -+ char *name; -+ char *set_doc, *show_doc, *doc; -+ char *cmd_name; -+ int parmclass, cmdtype; -+ PyObject *enum_values = NULL; -+ struct cmd_list_element *cmd_list; -+ struct cmd_list_element **set_list, **show_list; -+ volatile struct gdb_exception except; -+ -+ if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass, -+ &enum_values)) -+ return -1; -+ -+ if (cmdtype != no_class && cmdtype != class_run -+ && cmdtype != class_vars && cmdtype != class_stack -+ && cmdtype != class_files && cmdtype != class_support -+ && cmdtype != class_info && cmdtype != class_breakpoint -+ && cmdtype != class_trace && cmdtype != class_obscure -+ && cmdtype != class_maintenance) -+ { -+ PyErr_Format (PyExc_RuntimeError, "invalid command class argument"); -+ return -1; -+ } -+ -+ if (parmclass != var_boolean && parmclass != var_auto_boolean -+ && parmclass != var_uinteger && parmclass != var_integer -+ && parmclass != var_string && parmclass != var_string_noescape -+ && parmclass != var_optional_filename && parmclass != var_filename -+ && parmclass != var_zinteger && parmclass != var_enum) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "invalid parameter class argument"); -+ return -1; -+ } -+ -+ if (enum_values && parmclass != var_enum) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "only PARAM_ENUM accepts a fourth argument"); -+ return -1; -+ } -+ if (parmclass == var_enum) -+ { -+ if (! compute_enum_values (obj, enum_values)) -+ return -1; -+ } -+ -+ obj->type = (enum var_types) parmclass; -+ memset (&obj->value, 0, sizeof (obj->value)); -+ obj->enumeration = NULL; -+ -+ cmd_name = gdbpy_parse_command_name (name, &set_list, &setlist); -+ if (! cmd_name) -+ return -1; -+ xfree (cmd_name); -+ cmd_name = gdbpy_parse_command_name (name, &show_list, &showlist); -+ if (! cmd_name) -+ return -1; -+ -+ /* FIXME: there is no way to register a destructor function for -+ set/show commands. So, these are leaked. */ -+ set_doc = get_doc_string (self, set_doc_cst); -+ show_doc = get_doc_string (self, show_doc_cst); -+ doc = get_doc_string (self, gdbpy_doc_cst); -+ -+ Py_INCREF (self); -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ add_setshow_generic (parmclass, (enum command_class) cmdtype, -+ cmd_name, obj, -+ set_doc, show_doc, -+ doc, set_list, show_list); -+ } -+ if (except.reason < 0) -+ { -+ xfree (cmd_name); -+ xfree (set_doc); -+ xfree (show_doc); -+ xfree (doc); -+ Py_DECREF (self); -+ PyErr_Format (except.reason == RETURN_QUIT -+ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, -+ "%s", except.message); -+ return -1; -+ } -+ return 0; -+} -+ -+ -+ -+/* Initialize the 'parameters' module. */ -+void -+gdbpy_initialize_parameters (void) -+{ -+ int i; -+ -+ if (PyType_Ready (&parmpy_object_type) < 0) -+ return; -+ -+ set_doc_cst = PyString_FromString ("set_doc"); -+ if (! set_doc_cst) -+ return; -+ show_doc_cst = PyString_FromString ("show_doc"); -+ if (! show_doc_cst) -+ return; -+ -+ for (i = 0; parm_constants[i].name; ++i) -+ { -+ if (PyModule_AddIntConstant (gdb_module, -+ parm_constants[i].name, -+ parm_constants[i].value) < 0) -+ return; -+ } -+ -+ Py_INCREF (&parmpy_object_type); -+ PyModule_AddObject (gdb_module, "Parameter", -+ (PyObject *) &parmpy_object_type); -+} -+ -+ -+ -+static PyTypeObject parmpy_object_type = -+{ -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Parameter", /*tp_name*/ -+ sizeof (parmpy_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*/ -+ get_attr, /*tp_getattro*/ -+ set_attr, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ -+ "GDB parameter 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 */ -+ parmpy_init, /* tp_init */ -+ 0, /* tp_alloc */ -+ PyType_GenericNew /* tp_new */ -+}; -diff --git a/gdb/python/python-symbol.c b/gdb/python/python-symbol.c -new file mode 100644 -index 0000000..c7fda5c ---- /dev/null -+++ b/gdb/python/python-symbol.c -@@ -0,0 +1,337 @@ -+/* Python interface to symbols. -+ -+ 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 "block.h" -+#include "exceptions.h" -+#include "frame.h" -+#include "symtab.h" -+#include "python-internal.h" -+ -+typedef struct { -+ PyObject_HEAD -+ struct symbol *symbol; -+} symbol_object; -+ -+ -+static PyObject * -+sympy_str (PyObject *self) -+{ -+ int ret; -+ char *s; -+ PyObject *result; -+ -+ ret = asprintf (&s, "symbol for %s", -+ SYMBOL_PRINT_NAME (((symbol_object *) self)->symbol)); -+ if (ret < 0) -+ Py_RETURN_NONE; -+ -+ result = PyString_FromString (s); -+ xfree (s); -+ -+ return result; -+} -+ -+static PyObject * -+sympy_get_value (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ switch (SYMBOL_CLASS (self_sym->symbol)) -+ { -+ case LOC_BLOCK: -+ return block_to_block_object (SYMBOL_BLOCK_VALUE (self_sym->symbol)); -+ } -+ -+ PyErr_SetString (PyExc_NotImplementedError, -+ "Symbol type not yet supported in Python scripts."); -+ return NULL; -+} -+ -+static PyObject * -+sympy_get_symtab (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ return symtab_to_symtab_object (SYMBOL_SYMTAB (self_sym->symbol)); -+} -+ -+static PyObject * -+sympy_get_name (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ return PyString_FromString (SYMBOL_NATURAL_NAME (self_sym->symbol)); -+} -+ -+static PyObject * -+sympy_get_linkage_name (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ return PyString_FromString (SYMBOL_LINKAGE_NAME (self_sym->symbol)); -+} -+ -+static PyObject * -+sympy_get_print_name (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ return PyString_FromString (SYMBOL_PRINT_NAME (self_sym->symbol)); -+} -+ -+static PyObject * -+sympy_get_addr_class (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ return PyInt_FromLong (SYMBOL_CLASS (self_sym->symbol)); -+} -+ -+static PyObject * -+sympy_is_argument (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ -+ return PyBool_FromLong (SYMBOL_IS_ARGUMENT (self_sym->symbol)); -+} -+ -+static PyObject * -+sympy_is_constant (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ enum address_class class = SYMBOL_CLASS (self_sym->symbol); -+ -+ return PyBool_FromLong (class == LOC_CONST || class == LOC_CONST_BYTES); -+} -+ -+static PyObject * -+sympy_is_function (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ enum address_class class = SYMBOL_CLASS (self_sym->symbol); -+ -+ return PyBool_FromLong (class == LOC_BLOCK); -+} -+ -+static PyObject * -+sympy_is_variable (PyObject *self, void *closure) -+{ -+ symbol_object *self_sym = (symbol_object *) self; -+ enum address_class class = SYMBOL_CLASS (self_sym->symbol); -+ -+ return PyBool_FromLong (!SYMBOL_IS_ARGUMENT (self_sym->symbol) -+ && (class == LOC_LOCAL || class == LOC_REGISTER || class == LOC_STATIC -+ || class == LOC_COMPUTED || class == LOC_OPTIMIZED_OUT)); -+} -+ -+PyObject * -+symbol_to_symbol_object (struct symbol *sym) -+{ -+ symbol_object *sym_obj; -+ -+ sym_obj = PyObject_New (symbol_object, &symbol_object_type); -+ if (sym_obj == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, "Could not allocate symbol object."); -+ return NULL; -+ } -+ -+ sym_obj->symbol = sym; -+ -+ return (PyObject *) sym_obj; -+} -+ -+struct symbol * -+symbol_object_to_symbol (PyObject *obj) -+{ -+ if (! PyObject_TypeCheck (obj, &symbol_object_type)) -+ return NULL; -+ return ((symbol_object *) obj)->symbol; -+} -+ -+/* Implementation of -+ gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this) -+ A tuple with 2 elements is always returned. The first is the symbol -+ object or None, the second is a boolean with the value of -+ is_a_field_of_this (see comment in lookup_symbol_in_language). */ -+ -+PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) -+{ -+ int domain = VAR_DOMAIN, is_a_field_of_this = 0; -+ const char *name; -+ static char *keywords[] = { "name", "block", "domain", NULL }; -+ struct symbol *symbol; -+ PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj; -+ struct block *block = NULL; -+ -+ if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name, -+ &block_object_type, &block_obj, &domain)) -+ return NULL; -+ -+ if (block_obj) -+ block = block_object_to_block (block_obj); -+ else -+ { -+ struct frame_info *selected_frame; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ selected_frame = get_selected_frame (_("No frame selected.")); -+ block = block_for_pc (get_frame_address_in_block (selected_frame)); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ } -+ -+ symbol = lookup_symbol (name, block, domain, &is_a_field_of_this); -+ -+ ret_tuple = PyTuple_New (2); -+ if (!ret_tuple) -+ { -+ PyErr_SetString (PyExc_MemoryError, "Could not allocate tuple object."); -+ return NULL; -+ } -+ -+ if (symbol) -+ { -+ sym_obj = symbol_to_symbol_object (symbol); -+ if (!sym_obj) -+ { -+ Py_DECREF (ret_tuple); -+ return NULL; -+ } -+ } -+ else -+ { -+ sym_obj = Py_None; -+ Py_INCREF (Py_None); -+ } -+ PyTuple_SET_ITEM (ret_tuple, 0, sym_obj); -+ -+ bool_obj = is_a_field_of_this? Py_True : Py_False; -+ Py_INCREF (bool_obj); -+ PyTuple_SET_ITEM (ret_tuple, 1, bool_obj); -+ -+ return ret_tuple; -+} -+ -+void -+gdbpy_initialize_symbols (void) -+{ -+ symbol_object_type.tp_new = PyType_GenericNew; -+ if (PyType_Ready (&symbol_object_type) < 0) -+ return; -+ -+ /* FIXME: These would probably be best exposed as class attributes of Symbol, -+ but I don't know how to do it except by messing with the type's dictionary. -+ That seems too messy. */ -+ /* FIXME 2: Some of these were removed from GDB since I first wrote this code, -+ so it's probably a good idea not to expose them to Python. */ -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST", LOC_CONST); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC", LOC_STATIC); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER", LOC_REGISTER); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG", LOC_ARG); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG", LOC_REF_ARG); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL", LOC_LOCAL); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF", LOC_TYPEDEF); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL", LOC_LABEL); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK", LOC_BLOCK); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES", -+ LOC_CONST_BYTES); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED", LOC_UNRESOLVED); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT", -+ LOC_OPTIMIZED_OUT); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED", LOC_COMPUTED); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR", -+ LOC_REGPARM_ADDR); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_UNDEF_DOMAIN", UNDEF_DOMAIN); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_VAR_DOMAIN", VAR_DOMAIN); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_STRUCT_DOMAIN", STRUCT_DOMAIN); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_LABEL_DOMAIN", LABEL_DOMAIN); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_VARIABLES_DOMAIN", -+ VARIABLES_DOMAIN); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_FUNCTIONS_DOMAIN", -+ FUNCTIONS_DOMAIN); -+ PyModule_AddIntConstant (gdb_module, "SYMBOL_TYPES_DOMAIN", TYPES_DOMAIN); -+ -+ Py_INCREF (&symbol_object_type); -+ PyModule_AddObject (gdb_module, "Symbol", (PyObject *) &symbol_object_type); -+} -+ -+ -+ -+static PyGetSetDef symbol_object_getset[] = { -+ { "value", sympy_get_value, NULL, "Value of the symbol.", NULL }, -+ { "symtab", sympy_get_symtab, NULL, -+ "Symbol table in which the symbol appears.", NULL }, -+ { "name", sympy_get_name, NULL, -+ "Name of the symbol, as it appears in the source code.", NULL }, -+ { "linkage_name", sympy_get_linkage_name, NULL, -+ "Name of the symbol, as used by the linker (i.e., may be mangled).", NULL }, -+ { "print_name", sympy_get_print_name, NULL, -+ "Name of the symbol in a form suitable for output.\n\ -+This is either name or linkage_name, depending on whether the user asked GDB\n\ -+to display demangled or mangled names.", NULL }, -+ { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." }, -+ { "is_argument", sympy_is_argument, NULL, -+ "True if the symbol is an argument of a function." }, -+ { "is_constant", sympy_is_constant, NULL, -+ "True if the symbol is a constant." }, -+ { "is_function", sympy_is_function, NULL, -+ "True if the symbol is a function or method." }, -+ { "is_variable", sympy_is_variable, NULL, -+ "True if the symbol is a variable." }, -+ { NULL } /* Sentinel */ -+}; -+ -+PyTypeObject symbol_object_type = { -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Symbol", /*tp_name*/ -+ sizeof (symbol_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*/ -+ sympy_str, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT, /*tp_flags*/ -+ "GDB symbol 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 */ -+ symbol_object_getset /* tp_getset */ -+}; -diff --git a/gdb/python/python-symtab.c b/gdb/python/python-symtab.c -new file mode 100644 -index 0000000..a48c38c ---- /dev/null -+++ b/gdb/python/python-symtab.c -@@ -0,0 +1,311 @@ -+/* Python interface to symbol tables. -+ -+ 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 "charset.h" -+#include "symtab.h" -+#include "source.h" -+#include "python-internal.h" -+ -+typedef struct { -+ PyObject_HEAD -+ struct symtab *symtab; -+} symtab_object; -+ -+static PyTypeObject symtab_object_type; -+ -+typedef struct { -+ PyObject_HEAD -+ symtab_object *symtab; -+ struct symtab_and_line *sal; -+} sal_object; -+ -+static PyTypeObject sal_object_type; -+ -+ -+static PyObject * -+stpy_str (PyObject *self) -+{ -+ int ret; -+ char *s; -+ PyObject *result; -+ -+ ret = asprintf (&s, "symbol table for %s", -+ ((symtab_object *) self)->symtab->filename); -+ if (ret < 0) -+ Py_RETURN_NONE; -+ -+ result = PyString_FromString (s); -+ xfree (s); -+ -+ return result; -+} -+ -+static PyObject * -+stpy_get_filename (PyObject *self, void *closure) -+{ -+ symtab_object *self_symtab = (symtab_object *) self; -+ PyObject *str_obj; -+ -+ /* FIXME: Can symtab->filename really be NULL? */ -+ if (self_symtab->symtab->filename) -+ str_obj = PyString_Decode (self_symtab->symtab->filename, -+ strlen (self_symtab->symtab->filename), -+ host_charset (), NULL); -+ else -+ { -+ str_obj = Py_None; -+ Py_INCREF (Py_None); -+ } -+ -+ return str_obj; -+} -+ -+static PyObject * -+stpy_fullname (PyObject *self, PyObject *args) -+{ -+ char *fullname; -+ -+ fullname = symtab_to_fullname (((symtab_object *) self)->symtab); -+ if (fullname) -+ return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL); -+ -+ Py_RETURN_NONE; -+} -+ -+static PyObject * -+salpy_str (PyObject *self) -+{ -+ int ret; -+ char *s, *filename; -+ sal_object *sal_obj; -+ PyObject *result; -+ -+ sal_obj = (sal_object *) self; -+ filename = (sal_obj->symtab == (symtab_object *) Py_None)? "" : -+ sal_obj->symtab->symtab->filename; -+ ret = asprintf (&s, "symbol and line for %s, line %d", filename, -+ sal_obj->sal->line); -+ if (ret < 0) -+ Py_RETURN_NONE; -+ -+ result = PyString_FromString (s); -+ xfree (s); -+ -+ return result; -+} -+ -+static PyObject * -+salpy_get_pc (PyObject *self, void *closure) -+{ -+ return PyLong_FromUnsignedLongLong (((sal_object *) self)->sal->pc); -+} -+ -+static PyObject * -+salpy_get_line (PyObject *self, void *closure) -+{ -+ return PyLong_FromUnsignedLongLong (((sal_object *) self)->sal->line); -+} -+ -+static PyObject * -+salpy_get_symtab (PyObject *self, void *closure) -+{ -+ sal_object *self_sal = (sal_object *) self; -+ -+ Py_INCREF (self_sal->symtab); -+ -+ return (PyObject *) self_sal->symtab; -+} -+ -+static void -+salpy_dealloc (PyObject *self) -+{ -+ sal_object *self_sal = (sal_object *) self; -+ -+ Py_DECREF (self_sal->symtab); -+ xfree (self_sal->sal); -+ self_sal->ob_type->tp_free (self); -+} -+ -+PyObject * -+symtab_and_line_to_sal_object (struct symtab_and_line sal) -+{ -+ sal_object *sal_obj; -+ symtab_object *symtab_obj; -+ -+ sal_obj = PyObject_New (sal_object, &sal_object_type); -+ if (sal_obj == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, -+ "Could not allocate Symtab_and_line object."); -+ return NULL; -+ } -+ -+ if (sal.symtab) -+ { -+ symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab); -+ if (symtab_obj == NULL) -+ { -+ Py_DECREF (sal_obj); -+ return NULL; -+ } -+ -+ symtab_obj->symtab = sal.symtab; -+ } -+ else -+ { -+ symtab_obj = (symtab_object *) Py_None; -+ Py_INCREF (Py_None); -+ } -+ -+ sal_obj->sal = (struct symtab_and_line *) -+ xmalloc (sizeof (struct symtab_and_line)); -+ *(sal_obj->sal) = sal; -+ sal_obj->symtab = symtab_obj; -+ -+ return (PyObject *) sal_obj; -+} -+ -+PyObject * -+symtab_to_symtab_object (struct symtab *symtab) -+{ -+ symtab_object *symtab_obj; -+ -+ symtab_obj = PyObject_New (symtab_object, &symtab_object_type); -+ if (symtab_obj == NULL) -+ { -+ PyErr_SetString (PyExc_MemoryError, -+ "Could not allocate Symtab object."); -+ -+ return NULL; -+ } -+ -+ symtab_obj->symtab = symtab; -+ -+ return (PyObject *) symtab_obj; -+} -+ -+void -+gdbpy_initialize_symtabs (void) -+{ -+ symtab_object_type.tp_new = PyType_GenericNew; -+ if (PyType_Ready (&symtab_object_type) < 0) -+ return; -+ -+ sal_object_type.tp_new = PyType_GenericNew; -+ if (PyType_Ready (&sal_object_type) < 0) -+ return; -+ -+ Py_INCREF (&symtab_object_type); -+ PyModule_AddObject (gdb_module, "Symtab", (PyObject *) &symtab_object_type); -+ -+ Py_INCREF (&sal_object_type); -+ PyModule_AddObject (gdb_module, "Symtab_and_line", -+ (PyObject *) &sal_object_type); -+} -+ -+ -+ -+static PyGetSetDef symtab_object_getset[] = { -+ { "filename", stpy_get_filename, NULL, -+ "The symbol table's source filename.", NULL }, -+ {NULL} /* Sentinel */ -+}; -+ -+static PyMethodDef symtab_object_methods[] = { -+ { "fullname", stpy_fullname, METH_NOARGS, -+ "Return the symtab's full source filename." }, -+ {NULL} /* Sentinel */ -+}; -+ -+static PyTypeObject symtab_object_type = { -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Symtab", /*tp_name*/ -+ sizeof (symtab_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*/ -+ stpy_str, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT, /*tp_flags*/ -+ "GDB symtab object", /* tp_doc */ -+ 0, /* tp_traverse */ -+ 0, /* tp_clear */ -+ 0, /* tp_richcompare */ -+ 0, /* tp_weaklistoffset */ -+ 0, /* tp_iter */ -+ 0, /* tp_iternext */ -+ symtab_object_methods, /* tp_methods */ -+ 0, /* tp_members */ -+ symtab_object_getset /* tp_getset */ -+}; -+ -+static PyGetSetDef sal_object_getset[] = { -+ { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL }, -+ { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL }, -+ { "line", salpy_get_line, NULL, -+ "Return the symtab_and_line's line.", NULL }, -+ {NULL} /* Sentinel */ -+}; -+ -+static PyTypeObject sal_object_type = { -+ PyObject_HEAD_INIT (NULL) -+ 0, /*ob_size*/ -+ "gdb.Symtab_and_line", /*tp_name*/ -+ sizeof (sal_object), /*tp_basicsize*/ -+ 0, /*tp_itemsize*/ -+ salpy_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*/ -+ salpy_str, /*tp_str*/ -+ 0, /*tp_getattro*/ -+ 0, /*tp_setattro*/ -+ 0, /*tp_as_buffer*/ -+ Py_TPFLAGS_DEFAULT, /*tp_flags*/ -+ "GDB symtab_and_line 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 */ -+ 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 -+++ 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" -+#include "gdb_assert.h" -+ -+typedef struct pyty_type_object -+{ -+ PyObject_HEAD -+ struct type *type; -+ -+ /* 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; -+ Py_INCREF (arg); -+ if (PyObject_SetAttrString (result, "artificial", 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 * -+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 * -+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) -+ { -+ 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); -+ 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; -+ struct block *block = NULL; -+ PyObject *block_obj = NULL; -+ -+ if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj)) -+ return NULL; -+ -+ if (block_obj) -+ { -+ block = block_object_to_block (block_obj); -+ if (! block) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "second argument must be block"); -+ return NULL; -+ } -+ } -+ -+ 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; -+ } -+ -+ 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; -+ -+static void -+clean_up_objfile_types (struct objfile *objfile, void *datum) -+{ -+ type_object *obj = datum; -+ htab_t copied_types; -+ struct cleanup *cleanup; -+ PyGILState_STATE state; -+ -+ /* 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) -+ { -+ type_object *next = obj->next; -+ -+ 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; -+ } -+ -+ 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))) -+ { -+ 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); -+ } -+ else -+ obj->next = NULL; -+} -+ -+static void -+typy_dealloc (PyObject *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))) -+ { -+ /* 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->ob_type->tp_free (type); -+} -+ -+/* Create a new Type referring to TYPE. */ -+PyObject * -+type_to_type_object (struct type *type) -+{ -+ 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) -+{ -+ static char *keywords[] = { "name", "block", NULL }; -+ char *type_name = NULL; -+ struct type *type = NULL; -+ PyObject *block_obj = NULL; -+ struct block *block = NULL; -+ -+ if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords, -+ &type_name, &block_obj)) -+ return NULL; -+ -+ if (block_obj) -+ { -+ block = block_object_to_block (block_obj); -+ if (! block) -+ { -+ PyErr_SetString (PyExc_RuntimeError, -+ "'block' argument must be a Block"); -+ return NULL; -+ } -+ } -+ -+ type = typy_lookup_typename (type_name, block); -+ if (! type) -+ return NULL; -+ -+ 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 */ -+}; -diff --git a/gdb/python/python-utils.c b/gdb/python/python-utils.c -index ddac2f5..f9c9486 100644 ---- a/gdb/python/python-utils.c -+++ b/gdb/python/python-utils.c -@@ -19,6 +19,7 @@ - - #include "defs.h" - #include "charset.h" -+#include "value.h" - #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) - { - return PyString_Check (obj) || PyUnicode_Check (obj); - } -+ -+/* Converts OBJ to a CORE_ADDR value. -+ -+ Returns 1 on success or 0 on failure, with a Python exception set. This -+ function can also throw GDB exceptions. */ -+ -+int -+get_addr_from_python (PyObject *obj, CORE_ADDR *addr) -+{ -+ if (gdbpy_is_value_object (obj)) -+ *addr = value_as_address (value_object_to_value (obj)); -+ else if (PyLong_Check (obj)) -+ { -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ *addr = PyLong_AsUnsignedLong (obj); -+ if (PyErr_Occurred () != NULL) -+ return 0; -+ } -+ else if (PyInt_Check (obj)) -+ { -+ long val; -+ -+ /* Assume CORE_ADDR corresponds to unsigned long. */ -+ val = PyInt_AsLong (obj); -+ -+ if (val >= 0) -+ *addr = val; -+ else -+ { -+ /* If no error ocurred, VAL is indeed negative. */ -+ if (PyErr_Occurred () != NULL) -+ return 0; -+ -+ PyErr_SetString (PyExc_ValueError, "negative address"); -+ return 0; -+ } -+ } -+ else -+ { -+ PyErr_SetString (PyExc_TypeError, "invalid type for address"); -+ return 0; -+ } -+ -+ return 1; -+} -diff --git a/gdb/python/python-value.c b/gdb/python/python-value.c -index bc077b6..e26880a 100644 ---- a/gdb/python/python-value.c -+++ b/gdb/python/python-value.c -@@ -52,6 +52,10 @@ 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 - -+/* 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 -+ - #define builtin_type_pybool \ - language_bool_type (current_language, current_gdbarch) - -@@ -59,6 +63,8 @@ typedef struct { - PyObject_HEAD - struct value *value; - int owned_by_gdb; -+ PyObject *address; -+ PyObject *type; - } value_object; - - /* Called by the Python interpreter when deallocating a value object. */ -@@ -71,6 +77,18 @@ valpy_dealloc (PyObject *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); - } - -@@ -105,6 +123,8 @@ valpy_new (PyTypeObject *subtype, PyObject *args, PyObject *keywords) - - value_obj->value = value; - value_obj->owned_by_gdb = 0; -+ 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); -+ -+ return val_obj->address; - } - --/* 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; - 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; -+} -+ - /* Try to convert a Python value to a gdb value. If the value cannot - be converted, set a Python exception and return NULL. */ - -@@ -751,7 +857,34 @@ convert_value_from_python (PyObject *obj) - { - LONGEST l = PyLong_AsLongLong (obj); - -- if (! PyErr_Occurred ()) -+ if (PyErr_Occurred ()) -+ { -+ /* If the error was an overflow, we can try converting to -+ ULONGEST instead. */ -+ if (PyErr_ExceptionMatches (PyExc_OverflowError)) -+ { -+ PyObject *etype, *evalue, *etraceback, *zero; -+ -+ PyErr_Fetch (&etype, &evalue, &etraceback); -+ zero = PyInt_FromLong (0); -+ -+ /* Check whether obj is positive. */ -+ if (PyObject_RichCompareBool (obj, zero, Py_GT) > 0) -+ { -+ ULONGEST ul; -+ -+ ul = PyLong_AsUnsignedLongLong (obj); -+ if (! PyErr_Occurred ()) -+ value = value_from_ulongest (builtin_type_upylong, ul); -+ } -+ else -+ /* There's nothing we can do. */ -+ PyErr_Restore (etype, evalue, etraceback); -+ -+ Py_DECREF (zero); -+ } -+ } -+ else - 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) - return value_to_value_object (res_val); - } - -+/* Returns 1 in OBJ is a gdb.Value object, 0 otherwise. */ -+ -+int -+gdbpy_is_value_object (PyObject *obj) -+{ -+ return PyObject_TypeCheck (obj, &value_object_type); -+} -+ - void - gdbpy_initialize_values (void) - { -@@ -822,11 +963,24 @@ gdbpy_initialize_values (void) - values_in_python = NULL; - } - -+ -+ -+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 ---- 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" -+#include "event-loop.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; - #include "cli/cli-decode.h" - #include "charset.h" - #include "top.h" -+#include "solib.h" - #include "exceptions.h" - #include "python-internal.h" -+#include "linespec.h" -+#include "symtab.h" -+#include "source.h" - #include "version.h" -+#include "inferior.h" -+#include "gdbthread.h" - #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) - NULL (and set a Python exception) on error. Helper function for - get_parameter. */ - --static PyObject * --parameter_to_python (struct cmd_list_element *cmd) -+PyObject * -+gdbpy_parameter_value (enum var_types type, void *var) - { -- switch (cmd->var_type) -+ switch (type) - { - case var_string: - case var_string_noescape: -@@ -154,7 +177,7 @@ parameter_to_python (struct cmd_list_element *cmd) - case var_filename: - case var_enum: - { -- char *str = * (char **) cmd->var; -+ char *str = * (char **) var; - if (! str) - str = ""; - return PyString_Decode (str, strlen (str), host_charset (), NULL); -@@ -162,7 +185,7 @@ parameter_to_python (struct cmd_list_element *cmd) - - case var_boolean: - { -- if (* (int *) cmd->var) -+ if (* (int *) var) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -@@ -170,7 +193,7 @@ parameter_to_python (struct cmd_list_element *cmd) - - case var_auto_boolean: - { -- enum auto_boolean ab = * (enum auto_boolean *) cmd->var; -+ enum auto_boolean ab = * (enum auto_boolean *) var; - 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) - } - - case var_integer: -- if ((* (int *) cmd->var) == INT_MAX) -+ if ((* (int *) var) == INT_MAX) - Py_RETURN_NONE; - /* Fall through. */ - case var_zinteger: -- return PyLong_FromLong (* (int *) cmd->var); -+ return PyLong_FromLong (* (int *) var); - - case var_uinteger: - { -- unsigned int val = * (unsigned int *) cmd->var; -+ unsigned int val = * (unsigned int *) var; - 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); - - if (! cmd->var) -- return PyErr_Format (PyExc_RuntimeError, "`%s' is not a variable", 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) - Py_RETURN_NONE; - } - -+/* Implementation of gdb.solib_address (Long) -> String. -+ Returns the name of the shared library holding a given address, or None. */ -+ -+static PyObject * -+gdbpy_solib_address (PyObject *self, PyObject *args) -+{ -+ unsigned long long pc; -+ char *soname; -+ PyObject *str_obj; -+ -+ if (!PyArg_ParseTuple (args, "K", &pc)) -+ return NULL; -+ -+ soname = solib_address (pc); -+ if (soname) -+ str_obj = PyString_Decode (soname, strlen (soname), host_charset (), NULL); -+ else -+ { -+ str_obj = Py_None; -+ Py_INCREF (Py_None); -+ } -+ -+ 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 * -+gdbpy_decode_line (PyObject *self, PyObject *args) -+{ -+ struct symtabs_and_lines sals = { NULL, 0 }; /* Initialize to appease gcc. */ -+ struct symtab_and_line sal; -+ char *arg = NULL; -+ int free_sals = 0, i; -+ PyObject *result = NULL; -+ volatile struct gdb_exception except; -+ -+ if (! PyArg_ParseTuple (args, "|s", &arg)) -+ return NULL; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ if (arg) -+ { -+ char *copy; -+ -+ arg = strdup (arg); -+ copy = arg; -+ -+ sals = decode_line_1 (©, 0, 0, 0, 0, 0); -+ free_sals = 1; -+ } -+ else -+ { -+ set_default_source_symtab_and_line (); -+ sal = get_current_source_symtab_and_line (); -+ sals.sals = &sal; -+ sals.nelts = 1; -+ } -+ } -+ if (arg) -+ xfree (arg); -+ -+ if (except.reason < 0) -+ { -+ if (free_sals) -+ xfree (sals.sals); -+ /* We know this will always throw. */ -+ GDB_PY_HANDLE_EXCEPTION (except); -+ } -+ -+ if (sals.nelts) -+ { -+ result = PyTuple_New (sals.nelts); -+ for (i = 0; i < sals.nelts; ++i) -+ { -+ PyObject *obj; -+ char *str; -+ -+ obj = symtab_and_line_to_sal_object (sals.sals[i]); -+ if (! obj) -+ { -+ Py_DECREF (result); -+ result = NULL; -+ break; -+ } -+ -+ PyTuple_SetItem (result, i, obj); -+ } -+ } -+ -+ if (free_sals) -+ xfree (sals.sals); -+ -+ if (result) -+ return result; -+ Py_RETURN_NONE; -+} -+ -+/* Parse a string and evaluate it as an expression. */ -+static PyObject * -+gdbpy_parse_and_eval (PyObject *self, PyObject *args) -+{ -+ char *expr_str; -+ struct value *result = NULL; -+ volatile struct gdb_exception except; -+ -+ if (!PyArg_ParseTuple (args, "s", &expr_str)) -+ return NULL; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ result = parse_and_eval (expr_str); -+ } -+ GDB_PY_HANDLE_EXCEPTION (except); -+ -+ return value_to_value_object (result); -+} -+ -+ -+ -+/* Posting and handling events. */ -+ -+/* A single event. */ -+struct gdbpy_event -+{ -+ /* The Python event. This is just a callable object. */ -+ PyObject *event; -+ /* The next event. */ -+ struct gdbpy_event *next; -+}; -+ -+/* All pending events. */ -+static struct gdbpy_event *gdbpy_event_list; -+/* The final link of the event list. */ -+static struct gdbpy_event **gdbpy_event_list_end; -+ -+/* We use a file handler, and not an async handler, so that we can -+ wake up the main thread even when it is blocked in poll(). */ -+static int gdbpy_event_fds[2]; -+ -+/* The file handler callback. This reads from the internal pipe, and -+ then processes the Python event queue. This will always be run in -+ the main gdb thread. */ -+static void -+gdbpy_run_events (int err, gdb_client_data ignore) -+{ -+ PyGILState_STATE state; -+ char buffer[100]; -+ int r; -+ -+ state = PyGILState_Ensure (); -+ -+ /* Just read whatever is available on the fd. It is relatively -+ harmless if there are any bytes left over. */ -+ r = read (gdbpy_event_fds[0], buffer, sizeof (buffer)); -+ -+ while (gdbpy_event_list) -+ { -+ /* Dispatching the event might push a new element onto the event -+ loop, so we update here "atomically enough". */ -+ struct gdbpy_event *item = gdbpy_event_list; -+ gdbpy_event_list = gdbpy_event_list->next; -+ if (gdbpy_event_list == NULL) -+ gdbpy_event_list_end = &gdbpy_event_list; -+ -+ /* Ignore errors. */ -+ PyObject_CallObject (item->event, NULL); -+ -+ Py_DECREF (item->event); -+ xfree (item); -+ } -+ -+ PyGILState_Release (state); -+} -+ -+/* Submit an event to the gdb thread. */ -+static PyObject * -+gdbpy_post_event (PyObject *self, PyObject *args) -+{ -+ struct gdbpy_event *event; -+ PyObject *func; -+ int wakeup; -+ -+ if (!PyArg_ParseTuple (args, "O", &func)) -+ return NULL; -+ -+ if (!PyCallable_Check (func)) -+ { -+ PyErr_SetString (PyExc_RuntimeError, "Posted event is not callable"); -+ return NULL; -+ } -+ -+ Py_INCREF (func); -+ -+ /* From here until the end of the function, we have the GIL, so we -+ can operate on our global data structures without worrying. */ -+ wakeup = gdbpy_event_list == NULL; -+ -+ event = XNEW (struct gdbpy_event); -+ event->event = func; -+ event->next = NULL; -+ *gdbpy_event_list_end = event; -+ gdbpy_event_list_end = &event->next; -+ -+ /* Wake up gdb when needed. */ -+ if (wakeup) -+ { -+ char c = 'q'; /* Anything. */ -+ if (write (gdbpy_event_fds[1], &c, 1) != 1) -+ return PyErr_SetFromErrno (PyExc_IOError); -+ } -+ -+ Py_RETURN_NONE; -+} -+ -+/* Initialize the Python event handler. */ -+static void -+gdbpy_initialize_events (void) -+{ -+ if (!pipe (gdbpy_event_fds)) -+ { -+ gdbpy_event_list_end = &gdbpy_event_list; -+ 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 (); - } - -+ -+ -+/* Script interface. */ -+ -+/* True if 'gdb -P' was used, false otherwise. */ -+static int running_python_script; -+ -+/* True if we are currently in a call to 'gdb.cli', false otherwise. */ -+static int in_cli; -+ -+/* Enter the command loop. */ -+ -+static PyObject * -+gdbpy_cli (PyObject *unused1, PyObject *unused2) -+{ -+ if (! running_python_script || in_cli) -+ return PyErr_Format (PyExc_RuntimeError, "cannot invoke CLI recursively"); -+ -+ in_cli = 1; -+ cli_command_loop (); -+ in_cli = 0; -+ -+ Py_RETURN_NONE; -+} -+ -+/* Set up the Python argument vector and evaluate a script. This is -+ used to implement 'gdb -P'. */ -+ -+void -+run_python_script (int argc, char **argv) -+{ -+ FILE *input; -+ PyGILState_STATE state; -+ -+ /* We never free this, since we plan to exit at the end. */ -+ state = PyGILState_Ensure (); -+ -+ running_python_script = 1; -+ PySys_SetArgv (argc - 1, argv + 1); -+ input = fopen (argv[0], "r"); -+ if (! input) -+ { -+ fprintf (stderr, "could not open %s: %s\n", argv[0], strerror (errno)); -+ exit (1); -+ } -+ PyRun_SimpleFile (input, argv[0]); -+ fclose (input); -+ exit (0); -+} -+ -+void -+source_python_script (FILE *stream, char *file) -+{ -+ PyGILState_STATE state; -+ -+ state = PyGILState_Ensure (); -+ -+ PyRun_SimpleFile (stream, file); -+ -+ fclose (stream); -+ PyGILState_Release (state); -+} -+ -+ -+ -+/* 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; -+} -+ -+ -+ -+/* Helper function for find_pretty_printer which iterates over a -+ list, calls each function and inspects output. */ -+static PyObject * -+search_pp_list (PyObject *list, PyObject *value) -+{ -+ Py_ssize_t pp_list_size, list_index; -+ PyObject *function, *printer = NULL; -+ -+ pp_list_size = PyList_Size (list); -+ for (list_index = 0; list_index < pp_list_size; list_index++) -+ { -+ function = PyList_GetItem (list, list_index); -+ if (! function) -+ return NULL; -+ -+ /* gdbpy_instantiate_printer can return three possible return -+ values: NULL on error; Py_None if the pretty-printer -+ in the list cannot print the value; or a printer instance if -+ the printer can print the value. */ -+ printer = gdbpy_instantiate_printer (function, value); -+ if (! printer) -+ return NULL; -+ else if (printer != Py_None) -+ return printer; -+ -+ Py_DECREF (printer); -+ } -+ -+ Py_RETURN_NONE; -+} -+ -+/* Find the pretty-printing constructor function for TYPE. If no -+ pretty-printer exists, return NULL. If one exists, return a new -+ reference. */ -+static PyObject * -+find_pretty_printer (PyObject *value) -+{ -+ PyObject *pp_list = NULL; -+ PyObject *function = NULL; -+ struct objfile *obj; -+ volatile struct gdb_exception except; -+ -+ /* Look at the pretty-printer dictionary for each objfile. */ -+ ALL_OBJFILES (obj) -+ { -+ PyObject *objf = objfile_to_objfile_object (obj); -+ if (!objf) -+ continue; -+ -+ pp_list = objfpy_get_printers (objf, NULL); -+ function = search_pp_list (pp_list, value); -+ -+ /* If there is an error in any objfile list, abort the search and -+ exit. */ -+ if (! function) -+ { -+ Py_XDECREF (pp_list); -+ return NULL; -+ } -+ -+ if (function != Py_None) -+ goto done; -+ -+ /* In this loop, if function is not an instantiation of a -+ pretty-printer, and it is not null, then it is a return of -+ Py_RETURN_NONE, which must be decremented. */ -+ Py_DECREF (function); -+ Py_XDECREF (pp_list); -+ } -+ -+ pp_list = NULL; -+ /* Fetch the global pretty printer dictionary. */ -+ if (! PyObject_HasAttrString (gdb_module, "pretty_printers")) -+ goto done; -+ pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers"); -+ if (! pp_list) -+ goto done; -+ if (! PyList_Check (pp_list)) -+ goto done; -+ -+ function = search_pp_list (pp_list, value); -+ -+ done: -+ Py_XDECREF (pp_list); -+ -+ return function; -+} -+ -+/* Pretty-print a single value, via the printer object PRINTER. If -+ the function returns a string, an xmalloc()d copy is returned. -+ Otherwise, if the function returns a value, a *OUT_VALUE is set to -+ the value, and NULL is returned. On error, *OUT_VALUE is set to -+ NULL and NULL is returned. */ -+static char * -+pretty_print_one_value (PyObject *printer, struct value **out_value) -+{ -+ char *output = NULL; -+ volatile struct gdb_exception except; -+ -+ TRY_CATCH (except, RETURN_MASK_ALL) -+ { -+ PyObject *result; -+ -+ result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL); -+ if (result) -+ { -+ if (gdbpy_is_string (result)) -+ output = python_string_to_host_string (result); -+ else if (PyObject_TypeCheck (result, &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. */ -+ struct value *v = value_object_to_value (result); -+ *out_value = value_copy (v); -+ } -+ else -+ *out_value = convert_value_from_python (result); -+ Py_DECREF (result); -+ } -+ } -+ -+ return output; -+} -+ -+/* Instantiate a pretty-printer given a constructor, CONS, and a -+ value, VAL. Return NULL on error. Ownership of the object -+ instance is transferred to the reciever */ -+PyObject * -+gdbpy_instantiate_printer (PyObject *cons, PyObject *value) -+{ -+ PyObject *result; -+ 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) - 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) -+{ -+ fclose (stream); -+ error (_("Python scripting is not supported in this copy of GDB.")); -+} -+ - #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."), - 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); -+#ifdef PYTHONDIR -+ PyModule_AddStringConstant (gdb_module, "pythondir", PYTHONDIR); -+#else -+ if (gdb_datadir) -+ PyModule_AddStringConstant (gdb_module, "datadir", gdb_datadir); -+#endif - - gdbpy_initialize_values (); -+ gdbpy_initialize_breakpoints (); -+ gdbpy_initialize_frames (); -+ gdbpy_initialize_symtabs (); - gdbpy_initialize_commands (); -+ gdbpy_initialize_symbols (); -+ gdbpy_initialize_blocks (); -+ gdbpy_initialize_functions (); -+ gdbpy_initialize_types (); -+ gdbpy_initialize_parameters (); -+ gdbpy_initialize_objfile (); -+ 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\ - \n\ - sys.stderr = GdbOutputFile()\n\ - sys.stdout = GdbOutputFile()\n\ -+if hasattr (gdb, 'datadir'):\n\ -+ gdb.pythondir = gdb.datadir + '/python'\n\ -+if hasattr (gdb, 'pythondir'):\n\ -+ sys.path.insert(0, gdb.pythondir)\n\ -+ gdb.__path__ = [gdb.pythondir + '/gdb']\n\ -+ from os.path import exists\n\ -+ ipy = gdb.pythondir + '/gdb/__init__.py'\n\ -+ if exists (ipy):\n\ -+ execfile (ipy)\n\ - "); - - /* Release the GIL while gdb runs. */ -@@ -461,9 +1868,84 @@ 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, - "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." }, -+ -+ { "lookup_symbol", (PyCFunction) gdbpy_lookup_symbol, -+ METH_VARARGS | METH_KEYWORDS, -+ "lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)\n\ -+Return a tuple with the symbol corresponding to the given name (or None) and\n\ -+a boolean indicating if name is a field of the current implied argument\n\ -+`this' (when the current language is object-oriented)." }, -+ { "solib_address", gdbpy_solib_address, METH_VARARGS, -+ "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." }, -+ -+ { "decode_line", gdbpy_decode_line, METH_VARARGS, -+ "Decode a string argument the way that 'break' or 'edit' does.\n\ -+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." }, -+ -+ { "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 ---- a/gdb/python/python.h -+++ b/gdb/python/python.h -@@ -26,4 +26,14 @@ extern struct value *values_in_python; - - void eval_python_from_control_command (struct command_line *); - -+void source_python_script (FILE *stream, char *file); -+ -+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 */ -diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c -index 345befd..e2568c8 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) - { - 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); - -diff --git a/gdb/scm-valprint.c b/gdb/scm-valprint.c -index f0a7642..a32add5 100644 ---- a/gdb/scm-valprint.c -+++ b/gdb/scm-valprint.c -@@ -187,7 +187,8 @@ taloop: - if (SCM_ICHRP (svalue)) - { - svalue = SCM_ICHR (svalue); -- scm_printchar (svalue, stream); -+ scm_printchar (svalue, builtin_type (current_gdbarch)->builtin_char, -+ stream); - break; - } - else if (SCM_IFLAGP (svalue) -diff --git a/gdb/stabsread.c b/gdb/stabsread.c -index 2d7eb15..3b8eb29 100644 ---- a/gdb/stabsread.c -+++ b/gdb/stabsread.c -@@ -322,7 +322,7 @@ dbx_alloc_type (int typenums[2], struct objfile *objfile) - - if (typenums[0] == -1) - { -- return (alloc_type (objfile)); -+ return (alloc_type (objfile, NULL)); - } - - type_addr = dbx_lookup_type (typenums); -@@ -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) - { -- *type_addr = alloc_type (objfile); -+ *type_addr = alloc_type (objfile, NULL); - } - - 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 ---- 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) - else - count = -1; - -- if (info_verbose) -- { -- struct partial_symtab *ps; -- -- /* Read in symbols for all of the frames. Need to do this in a -- separate pass so that "Reading in symbols for xxx" messages -- don't screw up the appearance of the backtrace. Also if -- people have strong opinions against reading symbols for -- backtrace this may have to be an option. */ -- i = count; -- for (fi = trailing; fi != NULL && i--; fi = get_prev_frame (fi)) -- { -- QUIT; -- ps = find_pc_psymtab (get_frame_address_in_block (fi)); -- if (ps) -- PSYMTAB_TO_SYMTAB (ps); /* Force syms to come in. */ -- } -- } -+ { -+ struct partial_symtab *ps; -+ -+ /* Read in symbols for all of the frames. Need to do this -+ unconditionally to ensure that psymbols are read. Also need to -+ do this in a separate pass so that "Reading in symbols for xxx" -+ messages don't screw up the appearance of the backtrace. Also -+ if people have strong opinions against reading symbols for -+ backtrace this may have to be an option. */ -+ i = count; -+ for (fi = trailing; fi != NULL && i--; fi = get_prev_frame (fi)) -+ { -+ QUIT; -+ ps = find_pc_psymtab (get_frame_address_in_block (fi)); -+ if (info_verbose && ps) -+ PSYMTAB_TO_SYMTAB (ps); /* Force syms to come in. */ -+ } -+ } - - 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, - case LOC_COMPUTED: - if (SYMBOL_IS_ARGUMENT (sym)) - break; -+ if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN) -+ break; - 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 ---- 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); - } - -+/* A helper function which returns true if OBJFILE has any debug -+ symbols, and false otherwise. */ -+static int -+has_any_debug_symbols (struct objfile *objfile) -+{ -+ return (objfile->psymtabs || objfile->quick_addrmap -+ || (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, - /* 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 - && 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) -+ 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, - - if ((flags & OBJF_READNOW) || readnow_symbol_files) - { -+ require_partial_symbols (objfile); -+ - 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, - /* 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'. */ -- if (objfile->psymtabs == NULL) -+ if (!has_any_debug_symbols (objfile)) - debugfile = find_separate_debug_file (objfile); - if (debugfile) - { -@@ -1049,8 +1064,10 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, - xfree (debugfile); - } - -- if (!have_partial_symbols () && !have_full_symbols () -- && print_symbol_loading) -+ /* 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) - { - wrap_here (""); - printf_unfiltered (_("(no debugging symbols found)")); -@@ -2423,13 +2440,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); -- if (!have_partial_symbols () && !have_full_symbols ()) -+ if (!has_any_debug_symbols (objfile)) - { - wrap_here (""); - printf_unfiltered (_("(no debugging symbols found)\n")); - wrap_here (""); - } - -+ objfile->flags &= ~OBJF_SYMTABS_READ; -+ - /* 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) - } - - struct partial_symtab * --allocate_psymtab (char *filename, struct objfile *objfile) -+allocate_psymtab (const char *filename, struct objfile *objfile) - { - struct partial_symtab *psymtab; - -@@ -3040,7 +3059,8 @@ again2: - - struct partial_symtab * - start_psymtab_common (struct objfile *objfile, -- struct section_offsets *section_offsets, char *filename, -+ struct section_offsets *section_offsets, -+ const char *filename, - CORE_ADDR textlow, struct partial_symbol **global_syms, - struct partial_symbol **static_syms) - { -diff --git a/gdb/symfile.h b/gdb/symfile.h -index 88f8326..50671c1 100644 ---- a/gdb/symfile.h -+++ b/gdb/symfile.h -@@ -140,6 +140,12 @@ struct sym_fns - - void (*sym_read) (struct objfile *, int); - -+ /* Read the partial symbols for an objfile. This may be NULL, in -+ which case gdb assumes that sym_read already read the partial -+ symbols. */ -+ -+ void (*sym_read_psymbols) (struct objfile *); -+ - /* 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 *); - - extern struct partial_symtab *start_psymtab_common (struct objfile *, - struct section_offsets *, -- char *, CORE_ADDR, -+ const char *, CORE_ADDR, - struct partial_symbol **, - struct partial_symbol **); - -@@ -300,7 +306,7 @@ extern int auto_solib_limit; - - extern void set_initial_language (void); - --extern struct partial_symtab *allocate_psymtab (char *, struct objfile *); -+extern struct partial_symtab *allocate_psymtab (const char *, struct objfile *); - - extern void discard_psymtab (struct partial_symtab *); - -@@ -369,7 +375,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data); - /* From dwarf2read.c */ - - extern int dwarf2_has_info (struct objfile *); -- -+extern void dwarf2_create_quick_addrmap (struct objfile *); - extern void dwarf2_build_psymtabs (struct objfile *, int); - extern void dwarf2_build_frame_info (struct objfile *); - -diff --git a/gdb/symtab.c b/gdb/symtab.c -index d2ba1f3..44c9a58 100644 ---- a/gdb/symtab.c -+++ b/gdb/symtab.c -@@ -42,6 +42,7 @@ - #include "ada-lang.h" - #include "p-lang.h" - #include "addrmap.h" -+#include "cp-support.h" - - #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) - make_cleanup (xfree, real_path); - } - -- ALL_PSYMTABS (objfile, pst) -+ ALL_PSYMTABS_REQUIRED (objfile, pst) - { - 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) - { - 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) - than the later used TEXTLOW/TEXTHIGH one. */ - - ALL_OBJFILES (objfile) -- if (objfile->psymtabs_addrmap != NULL) -+ { -+ if (objfile->quick_addrmap) -+ { -+ if (!addrmap_find (objfile->quick_addrmap, pc)) -+ continue; -+ } -+ if (require_partial_symbols (objfile)->psymtabs_addrmap != NULL) - { - struct partial_symtab *pst; - -@@ -903,6 +914,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section) - return pst; - } - } -+ } - - /* 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) - return psym; - } - -+/* Ensure that the partial symbols for OBJFILE have been loaded. This -+ function always returns its argument, as a convenience. */ -+ -+struct objfile * -+require_partial_symbols (struct objfile *objfile) -+{ -+ if ((objfile->flags & OBJF_SYMTABS_READ) == 0) -+ { -+ objfile->flags |= OBJF_SYMTABS_READ; -+ -+ if (objfile->sf->sym_read_psymbols) -+ (*objfile->sf->sym_read_psymbols) (objfile); -+ } -+ return objfile; -+} -+ - /* 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; - struct symbol *returnval; - -+ if(strncmp(name, "::", 2) == 0){/* this must be a global name */ -+ name = name+2; -+ block = NULL; -+ } -+ - 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, - modified_name = demangled_name; - needtofreename = 1; - } -+ 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; -+ } -+ } - } - 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)); - -- 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) - { - 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; - - /* Check if either no block is specified or it's a global block. */ - -- if (static_block == NULL) -+ if (global_block == NULL) - return NULL; - -- while (block != static_block) -+ 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); - if (sym != NULL) - return sym; -- block = BLOCK_SUPERBLOCK (block); -+ -+ block_iterator = BLOCK_SUPERBLOCK (block_iterator); - } - -- /* We've reached the static block 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, - } - - /* Now go through psymtabs. */ -+ require_partial_symbols ((struct objfile *) objfile); - ALL_OBJFILE_PSYMTABS (objfile, ps) - { - if (!ps->readin -@@ -1520,7 +1569,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name, - struct symtab *s; - const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); - -- ALL_PSYMTABS (objfile, ps) -+ 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) - } - } - -- ALL_PSYMTABS (objfile, ps) -+ /* FIXME: .debug_pubnames should be read in. -+ -+ One may also try to the first pass without the require_partial_symbols -+ 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) - } - } - -- ALL_PSYMTABS (objfile, ps) -+ /* FIXME: Something like .debug_pubnames containing also static symbols -+ should be read in. Compiler needs to be taught to generate it first. -+ -+ One may also try to the first pass without the require_partial_symbols -+ call but that would behave nondeterministically. */ -+ ALL_PSYMTABS_REQUIRED (objfile, ps) - { - if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN)) - { -@@ -1894,7 +1952,21 @@ find_main_psymtab (void) - struct partial_symtab *pst; - struct objfile *objfile; - -- ALL_PSYMTABS (objfile, pst) -+ ALL_OBJFILES (objfile) -+ { -+ if ((objfile->flags & OBJF_MAIN) == 0) -+ continue; -+ require_partial_symbols (objfile); -+ ALL_OBJFILE_PSYMTABS (objfile, pst) -+ { -+ if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN)) -+ { -+ return pst; -+ } -+ } -+ } -+ -+ ALL_PSYMTABS_REQUIRED (objfile, pst) - { - if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN)) - { -@@ -3085,7 +3157,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. */ - -- ALL_PSYMTABS (objfile, ps) -+ ALL_PSYMTABS_REQUIRED (objfile, ps) - { - struct partial_symbol **bound, **gbound, **sbound; - int keep_going = 1; -diff --git a/gdb/symtab.h b/gdb/symtab.h -index 8b086f3..6ad6179 100644 ---- a/gdb/symtab.h -+++ b/gdb/symtab.h -@@ -171,9 +171,6 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *); - #define SYMBOL_SECTION(symbol) (symbol)->ginfo.section - #define SYMBOL_OBJ_SECTION(symbol) (symbol)->ginfo.obj_section - --#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol) \ -- (symbol)->ginfo.language_specific.cplus_specific.demangled_name -- - /* 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 - FUNCTIONS_DOMAIN, - - /* All defined types */ -- TYPES_DOMAIN -+ 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 - } - 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'. */ - - LOC_UNRESOLVED, - -@@ -1027,6 +1036,8 @@ extern void clear_pc_function_cache (void); - - /* from symtab.c: */ - -+struct objfile *require_partial_symbols (struct objfile *); -+ - /* 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: -diff --git a/gdb/target.h b/gdb/target.h -index 7f4cd8f..8dcc3d6 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, - ULONGEST pattern_len, - CORE_ADDR *found_addrp); - -+/* Utility functions which can be used by search_memory implementations. */ -+ -+void allocate_pattern_buffer (char **pattern_bufp, char **pattern_buf_end, -+ ULONGEST *pattern_buf_size); -+ -+void increase_pattern_buffer (char **pattern_bufp, char **pattern_buf_end, -+ ULONGEST *pattern_buf_size, int val_bytes); -+ -+int search_memory (CORE_ADDR *start_addr, ULONGEST *search_space_len, -+ const char *pattern_buf, ULONGEST pattern_len, -+ CORE_ADDR *found_addr); -+ -+void put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p); -+ - /* Command logging facility. */ - - #define target_log_command(p) \ -diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog -index e3aaeab..e886869 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 - - * 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. - --# 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" -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 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-power7.exp -@@ -0,0 +1,166 @@ -+# 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. -+ -+# Test PowerPC Power7 instructions disassembly. -+ -+if {![istarget "powerpc*-*-*"]} then { -+ verbose "Skipping PowerPC Power7 instructions disassembly." -+ return -+} -+ -+set testfile "powerpc-power7" -+set srcfile ${testfile}.s -+set objfile ${objdir}/${subdir}/${testfile}.o -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != "" } { -+ untested "PowerPC Power7 instructions disassembly" -+ return -1 -+} -+ -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${objfile} -+ -+ -+# Disassemble the function. -+ -+set test "disass func" -+gdb_test_multiple $test $test { -+ -re "\r\nDump of assembler code for function func:(\r\n.*\r\n)End of assembler dump.\r\n$gdb_prompt $" { -+ set func $expect_out(1,string) -+ pass $test -+ } -+} -+ -+proc func_check {offset instr} { -+ 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] { -+ pass $test -+ } else { -+ fail $test -+ } -+} -+ -+func_check 0x0 "lxvd2x vs3,r4,r5" -+func_check 0x4 "lxvd2ux vs3,r4,r5" -+func_check 0x8 "lxvd2x vs43,r4,r5" -+func_check 0xc "lxvd2ux vs43,r4,r5" -+func_check 0x10 "stxvd2x vs3,r4,r5" -+func_check 0x14 "stxvd2ux vs3,r4,r5" -+func_check 0x18 "stxvd2x vs43,r4,r5" -+func_check 0x1c "stxvd2ux vs43,r4,r5" -+func_check 0x20 "xxmrghd vs3,vs4,vs5" -+func_check 0x24 "xxmrghd vs43,vs44,vs45" -+func_check 0x28 "xxmrgld vs3,vs4,vs5" -+func_check 0x2c "xxmrgld vs43,vs44,vs45" -+func_check 0x30 "xxmrghd vs3,vs4,vs5" -+func_check 0x34 "xxmrghd vs43,vs44,vs45" -+func_check 0x38 "xxmrgld vs3,vs4,vs5" -+func_check 0x3c "xxmrgld vs43,vs44,vs45" -+func_check 0x40 "xxpermdi vs3,vs4,vs5,1" -+func_check 0x44 "xxpermdi vs43,vs44,vs45,1" -+func_check 0x48 "xxpermdi vs3,vs4,vs5,2" -+func_check 0x4c "xxpermdi vs43,vs44,vs45,2" -+func_check 0x50 "xvmovdp vs3,vs4" -+func_check 0x54 "xvmovdp vs43,vs44" -+func_check 0x58 "xvmovdp vs3,vs4" -+func_check 0x5c "xvmovdp vs43,vs44" -+func_check 0x60 "xvcpsgndp vs3,vs4,vs5" -+func_check 0x64 "xvcpsgndp vs43,vs44,vs45" -+func_check 0x68 "wait" -+func_check 0x6c "wait" -+func_check 0x70 "waitrsv" -+func_check 0x74 "waitrsv" -+func_check 0x78 "waitimpl" -+func_check 0x7c "waitimpl" -+func_check 0x80 "doze" -+func_check 0x84 "nap" -+func_check 0x88 "sleep" -+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 0xa0 "cmpb r3,r4,r5" -+func_check 0xa4 "lwzcix r10,r11,r12" -+func_check 0xa8 "dadd f16,f17,f18" -+func_check 0xac "daddq f20,f22,f24" -+func_check 0xb0 "dss 3" -+func_check 0xb4 "dssall" -+func_check 0xb8 "dst r5,r4,1" -+func_check 0xbc "dstt r8,r7,0" -+func_check 0xc0 "dstst r5,r6,3" -+func_check 0xc4 "dststt r4,r5,2" -+func_check 0xc8 "divwe r10,r11,r12" -+func_check 0xcc "divwe. r11,r12,r13" -+func_check 0xd0 "divweo r12,r13,r14" -+func_check 0xd4 "divweo. r13,r14,r15" -+func_check 0xd8 "divweu r10,r11,r12" -+func_check 0xdc "divweu. r11,r12,r13" -+func_check 0xe0 "divweuo r12,r13,r14" -+func_check 0xe4 "divweuo. r13,r14,r15" -+func_check 0xe8 "bpermd r7,r17,r27" -+func_check 0xec "popcntw r10,r20" -+func_check 0xf0 "popcntd r10,r20" -+func_check 0xf4 "ldbrx r20,r21,r22" -+func_check 0xf8 "stdbrx r20,r21,r22" -+func_check 0xfc "lfiwzx f10,0,r10" -+func_check 0x100 "lfiwzx f10,r9,r10" -+func_check 0x104 "fcfids f4,f5" -+func_check 0x108 "fcfids. f4,f5" -+func_check 0x10c "fcfidus f4,f5" -+func_check 0x110 "fcfidus. f4,f5" -+func_check 0x114 "fctiwu f4,f5" -+func_check 0x118 "fctiwu. f4,f5" -+func_check 0x11c "fctiwuz f4,f5" -+func_check 0x120 "fctiwuz. f4,f5" -+func_check 0x124 "fctidu f4,f5" -+func_check 0x128 "fctidu. f4,f5" -+func_check 0x12c "fctiduz f4,f5" -+func_check 0x130 "fctiduz. f4,f5" -+func_check 0x134 "fcfidu f4,f5" -+func_check 0x138 "fcfidu. f4,f5" -+func_check 0x13c "ftdiv cr0,f10,f11" -+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 0x154 "dcffix f10,f12" -+func_check 0x158 "dcffix. f20,f22" -+func_check 0x15c "lbarx r10,r11,r12" -+func_check 0x160 "lbarx r10,r11,r12" -+func_check 0x164 "lbarx r10,r11,r12,1" -+func_check 0x168 "lharx r20,r21,r22" -+func_check 0x16c "lharx r20,r21,r22" -+func_check 0x170 "lharx r20,r21,r22,1" -+func_check 0x174 "stbcx. r10,r11,r12" -+func_check 0x178 "sthcx. r10,r11,r12" -+func_check 0x17c "fre f14,f15" -+func_check 0x180 "fre. f14,f15" -+func_check 0x184 "fres f14,f15" -+func_check 0x188 "fres. f14,f15" -+func_check 0x18c "frsqrte f14,f15" -+func_check 0x190 "frsqrte. f14,f15" -+func_check 0x194 "frsqrtes f14,f15" -+func_check 0x198 "frsqrtes. f14,f15" -+func_check 0x19c "isel r2,r3,r4,28" -diff --git a/gdb/testsuite/gdb.arch/powerpc-power7.s b/gdb/testsuite/gdb.arch/powerpc-power7.s -new file mode 100644 -index 0000000..98b2e79 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-power7.s -@@ -0,0 +1,107 @@ -+ .text -+ .globl func -+func: -+ .long 0x7c642e98 /* 0: lxvd2x vs3,r4,r5 */ -+ .long 0x7c642ed8 /* 4: lxvd2ux vs3,r4,r5 */ -+ .long 0x7d642e99 /* 8: lxvd2x vs43,r4,r5 */ -+ .long 0x7d642ed9 /* c: lxvd2ux vs43,r4,r5 */ -+ .long 0x7c642f98 /* 10: stxvd2x vs3,r4,r5 */ -+ .long 0x7c642fd8 /* 14: stxvd2ux vs3,r4,r5 */ -+ .long 0x7d642f99 /* 18: stxvd2x vs43,r4,r5 */ -+ .long 0x7d642fd9 /* 1c: stxvd2ux vs43,r4,r5 */ -+ .long 0xf0642850 /* 20: xxmrghd vs3,vs4,vs5 */ -+ .long 0xf16c6857 /* 24: xxmrghd vs43,vs44,vs45 */ -+ .long 0xf0642b50 /* 28: xxmrgld vs3,vs4,vs5 */ -+ .long 0xf16c6b57 /* 2c: xxmrgld vs43,vs44,vs45 */ -+ .long 0xf0642850 /* 30: xxmrghd vs3,vs4,vs5 */ -+ .long 0xf16c6857 /* 34: xxmrghd vs43,vs44,vs45 */ -+ .long 0xf0642b50 /* 38: xxmrgld vs3,vs4,vs5 */ -+ .long 0xf16c6b57 /* 3c: xxmrgld vs43,vs44,vs45 */ -+ .long 0xf0642950 /* 40: xxpermdi vs3,vs4,vs5,1 */ -+ .long 0xf16c6957 /* 44: xxpermdi vs43,vs44,vs45,1 */ -+ .long 0xf0642a50 /* 48: xxpermdi vs3,vs4,vs5,2 */ -+ .long 0xf16c6a57 /* 4c: xxpermdi vs43,vs44,vs45,2 */ -+ .long 0xf0642780 /* 50: xvmovdp vs3,vs4 */ -+ .long 0xf16c6787 /* 54: xvmovdp vs43,vs44 */ -+ .long 0xf0642780 /* 58: xvmovdp vs3,vs4 */ -+ .long 0xf16c6787 /* 5c: xvmovdp vs43,vs44 */ -+ .long 0xf0642f80 /* 60: xvcpsgndp vs3,vs4,vs5 */ -+ .long 0xf16c6f87 /* 64: xvcpsgndp vs43,vs44,vs45 */ -+ .long 0x7c00007c /* 68: wait */ -+ .long 0x7c00007c /* 6c: wait */ -+ .long 0x7c20007c /* 70: waitrsv */ -+ .long 0x7c20007c /* 74: waitrsv */ -+ .long 0x7c40007c /* 78: waitimpl */ -+ .long 0x7c40007c /* 7c: waitimpl */ -+ .long 0x4c000324 /* 80: doze */ -+ .long 0x4c000364 /* 84: nap */ -+ .long 0x4c0003a4 /* 88: sleep */ -+ .long 0x4c0003e4 /* 8c: rvwinkle */ -+ .long 0x7c830134 /* 90: prtyw r3,r4 */ -+ .long 0x7dcd0174 /* 94: prtyd r13,r14 */ -+ .long 0x7d5c02a6 /* 98: mfcfar r10 */ -+ .long 0x7d7c03a6 /* 9c: mtcfar r11 */ -+ .long 0x7c832bf8 /* a0: cmpb r3,r4,r5 */ -+ .long 0x7d4b662a /* a4: lwzcix r10,r11,r12 */ -+ .long 0xee119004 /* a8: dadd f16,f17,f18 */ -+ .long 0xfe96c004 /* ac: daddq f20,f22,f24 */ -+ .long 0x7c60066c /* b0: dss 3 */ -+ .long 0x7e00066c /* b4: dssall */ -+ .long 0x7c2522ac /* b8: dst r5,r4,1 */ -+ .long 0x7e083aac /* bc: dstt r8,r7,0 */ -+ .long 0x7c6532ec /* c0: dstst r5,r6,3 */ -+ .long 0x7e442aec /* c4: dststt r4,r5,2 */ -+ .long 0x7d4b6356 /* c8: divwe r10,r11,r12 */ -+ .long 0x7d6c6b57 /* cc: divwe. r11,r12,r13 */ -+ .long 0x7d8d7756 /* d0: divweo r12,r13,r14 */ -+ .long 0x7dae7f57 /* d4: divweo. r13,r14,r15 */ -+ .long 0x7d4b6316 /* d8: divweu r10,r11,r12 */ -+ .long 0x7d6c6b17 /* dc: divweu. r11,r12,r13 */ -+ .long 0x7d8d7716 /* e0: divweuo r12,r13,r14 */ -+ .long 0x7dae7f17 /* e4: divweuo. r13,r14,r15 */ -+ .long 0x7e27d9f8 /* e8: bpermd r7,r17,r27 */ -+ .long 0x7e8a02f4 /* ec: popcntw r10,r20 */ -+ .long 0x7e8a03f4 /* f0: popcntd r10,r20 */ -+ .long 0x7e95b428 /* f4: ldbrx r20,r21,r22 */ -+ .long 0x7e95b528 /* f8: stdbrx r20,r21,r22 */ -+ .long 0x7d4056ee /* fc: lfiwzx f10,0,r10 */ -+ .long 0x7d4956ee /* 100: lfiwzx f10,r9,r10 */ -+ .long 0xec802e9c /* 104: fcfids f4,f5 */ -+ .long 0xec802e9d /* 108: fcfids. f4,f5 */ -+ .long 0xec802f9c /* 10c: fcfidus f4,f5 */ -+ .long 0xec802f9d /* 110: fcfidus. f4,f5 */ -+ .long 0xfc80291c /* 114: fctiwu f4,f5 */ -+ .long 0xfc80291d /* 118: fctiwu. f4,f5 */ -+ .long 0xfc80291e /* 11c: fctiwuz f4,f5 */ -+ .long 0xfc80291f /* 120: fctiwuz. f4,f5 */ -+ .long 0xfc802f5c /* 124: fctidu f4,f5 */ -+ .long 0xfc802f5d /* 128: fctidu. f4,f5 */ -+ .long 0xfc802f5e /* 12c: fctiduz f4,f5 */ -+ .long 0xfc802f5f /* 130: fctiduz. f4,f5 */ -+ .long 0xfc802f9c /* 134: fcfidu f4,f5 */ -+ .long 0xfc802f9d /* 138: fcfidu. f4,f5 */ -+ .long 0xfc0a5900 /* 13c: ftdiv cr0,f10,f11 */ -+ .long 0xff8a5900 /* 140: ftdiv cr7,f10,f11 */ -+ .long 0xfc005140 /* 144: ftsqrt cr0,f10 */ -+ .long 0xff805140 /* 148: ftsqrt cr7,f10 */ -+ .long 0x7e084a2c /* 14c: dcbtt r8,r9 */ -+ .long 0x7e0849ec /* 150: dcbtstt r8,r9 */ -+ .long 0xed406644 /* 154: dcffix f10,f12 */ -+ .long 0xee80b645 /* 158: dcffix. f20,f22 */ -+ .long 0x7d4b6068 /* 15c: lbarx r10,r11,r12 */ -+ .long 0x7d4b6068 /* 160: lbarx r10,r11,r12 */ -+ .long 0x7d4b6069 /* 164: lbarx r10,r11,r12,1 */ -+ .long 0x7e95b0e8 /* 168: lharx r20,r21,r22 */ -+ .long 0x7e95b0e8 /* 16c: lharx r20,r21,r22 */ -+ .long 0x7e95b0e9 /* 170: lharx r20,r21,r22,1 */ -+ .long 0x7d4b656d /* 174: stbcx. r10,r11,r12 */ -+ .long 0x7d4b65ad /* 178: sthcx. r10,r11,r12 */ -+ .long 0xfdc07830 /* 17c: fre f14,f15 */ -+ .long 0xfdc07831 /* 180: fre. f14,f15 */ -+ .long 0xedc07830 /* 184: fres f14,f15 */ -+ .long 0xedc07831 /* 188: fres. f14,f15 */ -+ .long 0xfdc07834 /* 18c: frsqrte f14,f15 */ -+ .long 0xfdc07835 /* 190: frsqrte. f14,f15 */ -+ .long 0xedc07834 /* 194: frsqrtes f14,f15 */ -+ .long 0xedc07835 /* 198: frsqrtes. f14,f15 */ -+ .long 0x7c43271e /* 19c: isel r2,r3,r4,28 */ -diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S b/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S -new file mode 100644 -index 0000000..66f7a39 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S -@@ -0,0 +1,455 @@ -+ .file "x86_64-vla-typedef.c" -+ .section .debug_abbrev,"",@progbits -+.Ldebug_abbrev0: -+ .section .debug_info,"",@progbits -+.Ldebug_info0: -+ .section .debug_line,"",@progbits -+.Ldebug_line0: -+ .text -+.Ltext0: -+.globl foo -+ .type foo, @function -+foo: -+.LFB2: -+ .file 1 "x86_64-vla-typedef.c" -+ .loc 1 22 0 -+ pushq %rbp -+.LCFI0: -+ movq %rsp, %rbp -+.LCFI1: -+ subq $64, %rsp -+.LCFI2: -+ movl %edi, -36(%rbp) -+ .loc 1 22 0 -+ movq %rsp, %rax -+ movq %rax, -48(%rbp) -+ .loc 1 23 0 -+ movl -36(%rbp), %edx -+ movslq %edx,%rax -+ subq $1, %rax -+ movq %rax, -24(%rbp) -+ .loc 1 24 0 -+ movslq %edx,%rax -+ addq $15, %rax -+ addq $15, %rax -+ shrq $4, %rax -+ salq $4, %rax -+ subq %rax, %rsp -+ movq %rsp, -56(%rbp) -+ movq -56(%rbp), %rax -+ addq $15, %rax -+ shrq $4, %rax -+ salq $4, %rax -+ movq %rax, -56(%rbp) -+ movq -56(%rbp), %rax -+ movq %rax, -16(%rbp) -+ .loc 1 27 0 -+ movl $0, -4(%rbp) -+ jmp .L2 -+.L3: -+ .loc 1 28 0 -+ movl -4(%rbp), %esi -+ movl -4(%rbp), %eax -+ movl %eax, %ecx -+ movq -16(%rbp), %rdx -+ movslq %esi,%rax -+ movb %cl, (%rdx,%rax) -+ .loc 1 27 0 -+ addl $1, -4(%rbp) -+.L2: -+ movl -4(%rbp), %eax -+ cmpl -36(%rbp), %eax -+ jl .L3 -+ .loc 1 30 0 -+ .globl break_here -+break_here: -+ movq -16(%rbp), %rax -+ movb $0, (%rax) -+ movq -48(%rbp), %rsp -+ .loc 1 31 0 -+ leave -+ ret -+.LFE2: -+ .size foo, .-foo -+ .section .debug_frame,"",@progbits -+.Lframe0: -+ .long .LECIE0-.LSCIE0 -+.LSCIE0: -+ .long 0xffffffff -+ .byte 0x1 -+ .string "" -+ .uleb128 0x1 -+ .sleb128 -8 -+ .byte 0x10 -+ .byte 0xc -+ .uleb128 0x7 -+ .uleb128 0x8 -+ .byte 0x90 -+ .uleb128 0x1 -+ .align 8 -+.LECIE0: -+.LSFDE0: -+ .long .LEFDE0-.LASFDE0 -+.LASFDE0: -+ .long .Lframe0 -+ .quad .LFB2 -+ .quad .LFE2-.LFB2 -+ .byte 0x4 -+ .long .LCFI0-.LFB2 -+ .byte 0xe -+ .uleb128 0x10 -+ .byte 0x86 -+ .uleb128 0x2 -+ .byte 0x4 -+ .long .LCFI1-.LCFI0 -+ .byte 0xd -+ .uleb128 0x6 -+ .align 8 -+.LEFDE0: -+ .section .eh_frame,"a",@progbits -+.Lframe1: -+ .long .LECIE1-.LSCIE1 -+.LSCIE1: -+ .long 0x0 -+ .byte 0x1 -+ .string "zR" -+ .uleb128 0x1 -+ .sleb128 -8 -+ .byte 0x10 -+ .uleb128 0x1 -+ .byte 0x3 -+ .byte 0xc -+ .uleb128 0x7 -+ .uleb128 0x8 -+ .byte 0x90 -+ .uleb128 0x1 -+ .align 8 -+.LECIE1: -+.LSFDE1: -+ .long .LEFDE1-.LASFDE1 -+.LASFDE1: -+ .long .LASFDE1-.Lframe1 -+ .long .LFB2 -+ .long .LFE2-.LFB2 -+ .uleb128 0x0 -+ .byte 0x4 -+ .long .LCFI0-.LFB2 -+ .byte 0xe -+ .uleb128 0x10 -+ .byte 0x86 -+ .uleb128 0x2 -+ .byte 0x4 -+ .long .LCFI1-.LCFI0 -+ .byte 0xd -+ .uleb128 0x6 -+ .align 8 -+.LEFDE1: -+ .text -+.Letext0: -+ .section .debug_loc,"",@progbits -+.Ldebug_loc0: -+.LLST0: -+ .quad .LFB2-.Ltext0 -+ .quad .LCFI0-.Ltext0 -+ .value 0x2 -+ .byte 0x77 -+ .sleb128 8 -+ .quad .LCFI0-.Ltext0 -+ .quad .LCFI1-.Ltext0 -+ .value 0x2 -+ .byte 0x77 -+ .sleb128 16 -+ .quad .LCFI1-.Ltext0 -+ .quad .LFE2-.Ltext0 -+ .value 0x2 -+ .byte 0x76 -+ .sleb128 16 -+ .quad 0x0 -+ .quad 0x0 -+ .section .debug_info -+ .long .Ldebug_end - .Ldebug_start -+.Ldebug_start: -+ .value 0x2 -+ .long .Ldebug_abbrev0 -+ .byte 0x8 -+ .uleb128 0x1 -+ .long .LASF2 -+ .byte 0x1 -+ .long .LASF3 -+ .long .LASF4 -+ .quad .Ltext0 -+ .quad .Letext0 -+ .long .Ldebug_line0 -+ .uleb128 0x2 -+ .byte 0x1 -+ .string "foo" -+ .byte 0x1 -+ .byte 0x16 -+ .byte 0x1 -+ .quad .LFB2 -+ .quad .LFE2 -+ .long .LLST0 -+ .long 0x83 -+ .uleb128 0x3 -+ .long .LASF5 -+ .byte 0x1 -+ .byte 0x15 -+ .long 0x83 -+ .byte 0x2 -+ .byte 0x91 -+ .sleb128 -52 -+.Ltag_typedef: -+ .uleb128 0x4 -+ .long .LASF6 -+ .byte 0x1 -+ .byte 0x17 -+ .long .Ltag_array_type - .debug_info -+ .uleb128 0x5 /* Abbrev Number: 5 (DW_TAG_variable) */ -+ .long .LASF0 -+ .byte 0x1 -+ .byte 0x18 -+#if 1 -+ .long .Ltag_typedef - .debug_info -+#else -+ /* Debugging only: Skip the typedef indirection. */ -+ .long .Ltag_array_type - .debug_info -+#endif -+ /* DW_AT_location: DW_FORM_block1: start */ -+ .byte 0x3 -+ .byte 0x91 -+ .sleb128 -32 -+#if 0 -+ .byte 0x6 /* DW_OP_deref */ -+#else -+ .byte 0x96 /* DW_OP_nop */ -+#endif -+ /* DW_AT_location: DW_FORM_block1: end */ -+ .uleb128 0x6 -+ .string "i" -+ .byte 0x1 -+ .byte 0x19 -+ .long 0x83 -+ .byte 0x2 -+ .byte 0x91 -+ .sleb128 -20 -+ .byte 0x0 -+ .uleb128 0x7 -+ .byte 0x4 -+ .byte 0x5 -+ .string "int" -+.Ltag_array_type: -+ .uleb128 0x8 /* Abbrev Number: 8 (DW_TAG_array_type) */ -+ .long 0xa0 + (2f - 1f) /* DW_AT_type: DW_FORM_ref4 */ -+ .long 0x9d + (2f - 1f) /* DW_AT_sibling: DW_FORM_ref4 */ -+1: /* DW_AT_data_location: DW_FORM_block1: start */ -+ .byte 2f - 3f /* length */ -+3: -+ .byte 0x97 /* DW_OP_push_object_address */ -+ .byte 0x6 /* DW_OP_deref */ -+2: /* DW_AT_data_location: DW_FORM_block1: end */ -+ .uleb128 0x9 -+ .long 0x9d + (2b - 1b) /* DW_AT_type: DW_FORM_ref4 */ -+ .byte 0x3 -+ .byte 0x91 -+ .sleb128 -40 -+ .byte 0x6 -+ .byte 0x0 -+ .uleb128 0xa -+ .byte 0x8 -+ .byte 0x7 -+ .uleb128 0xb -+ .byte 0x1 -+ .byte 0x6 -+ .long .LASF1 -+ .byte 0x0 -+.Ldebug_end: -+ .section .debug_abbrev -+ .uleb128 0x1 -+ .uleb128 0x11 -+ .byte 0x1 -+ .uleb128 0x25 -+ .uleb128 0xe -+ .uleb128 0x13 -+ .uleb128 0xb -+ .uleb128 0x3 -+ .uleb128 0xe -+ .uleb128 0x1b -+ .uleb128 0xe -+ .uleb128 0x11 -+ .uleb128 0x1 -+ .uleb128 0x12 -+ .uleb128 0x1 -+ .uleb128 0x10 -+ .uleb128 0x6 -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x2 -+ .uleb128 0x2e -+ .byte 0x1 -+ .uleb128 0x3f -+ .uleb128 0xc -+ .uleb128 0x3 -+ .uleb128 0x8 -+ .uleb128 0x3a -+ .uleb128 0xb -+ .uleb128 0x3b -+ .uleb128 0xb -+ .uleb128 0x27 -+ .uleb128 0xc -+ .uleb128 0x11 -+ .uleb128 0x1 -+ .uleb128 0x12 -+ .uleb128 0x1 -+ .uleb128 0x40 -+ .uleb128 0x6 -+ .uleb128 0x1 -+ .uleb128 0x13 -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x3 -+ .uleb128 0x5 -+ .byte 0x0 -+ .uleb128 0x3 -+ .uleb128 0xe -+ .uleb128 0x3a -+ .uleb128 0xb -+ .uleb128 0x3b -+ .uleb128 0xb -+ .uleb128 0x49 -+ .uleb128 0x13 -+ .uleb128 0x2 -+ .uleb128 0xa -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x4 -+ .uleb128 0x16 -+ .byte 0x0 -+ .uleb128 0x3 -+ .uleb128 0xe -+ .uleb128 0x3a -+ .uleb128 0xb -+ .uleb128 0x3b -+ .uleb128 0xb -+ .uleb128 0x49 -+ .uleb128 0x13 -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x5 -+ .uleb128 0x34 -+ .byte 0x0 -+ .uleb128 0x3 -+ .uleb128 0xe -+ .uleb128 0x3a -+ .uleb128 0xb -+ .uleb128 0x3b -+ .uleb128 0xb -+ .uleb128 0x49 -+ .uleb128 0x13 -+ .uleb128 0x2 -+ .uleb128 0xa -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x6 -+ .uleb128 0x34 -+ .byte 0x0 -+ .uleb128 0x3 -+ .uleb128 0x8 -+ .uleb128 0x3a -+ .uleb128 0xb -+ .uleb128 0x3b -+ .uleb128 0xb -+ .uleb128 0x49 -+ .uleb128 0x13 -+ .uleb128 0x2 -+ .uleb128 0xa -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x7 -+ .uleb128 0x24 -+ .byte 0x0 -+ .uleb128 0xb -+ .uleb128 0xb -+ .uleb128 0x3e -+ .uleb128 0xb -+ .uleb128 0x3 -+ .uleb128 0x8 -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x8 /* Abbrev Number: 8 (DW_TAG_array_type) */ -+ .uleb128 0x1 -+ .byte 0x1 -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x1 /* DW_AT_sibling */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x50 /* DW_AT_data_location */ -+ .uleb128 0xa /* DW_FORM_block1 */ -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0x9 -+ .uleb128 0x21 -+ .byte 0x0 -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x2f -+ .uleb128 0xa -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0xa -+ .uleb128 0x24 -+ .byte 0x0 -+ .uleb128 0xb -+ .uleb128 0xb -+ .uleb128 0x3e -+ .uleb128 0xb -+ .byte 0x0 -+ .byte 0x0 -+ .uleb128 0xb -+ .uleb128 0x24 -+ .byte 0x0 -+ .uleb128 0xb -+ .uleb128 0xb -+ .uleb128 0x3e -+ .uleb128 0xb -+ .uleb128 0x3 -+ .uleb128 0xe -+ .byte 0x0 -+ .byte 0x0 -+ .byte 0x0 -+ .section .debug_pubnames,"",@progbits -+ .long 0x16 -+ .value 0x2 -+ .long .Ldebug_info0 -+ .long 0xa8 -+ .long 0x2d -+ .string "foo" -+ .long 0x0 -+ .section .debug_aranges,"",@progbits -+ .long 0x2c -+ .value 0x2 -+ .long .Ldebug_info0 -+ .byte 0x8 -+ .byte 0x0 -+ .value 0x0 -+ .value 0x0 -+ .quad .Ltext0 -+ .quad .Letext0-.Ltext0 -+ .quad 0x0 -+ .quad 0x0 -+ .section .debug_str,"MS",@progbits,1 -+.LASF0: -+ .string "array" -+.LASF5: -+ .string "size" -+.LASF3: -+ .string "x86_64-vla-typedef.c" -+.LASF6: -+ .string "array_t" -+.LASF1: -+ .string "char" -+.LASF4: -+ .string "gdb.arch" -+.LASF2: -+ .string "GNU C 4.3.2 20081105 (Red Hat 4.3.2-7)" -+ .ident "GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7)" -+ .section .note.GNU-stack,"",@progbits -diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef.c b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.c +- TYPE_LENGTH (result_type) = +- TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); + TYPE_NFIELDS (result_type) = 1; + TYPE_FIELDS (result_type) = + (struct field *) TYPE_ZALLOC (result_type, sizeof (struct field)); + TYPE_INDEX_TYPE (result_type) = range_type; + TYPE_VPTR_FIELDNO (result_type) = -1; + +- /* TYPE_FLAG_TARGET_STUB will take care of zero length arrays */ ++ /* DWARF blocks may depend on runtime information like ++ DW_OP_PUSH_OBJECT_ADDRESS not being available during the ++ CREATE_ARRAY_TYPE time. */ ++ if (TYPE_RANGE_BOUND_IS_DWARF_BLOCK (range_type, 0) ++ || TYPE_RANGE_BOUND_IS_DWARF_BLOCK (range_type, 1) ++ || TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (range_type) ++ || TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (range_type) ++ || get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) ++ { ++ low_bound = 0; ++ high_bound = -1; ++ } ++ ++ /* Be careful when setting the array length. Ada arrays can be ++ empty arrays with the high_bound being smaller than the low_bound. ++ In such cases, the array length should be zero. TYPE_TARGET_STUB needs to ++ be checked as it may have dependencies on DWARF blocks depending on ++ runtime information not available during the CREATE_ARRAY_TYPE time. */ ++ if (high_bound < low_bound || TYPE_TARGET_STUB (element_type)) ++ TYPE_LENGTH (result_type) = 0; ++ else ++ { ++ CHECK_TYPEDEF (element_type); ++ TYPE_LENGTH (result_type) = ++ TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); ++ } ++ + if (TYPE_LENGTH (result_type) == 0) +- TYPE_TARGET_STUB (result_type) = 1; ++ { ++ /* The real size will be computed for specific instances by ++ CHECK_TYPEDEF. */ ++ TYPE_TARGET_STUB (result_type) = 1; ++ } + + return result_type; + } +@@ -1331,6 +1405,84 @@ stub_noname_complaint (void) + complaint (&symfile_complaints, _("stub type has NULL name")); + } + ++/* Calculate the memory length of array TYPE. ++ ++ TARGET_TYPE should be set to `check_typedef (TYPE_TARGET_TYPE (type))' as ++ a performance hint. Feel free to pass NULL. Set FULL_SPAN to return the ++ size incl. the possible padding of the last element - it may differ from the ++ cleared FULL_SPAN return value (the expected SIZEOF) for non-zero ++ TYPE_BYTE_STRIDE values. */ ++ ++static CORE_ADDR ++type_length_get (struct type *type, struct type *target_type, int full_span) ++{ ++ struct type *range_type; ++ int count; ++ CORE_ADDR byte_stride = 0; /* `= 0' for a false GCC warning. */ ++ CORE_ADDR element_size; ++ ++ if (TYPE_CODE (type) != TYPE_CODE_ARRAY ++ && TYPE_CODE (type) != TYPE_CODE_STRING) ++ return TYPE_LENGTH (type); ++ ++ /* Avoid executing TYPE_HIGH_BOUND for invalid (unallocated/unassociated) ++ Fortran arrays. The allocated data will never be used so they can be ++ zero-length. */ ++ if (object_address_data_not_valid (type)) ++ return 0; ++ ++ range_type = TYPE_INDEX_TYPE (type); ++ if (TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (range_type) ++ || TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (range_type)) ++ return 0; ++ count = TYPE_HIGH_BOUND (range_type) - TYPE_LOW_BOUND (range_type) + 1; ++ /* It may happen for wrong DWARF annotations returning garbage data. */ ++ if (count < 0) ++ warning (_("Range for type %s has invalid bounds %d..%d"), ++ TYPE_NAME (type), TYPE_LOW_BOUND (range_type), ++ TYPE_HIGH_BOUND (range_type)); ++ /* The code below does not handle count == 0 right. */ ++ if (count <= 0) ++ return 0; ++ if (full_span || count > 1) ++ { ++ /* We do not use TYPE_ARRAY_BYTE_STRIDE_VALUE (type) here as we want to ++ force FULL_SPAN to 1. */ ++ byte_stride = TYPE_BYTE_STRIDE (range_type); ++ if (byte_stride == 0) ++ { ++ if (target_type == NULL) ++ target_type = check_typedef (TYPE_TARGET_TYPE (type)); ++ byte_stride = type_length_get (target_type, NULL, 1); ++ } ++ } ++ if (full_span) ++ return count * byte_stride; ++ if (target_type == NULL) ++ target_type = check_typedef (TYPE_TARGET_TYPE (type)); ++ element_size = type_length_get (target_type, NULL, 1); ++ return (count - 1) * byte_stride + element_size; ++} ++ ++/* Prepare TYPE after being read in by the backend. Currently this function ++ only propagates the TYPE_DYNAMIC flag. */ ++ ++void ++finalize_type (struct type *type) ++{ ++ int i; ++ ++ for (i = 0; i < TYPE_NFIELDS (type); ++i) ++ if (TYPE_FIELD_TYPE (type, i) && TYPE_DYNAMIC (TYPE_FIELD_TYPE (type, i))) ++ break; ++ ++ /* FIXME: cplus_stuff is ignored here. */ ++ if (i < TYPE_NFIELDS (type) ++ || (TYPE_VPTR_BASETYPE (type) && TYPE_DYNAMIC (TYPE_VPTR_BASETYPE (type))) ++ || (TYPE_TARGET_TYPE (type) && TYPE_DYNAMIC (TYPE_TARGET_TYPE (type)))) ++ TYPE_DYNAMIC (type) = 1; ++} ++ + /* 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 +@@ -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 +- typedefs does not. */ ++ typedefs does not. Still original passed TYPE will have TYPE_LENGTH ++ updated. FIXME: Remove this dependency (only ada_to_fixed_type?). */ + + struct type * + check_typedef (struct type *type) +@@ -1457,34 +1610,37 @@ check_typedef (struct type *type) + } + } + +- if (TYPE_TARGET_STUB (type)) ++ /* copy_type_recursive automatically makes the resulting type containing only ++ constant values expected by the callers of this function. */ ++ if (TYPE_DYNAMIC (type)) ++ { ++ htab_t copied_types; ++ struct type *type_old = type; ++ ++ copied_types = create_copied_types_hash (NULL); ++ type = copy_type_recursive (type, copied_types); ++ htab_delete (copied_types); ++ ++ gdb_assert (TYPE_DYNAMIC (type) == 0); ++ } ++ ++ if (!currently_reading_symtab ++ && (TYPE_TARGET_STUB (type) || TYPE_DYNAMIC (type))) + { +- struct type *range_type; + struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type)); + ++ if (TYPE_DYNAMIC (type)) ++ TYPE_TARGET_TYPE (type) = target_type; + if (TYPE_STUB (target_type) || TYPE_TARGET_STUB (target_type)) + { + /* Empty. */ + } + else if (TYPE_CODE (type) == TYPE_CODE_ARRAY +- && TYPE_NFIELDS (type) == 1 +- && (TYPE_CODE (range_type = TYPE_INDEX_TYPE (type)) +- == TYPE_CODE_RANGE)) ++ || TYPE_CODE (type) == TYPE_CODE_STRING) + { + /* Now recompute the length of the array type, based on its +- number of elements and the target type's length. +- Watch out for Ada null Ada arrays where the high bound +- is smaller than the low bound. */ +- const int low_bound = TYPE_LOW_BOUND (range_type); +- const int high_bound = TYPE_HIGH_BOUND (range_type); +- int nb_elements; +- +- if (high_bound < low_bound) +- nb_elements = 0; +- else +- nb_elements = high_bound - low_bound + 1; +- +- TYPE_LENGTH (type) = nb_elements * TYPE_LENGTH (target_type); ++ number of elements and the target type's length. */ ++ TYPE_LENGTH (type) = type_length_get (type, target_type, 0); + TYPE_TARGET_STUB (type) = 0; + } + else if (TYPE_CODE (type) == TYPE_CODE_RANGE) +@@ -1492,9 +1648,12 @@ check_typedef (struct type *type) + TYPE_LENGTH (type) = TYPE_LENGTH (target_type); + TYPE_TARGET_STUB (type) = 0; + } ++ TYPE_DYNAMIC (type) = 0; + } ++ + /* Cache TYPE_LENGTH for future use. */ + TYPE_LENGTH (orig_type) = TYPE_LENGTH (type); ++ + return type; + } + +@@ -1716,7 +1875,7 @@ init_type (enum type_code code, int length, int flags, + { + struct type *type; + +- type = alloc_type (objfile); ++ type = alloc_type (objfile, NULL); + TYPE_CODE (type) = code; + TYPE_LENGTH (type) = length; + +@@ -1760,6 +1919,10 @@ init_type (enum type_code code, int length, int flags, + { + INIT_CPLUS_SPECIFIC (type); + } ++ ++ if (!objfile) ++ type_incref (type); ++ + return type; + } + +@@ -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 +- types without duplicates. We use OBJFILE's obstack, because +- OBJFILE is about to be deleted. */ ++ types without duplicates. */ + + htab_t + create_copied_types_hash (struct objfile *objfile) + { +- return htab_create_alloc_ex (1, type_pair_hash, type_pair_eq, +- NULL, &objfile->objfile_obstack, +- hashtab_obstack_allocate, +- dummy_obstack_deallocate); ++ if (objfile == NULL) ++ { ++ /* NULL OBJFILE is for TYPE_DYNAMIC types already contained in ++ OBJFILE_MALLOC memory, such as those from VALUE_HISTORY_CHAIN. Table ++ element entries get allocated by xmalloc - so use xfree. */ ++ return htab_create (1, type_pair_hash, type_pair_eq, xfree); ++ } ++ else ++ { ++ /* Use OBJFILE's obstack, because OBJFILE is about to be deleted. Table ++ element entries get allocated by xmalloc - so use xfree. */ ++ return htab_create_alloc_ex (1, type_pair_hash, type_pair_eq, ++ xfree, &objfile->objfile_obstack, ++ hashtab_obstack_allocate, ++ dummy_obstack_deallocate); ++ } + } + +-/* Recursively copy (deep copy) TYPE, if it is associated with +- 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. OBJFILE is used ++ only for an assertion checking. */ + +-struct type * +-copy_type_recursive (struct objfile *objfile, +- struct type *type, +- htab_t copied_types) ++static struct type * ++copy_type_recursive_1 (struct objfile *objfile, ++ struct type *type, ++ htab_t copied_types) + { + struct type_pair *stored, pair; + void **slot; + struct type *new_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; +@@ -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. */ +- stored = obstack_alloc (&objfile->objfile_obstack, sizeof (struct type_pair)); ++ we encounter this type again during a recursive call below. Memory could ++ be allocated from OBJFILE in the case we will be removing OBJFILE, this ++ optimization is missed and xfree is called for it from COPIED_TYPES. */ ++ stored = xmalloc (sizeof (*stored)); + stored->old = type; + stored->new = new_type; + *slot = stored; +@@ -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; ++ TYPE_VPTR_BASETYPE (new_type) = NULL; ++ TYPE_NFIELDS (new_type) = 0; ++ TYPE_FIELDS (new_type) = NULL; ++ + if (TYPE_NAME (type)) + TYPE_NAME (new_type) = xstrdup (TYPE_NAME (type)); + if (TYPE_TAG_NAME (type)) +@@ -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); + ++ if (TYPE_ALLOCATED (new_type)) ++ { ++ gdb_assert (!TYPE_NOT_ALLOCATED (new_type)); ++ ++ if (!dwarf_locexpr_baton_eval (TYPE_ALLOCATED (new_type))) ++ TYPE_NOT_ALLOCATED (new_type) = 1; ++ TYPE_ALLOCATED (new_type) = NULL; ++ } ++ ++ if (TYPE_ASSOCIATED (new_type)) ++ { ++ gdb_assert (!TYPE_NOT_ASSOCIATED (new_type)); ++ ++ if (!dwarf_locexpr_baton_eval (TYPE_ASSOCIATED (new_type))) ++ TYPE_NOT_ASSOCIATED (new_type) = 1; ++ TYPE_ASSOCIATED (new_type) = NULL; ++ } ++ ++ if (!TYPE_DATA_LOCATION_IS_ADDR (new_type) ++ && TYPE_DATA_LOCATION_DWARF_BLOCK (new_type)) ++ { ++ if (TYPE_NOT_ALLOCATED (new_type) ++ || TYPE_NOT_ASSOCIATED (new_type)) ++ TYPE_DATA_LOCATION_DWARF_BLOCK (new_type) = NULL; ++ else ++ { ++ TYPE_DATA_LOCATION_IS_ADDR (new_type) = 1; ++ TYPE_DATA_LOCATION_ADDR (new_type) = dwarf_locexpr_baton_eval ++ (TYPE_DATA_LOCATION_DWARF_BLOCK (new_type)); ++ } ++ } ++ + /* Copy the fields. */ + if (TYPE_NFIELDS (type)) + { + int i, nfields; + + nfields = TYPE_NFIELDS (type); ++ TYPE_NFIELDS (new_type) = nfields; + TYPE_FIELDS (new_type) = XCALLOC (nfields, struct field); + for (i = 0; i < nfields; i++) + { +@@ -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); + if (TYPE_FIELD_NAME (type, i)) + TYPE_FIELD_NAME (new_type, i) = + xstrdup (TYPE_FIELD_NAME (type, i)); +@@ -2915,6 +3135,16 @@ copy_type_recursive (struct objfile *objfile, + xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type, + i))); + break; ++ case FIELD_LOC_KIND_DWARF_BLOCK: ++ /* `struct dwarf2_locexpr_baton' is too bound to its objfile so ++ it is expected to be made constant by CHECK_TYPEDEF. */ ++ if (TYPE_NOT_ALLOCATED (new_type) ++ || TYPE_NOT_ASSOCIATED (new_type)) ++ SET_FIELD_DWARF_BLOCK (TYPE_FIELD (new_type, i), NULL); ++ else ++ SET_FIELD_BITPOS (TYPE_FIELD (new_type, i), ++ dwarf_locexpr_baton_eval (TYPE_FIELD_DWARF_BLOCK (type, i))); ++ break; + default: + internal_error (__FILE__, __LINE__, + _("Unexpected type field location kind: %d"), +@@ -2923,17 +3153,30 @@ copy_type_recursive (struct objfile *objfile, + } + } + ++ /* Convert TYPE_RANGE_HIGH_BOUND_IS_COUNT into a regular bound. */ ++ if (TYPE_CODE (type) == TYPE_CODE_RANGE ++ && TYPE_RANGE_HIGH_BOUND_IS_COUNT (type)) ++ { ++ TYPE_RANGE_HIGH_BOUND_IS_COUNT (new_type) = 0; ++ TYPE_HIGH_BOUND (new_type) = TYPE_LOW_BOUND (type) ++ + TYPE_HIGH_BOUND (type) - 1; ++ } ++ ++ /* Both FIELD_LOC_KIND_DWARF_BLOCK and TYPE_RANGE_HIGH_BOUND_IS_COUNT were ++ possibly converted. */ ++ TYPE_DYNAMIC (new_type) = 0; ++ + /* Copy pointers to other types. */ + if (TYPE_TARGET_TYPE (type)) + TYPE_TARGET_TYPE (new_type) = +- copy_type_recursive (objfile, +- TYPE_TARGET_TYPE (type), +- copied_types); ++ copy_type_recursive_1 (objfile, ++ TYPE_TARGET_TYPE (type), ++ copied_types); + if (TYPE_VPTR_BASETYPE (type)) + TYPE_VPTR_BASETYPE (new_type) = +- copy_type_recursive (objfile, +- TYPE_VPTR_BASETYPE (type), +- copied_types); ++ copy_type_recursive_1 (objfile, ++ TYPE_VPTR_BASETYPE (type), ++ copied_types); + /* Maybe copy the type_specific bits. + + NOTE drow/2005-12-09: We do not copy the C++-specific bits like +@@ -2951,6 +3194,17 @@ copy_type_recursive (struct objfile *objfile, + return new_type; + } + ++/* Recursively copy (deep copy) TYPE. 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. */ ++ ++struct type * ++copy_type_recursive (struct type *type, ++ htab_t copied_types) ++{ ++ 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. + +@@ -2973,6 +3227,219 @@ copy_type (const struct type *type) + return new_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 type *type) ++{ ++ int i; ++ ++ gdb_assert (TYPE_DISCARDABLE (type)); ++ gdb_assert (TYPE_OBJFILE (type) == NULL); ++ ++ xfree (TYPE_NAME (type)); ++ xfree (TYPE_TAG_NAME (type)); ++ ++ for (i = 0; i < TYPE_NFIELDS (type); ++i) ++ { ++ xfree (TYPE_FIELD_NAME (type, i)); ++ ++ if (TYPE_FIELD_LOC_KIND (type, i) == FIELD_LOC_KIND_PHYSNAME) ++ xfree (TYPE_FIELD_STATIC_PHYSNAME (type, i)); ++ } ++ xfree (TYPE_FIELDS (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)); ++} ++ ++/* 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_chain (struct type *type) ++{ ++ struct type *type_iter, *type_iter_to_free; ++ ++ 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); ++} ++ ++/* Hash function for type_discardable_table. */ ++ ++static hashval_t ++type_discardable_hash (const void *p) ++{ ++ const struct type *type = p; ++ ++ return htab_hash_pointer (TYPE_MAIN_TYPE (type)); ++} ++ ++/* Equality function for type_discardable_table. */ ++ ++static int ++type_discardable_equal (const void *a, const void *b) ++{ ++ const struct type *left = a; ++ const struct type *right = b; ++ ++ return TYPE_MAIN_TYPE (left) == TYPE_MAIN_TYPE (right); ++} ++ ++/* A helper for type_mark_used. */ ++ ++static int ++type_mark_used_crawl (struct type *type, void *unused) ++{ ++ if (!TYPE_DISCARDABLE (type)) ++ return 0; ++ ++ if (TYPE_DISCARDABLE_AGE (type) == type_discardable_age_current) ++ return 0; ++ ++ TYPE_DISCARDABLE_AGE (type) = type_discardable_age_current; ++ ++ /* Continue the traversal. */ ++ return 1; ++} ++ ++/* Mark TYPE and its connected types as used in this free_all_types pass. */ ++ ++void ++type_mark_used (struct type *type) ++{ ++ if (type == NULL) ++ return; ++ ++ if (!TYPE_DISCARDABLE (type)) ++ return; ++ ++ main_type_crawl (type, type_mark_used_crawl, NULL); ++} ++ ++/* A traverse callback for type_discardable_table which removes any ++ type_discardable whose reference count is now zero (unused link). */ ++ ++static int ++type_discardable_remove (void **slot, void *unused) ++{ ++ struct type *type = *slot; ++ ++ gdb_assert (TYPE_DISCARDABLE (type)); ++ ++ if (TYPE_DISCARDABLE_AGE (type) != type_discardable_age_current) ++ { ++ delete_type_chain (type); ++ ++ htab_clear_slot (type_discardable_table, slot); ++ } ++ ++ return 1; ++} ++ ++/* Free all the reclaimable types that have been allocated and that have ++ currently zero reference counter. ++ ++ 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) ++{ ++ /* 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); ++} ++ ++/* 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) ++{ ++} + + /* Helper functions to initialize architecture-specific types. */ + +@@ -3463,6 +3930,11 @@ void + _initialize_gdbtypes (void) + { + gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init); ++ ++ 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, _("\ +diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h +index be6ed55..cf8c4d8 100644 +--- a/gdb/gdbtypes.h ++++ b/gdb/gdbtypes.h +@@ -213,6 +213,11 @@ enum type_instance_flag_value + + #define TYPE_TARGET_STUB(t) (TYPE_MAIN_TYPE (t)->flag_target_stub) + ++/* Type needs to be evaluated on each CHECK_TYPEDEF and its results must not be ++ sticky. */ ++ ++#define TYPE_DYNAMIC(t) (TYPE_MAIN_TYPE (t)->flag_dynamic) ++ + /* Static type. If this is set, the corresponding type had + * a static modifier. + * Note: This may be unnecessary, since static data members +@@ -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) \ ++ (TYPE_MAIN_TYPE (range_type)->flag_range_high_bound_is_count) ++ ++/* Not allocated. TYPE_ALLOCATED(t) must be NULL in such case. If this flag ++ is unset and TYPE_ALLOCATED(t) is NULL then the type is allocated. If this ++ flag is unset and TYPE_ALLOCATED(t) is not NULL then its DWARF block ++ determines the actual allocation state. */ ++ ++#define TYPE_NOT_ALLOCATED(t) (TYPE_MAIN_TYPE (t)->flag_not_allocated) ++ ++/* Not associated. TYPE_ASSOCIATED(t) must be NULL in such case. If this flag ++ is unset and TYPE_ASSOCIATED(t) is NULL then the type is associated. If ++ this flag is unset and TYPE_ASSOCIATED(t) is not NULL then its DWARF block ++ determines the actual association state. */ ++ ++#define TYPE_NOT_ASSOCIATED(t) (TYPE_MAIN_TYPE (t)->flag_not_associated) ++ ++/* Address of the actual data as for DW_AT_data_location. Its dwarf block must ++ not be evaluated unless both TYPE_NOT_ALLOCATED and TYPE_NOT_ASSOCIATED are ++ 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_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) \ ++ (TYPE_MAIN_TYPE (t)->flag_data_location_is_addr) ++ + /* Constant type. If this is set, the corresponding type has a + * const modifier. + */ +@@ -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; ++ unsigned int flag_not_associated : 1; ++ unsigned int flag_data_location_is_addr : 1; + + /* Number of fields described for this type. This field appears at + this location because it packs nicely here. */ +@@ -431,6 +485,20 @@ struct main_type + + struct type *target_type; + ++ /* For DW_AT_data_location. */ ++ union ++ { ++ struct dwarf2_locexpr_baton *dwarf_block; ++ CORE_ADDR addr; ++ } ++ data_location; ++ ++ /* For DW_AT_allocated. */ ++ struct dwarf2_locexpr_baton *allocated; ++ ++ /* For DW_AT_associated. */ ++ struct dwarf2_locexpr_baton *associated; ++ + /* 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. +@@ -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 +-/* Note that if thistype is a TYPEDEF type, you have to call check_typedef. +- But check_typedef does set the TYPE_LENGTH of the TYPEDEF type, +- so you only have to call check_typedef once. Since allocate_value ++/* Note that if thistype is a TYPEDEF, ARRAY or STRING type, you have to call ++ check_typedef. But check_typedef does set the TYPE_LENGTH of the TYPEDEF ++ 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 + /* 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 ++#define TYPE_DATA_LOCATION_DWARF_BLOCK(thistype) TYPE_MAIN_TYPE (thistype)->data_location.dwarf_block ++#define TYPE_DATA_LOCATION_ADDR(thistype) TYPE_MAIN_TYPE (thistype)->data_location.addr ++#define TYPE_ALLOCATED(thistype) TYPE_MAIN_TYPE (thistype)->allocated ++#define TYPE_ASSOCIATED(thistype) TYPE_MAIN_TYPE (thistype)->associated + + #define TYPE_INDEX_TYPE(type) TYPE_FIELD_TYPE (type, 0) + #define TYPE_LOW_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 0) + #define TYPE_HIGH_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 1) +- +-/* Moto-specific stuff for FORTRAN arrays */ +- +-#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ +- (TYPE_FIELD_ARTIFICIAL(TYPE_INDEX_TYPE((arraytype)),1)) ++#define TYPE_BYTE_STRIDE(range_type) TYPE_FIELD_BITPOS (range_type, 2) ++ ++/* Whether we should use TYPE_FIELD_DWARF_BLOCK (and not TYPE_FIELD_BITPOS). */ ++#define TYPE_RANGE_BOUND_IS_DWARF_BLOCK(range_type, fieldno) \ ++ (TYPE_FIELD_LOC_KIND (range_type, fieldno) == FIELD_LOC_KIND_DWARF_BLOCK) ++#define TYPE_RANGE_BOUND_SET_DWARF_BLOCK(range_type, fieldno) \ ++ (TYPE_FIELD_LOC_KIND (range_type, fieldno) = FIELD_LOC_KIND_DWARF_BLOCK) ++#define TYPE_ARRAY_BOUND_IS_DWARF_BLOCK(array_type, fieldno) \ ++ TYPE_RANGE_BOUND_IS_DWARF_BLOCK (TYPE_INDEX_TYPE (array_type), fieldno) ++ ++/* Unbound arrays, such as GCC array[]; at end of struct. */ ++#define TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED(rangetype) \ ++ TYPE_FIELD_ARTIFICIAL((rangetype),0) ++#define TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED(rangetype) \ ++ TYPE_FIELD_ARTIFICIAL((rangetype),1) + #define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \ +- (TYPE_FIELD_ARTIFICIAL(TYPE_INDEX_TYPE((arraytype)),0)) +- +-#define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ +- (TYPE_HIGH_BOUND(TYPE_INDEX_TYPE((arraytype)))) ++ TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (TYPE_INDEX_TYPE (arraytype)) ++#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ ++ TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (TYPE_INDEX_TYPE (arraytype)) + + #define TYPE_ARRAY_LOWER_BOUND_VALUE(arraytype) \ +- (TYPE_LOW_BOUND(TYPE_INDEX_TYPE((arraytype)))) ++ TYPE_LOW_BOUND (TYPE_INDEX_TYPE (arraytype)) ++#define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ ++ TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (arraytype)) ++/* TYPE_BYTE_STRIDE (TYPE_INDEX_TYPE (arraytype)) with a fallback to the ++ element size if no specific stride value is known. */ ++#define TYPE_ARRAY_BYTE_STRIDE_VALUE(arraytype) \ ++ (TYPE_BYTE_STRIDE (TYPE_INDEX_TYPE (arraytype)) == 0 \ ++ ? TYPE_LENGTH (TYPE_TARGET_TYPE (arraytype)) \ ++ : TYPE_BYTE_STRIDE (TYPE_INDEX_TYPE (arraytype))) + + /* C++ */ + +@@ -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 *); + +@@ -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); ++ ++extern int type_range_high_bound_internal (struct type *range_type); ++ ++extern int type_range_count_bound_internal (struct type *range_type); ++ ++extern CORE_ADDR type_range_byte_stride_internal (struct type *range_type, ++ struct type *element_type); ++ ++extern void finalize_type (struct type *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 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); + +-extern struct type *copy_type_recursive (struct objfile *objfile, +- struct type *type, ++extern struct type *copy_type_recursive (struct type *type, + htab_t copied_types); + + 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); ++ + #endif /* GDBTYPES_H */ +diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c +index 0f9d44e..c910e88 100644 +--- a/gdb/gnu-v3-abi.c ++++ b/gdb/gnu-v3-abi.c +@@ -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; +- const char *physname; + + /* Search this class first. */ +- physname = NULL; + if (adjustment == 0) + { + int len; +@@ -590,15 +589,24 @@ gnuv3_print_method_ptr (const gdb_byte *contents, + { + char *demangled_name = cplus_demangle (physname, + DMGL_ANSI | DMGL_PARAMS); +- if (demangled_name != NULL) ++ fprintf_filtered (stream, "&virtual "); ++ if (demangled_name == NULL) ++ fputs_filtered (physname, stream); ++ else + { +- fprintf_filtered (stream, "&virtual "); + fputs_filtered (demangled_name, stream); + xfree (demangled_name); +- return; + } ++ return; + } + } ++ else if (ptr_value != 0) ++ { ++ /* Found a non-virtual function: print out the type. */ ++ fputs_filtered ("(", stream); ++ c_print_type (type, "", stream, -1, 0); ++ fputs_filtered (") ", stream); ++ } + + /* 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@ + +-# 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 6b68e7d..5095180 100644 +--- a/gdb/jv-lang.c ++++ b/gdb/jv-lang.c +@@ -1121,6 +1121,7 @@ const struct exp_descriptor exp_descriptor_java = + { + 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 ba37faa..a8e41d2 100644 +--- a/gdb/language.h ++++ b/gdb/language.h +@@ -237,7 +237,6 @@ struct language_defn + variables. */ + + 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 debe86f..e17a0b6 100644 +--- a/gdb/linespec.c ++++ b/gdb/linespec.c +@@ -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) + { +- p = paren_pointer + 1; ++ /* We need to deal with method and function overloads ++ with no parameters. Gdb and gcc (and who knows about other ++ compilers) are very inconsistent with the keyword "void". ++ Canonicalizing C++ types is insufficient in this case, since ++ we still need to enforce the presence (or lack thereof) of ++ "void". For simplicity, omit the keyword "void" if present. */ ++ if (strncmp (paren_pointer - 5, "(void)", 6) == 0) ++ { ++ char *a, *b; ++ a = paren_pointer - 4; ++ b = paren_pointer; ++ while ((*(a++) = *(b++)) != '\0') ; ++ *a = '\0'; ++ p = paren_pointer - 3; ++ } ++ else ++ p = paren_pointer + 1; + } + else + { + p = skip_quoted (*argptr); + } + ++ /* Make sure we keep important kewords like "const" */ ++ if (strncmp (p, " const", 6) == 0) ++ p += 6; ++ + /* 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; ++ } + } + + /* Allocate our own copy of the substring between argptr and +@@ -1408,6 +1442,7 @@ lookup_prefix_sym (char **argptr, char *p) + { + char *p1; + char *copy; ++ struct symbol *sym; + + /* 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" */ + +- return lookup_symbol (copy, 0, STRUCT_DOMAIN, 0); ++ sym = lookup_symbol (copy, 0, STRUCT_DOMAIN, 0); ++ if (sym == NULL) ++ { ++ /* 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; ++ } ++ } ++ ++ return sym; + } + + /* 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 88c7e5e..2d0b3ca 100644 +--- a/gdb/m2-lang.c ++++ b/gdb/m2-lang.c +@@ -356,6 +356,7 @@ const struct exp_descriptor exp_descriptor_modula2 = + { + 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 8b66f78..ddeab6f 100644 +--- a/gdb/main.c ++++ b/gdb/main.c +@@ -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. */ +@@ -259,6 +260,8 @@ captured_main (void *data) + char *cdarg = NULL; + char *ttyarg = NULL; + ++ int python_script = 0; ++ + /* These are static so that we can take their address in an initializer. */ + static int print_help; + static int print_version; +@@ -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}, ++#if HAVE_PYTHON ++ {"python", no_argument, 0, 'P'}, ++ {"P", no_argument, 0, 'P'}, ++#endif + {0, no_argument, 0, 0} + }; + +- while (1) ++ while (!python_script) + { + int option_index; + +@@ -455,6 +462,9 @@ captured_main (void *data) + case 0: + /* Long option that just sets a flag. */ + break; ++ case 'P': ++ python_script = 1; ++ break; + case OPT_SE: + symarg = optarg; + execarg = optarg; +@@ -631,7 +641,31 @@ extern int gdbtk_test (char *); + use_windows = 0; + } + +- if (set_args) ++ if (python_script) ++ { ++ /* The first argument is a python script to evaluate, and ++ subsequent arguments are passed to the script for ++ processing there. */ ++ if (optind >= argc) ++ { ++ fprintf_unfiltered (gdb_stderr, ++ _("%s: Python script file name required\n"), ++ argv[0]); ++ exit (1); ++ } ++ ++ /* FIXME: should handle inferior I/O intelligently here. ++ E.g., should be possible to run gdb in pipeline and have ++ Python (and gdb) output go to stderr or file; and if a ++ prompt is needed, open the tty. */ ++ quiet = 1; ++ /* FIXME: should read .gdbinit if, and only if, a prompt is ++ requested by the script. Though... maybe this is not ++ ideal? */ ++ /* FIXME: likewise, reading in history. */ ++ inhibit_gdbinit = 1; ++ } ++ else if (set_args) + { + /* The remaining options are the command-line options for the + inferior. The first one is the sym/exec file, and the rest +@@ -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. */ +- init_history (); ++ if (!python_script) ++ init_history (); + + if (batch) + { +@@ -893,13 +928,25 @@ Can't attach to process and specify a core file at the same time.")); + #endif + } + +- /* NOTE: cagney/1999-11-07: There is probably no reason for not +- moving this loop and the code found in captured_command_loop() +- into the command_loop() proper. The main thing holding back that +- change - SET_TOP_LEVEL() - has been eliminated. */ +- while (1) ++#if HAVE_PYTHON ++ if (python_script) + { +- catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL); ++ extern int pagination_enabled; ++ pagination_enabled = 0; ++ run_python_script (argc - optind, &argv[optind]); ++ return 1; ++ } ++ else ++#endif ++ { ++ /* NOTE: cagney/1999-11-07: There is probably no reason for not ++ moving this loop and the code found in captured_command_loop() ++ into the command_loop() proper. The main thing holding back that ++ change - SET_TOP_LEVEL() - has been eliminated. */ ++ while (1) ++ { ++ catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL); ++ } + } + /* No exit -- exit is through quit_command. */ + } +@@ -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\ +- gdb [options] --args executable-file [inferior-arguments ...]\n\n\ ++ gdb [options] --args executable-file [inferior-arguments ...]\n"), stream); ++#if HAVE_PYTHON ++ fputs_unfiltered (_("\ ++ gdb [options] [--python|-P] script-file [script-arguments ...]\n"), stream); ++#endif ++ fputs_unfiltered (_("\n\ + Options:\n\n\ + "), stream); + fputs_unfiltered (_("\ +@@ -969,7 +1021,13 @@ Options:\n\n\ + --nw Do not use a window interface.\n\ + --nx Do not read "), stream); + fputs_unfiltered (gdbinit, stream); +- fputs_unfiltered (_(" file.\n\ ++ fputs_unfiltered (_(" file.\n"), stream); ++#if HAVE_PYTHON ++ fputs_unfiltered (_("\ ++ --python, -P Following argument is Python script file; remaining\n\ ++ arguments are passed to script.\n"), stream); ++#endif ++ fputs_unfiltered (_("\ + --quiet Do not print version number on startup.\n\ + --readnow Fully read symbol files on first access.\n\ + "), stream); +diff --git a/gdb/maint.c b/gdb/maint.c +index ecbae12..80fc36e 100644 +--- a/gdb/maint.c ++++ b/gdb/maint.c +@@ -914,4 +914,12 @@ When enabled GDB is profiled."), + show_maintenance_profile_p, + &maintenance_set_cmdlist, + &maintenance_show_cmdlist); ++ add_setshow_filename_cmd ("gdb_datadir", class_maintenance, ++ &gdb_datadir, _("Set GDB's datadir path."), ++ _("Show GDB's datadir path."), ++ _("\ ++When set, GDB uses the specified path to search for data files."), ++ NULL, NULL, ++ &maintenance_set_cmdlist, ++ &maintenance_show_cmdlist); + } +diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c +index aac82e9..626292c 100644 +--- a/gdb/mdebugread.c ++++ b/gdb/mdebugread.c +@@ -4802,7 +4802,7 @@ new_type (char *name) + { + struct type *t; + +- t = alloc_type (current_objfile); ++ t = alloc_type (current_objfile, NULL); + TYPE_NAME (t) = name; + 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 0cf03d9..89936d2 100644 +--- a/gdb/mi/mi-cmd-var.c ++++ b/gdb/mi/mi-cmd-var.c +@@ -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; + +- 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; + ++ /* 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); ++ + 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); + } + +- 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) ++ if (from < to) + { +- 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) ++ { ++ 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); ++ ++ 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); ++ 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); +@@ -730,6 +751,9 @@ varobj_update_one (struct varobj *var, enum print_values print_values, + } + + do_cleanups (cleanup); ++ ++ ui_out_field_int (uiout, "has_more", ++ VEC_length (varobj_p, children) > to); + } + + if (mi_version (uiout) > 1) +@@ -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 4911146..772566e 100644 +--- a/gdb/mi/mi-cmds.c ++++ b/gdb/mi/mi-cmds.c +@@ -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 afcba1e..79798ef 100644 +--- a/gdb/mi/mi-cmds.h ++++ b/gdb/mi/mi-cmds.h +@@ -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 6aa1d08..448d10a 100644 +--- a/gdb/mi/mi-main.c ++++ b/gdb/mi/mi-main.c +@@ -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"); ++ ++#if HAVE_PYTHON ++ ui_out_field_string (uiout, NULL, "python"); ++#endif + + #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); + + 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 ++++ b/gdb/mipsread.c +@@ -394,6 +394,7 @@ static struct sym_fns ecoff_sym_fns = + mipscoff_new_init, /* sym_new_init: init anything gbl to entire symtab */ + mipscoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */ + mipscoff_symfile_read, /* sym_read: read a symbol file into symtab */ ++ NULL, /* sym_read_psymbols */ + 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/objfiles.c b/gdb/objfiles.c +index c983b11..2ac1bd1 100644 +--- a/gdb/objfiles.c ++++ b/gdb/objfiles.c +@@ -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; + } + } ++ ++ /* Try again, after reading partial symbols. We do this in two ++ passes because objfiles are always added to the head of the list, ++ and there might be a later objfile for which we've already read ++ partial symbols. */ ++ ALL_OBJFILES (ofp) ++ { ++ require_partial_symbols (ofp); ++ if (ofp->psymtabs != NULL) ++ { ++ return 1; ++ } ++ } ++ + 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 1857260..e421232 100644 +--- a/gdb/objfiles.h ++++ b/gdb/objfiles.h +@@ -212,6 +212,11 @@ struct objfile + + struct partial_symtab *psymtabs; + ++ /* An address map that can be used to quickly determine if an ++ address comes from this objfile. This can be NULL. */ ++ ++ struct addrmap *quick_addrmap; ++ + /* Map addresses to the entries of PSYMTABS. It would be more efficient to + have a map per the whole process but ADDRMAP cannot selectively remove + its items during FREE_OBJFILE. This mapping is already present even for +@@ -420,6 +425,15 @@ struct objfile + #define OBJF_KEEPBFD (1 << 4) /* Do not delete bfd */ + + ++/* Set if we have tried to read partial symtabs for this objfile. ++ This is used to allow lazy reading of partial symtabs. */ ++ ++#define OBJF_SYMTABS_READ (1 << 6) ++ ++/* This flag is set for the main objfile. */ ++ ++#define OBJF_MAIN (1 << 7) ++ + /* The object file that the main symbol table was loaded from (e.g. the + argument to the "symbol-file" or "file" command). */ + +@@ -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) + ++/* Like ALL_PSYMTABS, but ensure that partial symbols have been read ++ before examining the objfile. */ ++ ++#define ALL_PSYMTABS_REQUIRED(objfile, p) \ ++ ALL_OBJFILES (objfile) \ ++ ALL_OBJFILE_PSYMTABS (require_partial_symbols (objfile), p) ++ + /* Traverse all minimal symbols in all objfiles. */ + + #define ALL_MSYMBOLS(objfile, m) \ +diff --git a/gdb/parse.c b/gdb/parse.c +index ef938e3..c243bd8 100644 +--- a/gdb/parse.c ++++ b/gdb/parse.c +@@ -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; + ++ case TYPE_INSTANCE: ++ oplen = 4 + longest_to_int (expr->elts[endpos - 2].longconst); ++ args = 1; ++ break; ++ ++ case TYPE_INSTANCE_LOOKUP: ++ oplen = 3; ++ break; ++ + case OP_OBJC_MSGCALL: /* Objective C message (method) call */ + oplen = 4; + args = 1 + longest_to_int (expr->elts[endpos - 2].longconst); +@@ -1355,6 +1365,150 @@ parser_fprintf (FILE *x, const char *y, ...) + va_end (args); + } + ++/* 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) ++{ ++ const union exp_element *const elts = exp->elts; ++ struct type *type = NULL; ++ struct objfile *objfile = NULL; ++ ++ /* Extended operators should have been already handled by exp_descriptor ++ iterate method of its specific language. */ ++ gdb_assert (elts[pos].opcode < OP_EXTENDED0); ++ ++ /* Track the callers of write_exp_elt_type for this table. */ ++ ++ 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; ++ ++ case UNOP_MEMVAL_TLS: ++ objfile = elts[pos + 1].objfile; ++ type = elts[pos + 2].type; ++ break; ++ ++ 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); ++ ++ /* 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; ++} ++ ++/* 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) + { +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 *); + + extern void operator_length_standard (struct expression *, int, int *, int *); + ++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); ++ + extern char *op_name_standard (enum exp_opcode); + + 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 *); + ++ /* 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); ++ + /* 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 5d8b936..49c575d 100644 +--- a/gdb/printcmd.c ++++ b/gdb/printcmd.c +@@ -46,7 +46,6 @@ + #include "exceptions.h" + #include "observer.h" + #include "solist.h" +-#include "solib.h" + #include "parser-defs.h" + #include "charset.h" + +@@ -900,6 +899,11 @@ print_command_1 (char *exp, int inspect, int voidprint) + else + val = access_value_history (0); + ++ /* Do not try to OBJECT_ADDRESS_SET here anything. We are interested in the ++ source variable base addresses as found by READ_VAR_VALUE. The value here ++ can be already a calculated expression address inappropriate for ++ DW_OP_push_object_address. */ ++ + if (voidprint || (val && value_type (val) && + TYPE_CODE (value_type (val)) != TYPE_CODE_VOID)) + { +@@ -1396,6 +1400,22 @@ x_command (char *exp, int from_tty) + set_internalvar (lookup_internalvar ("__"), last_examine_value); + } + } ++ ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ ++ ++static void ++print_types_mark_used (void) ++{ ++ struct display *d; ++ ++ if (last_examine_value) ++ type_mark_used (value_type (last_examine_value)); ++ ++ for (d = display_chain; d; d = d->next) ++ if (d->exp) ++ exp_types_mark_used (d->exp); ++} ++ + + + /* 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); ++ ++ 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 +--- /dev/null ++++ b/gdb/python/lib/gdb/FrameIterator.py +@@ -0,0 +1,33 @@ ++# Iterator over 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 . ++ ++class FrameIterator: ++ """An iterator that iterates over frames.""" ++ ++ def __init__ (self, frame): ++ "Initialize a FrameIterator. FRAME is the starting frame." ++ self.frame = frame ++ ++ def __iter__ (self): ++ return self ++ ++ def next (self): ++ result = self.frame ++ if result is None: ++ 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 +--- /dev/null ++++ b/gdb/python/lib/gdb/__init__.py +@@ -0,0 +1,19 @@ ++# Startup code. ++ ++# 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 . ++ ++# Load the require command by default. ++import gdb.command.require +diff --git a/gdb/python/lib/gdb/backtrace.py b/gdb/python/lib/gdb/backtrace.py +new file mode 100644 +index 0000000..2baab5f +--- /dev/null ++++ b/gdb/python/lib/gdb/backtrace.py +@@ -0,0 +1,42 @@ ++# Filtering backtrace. ++ ++# 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 . ++ ++import gdb ++import itertools ++ ++# Our only exports. ++__all__ = ['push_frame_filter', 'create_frame_filter'] ++ ++frame_filter = None ++ ++def push_frame_filter (constructor): ++ """Register a new backtrace filter class with the 'backtrace' command. ++The filter will be passed an iterator as an argument. The iterator ++will return gdb.Frame-like objects. The filter should in turn act as ++an iterator returning such objects.""" ++ global frame_filter ++ if frame_filter == None: ++ frame_filter = constructor ++ else: ++ frame_filter = lambda iterator: constructor (frame_filter (iterator)) ++ ++def create_frame_filter (iter): ++ global frame_filter ++ if frame_filter is None: ++ return iter ++ return frame_filter (iter) ++ +diff --git a/gdb/python/lib/gdb/command/__init__.py b/gdb/python/lib/gdb/command/__init__.py +new file mode 100644 +index 0000000..8b13789 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/__init__.py +@@ -0,0 +1 @@ ++ +diff --git a/gdb/python/lib/gdb/command/alias.py b/gdb/python/lib/gdb/command/alias.py +new file mode 100644 +index 0000000..96b6618 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/alias.py +@@ -0,0 +1,59 @@ ++# Alias command. ++ ++# 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 . ++ ++import gdb ++ ++class AliasImplementation (gdb.Command): ++ def __init__ (self, name, real, doc): ++ # Have to set __doc__ before the super init call. ++ # It would be nice if gdb's help looked up __doc__ dynamically. ++ self.__doc__ = doc ++ # Note: no good way to complete :( ++ super (AliasImplementation, self).__init__ (name, gdb.COMMAND_NONE) ++ self.real = real ++ ++ def invoke(self, arg, from_tty): ++ gdb.execute (self.real + ' ' + arg, from_tty) ++ ++class AliasCommand (gdb.Command): ++ """Alias one command to another. ++In the simplest form, the first word is the name of the alias, and ++the remaining words are the the expansion. ++An '=' by itself can be used to define a multi-word alias; words ++before the '=' are the name of the new command.""" ++ ++ def __init__ (self): ++ # Completion is not quite right here. ++ super (AliasCommand, self).__init__ ("alias", gdb.COMMAND_NONE, ++ gdb.COMPLETE_COMMAND) ++ ++ def invoke (self, arg, from_tty): ++ self.dont_repeat () ++ # Without some form of quoting we can't alias a multi-word ++ # command to another command. ++ args = arg.split() ++ try: ++ start = args.index ('=') ++ end = start + 1 ++ except ValueError: ++ start = 1 ++ end = 1 ++ target = " ".join(args[end:]) ++ AliasImplementation (" ".join (args[0:start]), target, ++ "This command is an alias for '%s'." % target) ++ ++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..ec9a527 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/backtrace.py +@@ -0,0 +1,106 @@ ++# New backtrace command. ++ ++# 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 gdb.backtrace ++import itertools ++from gdb.FrameIterator import FrameIterator ++from gdb.FrameWrapper import FrameWrapper ++import sys ++ ++class ReverseBacktraceParameter (gdb.Parameter): ++ """The new-backtrace command can show backtraces in 'reverse' order. ++This means that the innermost frame will be printed last. ++Note that reverse backtraces are more expensive to compute.""" ++ ++ set_doc = "Enable or disable reverse backtraces." ++ show_doc = "Show whether backtraces will be printed in reverse order." ++ ++ def __init__(self): ++ gdb.Parameter.__init__ (self, "reverse-backtrace", ++ gdb.COMMAND_STACK, gdb.PARAM_BOOLEAN) ++ # Default to compatibility with gdb. ++ self.value = False ++ ++class FilteringBacktrace (gdb.Command): ++ """Print backtrace of all stack frames, or innermost COUNT frames. ++With a negative argument, print outermost -COUNT frames. ++Use of the 'full' qualifier also prints the values of the local variables. ++Use of the 'raw' qualifier avoids any filtering by loadable modules. ++""" ++ ++ def __init__ (self): ++ # FIXME: this is not working quite well enough to replace ++ # "backtrace" yet. ++ gdb.Command.__init__ (self, "new-backtrace", gdb.COMMAND_STACK) ++ self.reverse = ReverseBacktraceParameter() ++ ++ def reverse_iter (self, iter): ++ result = [] ++ for item in iter: ++ result.append (item) ++ result.reverse() ++ return result ++ ++ def final_n (self, iter, x): ++ result = [] ++ for item in iter: ++ result.append (item) ++ return result[x:] ++ ++ def invoke (self, arg, from_tty): ++ i = 0 ++ count = 0 ++ filter = True ++ full = False ++ ++ for word in arg.split (" "): ++ if word == '': ++ continue ++ elif word == 'raw': ++ filter = False ++ elif word == 'full': ++ full = True ++ else: ++ count = int (word) ++ ++ # 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 (newest_frame)) ++ if filter: ++ iter = gdb.backtrace.create_frame_filter (iter) ++ ++ # Now wrap in an iterator that numbers the frames. ++ iter = itertools.izip (itertools.count (0), iter) ++ ++ # Reverse if the user wanted that. ++ if self.reverse.value: ++ iter = self.reverse_iter (iter) ++ ++ # Extract sub-range user wants. ++ if count < 0: ++ iter = self.final_n (iter, count) ++ elif count > 0: ++ iter = itertools.islice (iter, 0, count) ++ ++ for pair in iter: ++ sys.stdout.write ("#%-2d" % pair[0]) ++ pair[1].describe (sys.stdout, full) ++ ++FilteringBacktrace() +diff --git a/gdb/python/lib/gdb/command/ignore_errors.py b/gdb/python/lib/gdb/command/ignore_errors.py +new file mode 100644 +index 0000000..6fa48ff +--- /dev/null ++++ b/gdb/python/lib/gdb/command/ignore_errors.py +@@ -0,0 +1,37 @@ ++# Ignore errors in user commands. ++ ++# 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 . ++ ++import gdb ++ ++class IgnoreErrorsCommand (gdb.Command): ++ """Execute a single command, ignoring all errors. ++Only one-line commands are supported. ++This is primarily useful in scripts.""" ++ ++ def __init__ (self): ++ super (IgnoreErrorsCommand, self).__init__ ("ignore-errors", ++ gdb.COMMAND_OBSCURE, ++ # FIXME... ++ gdb.COMPLETE_COMMAND) ++ ++ def invoke (self, arg, from_tty): ++ try: ++ gdb.execute (arg, from_tty) ++ except: ++ pass ++ ++IgnoreErrorsCommand () +diff --git a/gdb/python/lib/gdb/command/pahole.py b/gdb/python/lib/gdb/command/pahole.py +new file mode 100644 +index 0000000..21a0bf0 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/pahole.py +@@ -0,0 +1,75 @@ ++# pahole command for gdb ++ ++# 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 ++ ++class Pahole (gdb.Command): ++ """Show the holes in a structure. ++This command takes a single argument, a type name. ++It prints the type and displays comments showing where holes are.""" ++ ++ def __init__ (self): ++ super (Pahole, self).__init__ ("pahole", gdb.COMMAND_NONE, ++ gdb.COMPLETE_SYMBOL) ++ ++ def pahole (self, type, level, name): ++ if name is None: ++ name = '' ++ tag = type.tag ++ if tag is None: ++ tag = '' ++ print '%sstruct %s {' % (' ' * (2 * level), tag) ++ bitpos = 0 ++ for field in type.fields (): ++ # Skip static fields. ++ if not hasattr (field, ('bitpos')): ++ continue ++ ++ ftype = field.type.strip_typedefs() ++ ++ if bitpos != field.bitpos: ++ hole = field.bitpos - bitpos ++ print ' /* XXX %d bit hole, try to pack */' % hole ++ bitpos = field.bitpos ++ if field.bitsize > 0: ++ fieldsize = field.bitsize ++ else: ++ # TARGET_CHAR_BIT here... ++ fieldsize = 8 * ftype.sizeof ++ ++ # TARGET_CHAR_BIT ++ print ' /* %3d %3d */' % (int (bitpos / 8), int (fieldsize / 8)), ++ bitpos = bitpos + fieldsize ++ ++ if ftype.code == gdb.TYPE_CODE_STRUCT: ++ self.pahole (ftype, level + 1, field.name) ++ else: ++ print ' ' * (2 + 2 * level), ++ print '%s %s' % (str (ftype), field.name) ++ ++ print ' ' * (14 + 2 * level), ++ print '} %s' % name ++ ++ def invoke (self, arg, from_tty): ++ type = gdb.lookup_type (arg) ++ type = type.strip_typedefs () ++ if type.code != gdb.TYPE_CODE_STRUCT: ++ raise TypeError, '%s is not a struct type' % arg ++ print ' ' * 14, ++ self.pahole (type, 0, '') ++ ++Pahole() +diff --git a/gdb/python/lib/gdb/command/require.py b/gdb/python/lib/gdb/command/require.py +new file mode 100644 +index 0000000..1fbc1e8 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/require.py +@@ -0,0 +1,57 @@ ++# Demand-loading commands. ++ ++# 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 os ++ ++class RequireCommand (gdb.Command): ++ """Prefix command for requiring features.""" ++ ++ def __init__ (self): ++ super (RequireCommand, self).__init__ ("require", ++ gdb.COMMAND_SUPPORT, ++ gdb.COMPLETE_NONE, ++ True) ++ ++class RequireSubcommand (gdb.Command): ++ """Demand-load a command by name.""" ++ ++ def __init__ (self, name): ++ self.__doc__ = "Demand-load a %s by name." % name ++ super (RequireSubcommand, self).__init__ ("require %s" % name, ++ gdb.COMMAND_SUPPORT) ++ self.name = name ++ ++ def invoke (self, arg, from_tty): ++ for cmd in arg.split(): ++ exec ('import gdb.' + self.name + '.' + cmd, globals ()) ++ ++ def complete (self, text, word): ++ dir = gdb.pythondir + '/gdb/' + self.name ++ result = [] ++ for file in os.listdir(dir): ++ if not file.startswith (word) or not file.endswith ('.py'): ++ continue ++ feature = file[0:-3] ++ if feature == 'require' or feature == '__init__': ++ continue ++ result.append (feature) ++ return result ++ ++RequireCommand() ++RequireSubcommand("command") ++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..6143187 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/save_breakpoints.py +@@ -0,0 +1,65 @@ ++# Save breakpoints. ++ ++# 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 . ++ ++from __future__ import with_statement ++import gdb ++ ++class SavePrefixCommand (gdb.Command): ++ "Prefix command for saving things." ++ ++ def __init__ (self): ++ super (SavePrefixCommand, self).__init__ ("save", ++ gdb.COMMAND_SUPPORT, ++ gdb.COMPLETE_NONE, True) ++ ++class SaveBreakpointsCommand (gdb.Command): ++ """Save the current breakpoints to a file. ++This command takes a single argument, a file name. ++The breakpoints can be restored using the 'source' command.""" ++ ++ def __init__ (self): ++ super (SaveBreakpointsCommand, self).__init__ ("save breakpoints", ++ gdb.COMMAND_SUPPORT, ++ gdb.COMPLETE_FILENAME) ++ ++ def invoke (self, arg, from_tty): ++ self.dont_repeat () ++ bps = gdb.breakpoints () ++ if bps is None: ++ raise RuntimeError, 'No breakpoints to save' ++ with open (arg.strip (), 'w') as f: ++ for bp in bps: ++ print >> f, "break", bp.location, ++ if bp.thread is not None: ++ print >> f, " thread", bp.thread, ++ if bp.condition is not None: ++ print >> f, " if", bp.condition, ++ print >> f ++ if not bp.enabled: ++ print >> f, "disable $bpnum" ++ # Note: we don't save the ignore count; there doesn't ++ # seem to be much point. ++ commands = bp.commands ++ if commands is not None: ++ print >> f, "commands" ++ # Note that COMMANDS has a trailing newline. ++ print >> f, commands, ++ print >> f, "end" ++ print >> f ++ ++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 +--- /dev/null ++++ b/gdb/python/lib/gdb/function/__init__.py +@@ -0,0 +1 @@ ++ +diff --git a/gdb/python/lib/gdb/function/caller_is.py b/gdb/python/lib/gdb/function/caller_is.py +new file mode 100644 +index 0000000..2b9c5c7 +--- /dev/null ++++ b/gdb/python/lib/gdb/function/caller_is.py +@@ -0,0 +1,58 @@ ++# Caller-is functions. ++ ++# 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 . ++ ++import gdb ++import re ++ ++class CallerIs (gdb.Function): ++ """Return True if the calling function's name is equal to a string. ++This function takes one or two arguments. ++The first argument is the name of a function; if the calling function's ++name is equal to this argument, this function returns True. ++The optional second argument tells this function how many stack frames ++to traverse to find the calling function. The default is 1.""" ++ ++ def __init__ (self): ++ super (CallerIs, self).__init__ ("caller_is") ++ ++ def invoke (self, name, nframes = 1): ++ frame = gdb.selected_frame () ++ while nframes > 0: ++ frame = frame.older () ++ nframes = nframes - 1 ++ return frame.name () == name.string () ++ ++class CallerMatches (gdb.Function): ++ """Return True if the calling function's name matches a string. ++This function takes one or two arguments. ++The first argument is a regular expression; if the calling function's ++name is matched by this argument, this function returns True. ++The optional second argument tells this function how many stack frames ++to traverse to find the calling function. The default is 1.""" ++ ++ def __init__ (self): ++ super (CallerMatches, self).__init__ ("caller_matches") ++ ++ def invoke (self, name, nframes = 1): ++ frame = gdb.selected_frame () ++ while nframes > 0: ++ frame = frame.older () ++ nframes = nframes - 1 ++ return re.match (name.string (), frame.name ()) is not None ++ ++CallerIs() ++CallerMatches() +diff --git a/gdb/python/lib/gdb/function/in_scope.py b/gdb/python/lib/gdb/function/in_scope.py +new file mode 100644 +index 0000000..debb3bb +--- /dev/null ++++ b/gdb/python/lib/gdb/function/in_scope.py +@@ -0,0 +1,47 @@ ++# In-scope function. ++ ++# 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 . ++ ++import gdb ++ ++class InScope (gdb.Function): ++ """Return True if all the given variables or macros are in scope. ++Takes one argument for each variable name to be checked.""" ++ ++ def __init__ (self): ++ super (InScope, self).__init__ ("in_scope") ++ ++ def invoke (self, *vars): ++ if len (vars) == 0: ++ raise TypeError, "in_scope takes at least one argument" ++ ++ # gdb.Value isn't hashable so it can't be put in a map. ++ # Convert to string first. ++ wanted = set (map (lambda x: x.string (), vars)) ++ found = set () ++ block = gdb.selected_frame ().block () ++ while block: ++ for sym in block: ++ if (sym.is_argument or sym.is_constant ++ or sym.is_function or sym.is_variable): ++ if sym.name in wanted: ++ found.add (sym.name) ++ ++ block = block.superblock ++ ++ return wanted == found ++ ++InScope () +diff --git a/gdb/python/python-block.c b/gdb/python/python-block.c +new file mode 100644 +index 0000000..8019e9d +--- /dev/null ++++ b/gdb/python/python-block.c +@@ -0,0 +1,265 @@ ++/* Python interface to blocks. ++ ++ 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 "block.h" ++#include "dictionary.h" ++#include "symtab.h" ++#include "python-internal.h" ++ ++typedef struct { ++ PyObject_HEAD ++ struct block *block; ++} block_object; ++ ++typedef struct { ++ PyObject_HEAD ++ struct dictionary *dict; ++ struct dict_iterator iter; ++ int initialized_p; ++} block_syms_iterator_object; ++ ++static PyTypeObject block_syms_iterator_object_type; ++ ++static PyObject * ++blpy_iter (PyObject *self) ++{ ++ block_syms_iterator_object *block_iter_obj; ++ ++ block_iter_obj = PyObject_New (block_syms_iterator_object, ++ &block_syms_iterator_object_type); ++ if (block_iter_obj == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, ++ "Could not allocate iterator object."); ++ return NULL; ++ } ++ ++ block_iter_obj->dict = BLOCK_DICT (((block_object *) self)->block); ++ block_iter_obj->initialized_p = 0; ++ ++ return (PyObject *) block_iter_obj; ++} ++ ++static PyObject * ++blpy_get_start (PyObject *self, void *closure) ++{ ++ block_object *self_block = (block_object *) self; ++ ++ return PyLong_FromUnsignedLongLong (BLOCK_START (self_block->block)); ++} ++ ++static PyObject * ++blpy_get_end (PyObject *self, void *closure) ++{ ++ block_object *self_block = (block_object *) self; ++ ++ return PyLong_FromUnsignedLongLong (BLOCK_END (self_block->block)); ++} ++ ++static PyObject * ++blpy_get_function (PyObject *self, void *closure) ++{ ++ block_object *self_block = (block_object *) self; ++ struct symbol *sym; ++ ++ sym = BLOCK_FUNCTION (self_block->block); ++ if (sym) ++ return symbol_to_symbol_object (sym); ++ ++ Py_RETURN_NONE; ++} ++ ++static PyObject * ++blpy_get_superblock (PyObject *self, void *closure) ++{ ++ block_object *self_block = (block_object *) self; ++ struct block *block; ++ ++ block = BLOCK_SUPERBLOCK (self_block->block); ++ if (block) ++ return block_to_block_object (block); ++ ++ Py_RETURN_NONE; ++} ++ ++PyObject * ++block_to_block_object (struct block *block) ++{ ++ block_object *block_obj; ++ ++ block_obj = PyObject_New (block_object, &block_object_type); ++ if (block_obj == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, "Could not allocate block object."); ++ return NULL; ++ } ++ ++ block_obj->block = block; ++ ++ return (PyObject *) block_obj; ++} ++ ++struct block * ++block_object_to_block (PyObject *obj) ++{ ++ if (! PyObject_TypeCheck (obj, &block_object_type)) ++ return NULL; ++ return ((block_object *) obj)->block; ++} ++ ++static PyObject * ++blpy_block_syms_iter (PyObject *self) ++{ ++ return self; ++} ++ ++static PyObject * ++blpy_block_syms_iternext (PyObject *self) ++{ ++ block_syms_iterator_object *iter_obj = (block_syms_iterator_object *) self; ++ struct symbol *sym; ++ ++ if (!iter_obj->initialized_p) ++ { ++ sym = dict_iterator_first (iter_obj->dict, &(iter_obj->iter)); ++ iter_obj->initialized_p = 1; ++ } ++ else ++ sym = dict_iterator_next (&(iter_obj->iter)); ++ ++ return (sym == NULL)? NULL : symbol_to_symbol_object (sym); ++} ++ ++/* Return the innermost lexical block containing the specified pc value, ++ or 0 if there is none. */ ++ ++PyObject * ++gdbpy_block_for_pc (PyObject *self, PyObject *args) ++{ ++ unsigned PY_LONG_LONG pc; ++ struct block *block; ++ PyObject *sym_obj; ++ ++ if (!PyArg_ParseTuple (args, "K", &pc)) ++ return NULL; ++ ++ block = block_for_pc (pc); ++ if (block) ++ return block_to_block_object (block); ++ ++ Py_RETURN_NONE; ++} ++ ++void ++gdbpy_initialize_blocks (void) ++{ ++ block_object_type.tp_new = PyType_GenericNew; ++ if (PyType_Ready (&block_object_type) < 0) ++ return; ++ ++ block_syms_iterator_object_type.tp_new = PyType_GenericNew; ++ if (PyType_Ready (&block_syms_iterator_object_type) < 0) ++ return; ++ ++ Py_INCREF (&block_object_type); ++ PyModule_AddObject (gdb_module, "Block", (PyObject *) &block_object_type); ++ ++ Py_INCREF (&block_syms_iterator_object_type); ++ PyModule_AddObject (gdb_module, "BlockIterator", ++ (PyObject *) &block_syms_iterator_object_type); ++} ++ ++ ++ ++static PyGetSetDef block_object_getset[] = { ++ { "start", blpy_get_start, NULL, "Start address of the block.", NULL }, ++ { "end", blpy_get_end, NULL, "End address of the block.", NULL }, ++ { "function", blpy_get_function, NULL, ++ "Symbol that names the block, or None.", NULL }, ++ { "superblock", blpy_get_superblock, NULL, ++ "Block containing the block, or None.", NULL }, ++ { NULL } /* Sentinel */ ++}; ++ ++PyTypeObject block_object_type = { ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Block", /*tp_name*/ ++ sizeof (block_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 block object", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ blpy_iter, /* tp_iter */ ++ 0, /* tp_iternext */ ++ 0, /* tp_methods */ ++ 0, /* tp_members */ ++ block_object_getset /* tp_getset */ ++}; ++ ++static PyTypeObject block_syms_iterator_object_type = { ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.BlockIterator", /*tp_name*/ ++ sizeof (block_syms_iterator_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 block syms iterator object", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ blpy_block_syms_iter, /* tp_iter */ ++ blpy_block_syms_iternext, /* tp_iternext */ ++ 0 /* tp_methods */ ++}; +diff --git a/gdb/python/python-breakpoint.c b/gdb/python/python-breakpoint.c +new file mode 100644 +index 0000000..afa9526 +--- /dev/null ++++ b/gdb/python/python-breakpoint.c +@@ -0,0 +1,665 @@ ++/* Python interface to breakpoints ++ ++ 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 "breakpoint.h" ++#include "gdbcmd.h" ++#include "gdbthread.h" ++#include "observer.h" ++ ++ ++/* From breakpoint.c. */ ++extern struct breakpoint *breakpoint_chain; ++ ++ ++typedef struct breakpoint_object breakpoint_object; ++ ++static PyTypeObject breakpoint_object_type; ++ ++/* A dynamically allocated vector of breakpoint objects. Each ++ breakpoint has a number. A breakpoint is valid if its slot in this ++ vector is non-null. When a breakpoint is deleted, we drop our ++ reference to it and zero its slot; this is how we let the Python ++ object have a lifetime which is independent from that of the gdb ++ breakpoint. */ ++static breakpoint_object **bppy_breakpoints; ++ ++/* Number of slots in bppy_breakpoints. */ ++static int bppy_slots; ++ ++/* Number of live breakpoints. */ ++static int bppy_live; ++ ++/* Variables used to pass information between the Breakpoint ++ constructor and the breakpoint-created hook function. */ ++static breakpoint_object *bppy_pending_object; ++ ++struct breakpoint_object ++{ ++ PyObject_HEAD ++ ++ /* The breakpoint number according to gdb. */ ++ int number; ++ ++ /* The gdb breakpoint object, or NULL if the breakpoint has been ++ deleted. */ ++ struct breakpoint *bp; ++}; ++ ++/* Evaluate to true if the breakpoint NUM is valid, false otherwise. */ ++#define BPPY_VALID_P(Num) \ ++ ((Num) >= 0 \ ++ && (Num) < bppy_slots \ ++ && bppy_breakpoints[Num] != NULL) ++ ++/* Require that BREAKPOINT be a valid breakpoint ID; throw a Python ++ exception if it is invalid. */ ++#define BPPY_REQUIRE_VALID(Breakpoint) \ ++ do { \ ++ if (! BPPY_VALID_P ((Breakpoint)->number)) \ ++ return PyErr_Format (PyExc_RuntimeError, "breakpoint %d is invalid", \ ++ (Breakpoint)->number); \ ++ } while (0) ++ ++/* Require that BREAKPOINT be a valid breakpoint ID; throw a Python ++ exception if it is invalid. This macro is for use in setter functions. */ ++#define BPPY_SET_REQUIRE_VALID(Breakpoint) \ ++ do { \ ++ if (! BPPY_VALID_P ((Breakpoint)->number)) \ ++ { \ ++ PyErr_Format (PyExc_RuntimeError, "breakpoint %d is invalid", \ ++ (Breakpoint)->number); \ ++ return -1; \ ++ } \ ++ } while (0) ++ ++/* Python function which checks the validity of a breakpoint object. */ ++static PyObject * ++bppy_is_valid (PyObject *self, PyObject *args) ++{ ++ if (((breakpoint_object *) self)->bp) ++ Py_RETURN_TRUE; ++ Py_RETURN_FALSE; ++} ++ ++/* Python function to test whether or not the breakpoint is enabled. */ ++static PyObject * ++bppy_get_enabled (PyObject *self, void *closure) ++{ ++ if (! ((breakpoint_object *) self)->bp) ++ Py_RETURN_FALSE; ++ /* Not clear what we really want here. */ ++ if (((breakpoint_object *) self)->bp->enable_state == bp_enabled) ++ Py_RETURN_TRUE; ++ Py_RETURN_FALSE; ++} ++ ++/* Python function to test whether or not the breakpoint is silent. */ ++static PyObject * ++bppy_get_silent (PyObject *self, void *closure) ++{ ++ BPPY_REQUIRE_VALID ((breakpoint_object *) self); ++ if (((breakpoint_object *) self)->bp->silent) ++ Py_RETURN_TRUE; ++ Py_RETURN_FALSE; ++} ++ ++/* Python function to set the enabled state of a breakpoint. */ ++static int ++bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ int cmp; ++ ++ BPPY_SET_REQUIRE_VALID (self_bp); ++ ++ if (newvalue == NULL) ++ { ++ PyErr_SetString (PyExc_TypeError, "cannot delete `enabled' attribute"); ++ return -1; ++ } ++ else if (! PyBool_Check (newvalue)) ++ { ++ PyErr_SetString (PyExc_TypeError, ++ "the value of `enabled' must be a boolean"); ++ return -1; ++ } ++ ++ cmp = PyObject_IsTrue (newvalue); ++ if (cmp < 0) ++ return -1; ++ else if (cmp == 1) ++ enable_breakpoint (self_bp->bp); ++ else ++ disable_breakpoint (self_bp->bp); ++ return 0; ++} ++ ++/* Python function to set the 'silent' state of a breakpoint. */ ++static int ++bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ int cmp; ++ ++ BPPY_SET_REQUIRE_VALID (self_bp); ++ ++ if (newvalue == NULL) ++ { ++ PyErr_SetString (PyExc_TypeError, "cannot delete `silent' attribute"); ++ return -1; ++ } ++ else if (! PyBool_Check (newvalue)) ++ { ++ PyErr_SetString (PyExc_TypeError, ++ "the value of `silent' must be a boolean"); ++ return -1; ++ } ++ ++ cmp = PyObject_IsTrue (newvalue); ++ if (cmp < 0) ++ return -1; ++ else ++ self_bp->bp->silent = cmp; ++ ++ return 0; ++} ++ ++/* Python function to set the thread of a breakpoint. */ ++static int ++bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ int id; ++ ++ BPPY_SET_REQUIRE_VALID (self_bp); ++ ++ if (newvalue == NULL) ++ { ++ PyErr_SetString (PyExc_TypeError, "cannot delete `thread' attribute"); ++ return -1; ++ } ++ else if (PyInt_Check (newvalue)) ++ { ++ id = (int) PyInt_AsLong (newvalue); ++ if (! valid_thread_id (id)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "invalid thread id"); ++ return -1; ++ } ++ } ++ else if (newvalue == Py_None) ++ id = -1; ++ else ++ { ++ PyErr_SetString (PyExc_TypeError, ++ "the value of `thread' must be an integer or None"); ++ return -1; ++ } ++ ++ self_bp->bp->thread = id; ++ ++ return 0; ++} ++ ++/* Python function to set the ignore count of a breakpoint. */ ++static int ++bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ long value; ++ ++ BPPY_SET_REQUIRE_VALID (self_bp); ++ ++ if (newvalue == NULL) ++ { ++ PyErr_SetString (PyExc_TypeError, ++ "cannot delete `ignore_count' attribute"); ++ return -1; ++ } ++ else if (! PyInt_Check (newvalue)) ++ { ++ PyErr_SetString (PyExc_TypeError, ++ "the value of `ignore_count' must be an integer"); ++ return -1; ++ } ++ ++ value = PyInt_AsLong (newvalue); ++ if (value < 0) ++ value = 0; ++ set_ignore_count (self_bp->number, (int) value, 0); ++ ++ return 0; ++} ++ ++/* Python function to set the hit count of a breakpoint. */ ++static int ++bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ ++ BPPY_SET_REQUIRE_VALID (self_bp); ++ ++ if (newvalue == NULL) ++ { ++ PyErr_SetString (PyExc_TypeError, "cannot delete `hit_count' attribute"); ++ return -1; ++ } ++ else if (! PyInt_Check (newvalue) || PyInt_AsLong (newvalue) != 0) ++ { ++ PyErr_SetString (PyExc_AttributeError, ++ "the value of `hit_count' must be zero"); ++ return -1; ++ } ++ ++ self_bp->bp->hit_count = 0; ++ ++ return 0; ++} ++ ++/* Python function to get the location of a breakpoint. */ ++static PyObject * ++bppy_get_location (PyObject *self, void *closure) ++{ ++ char *str; ++ ++ BPPY_REQUIRE_VALID ((breakpoint_object *) self); ++ str = ((breakpoint_object *) self)->bp->addr_string; ++ /* FIXME: watchpoints? tracepoints? */ ++ if (! str) ++ str = ""; ++ return PyString_Decode (str, strlen (str), host_charset (), NULL); ++} ++ ++/* Python function to get the condition expression of a breakpoint. */ ++static PyObject * ++bppy_get_condition (PyObject *self, void *closure) ++{ ++ char *str; ++ BPPY_REQUIRE_VALID ((breakpoint_object *) self); ++ ++ str = ((breakpoint_object *) self)->bp->cond_string; ++ if (! str) ++ Py_RETURN_NONE; ++ return PyString_Decode (str, strlen (str), host_charset (), NULL); ++} ++ ++static int ++bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure) ++{ ++ char *exp; ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ volatile struct gdb_exception except; ++ ++ BPPY_SET_REQUIRE_VALID (self_bp); ++ ++ if (newvalue == NULL) ++ { ++ PyErr_SetString (PyExc_TypeError, "cannot delete `condition' attribute"); ++ return -1; ++ } ++ else if (newvalue == Py_None) ++ exp = ""; ++ else ++ { ++ exp = python_string_to_host_string (newvalue); ++ if (exp == NULL) ++ return -1; ++ } ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ set_breakpoint_condition (self_bp->bp, exp, 0); ++ } ++ GDB_PY_SET_HANDLE_EXCEPTION (except); ++ ++ return 0; ++} ++ ++/* Python function to get the commands attached to a breakpoint. */ ++static PyObject * ++bppy_get_commands (PyObject *self, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ long length; ++ volatile struct gdb_exception except; ++ struct ui_file *string_file; ++ struct cleanup *chain; ++ PyObject *result; ++ char *cmdstr; ++ ++ BPPY_REQUIRE_VALID (self_bp); ++ ++ if (! self_bp->bp->commands) ++ Py_RETURN_NONE; ++ ++ string_file = mem_fileopen (); ++ chain = make_cleanup_ui_file_delete (string_file); ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ /* FIXME: this can fail. Maybe we need to be making a new ++ ui_out object here? */ ++ ui_out_redirect (uiout, string_file); ++ print_command_lines (uiout, self_bp->bp->commands, 0); ++ ui_out_redirect (uiout, NULL); ++ } ++ cmdstr = ui_file_xstrdup (string_file, &length); ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL); ++ do_cleanups (chain); ++ xfree (cmdstr); ++ return result; ++} ++ ++/* Python function to get the breakpoint's number. */ ++static PyObject * ++bppy_get_number (PyObject *self, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ ++ BPPY_REQUIRE_VALID (self_bp); ++ ++ return PyInt_FromLong (self_bp->number); ++} ++ ++/* Python function to get the breakpoint's thread ID. */ ++static PyObject * ++bppy_get_thread (PyObject *self, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ ++ BPPY_REQUIRE_VALID (self_bp); ++ ++ if (self_bp->bp->thread == -1) ++ Py_RETURN_NONE; ++ ++ return PyInt_FromLong (self_bp->bp->thread); ++} ++ ++/* Python function to get the breakpoint's hit count. */ ++static PyObject * ++bppy_get_hit_count (PyObject *self, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ ++ BPPY_REQUIRE_VALID (self_bp); ++ ++ return PyInt_FromLong (self_bp->bp->hit_count); ++} ++ ++/* Python function to get the breakpoint's ignore count. */ ++static PyObject * ++bppy_get_ignore_count (PyObject *self, void *closure) ++{ ++ breakpoint_object *self_bp = (breakpoint_object *) self; ++ ++ BPPY_REQUIRE_VALID (self_bp); ++ ++ return PyInt_FromLong (self_bp->bp->ignore_count); ++} ++ ++/* Python function to create a new breakpoint. */ ++static PyObject * ++bppy_new (PyTypeObject *subtype, PyObject *args, PyObject *kwargs) ++{ ++ PyObject *result; ++ char *spec; ++ volatile struct gdb_exception except; ++ ++ /* FIXME: allow condition, thread, temporary, ... ? */ ++ if (! PyArg_ParseTuple (args, "s", &spec)) ++ return NULL; ++ result = subtype->tp_alloc (subtype, 0); ++ if (! result) ++ return NULL; ++ bppy_pending_object = (breakpoint_object *) result; ++ bppy_pending_object->number = -1; ++ bppy_pending_object->bp = NULL; ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ set_breakpoint (python_gdbarch, spec, NULL, 0, 0, -1, 0, ++ AUTO_BOOLEAN_TRUE, 1); ++ } ++ if (except.reason < 0) ++ { ++ subtype->tp_free (result); ++ return PyErr_Format (except.reason == RETURN_QUIT ++ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, ++ "%s", except.message); ++ } ++ ++ BPPY_REQUIRE_VALID ((breakpoint_object *) result); ++ return result; ++} ++ ++ ++ ++/* Static function to return a tuple holding all breakpoints. */ ++ ++PyObject * ++gdbpy_breakpoints (PyObject *self, PyObject *args) ++{ ++ PyObject *result; ++ ++ if (bppy_live == 0) ++ Py_RETURN_NONE; ++ ++ result = PyTuple_New (bppy_live); ++ if (result) ++ { ++ int i, out = 0; ++ for (i = 0; out < bppy_live; ++i) ++ { ++ if (! bppy_breakpoints[i]) ++ continue; ++ Py_INCREF (bppy_breakpoints[i]); ++ PyTuple_SetItem (result, out, (PyObject *) bppy_breakpoints[i]); ++ ++out; ++ } ++ } ++ return result; ++} ++ ++ ++ ++/* Event callback functions. */ ++ ++/* Callback that is used when a breakpoint is created. This function ++ will create a new Python breakpoint object. */ ++static void ++gdbpy_breakpoint_created (int num) ++{ ++ breakpoint_object *newbp; ++ struct breakpoint *bp; ++ PyGILState_STATE state; ++ ++ if (num < 0) ++ return; ++ ++ for (bp = breakpoint_chain; bp; bp = bp->next) ++ if (bp->number == num) ++ break; ++ if (! bp) ++ return; ++ ++ if (num >= bppy_slots) ++ { ++ int old = bppy_slots; ++ bppy_slots = bppy_slots * 2 + 10; ++ bppy_breakpoints ++ = (breakpoint_object **) xrealloc (bppy_breakpoints, ++ (bppy_slots ++ * sizeof (breakpoint_object *))); ++ memset (&bppy_breakpoints[old], 0, ++ (bppy_slots - old) * sizeof (PyObject *)); ++ } ++ ++ ++bppy_live; ++ ++ state = PyGILState_Ensure (); ++ ++ if (bppy_pending_object) ++ { ++ newbp = bppy_pending_object; ++ bppy_pending_object = NULL; ++ } ++ else ++ newbp = PyObject_New (breakpoint_object, &breakpoint_object_type); ++ if (newbp) ++ { ++ PyObject *hookfn; ++ ++ newbp->number = num; ++ newbp->bp = bp; ++ bppy_breakpoints[num] = newbp; ++ ++ hookfn = gdbpy_get_hook_function ("new_breakpoint"); ++ if (hookfn) ++ { ++ PyObject *result; ++ result = PyObject_CallFunctionObjArgs (hookfn, newbp, NULL); ++ if (result) ++ { ++ Py_DECREF (result); ++ } ++ Py_DECREF (hookfn); ++ } ++ } ++ ++ /* Just ignore errors here. */ ++ PyErr_Clear (); ++ ++ PyGILState_Release (state); ++} ++ ++/* Callback that is used when a breakpoint is deleted. This will ++ invalidate the corresponding Python object. */ ++static void ++gdbpy_breakpoint_deleted (int num) ++{ ++ PyGILState_STATE state; ++ ++ state = PyGILState_Ensure (); ++ if (BPPY_VALID_P (num)) ++ { ++ bppy_breakpoints[num]->bp = NULL; ++ Py_DECREF (bppy_breakpoints[num]); ++ bppy_breakpoints[num] = NULL; ++ --bppy_live; ++ } ++ PyGILState_Release (state); ++} ++ ++ ++ ++/* Initialize the Python breakpoint code. */ ++void ++gdbpy_initialize_breakpoints (void) ++{ ++ breakpoint_object_type.tp_new = bppy_new; ++ if (PyType_Ready (&breakpoint_object_type) < 0) ++ return; ++ ++ Py_INCREF (&breakpoint_object_type); ++ PyModule_AddObject (gdb_module, "Breakpoint", ++ (PyObject *) &breakpoint_object_type); ++ ++ observer_attach_breakpoint_created (gdbpy_breakpoint_created); ++ observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted); ++} ++ ++ ++ ++static PyGetSetDef breakpoint_object_getset[] = { ++ { "enabled", bppy_get_enabled, bppy_set_enabled, ++ "Boolean telling whether the breakpoint is enabled.", NULL }, ++ { "silent", bppy_get_silent, bppy_set_silent, ++ "Boolean telling whether the breakpoint is silent.", NULL }, ++ { "thread", bppy_get_thread, bppy_set_thread, ++ "Thread ID for the breakpoint.\n\ ++If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\ ++If the value is None, then this breakpoint not thread-specific.\n\ ++No other type of value can be used.", NULL }, ++ { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count, ++ "Number of times this breakpoint should be automatically continued.", ++ NULL }, ++ { "number", bppy_get_number, NULL, ++ "Breakpoint's number assigned by GDB.", NULL }, ++ { "hit_count", bppy_get_hit_count, bppy_set_hit_count, ++ "Number of times the breakpoint has been hit.\n\ ++Can be set to zero to clear the count. No other value is valid\n\ ++when setting this property.", NULL }, ++ { "location", bppy_get_location, NULL, ++ "Location of the breakpoint, as specified by the user.", NULL}, ++ { "condition", bppy_get_condition, bppy_set_condition, ++ "Condition of the breakpoint, as specified by the user,\ ++or None if no condition set."}, ++ { "commands", bppy_get_commands, NULL, ++ "Commands of the breakpoint, as specified by the user."}, ++ { NULL } /* Sentinel. */ ++}; ++ ++static PyMethodDef breakpoint_object_methods[] = ++{ ++ { "is_valid", bppy_is_valid, METH_NOARGS, ++ "Return true if this breakpoint is valid, false if not." }, ++ { NULL } /* Sentinel. */ ++}; ++ ++static PyTypeObject breakpoint_object_type = ++{ ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Breakpoint", /*tp_name*/ ++ sizeof (breakpoint_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, /*tp_flags*/ ++ "GDB breakpoint object", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ breakpoint_object_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ breakpoint_object_getset /* tp_getset */ ++}; +diff --git a/gdb/python/python-cmd.c b/gdb/python/python-cmd.c +index 528aca6..04b3fd1 100644 +--- a/gdb/python/python-cmd.c ++++ b/gdb/python/python-cmd.c +@@ -49,8 +49,7 @@ static struct cmdpy_completer completers[] = + + #define N_COMPLETERS (sizeof (completers) / sizeof (completers[0])) + +-/* A gdb command. For the time being only ordinary commands (not +- set/show commands) are allowed. */ ++/* A gdb command. */ + struct cmdpy_object + { + PyObject_HEAD +@@ -70,7 +69,6 @@ typedef struct cmdpy_object cmdpy_object; + + static PyTypeObject cmdpy_object_type; + +- + /* Constants used by this module. */ + static PyObject *invoke_cst; + static PyObject *complete_cst; +@@ -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. + ++ START_LIST is the list in which the search starts. ++ + This function returns the xmalloc()d name of the new command. On + error sets the Python error and returns NULL. */ +-static char * +-parse_command_name (char *text, struct cmd_list_element ***base_list) ++char * ++gdbpy_parse_command_name (char *text, struct cmd_list_element ***base_list, ++ struct cmd_list_element **start_list) + { + struct cmd_list_element *elt; + int len = strlen (text); +@@ -299,7 +300,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) + ; + if (i < 0) + { +- *base_list = &cmdlist; ++ *base_list = start_list; + return result; + } + +@@ -308,7 +309,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list) + prefix_text[i + 1] = '\0'; + + text = prefix_text; +- elt = lookup_cmd_1 (&text, cmdlist, NULL, 1); ++ elt = lookup_cmd_1 (&text, *start_list, NULL, 1); + if (!elt || elt == (struct cmd_list_element *) -1) + { + PyErr_Format (PyExc_RuntimeError, _("could not find command prefix %s"), +@@ -399,7 +400,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) + return -1; + } + +- cmd_name = parse_command_name (name, &cmd_list); ++ cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist); + if (! cmd_name) + return -1; + +diff --git a/gdb/python/python-frame.c b/gdb/python/python-frame.c +index a97009f..3d2f61f 100644 +--- a/gdb/python/python-frame.c ++++ b/gdb/python/python-frame.c +@@ -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. */ ++ ++static PyObject * ++frapy_block (PyObject *self, PyObject *args) ++{ ++ struct frame_info *frame; ++ struct block *block = NULL; ++ volatile struct gdb_exception except; ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); ++ ++ block = block_for_pc (get_frame_address_in_block (frame)); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ if (block) ++ return block_to_block_object (block); ++ ++ Py_RETURN_NONE; ++} ++ ++ ++/* Implementation of gdb.Frame.function (self) -> gdb.Symbol. ++ Returns the symbol for the function corresponding to this frame. */ ++ ++static PyObject * ++frapy_function (PyObject *self, PyObject *args) ++{ ++ struct symbol *sym = NULL; ++ struct frame_info *frame; ++ volatile struct gdb_exception except; ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); ++ ++ sym = find_pc_function (get_frame_address_in_block (frame)); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ 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. */ ++ ++static PyObject * ++frapy_find_sal (PyObject *self, PyObject *args) ++{ ++ struct frame_info *frame; ++ struct symtab_and_line sal; ++ volatile struct gdb_exception except; ++ PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */ ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ FRAPY_REQUIRE_VALID ((frame_object *) self, frame); ++ ++ find_frame_sal (frame, &sal); ++ sal_obj = symtab_and_line_to_sal_object (sal); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ return sal_obj; ++} ++ ++/* Implementation of gdb.Frame.read_var (self, variable) -> gdb.Value. + 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; +@@ -366,6 +440,25 @@ frapy_read_var (PyObject *self, PyObject *args) + Py_RETURN_NONE; + } + ++/* Select this frame. */ ++ ++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, fi); ++ select_frame (fi); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ ++ Py_RETURN_NONE; ++} ++ + /* 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." }, ++ { "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." }, ++ { "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 +--- /dev/null ++++ b/gdb/python/python-hooks.c +@@ -0,0 +1,50 @@ ++/* Notifications from gdb to Python ++ ++ 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 "cli/cli-decode.h" ++#include "charset.h" ++#include "python.h" ++#include "python-internal.h" ++#include "observer.h" ++ ++PyObject * ++gdbpy_get_hook_function (const char *name) ++{ ++ PyObject *hooks; ++ PyObject *result; ++ ++ if (! PyObject_HasAttrString (gdb_module, "hooks")) ++ return NULL; ++ hooks = PyObject_GetAttrString (gdb_module, "hooks"); ++ if (! hooks) ++ return NULL; ++ /* The cast is because the Python function doesn't declare const argument. ++ This is a problem in Python version 2.4, but not in 2.5. */ ++ if (! PyObject_HasAttrString (hooks, (char *) name)) ++ { ++ Py_DECREF (hooks); ++ return NULL; ++ } ++ /* The cast is because the Python function doesn't declare const argument. ++ This is a problem in Python version 2.4, but not in 2.5. */ ++ result = PyObject_GetAttrString (hooks, (char *) name); ++ 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..b809c4e +index 0000000..21e4eab --- /dev/null -+++ b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.c -@@ -0,0 +1,43 @@ -+/* This testcase is part of GDB, the GNU debugger. ++++ b/gdb/python/python-infthread.c +@@ -0,0 +1,285 @@ ++/* Python interface to inferior threads. + -+ Copyright 2008 Free Software Foundation, Inc. ++ 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 @@ -35388,1116 +14030,695 @@ index 0000000..b809c4e + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + -+#if 0 -+ -+void -+foo (int size) -+{ -+ typedef char array_t[size]; -+ array_t array; -+ int i; -+ -+ for (i = 0; i < size; i++) -+ array[i] = i; ++#include "defs.h" ++#include "exceptions.h" ++#include "gdbthread.h" ++#include "inferior.h" ++#include "python-internal.h" + -+ array[0] = 0; /* break-here */ -+} ++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) + -+#else ++ + -+int -+main (void) ++thread_object * ++create_thread_object (struct thread_info *tp) +{ -+ foo (26); -+ foo (78); -+ return 0; -+} -+ -+#endif -diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef.exp b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.exp -new file mode 100644 -index 0000000..534120a ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.exp -@@ -0,0 +1,64 @@ -+# 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 . -+ -+# Test DW_AT_data_location accessed through DW_TAG_typedef intermediate. ++ thread_object *thread_obj; ++ ++ thread_obj = PyObject_New (thread_object, &thread_object_type); ++ if (!thread_obj) ++ return NULL; + -+if ![istarget "x86_64-*-*"] then { -+ verbose "Skipping over gdb.arch/x86_64-vla-typedef.exp test made only for x86_64." -+ return -+} ++ thread_obj->thread = tp; ++ thread_obj->inf_obj = find_inferior_object (PIDGET (tp->ptid)); ++ Py_INCREF (thread_obj->inf_obj); + -+set testfile x86_64-vla-typedef -+set srcasmfile ${testfile}-foo.S -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+set binobjfile ${objdir}/${subdir}/${testfile}-foo.o -+if { [gdb_compile "${srcdir}/${subdir}/${srcasmfile}" "${binobjfile}" object {}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${binobjfile}" "${binfile}" executable {debug}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 ++ return thread_obj; +} + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ + -+if ![runto_main] { -+ untested x86_64-vla-typedef -+ return -1 ++static void ++thpy_dealloc (PyObject *self) ++{ ++ Py_DECREF (((thread_object *) self)->inf_obj); ++ self->ob_type->tp_free (self); +} + -+gdb_breakpoint "break_here" -+ -+gdb_continue_to_breakpoint "break_here" -+ -+gdb_test "whatis array" "type = array_t" "first: whatis array" ++static PyObject * ++thpy_get_num (PyObject *self, void *closure) ++{ ++ thread_object *thread_obj = (thread_object *) self; + -+gdb_test "ptype array" "type = char \\\[26\\\]" "first: ptype array" ++ THPY_REQUIRE_VALID (thread_obj); + -+gdb_test "p array\[1\]" "\\$\[0-9\] = 1 '\\\\1'" -+gdb_test "p array\[2\]" "\\$\[0-9\] = 2 '\\\\2'" -+gdb_test "p array\[3\]" "\\$\[0-9\] = 3 '\\\\3'" -+gdb_test "p array\[4\]" "\\$\[0-9\] = 4 '\\\\4'" ++ return PyLong_FromLong (thread_obj->thread->num); ++} + -+gdb_continue_to_breakpoint "break_here" ++ + -+gdb_test "whatis array" "type = array_t" "second: whatis array" ++/* 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; + -+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 -+++ b/gdb/testsuite/gdb.base/arrayidx.c -@@ -17,6 +17,13 @@ - - int array[] = {1, 2, 3, 4}; - -+#ifdef __GNUC__ -+struct -+ { -+ int a[0]; -+ } unbound; -+#endif ++ THPY_REQUIRE_VALID (thread_obj); + - int - main (void) - { -diff --git a/gdb/testsuite/gdb.base/arrayidx.exp b/gdb/testsuite/gdb.base/arrayidx.exp -index 71ce4aa..af0e5f8 100644 ---- a/gdb/testsuite/gdb.base/arrayidx.exp -+++ b/gdb/testsuite/gdb.base/arrayidx.exp -@@ -59,4 +59,12 @@ gdb_test "print array" \ - "\\{\\\[0\\\] = 1, \\\[1\\\] = 2, \\\[2\\\] = 3, \\\[3\\\] = 4\\}" \ - "Print array with array-indexes on" - -- -+set test "p unbound.a == &unbound.a\[0\]" -+gdb_test_multiple $test $test { -+ -re " = 1\r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re "No symbol \"unbound\" in current context.\r\n$gdb_prompt $" { -+ unsupported "$test (no GCC)" ++ list = PyList_New (0); ++ if (list == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, "Could not allocate frames list."); ++ return NULL; + } -+} -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 */ ++ cleanup = make_cleanup_restore_current_thread (); + -+#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. ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ switch_to_thread (thread_obj->thread->ptid); + -+# 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 . ++ 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); ++ } + -+# This program tests the 'catch syscall' functionality. -+# -+# It was written by Sergio Durigan Junior -+# on September/2008. ++ do_cleanups (cleanup); + -+if { [is_remote target] || ![isnative] } then { -+ continue -+} ++ if (list) ++ { ++ tuple = PyList_AsTuple (list); ++ Py_DECREF (list); ++ } ++ else ++ tuple = NULL; + -+set prms_id 0 -+set bug_id 0 ++ return tuple; ++} + -+global srcfile -+set testfile "catch-syscall" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} ++/* 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; + -+# 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" ++ THPY_REQUIRE_VALID (thread_obj); + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested catch-syscall.exp -+ return -1 -+} ++ cleanup = make_cleanup_restore_current_thread (); + -+# Until "catch syscall" is implemented on other targets... -+if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then { -+ continue -+} ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ switch_to_thread (thread_obj->thread->ptid); + -+# 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 -+} ++ frame = get_current_frame (); ++ frame_obj = frame_info_to_frame_object (frame); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); + -+# 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 ++ do_cleanups (cleanup); + -+ # 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 ++ return frame_obj; +} + -+# 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 -+} ++/* 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; + -+# This procedure checks if there was a call to a syscall. -+proc check_call_to_syscall { syscall } { -+ global gdb_prompt ++ THPY_REQUIRE_VALID (thread_obj); + -+ set thistest "program has called $syscall" -+ gdb_test "continue" "Catchpoint .*(call to syscall .?${syscall}.?).*" $thistest ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ switch_to_thread (thread_obj->thread->ptid); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); + -+ # Checking if the syscall is reported to be caught in -+ # 'info breakpoints'. -+ check_info_breakpoints "$syscall" ++ Py_RETURN_NONE; +} + -+# 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 ++/* 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; ++ } + -+ # Checking if the syscall is reported to be caught in -+ # 'info breakpoints'. -+ check_info_breakpoints "$syscall" ++ Py_RETURN_NONE; +} + -+# 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 ++void ++gdbpy_initialize_thread (void) ++{ ++ if (PyType_Ready (&thread_object_type) < 0) ++ return; + -+ # Trying to set the syscall -+ set thistest "catch syscall with arguments ($syscall)" -+ gdb_test "catch syscall $syscall" "Catchpoint .*(syscall\[(\]s\[)\] (.)?${syscall}(.)?).*" $thistest ++ Py_INCREF (&thread_object_type); ++ PyModule_AddObject (gdb_module, "InferiorThread", ++ (PyObject *) &thread_object_type); +} + -+proc check_for_program_end {} { -+ global gdb_prompt ++ + -+ # Deleting the catchpoints -+ delete_breakpoints ++static PyGetSetDef thread_object_getset[] = ++{ ++ { "num", thpy_get_num, NULL, "ID of the thread, as assigned by GDB.", NULL }, + -+ set thistest "successful program end" -+ gdb_test "continue" "Program exited normally.*" $thistest ++ { 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." }, + -+proc test_catch_syscall_without_args {} { -+ global gdb_prompt all_syscalls last_syscall ++ { NULL } ++}; + -+ # Trying to set the syscall -+ set thistest "setting catch syscall without arguments" -+ gdb_test "catch syscall" "Catchpoint .*(syscall).*" $thistest ++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 67a78af..47662d9 100644 +--- a/gdb/python/python-internal.h ++++ b/gdb/python/python-internal.h +@@ -61,33 +61,76 @@ typedef int Py_ssize_t; + #define PyEval_ReleaseLock() 0 + #endif + ++#include "command.h" + -+ check_init_info_breakpoints ++struct block; ++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; + -+ # We have to check every syscall -+ foreach name $all_syscalls { -+ check_continue $name -+ } ++/* Used in python-inferior.c. */ ++typedef struct ++{ ++ PyObject_HEAD + -+ # At last but not least, we check if the inferior -+ # has called the last (exit) syscall. -+ check_call_to_syscall $last_syscall ++ /* The thread we represent. */ ++ struct thread_info *thread; + -+ # Now let's see if the inferior correctly finishes. -+ check_for_program_end -+} ++ /* 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_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_block_for_pc (PyObject *self, PyObject *args); + 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 *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 *); + ++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 *convert_value_from_python (PyObject *obj); + struct type *type_object_to_type (PyObject *obj); + ++PyObject *gdbpy_get_hook_function (const char *); + -+proc test_catch_syscall_with_args {} { -+ global gdb_prompt -+ set syscall_name "close" + void gdbpy_initialize_values (void); ++void gdbpy_initialize_breakpoints (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_blocks (void); + void gdbpy_initialize_functions (void); + void gdbpy_initialize_objfile (void); ++void gdbpy_initialize_parameters (void); ++void gdbpy_initialize_thread (void); ++void gdbpy_initialize_inferior (void); + + struct cleanup *make_cleanup_py_decref (PyObject *py); + +@@ -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, ++ struct cmd_list_element **start_list); + -+ insert_catch_syscall_with_arg $syscall_name -+ check_init_info_breakpoints ++PyObject *gdbpy_parameter_value (enum var_types, void *); + -+ # Can we continue until we catch the syscall? -+ check_continue $syscall_name + /* Use this after a TRY_EXCEPT to throw the appropriate Python + exception. */ + #define GDB_PY_HANDLE_EXCEPTION(Exception) \ +@@ -107,6 +156,19 @@ extern const struct language_defn *python_language; + "%s", Exception.message); \ + } while (0) + ++/* Use this after a TRY_EXCEPT to throw the appropriate Python ++ exception. This macro is for use inside setter functions. */ ++#define GDB_PY_SET_HANDLE_EXCEPTION(Exception) \ ++ do { \ ++ if (Exception.reason < 0) \ ++ { \ ++ PyErr_Format (Exception.reason == RETURN_QUIT \ ++ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \ ++ "%s", Exception.message); \ ++ return -1; \ ++ } \ ++ } while (0) + -+ # Now let's see if the inferior correctly finishes. -+ check_for_program_end -+} + + void gdbpy_print_stack (void); + +@@ -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); + -+proc test_catch_syscall_with_wrong_args {} { -+ global gdb_prompt -+ # mlock is not called from the source -+ set syscall_name "mlock" + /* 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); + PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args); + +-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; + -+ insert_catch_syscall_with_arg $syscall_name -+ check_init_info_breakpoints ++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..7bc294c +--- /dev/null ++++ b/gdb/python/python-membuf.c +@@ -0,0 +1,268 @@ ++/* Python interface to the inferior memory. + -+ # 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 -+} ++ Copyright (C) 2008, 2009 Free Software Foundation, Inc. + -+proc test_catch_syscall_restarting_inferior {} { -+ global gdb_prompt -+ set syscall_name "chroot" ++ This file is part of GDB. + -+ insert_catch_syscall_with_arg $syscall_name -+ check_init_info_breakpoints ++ 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. + -+ # Let's first reach the call of the syscall. -+ check_call_to_syscall $syscall_name ++ 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. + -+ # Now, restart the program -+ rerun_to_main ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + -+ # And check for call/return -+ check_continue $syscall_name ++#include "defs.h" ++#include "exceptions.h" ++#include "gdbcore.h" ++#include "python-internal.h" + -+ # Can we finish? -+ check_for_program_end -+} ++typedef struct { ++ PyObject_HEAD ++ void *buffer; + -+proc do_syscall_tests {} { -+ global gdb_prompt srcdir ++ /* These are kept just for mbpy_str. */ ++ CORE_ADDR addr; ++ CORE_ADDR length; ++} membuf_object; + -+ # 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." -+ } -+ } ++static PyTypeObject membuf_object_type; + -+ # Verify that the 'catch syscall' help is available -+ set thistest "help catch syscall" -+ gdb_test "help catch syscall" "Catch system calls.*" $thistest ++/* 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. */ + -+ # 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 ++PyObject * ++gdbpy_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 = NULL; ++ volatile struct gdb_exception except; + -+ # Testing the 'catch syscall' command without arguments. -+ # This test should catch any syscalls. -+ if [runto_main] then { test_catch_syscall_without_args } ++ if (! PyArg_ParseTuple (args, "OO", &addr_obj, &length_obj)) ++ return NULL; + -+ # Testing the 'catch syscall' command with arguments. -+ # This test should only catch the specified syscall. -+ if [runto_main] then { test_catch_syscall_with_args } ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ if (!get_addr_from_python (addr_obj, &addr) ++ || !get_addr_from_python (length_obj, &length)) ++ { ++ error = 1; ++ break; ++ } + -+ # 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 } ++ buffer = xmalloc (length); ++ cleanups = make_cleanup (xfree, buffer); + -+ # Testing the 'catch' syscall command during a restart of -+ # the inferior. -+ if [runto_main] then { test_catch_syscall_restarting_inferior } -+} ++ read_memory (addr, buffer, length); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); + -+proc test_catch_syscall_fail_noxml {} { -+ global gdb_prompt ++ if (error) ++ return NULL; + -+ # Sanitizing. -+ delete_breakpoints ++ discard_cleanups (cleanups); + -+ # 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 ++ membuf_obj = PyObject_New (membuf_object, &membuf_object_type); ++ if (membuf_obj == NULL) ++ { ++ xfree (buffer); ++ PyErr_SetString (PyExc_MemoryError, ++ "Could not allocate memory buffer object."); ++ return NULL; ++ } + -+ # Since the catchpoint was set, we must check if it's present at -+ # "info breakpoints" -+ check_init_info_breakpoints ++ membuf_obj->buffer = buffer; ++ membuf_obj->addr = addr; ++ membuf_obj->length = length; + -+ # Sanitizing. -+ delete_breakpoints ++ return PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0, ++ Py_END_OF_BUFFER); +} + -+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 ++/* 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. */ ++ ++PyObject * ++gdbpy_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; + -+ delete_breakpoints ++ if (! PyArg_ParseTuple (args, "Os#|O", &addr_obj, &buffer, &buf_len, ++ &length_obj)) ++ return NULL; + -+ set thistest "Catch syscall without arguments and without XML support" -+ gdb_test "catch syscall" "Catchpoint .*(syscall).*" ++ 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; ++ } + -+ # 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\]*" ++ write_memory (addr, buffer, length); + } ++ GDB_PY_HANDLE_EXCEPTION (except); + -+ # At last but not least, we check if the inferior -+ # has called the last (exit) syscall. -+ check_call_to_syscall "\[0-9\]*" ++ if (error) ++ return NULL; + -+ delete_breakpoints ++ Py_RETURN_NONE; +} + -+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" -+ } ++/* Destructor of Membuf objects. */ + -+ delete_breakpoints ++static void ++mbpy_dealloc (PyObject *self) ++{ ++ xfree (((membuf_object *) self)->buffer); ++ self->ob_type->tp_free (self); ++} + -+ insert_catch_syscall_with_arg $close_number -+ check_init_info_breakpoints ++/* Return a description of the Membuf object. */ + -+ check_continue $close_number ++static PyObject * ++mbpy_str (PyObject *self) ++{ ++ membuf_object *membuf_obj = (membuf_object *) self; + -+ delete_breakpoints ++ return PyString_FromFormat ("memory buffer for address %s, %s bytes long", ++ paddress (membuf_obj->addr), ++ pulongest (membuf_obj->length)); +} + -+proc test_catch_syscall_with_wrong_args_noxml {} { -+ global gdb_prompt ++static Py_ssize_t ++get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) ++{ ++ membuf_object *membuf_obj = (membuf_object *) self; + -+ delete_breakpoints ++ if (segment) ++ { ++ PyErr_SetString (PyExc_SystemError, ++ "The memory buffer supports only one segment."); ++ return -1; ++ } + -+ # 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 ++ *ptrptr = membuf_obj->buffer; + -+ delete_breakpoints ++ return membuf_obj->length; +} + -+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 } ++static Py_ssize_t ++get_write_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) ++{ ++ return get_read_buffer (self, segment, ptrptr); ++} + -+ # 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 } ++static Py_ssize_t ++get_seg_count (PyObject *self, Py_ssize_t *lenp) ++{ ++ if (lenp) ++ *lenp = ((membuf_object *) self)->length; + -+ # 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 } ++ return 1; +} + -+# Start with a fresh gdb ++static Py_ssize_t ++get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr) ++{ ++ void *ptr = NULL; ++ Py_ssize_t ret; + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ ret = get_read_buffer (self, segment, &ptr); ++ *ptrptr = (char *) ptr; + -+# Execute the tests, using XML support -+do_syscall_tests ++ return ret; ++} + -+# Restart gdb ++/* 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 + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++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 ++}; + -+# 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; ++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 */ ++}; + -+ 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 () ++gdbpy_initialize_membuf (void) +{ -+ int i; ++ if (PyType_Ready (&membuf_object_type) < 0) ++ return; + -+ for (i = 0; i < NUM_CHARS; ++i) -+ ucs_4_string[i] = iso_8859_1_string[i] & 0xff; ++ Py_INCREF (&membuf_object_type); ++ PyModule_AddObject (gdb_module, "Membuf", (PyObject *) &membuf_object_type); +} -+ - 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 ---- 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 - gdb_test "help signal" "Continue program giving it signal.*" "help signal" - # test help source - # vxgdb reads .vxgdbinit --gdb_test "help source" "Read commands from a file named FILE\.\[\r\n\]+Optional -v switch \\(before the filename\\) causes each command in\[\r\n\]+FILE to be echoed as it is executed\.\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way\[\r\n\]+when GDB is started\." "help source" -+gdb_test "help source" "Read commands from a file named FILE\.\[\r\n\]+Optional -v switch \\(before the filename\\) causes each command in\[\r\n\]+FILE to be echoed as it is executed\.\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way\[\r\n\]+when GDB is started\.\[\r\n\]+Optional -p switch \\(before the filename\\) causes FILE to be evaluated\[\r\n\]+as Python code\." "help source" - # test help stack - test_class_help "stack" { - "Examining the stack\..*\[\r\n\]+" -diff --git a/gdb/testsuite/gdb.base/lineno-makeup-func.c b/gdb/testsuite/gdb.base/lineno-makeup-func.c +diff --git a/gdb/python/python-param.c b/gdb/python/python-param.c new file mode 100644 -index 0000000..1a0220e +index 0000000..1f591a8 --- /dev/null -+++ b/gdb/testsuite/gdb.base/lineno-makeup-func.c -@@ -0,0 +1,21 @@ -+/* This testcase is part of GDB, the GNU debugger. ++++ b/gdb/python/python-param.c +@@ -0,0 +1,606 @@ ++/* gdb parameters implemented in Python + -+ Copyright 2009 Free Software Foundation, Inc. ++ 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 @@ -36512,677 +14733,651 @@ index 0000000..1a0220e + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + -+void -+func (void) ++ ++#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" ++ ++/* Parameter constants and their values. */ ++struct parm_constant ++{ ++ char *name; ++ int value; ++}; ++ ++struct parm_constant parm_constants[] = ++{ ++ { "PARAM_BOOLEAN", var_boolean }, ++ { "PARAM_AUTO_BOOLEAN", var_auto_boolean }, ++ { "PARAM_UINTEGER", var_uinteger }, ++ { "PARAM_INTEGER", var_integer }, ++ { "PARAM_STRING", var_string }, ++ { "PARAM_STRING_NOESCAPE", var_string_noescape }, ++ { "PARAM_OPTIONAL_FILENAME", var_optional_filename }, ++ { "PARAM_FILENAME", var_filename }, ++ { "PARAM_ZINTEGER", var_zinteger }, ++ { "PARAM_ENUM", var_enum }, ++ { NULL, 0 } ++}; ++ ++/* A union that can hold anything described by enum var_types. */ ++union parmpy_variable ++{ ++ /* Hold an integer value, for boolean and integer types. */ ++ int intval; ++ ++ /* Hold an auto_boolean. */ ++ enum auto_boolean autoboolval; ++ ++ /* Hold an unsigned integer value, for uinteger. */ ++ unsigned int uintval; ++ ++ /* Hold a string, for the various string types. */ ++ char *stringval; ++ ++ /* Hold a string, for enums. */ ++ const char *cstringval; ++}; ++ ++/* A gdb parameter. */ ++struct parmpy_object ++{ ++ PyObject_HEAD ++ ++ /* The type of the parameter. */ ++ enum var_types type; ++ ++ /* The value of the parameter. */ ++ union parmpy_variable value; ++ ++ /* For an enum command, the possible values. The vector is ++ allocated with xmalloc, as is each element. It is ++ NULL-terminated. */ ++ const char **enumeration; ++}; ++ ++typedef struct parmpy_object parmpy_object; ++ ++static PyTypeObject parmpy_object_type; ++ ++/* Some handy string constants. */ ++static PyObject *set_doc_cst; ++static PyObject *show_doc_cst; ++ ++ ++ ++/* Get an attribute. */ ++static PyObject * ++get_attr (PyObject *obj, PyObject *attr_name) +{ ++ if (PyString_Check (attr_name) ++ && ! strcmp (PyString_AsString (attr_name), "value")) ++ { ++ parmpy_object *self = (parmpy_object *) obj; ++ return gdbpy_parameter_value (self->type, &self->value); ++ } ++ ++ return PyObject_GenericGetAttr (obj, attr_name); +} -diff --git a/gdb/testsuite/gdb.base/lineno-makeup.c b/gdb/testsuite/gdb.base/lineno-makeup.c -new file mode 100644 -index 0000000..bb20e98 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/lineno-makeup.c -@@ -0,0 +1,35 @@ -+/* This testcase is part of GDB, the GNU debugger. + -+ Copyright 2009 Free Software Foundation, Inc. ++/* Set a parameter value from a Python value. Return 0 on success, -1 ++ on failure. */ ++static int ++set_parameter_value (parmpy_object *self, PyObject *value) ++{ ++ int cmp; + -+ 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. ++ switch (self->type) ++ { ++ case var_string: ++ case var_string_noescape: ++ case var_optional_filename: ++ case var_filename: ++ if (! gdbpy_is_string (value) ++ && (self->type == var_filename ++ || value != Py_None)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "string required"); ++ return -1; ++ } ++ if (self->value.stringval) ++ xfree (self->value.stringval); ++ if (value == Py_None) ++ { ++ if (self->type == var_optional_filename) ++ self->value.stringval = xstrdup (""); ++ else ++ self->value.stringval = NULL; ++ } ++ else ++ self->value.stringval = python_string_to_host_string (value); ++ break; + -+ 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. ++ case var_enum: ++ { ++ int i; ++ char *str; + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ ++ if (! gdbpy_is_string (value)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "string required"); ++ return -1; ++ } + -+/* DW_AT_low_pc-DW_AT_high_pc should cover the function without line number -+ information (.debug_line) so we cannot use an external object file. -+ -+ It must not be just a label as it would alias on the next function even for -+ correct GDB. Therefore some stub data must be placed there. -+ -+ We need to provide a real stub function body as at least s390 -+ (s390_analyze_prologue) would skip the whole body till reaching `main'. */ ++ str = python_string_to_host_string (value); ++ for (i = 0; self->enumeration[i]; ++i) ++ if (! strcmp (self->enumeration[i], str)) ++ break; ++ xfree (str); ++ if (! self->enumeration[i]) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "value must be member of enumeration"); ++ return -1; ++ } ++ self->value.cstringval = self->enumeration[i]; ++ break; ++ } + -+extern void func (void); -+asm ("func: .incbin \"gdb.base/lineno-makeup-func.bin\""); ++ case var_boolean: ++ if (! PyBool_Check (value)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "boolean required"); ++ return -1; ++ } ++ cmp = PyObject_IsTrue (value); ++ if (cmp < 0) ++ return -1; ++ self->value.intval = cmp; ++ break; ++ ++ case var_auto_boolean: ++ if (! PyBool_Check (value) && value != Py_None) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "boolean or None required"); ++ return -1; ++ } ++ ++ if (value == Py_None) ++ self->value.autoboolval = AUTO_BOOLEAN_AUTO; ++ else ++ { ++ cmp = PyObject_IsTrue (value); ++ if (cmp < 0 ) ++ return -1; ++ if (cmp == 1) ++ self->value.autoboolval = AUTO_BOOLEAN_TRUE; ++ else ++ self->value.autoboolval = AUTO_BOOLEAN_FALSE; ++ ++ break; ++ } ++ ++ case var_integer: ++ case var_zinteger: ++ case var_uinteger: ++ { ++ long l; ++ int ok; ++ ++ if (! PyInt_Check (value)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "value must be integer"); ++ return -1; ++ } ++ ++ l = PyInt_AsLong (value); ++ if (self->type == var_uinteger) ++ { ++ ok = (l >= 0 && l <= UINT_MAX); ++ if (l == 0) ++ l = UINT_MAX; ++ } ++ else if (self->type == var_integer) ++ { ++ ok = (l >= INT_MIN && l <= INT_MAX); ++ if (l == 0) ++ l = INT_MAX; ++ } ++ else ++ ok = (l >= INT_MIN && l <= INT_MAX); ++ ++ if (! ok) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "range exceeded"); ++ return -1; ++ } ++ ++ self->value.intval = (int) l; ++ break; ++ } ++ ++ default: ++ PyErr_SetString (PyExc_RuntimeError, "programmer error: unhandled type"); ++ return -1; ++ } + -+int -+main (void) -+{ -+ func (); + return 0; +} -diff --git a/gdb/testsuite/gdb.base/lineno-makeup.exp b/gdb/testsuite/gdb.base/lineno-makeup.exp -new file mode 100644 -index 0000000..0c75b84 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/lineno-makeup.exp -@@ -0,0 +1,78 @@ -+# 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 "lineno-makeup" -+set srcfuncfile ${testfile}-func.c -+set srcfile ${testfile}.c -+set objfuncfile ${objdir}/${subdir}/${testfile}-func.o -+set binfuncfile ${objdir}/${subdir}/${testfile}-func.bin -+set binfile ${objdir}/${subdir}/${testfile} ++/* Set an attribute. */ ++static int ++set_attr (PyObject *obj, PyObject *attr_name, PyObject *val) ++{ ++ if (PyString_Check (attr_name) ++ && ! strcmp (PyString_AsString (attr_name), "value")) ++ { ++ if (!val) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "cannot delete a parameter's value"); ++ return -1; ++ } ++ return set_parameter_value ((parmpy_object *) obj, val); ++ } + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfuncfile}" "${objfuncfile}" object {}] != "" } { -+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." ++ return PyObject_GenericSetAttr (obj, attr_name, val); +} + -+set objcopy [catch "exec objcopy -O binary --only-section .text ${objfuncfile} ${binfuncfile}" output] -+verbose -log "objcopy=$objcopy: $output" -+if { $objcopy != 0 } { -+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -+} -+set binfuncfilesize [file size $binfuncfile] -+verbose -log "file size $binfuncfile = $binfuncfilesize" ++ + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -+} ++/* A helper function that dispatches to the appropriate add_setshow ++ function. */ ++static void ++add_setshow_generic (int parmclass, enum command_class cmdclass, ++ char *cmd_name, parmpy_object *self, ++ char *set_doc, char *show_doc, char *help_doc, ++ struct cmd_list_element **set_list, ++ struct cmd_list_element **show_list) ++{ ++ switch (parmclass) ++ { ++ case var_boolean: ++ add_setshow_boolean_cmd (cmd_name, cmdclass, &self->value.intval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ case var_auto_boolean: ++ add_setshow_auto_boolean_cmd (cmd_name, cmdclass, ++ &self->value.autoboolval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + -+set b_addr "" -+set test "break func" -+gdb_test_multiple $test $test { -+ -re "Breakpoint \[0-9\]+ at (0x\[0-9a-f\]+)\r\n$gdb_prompt $" { -+ set b_addr $expect_out(1,string) -+ pass $test -+ } -+ -re "Breakpoint \[0-9\]+ at (0x\[0-9a-f\]+): .*\r\n$gdb_prompt $" { -+ set b_addr $expect_out(1,string) -+ fail $test -+ } -+} -+verbose -log "b_addr=<$b_addr>" ++ case var_uinteger: ++ add_setshow_uinteger_cmd (cmd_name, cmdclass, &self->value.uintval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + -+set p_addr "" -+set test "print func" -+gdb_test_multiple $test $test { -+ -re "\\$\[0-9\]+ = {} (0x\[0-9a-f\]+) \r\n$gdb_prompt $" { -+ set p_addr $expect_out(1,string) -+ pass $test -+ } -+} -+verbose -log "p_addr=<$p_addr>" ++ case var_integer: ++ add_setshow_integer_cmd (cmd_name, cmdclass, &self->value.intval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + -+set test "break address belongs to func" -+if {$b_addr == $p_addr} { -+ pass "$test (exact match)" -+} else { -+ set skip [expr $b_addr - $p_addr] -+ if {$skip > 0 && $skip < $binfuncfilesize} { -+ pass "$test (prologue skip by $skip bytes)" -+ } else { -+ 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 ---- 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*] { - lappend options additional_flags=-g3 - } - -+# Workaround ccache making lineno non-zero for command-line definitions. -+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" -+ } -+} ++ case var_string: ++ add_setshow_string_cmd (cmd_name, cmdclass, &self->value.stringval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + - # 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} { - - 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" ++ case var_string_noescape: ++ add_setshow_string_noescape_cmd (cmd_name, cmdclass, ++ &self->value.stringval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + - 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 } -+ } -+ } ++ case var_optional_filename: ++ add_setshow_optional_filename_cmd (cmd_name, cmdclass, ++ &self->value.stringval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; + -+ 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" ++ case var_filename: ++ add_setshow_filename_cmd (cmd_name, cmdclass, &self->value.stringval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; ++ ++ case var_zinteger: ++ add_setshow_zinteger_cmd (cmd_name, cmdclass, &self->value.intval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ break; ++ ++ case var_enum: ++ add_setshow_enum_cmd (cmd_name, cmdclass, self->enumeration, ++ &self->value.cstringval, ++ set_doc, show_doc, help_doc, ++ NULL, NULL, set_list, show_list); ++ /* Initialize the value, just in case. */ ++ self->value.cstringval = self->enumeration[0]; ++ break; + } +} - - # 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" "" "" -- --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. ++/* A helper which computes enum values. Returns 1 on success, 0 on ++ error. */ ++static int ++compute_enum_values (parmpy_object *self, PyObject *enum_values) ++{ ++ Py_ssize_t size, i; + -+ 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. ++ if (! enum_values) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "enumeration required for PARAM_ENUM"); ++ return 0; ++ } + -+ 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. ++ if (! PySequence_Check (enum_values)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "enumeration is not a sequence"); ++ return 0; ++ } + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ ++ size = PySequence_Size (enum_values); ++ if (size < 0) ++ return 0; ++ if (size == 0) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "empty enumeration"); ++ return 0; ++ } + -+#include ++ self->enumeration = xmalloc ((size + 1) * sizeof (char *)); ++ memset (self->enumeration, 0, (size + 1) * sizeof (char *)); + -+static TYPE -+init (void) -+{ -+ return 0; -+} ++ for (i = 0; i < size; ++i) ++ { ++ PyObject *item = PySequence_GetItem (enum_values, i); ++ if (! item) ++ return 0; ++ if (! gdbpy_is_string (item)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "enumeration item not a string"); ++ return 0; ++ } ++ self->enumeration[i] = python_string_to_host_string (item); ++ } + -+static TYPE -+func (void) -+{ -+ return 31; ++ return 1; +} + -+static void -+marker (void) ++/* A helper function which returns a documentation string for an ++ object. */ ++static char * ++get_doc_string (PyObject *object, PyObject *attr) +{ ++ char *result = NULL; ++ if (PyObject_HasAttr (object, attr)) ++ { ++ PyObject *ds_obj = PyObject_GetAttr (object, attr); ++ if (ds_obj && gdbpy_is_string (ds_obj)) ++ result = python_string_to_host_string (ds_obj); ++ } ++ if (! result) ++ result = xstrdup ("This command is not documented."); ++ return result; +} + -+int -+main (void) -+{ -+ /* Preinitialize registers to 0 to avoid false PASS by leftover garbage. */ -+ init (); ++/* Object initializer; sets up gdb-side structures for command. + -+ printf ("result=" FORMAT "\n", CAST func ()); ++ Use: __init__(NAME, CMDCLASS, PARMCLASS, [ENUM]) + -+ /* Cannot `next' with no debug info. */ -+ marker (); ++ NAME is the name of the parameter. 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. + -+ 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. ++ CMDCLASS is the kind of command. It should be one of the COMMAND_* ++ constants defined in the gdb module. + -+# 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 . ++ PARMCLASS is the type of the parameter. It should be one of the ++ PARAM_* constants defined in the gdb module. + -+proc do_test {type} { -+ set typenospace [string map {{ } -} $type] ++ If PARMCLASS is PARAM_ENUM, then the final argument should be a ++ collection of strings. These strings are the valid values for this ++ parameter. + -+ global pf_prefix -+ set old_prefix $pf_prefix -+ lappend pf_prefix "$typenospace:" ++ The documentation for the parameter is taken from the doc string ++ for the python class. ++ ++*/ ++static int ++parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) ++{ ++ parmpy_object *obj = (parmpy_object *) self; ++ char *name; ++ char *set_doc, *show_doc, *doc; ++ char *cmd_name; ++ int parmclass, cmdtype; ++ PyObject *enum_values = NULL; ++ struct cmd_list_element *cmd_list; ++ struct cmd_list_element **set_list, **show_list; ++ volatile struct gdb_exception except; + -+ 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'. ++ if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass, ++ &enum_values)) ++ return -1; + -+ 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" ++ if (cmdtype != no_class && cmdtype != class_run ++ && cmdtype != class_vars && cmdtype != class_stack ++ && cmdtype != class_files && cmdtype != class_support ++ && cmdtype != class_info && cmdtype != class_breakpoint ++ && cmdtype != class_trace && cmdtype != class_obscure ++ && cmdtype != class_maintenance) ++ { ++ PyErr_Format (PyExc_RuntimeError, "invalid command class argument"); ++ return -1; ++ } + -+ # 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" ++ if (parmclass != var_boolean && parmclass != var_auto_boolean ++ && parmclass != var_uinteger && parmclass != var_integer ++ && parmclass != var_string && parmclass != var_string_noescape ++ && parmclass != var_optional_filename && parmclass != var_filename ++ && parmclass != var_zinteger && parmclass != var_enum) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "invalid parameter class argument"); ++ return -1; ++ } + -+ # 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" ++ if (enum_values && parmclass != var_enum) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "only PARAM_ENUM accepts a fourth argument"); ++ return -1; ++ } ++ if (parmclass == var_enum) ++ { ++ if (! compute_enum_values (obj, enum_values)) ++ return -1; + } + -+ set pf_prefix $old_prefix ++ obj->type = (enum var_types) parmclass; ++ memset (&obj->value, 0, sizeof (obj->value)); ++ obj->enumeration = NULL; ++ ++ cmd_name = gdbpy_parse_command_name (name, &set_list, &setlist); ++ if (! cmd_name) ++ return -1; ++ xfree (cmd_name); ++ cmd_name = gdbpy_parse_command_name (name, &show_list, &showlist); ++ if (! cmd_name) ++ return -1; ++ ++ /* FIXME: there is no way to register a destructor function for ++ set/show commands. So, these are leaked. */ ++ set_doc = get_doc_string (self, set_doc_cst); ++ show_doc = get_doc_string (self, show_doc_cst); ++ doc = get_doc_string (self, gdbpy_doc_cst); ++ ++ Py_INCREF (self); ++ ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ add_setshow_generic (parmclass, (enum command_class) cmdtype, ++ cmd_name, obj, ++ set_doc, show_doc, ++ doc, set_list, show_list); ++ } ++ if (except.reason < 0) ++ { ++ xfree (cmd_name); ++ xfree (set_doc); ++ xfree (show_doc); ++ xfree (doc); ++ Py_DECREF (self); ++ PyErr_Format (except.reason == RETURN_QUIT ++ ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, ++ "%s", except.message); ++ return -1; ++ } ++ return 0; +} + -+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] ++ ++ ++/* Initialize the 'parameters' module. */ ++void ++gdbpy_initialize_parameters (void) ++{ ++ int i; ++ ++ if (PyType_Ready (&parmpy_object_type) < 0) ++ return; + -+ set typeesc [string map {{ } {\ }} $type] -+ set typenospace [string map {{ } -} $type] ++ set_doc_cst = PyString_FromString ("set_doc"); ++ if (! set_doc_cst) ++ return; ++ show_doc_cst = PyString_FromString ("show_doc"); ++ if (! show_doc_cst) ++ return; + -+ 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 ++ for (i = 0; parm_constants[i].name; ++i) ++ { ++ if (PyModule_AddIntConstant (gdb_module, ++ parm_constants[i].name, ++ parm_constants[i].value) < 0) ++ return; + } ++ ++ Py_INCREF (&parmpy_object_type); ++ PyModule_AddObject (gdb_module, "Parameter", ++ (PyObject *) &parmpy_object_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}" ++ ++ ++ ++static PyTypeObject parmpy_object_type = ++{ ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Parameter", /*tp_name*/ ++ sizeof (parmpy_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*/ ++ get_attr, /*tp_getattro*/ ++ set_attr, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ ++ "GDB parameter 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 */ ++ parmpy_init, /* tp_init */ ++ 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; --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" -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 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/valgrind-attach.c -@@ -0,0 +1,28 @@ -+/* This testcase is part of GDB, the GNU debugger. +- 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..03d43c1 +--- /dev/null ++++ b/gdb/python/python-symbol.c +@@ -0,0 +1,336 @@ ++/* Python interface to symbols. + -+ Copyright 2009 Free Software Foundation, Inc. ++ 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 @@ -37197,302 +15392,334 @@ index 0000000..84b57db + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + -+#include -+ -+int -+main (void) -+{ -+ int *a = malloc (1); -+ -+ a[10] = 0; /* crash-here */ -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/valgrind-attach.exp b/gdb/testsuite/gdb.base/valgrind-attach.exp -new file mode 100644 -index 0000000..1f9b26e ---- /dev/null -+++ b/gdb/testsuite/gdb.base/valgrind-attach.exp -@@ -0,0 +1,94 @@ -+# 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 "defs.h" ++#include "block.h" ++#include "exceptions.h" ++#include "frame.h" ++#include "symtab.h" ++#include "python-internal.h" + -+set testfile valgrind-attach -+set shfile ${testfile}.sh -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} ++typedef struct { ++ PyObject_HEAD ++ struct symbol *symbol; ++} symbol_object; + -+gdb_exit -+gdb_stop_suppressing_tests; + -+set VALGRIND "valgrind" ++static PyObject * ++sympy_str (PyObject *self) ++{ ++ int ret; ++ char *s; ++ PyObject *result; + -+# Syntax for ${shfile} is: -+set VALGRIND_SPAWN "sh ${srcdir}/${subdir}/${shfile} $binfile $VALGRIND $GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]" ++ ret = asprintf (&s, "symbol for %s", ++ SYMBOL_PRINT_NAME (((symbol_object *) self)->symbol)); ++ if (ret < 0) ++ Py_RETURN_NONE; + -+set test "spawn valgrind" -+verbose "Spawning $VALGRIND_SPAWN" ++ result = PyString_FromString (s); ++ xfree (s); + -+if [info exists gdb_spawn_id] { -+ fail $test -+ return -1 ++ return result; +} + -+if ![is_remote host] { -+ if { [which $VALGRIND] == 0 } then { -+ untested "Couldn't find $VALGRIND" -+ return -1 -+ } -+} -+set res [remote_spawn host "$VALGRIND_SPAWN"] -+if { $res < 0 || $res == "" } { -+ perror "Spawning $VALGRIND_SPAWN failed." -+ return -1 -+} -+set gdb_spawn_id -1; ++static PyObject * ++sympy_get_value (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; + -+gdb_expect { -+ -re "---- Attach to debugger \\? --- \\\[Return/N/n/Y/y/C/c\\\] ---- $" { -+ pass $test -+ } -+ eof { -+ perror "(eof) $VALGRIND never initialized" -+ remote_close host -+ return -1 -+ } -+ timeout { -+ perror "(timeout) $VALGRIND never initialized" -+ remote_close host -+ return -1 ++ switch (SYMBOL_CLASS (self_sym->symbol)) ++ { ++ case LOC_BLOCK: ++ return block_to_block_object (SYMBOL_BLOCK_VALUE (self_sym->symbol)); + } -+} -+send_gdb "y\n" + -+set test "spawn gdb" -+set test2 "crash line caught" -+gdb_expect { -+ -re "starting debugger with cmd:.* in main .* crash-here .*\[\r\n\]$gdb_prompt $" { -+ pass $test -+ pass $test2 -+ } -+ -re "starting debugger with cmd:.*\[\r\n\]$gdb_prompt $" { -+ pass $test -+ fail $test2 -+ } -+ eof { -+ perror "(eof) $GDB never initialized" -+ remote_close host -+ return -1 -+ } -+ timeout { -+ perror "(timeout) $GDB never initialized" -+ remote_close host -+ return -1 -+ } ++ PyErr_SetString (PyExc_NotImplementedError, ++ "Symbol type not yet supported in Python scripts."); ++ return NULL; +} + -+remote_close host -diff --git a/gdb/testsuite/gdb.base/valgrind-attach.sh b/gdb/testsuite/gdb.base/valgrind-attach.sh -new file mode 100755 -index 0000000..f02c6f7 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/valgrind-attach.sh -@@ -0,0 +1,20 @@ -+#! /bin/sh -+ -+# 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 . -+ -+BINFILE="$1"; shift -+VALGRIND="$1"; shift -+"$VALGRIND" --db-attach=yes --db-command="$* %f %p" "$BINFILE" -diff --git a/gdb/testsuite/gdb.base/vla-overflow.c b/gdb/testsuite/gdb.base/vla-overflow.c -new file mode 100644 -index 0000000..c5d5ee0 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/vla-overflow.c -@@ -0,0 +1,30 @@ -+/* This testcase is part of GDB, the GNU debugger. ++static PyObject * ++sympy_get_symtab (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; + -+ Copyright 2008 Free Software Foundation, Inc. ++ return symtab_to_symtab_object (SYMBOL_SYMTAB (self_sym->symbol)); ++} + -+ 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. ++static PyObject * ++sympy_get_name (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; + -+ 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. ++ return PyString_FromString (SYMBOL_NATURAL_NAME (self_sym->symbol)); ++} + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ ++static PyObject * ++sympy_get_linkage_name (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; + -+#include ++ return PyString_FromString (SYMBOL_LINKAGE_NAME (self_sym->symbol)); ++} + -+int -+main (int argc, char **argv) ++static PyObject * ++sympy_get_print_name (PyObject *self, void *closure) +{ -+ int array[argc]; ++ symbol_object *self_sym = (symbol_object *) self; + -+ array[0] = array[0]; ++ return PyString_FromString (SYMBOL_PRINT_NAME (self_sym->symbol)); ++} + -+ abort (); ++static PyObject * ++sympy_get_addr_class (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; + -+ return 0; ++ return PyInt_FromLong (SYMBOL_CLASS (self_sym->symbol)); +} -diff --git a/gdb/testsuite/gdb.base/vla-overflow.exp b/gdb/testsuite/gdb.base/vla-overflow.exp -new file mode 100644 -index 0000000..7203a48 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/vla-overflow.exp -@@ -0,0 +1,108 @@ -+# 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 . ++static PyObject * ++sympy_is_argument (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; + -+# We could crash in: -+# #0 block_linkage_function (bl=0x0) at ../../gdb/block.c:69 -+# #1 in dwarf_block_get_frame_base (...) at ../../gdb/dwarf2block.c:97 -+# 97 framefunc = block_linkage_function (get_frame_block (frame, NULL)); -+# #2 in execute_stack_op (...) at ../../gdb/dwarf2expr.c:496 -+# #3 in dwarf_block_exec_core () at ../../gdb/dwarf2block.c:156 -+# #4 dwarf_block_exec (...) at ../../gdb/dwarf2block.c:206 -+# #5 in range_type_count_bound_internal (...) at ../../gdb/gdbtypes.c:1430 -+# #6 in create_array_type (...) at ../../gdb/gdbtypes.c:840 -+# ... -+# #21 in psymtab_to_symtab (...) at ../../gdb/symfile.c:292 -+# ... -+# #29 in backtrace_command_1 () at ../../gdb/stack.c:1273 ++ return PyBool_FromLong (SYMBOL_IS_ARGUMENT (self_sym->symbol)); ++} + -+set testfile vla-overflow -+set shfile ${objdir}/${subdir}/${testfile}-gdb.sh -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 ++static PyObject * ++sympy_is_constant (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; ++ enum address_class class = SYMBOL_CLASS (self_sym->symbol); ++ ++ return PyBool_FromLong (class == LOC_CONST || class == LOC_CONST_BYTES); +} + -+set f [open "|getconf PAGESIZE" "r"] -+gets $f pagesize -+close $f ++static PyObject * ++sympy_is_function (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; ++ enum address_class class = SYMBOL_CLASS (self_sym->symbol); + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ return PyBool_FromLong (class == LOC_BLOCK); ++} + -+set pid_of_gdb [exp_pid -i [board_info host fileid]] ++static PyObject * ++sympy_is_variable (PyObject *self, void *closure) ++{ ++ symbol_object *self_sym = (symbol_object *) self; ++ enum address_class class = SYMBOL_CLASS (self_sym->symbol); + -+if { [runto_main] < 0 } { -+ untested vla-overflow -+ return -1 ++ return PyBool_FromLong (!SYMBOL_IS_ARGUMENT (self_sym->symbol) ++ && (class == LOC_LOCAL || class == LOC_REGISTER || class == LOC_STATIC ++ || class == LOC_COMPUTED || class == LOC_OPTIMIZED_OUT)); +} + -+# Get the GDB memory size when we stay at main. ++PyObject * ++symbol_to_symbol_object (struct symbol *sym) ++{ ++ symbol_object *sym_obj; + -+proc memory_v_pages_get {} { -+ global pid_of_gdb pagesize -+ set fd [open "/proc/$pid_of_gdb/statm"] -+ gets $fd line -+ close $fd -+ # number of pages of virtual memory -+ scan $line "%d" drs -+ return $drs ++ sym_obj = PyObject_New (symbol_object, &symbol_object_type); ++ if (sym_obj == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, "Could not allocate symbol object."); ++ return NULL; ++ } ++ ++ sym_obj->symbol = sym; ++ ++ return (PyObject *) sym_obj; +} + -+set pages_found [memory_v_pages_get] ++struct symbol * ++symbol_object_to_symbol (PyObject *obj) ++{ ++ if (! PyObject_TypeCheck (obj, &symbol_object_type)) ++ return NULL; ++ return ((symbol_object *) obj)->symbol; ++} + -+set mb_reserve 10 -+verbose -log "pages_found = $pages_found, mb_reserve = $mb_reserve" -+set kb_found [expr $pages_found * $pagesize / 1024] -+set kb_permit [expr $kb_found + 1 * 1024 + $mb_reserve * 1024] -+verbose -log "kb_found = $kb_found, kb_permit = $kb_permit" ++/* Implementation of ++ gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this) ++ A tuple with 2 elements is always returned. The first is the symbol ++ object or None, the second is a boolean with the value of ++ is_a_field_of_this (see comment in lookup_symbol_in_language). */ + -+# Create the ulimit wrapper. -+set f [open $shfile "w"] -+puts $f "#! /bin/sh" -+puts $f "ulimit -v $kb_permit" -+puts $f "exec $GDB \"\$@\"" -+close $f -+remote_exec host "chmod +x $shfile" ++PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) ++{ ++ int domain = VAR_DOMAIN, is_a_field_of_this = 0; ++ const char *name; ++ static char *keywords[] = { "name", "block", "domain", NULL }; ++ struct symbol *symbol; ++ PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj; ++ struct block *block = NULL; + -+gdb_exit -+set GDBold $GDB -+set GDB "$shfile" -+gdb_start -+set GDB $GDBold ++ if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name, ++ &block_object_type, &block_obj, &domain)) ++ return NULL; + -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ if (block_obj) ++ block = block_object_to_block (block_obj); ++ else ++ { ++ struct frame_info *selected_frame; ++ volatile struct gdb_exception except; + -+set pid_of_gdb [exp_pid -i [board_info host fileid]] ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ selected_frame = get_selected_frame (_("No frame selected.")); ++ block = block_for_pc (get_frame_address_in_block (selected_frame)); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); ++ } + -+# Check the size again after the second run. -+# We must not stop in main as it would cache `array' and never crash later. ++ symbol = lookup_symbol (name, block, domain, &is_a_field_of_this); + -+gdb_run_cmd ++ ret_tuple = PyTuple_New (2); ++ if (!ret_tuple) ++ { ++ PyErr_SetString (PyExc_MemoryError, "Could not allocate tuple object."); ++ return NULL; ++ } + -+verbose -log "kb_found before abort() = [expr [memory_v_pages_get] * $pagesize / 1024]" ++ if (symbol) ++ { ++ sym_obj = symbol_to_symbol_object (symbol); ++ if (!sym_obj) ++ { ++ Py_DECREF (ret_tuple); ++ return NULL; ++ } ++ } ++ else ++ { ++ sym_obj = Py_None; ++ Py_INCREF (Py_None); ++ } ++ PyTuple_SET_ITEM (ret_tuple, 0, sym_obj); + -+gdb_test "" "Program received signal SIGABRT, Aborted..*" "Enter abort()" ++ bool_obj = is_a_field_of_this? Py_True : Py_False; ++ Py_INCREF (bool_obj); ++ PyTuple_SET_ITEM (ret_tuple, 1, bool_obj); + -+verbose -log "kb_found in abort() = [expr [memory_v_pages_get] * $pagesize / 1024]" ++ return ret_tuple; ++} + -+# `abort' can get expressed as `*__GI_abort'. -+gdb_test "bt" "in \[^ \]*abort \\(.* in main \\(.*" "Backtrace after abort()" ++void ++gdbpy_initialize_symbols (void) ++{ ++ if (PyType_Ready (&symbol_object_type) < 0) ++ return; + -+verbose -log "kb_found in bt after abort() = [expr [memory_v_pages_get] * $pagesize / 1024]" -diff --git a/gdb/testsuite/gdb.base/vla.c b/gdb/testsuite/gdb.base/vla.c ++ /* FIXME: These would probably be best exposed as class attributes of Symbol, ++ but I don't know how to do it except by messing with the type's dictionary. ++ That seems too messy. */ ++ /* FIXME 2: Some of these were removed from GDB since I first wrote this code, ++ so it's probably a good idea not to expose them to Python. */ ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST", LOC_CONST); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC", LOC_STATIC); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER", LOC_REGISTER); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG", LOC_ARG); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG", LOC_REF_ARG); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL", LOC_LOCAL); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF", LOC_TYPEDEF); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL", LOC_LABEL); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK", LOC_BLOCK); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES", ++ LOC_CONST_BYTES); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED", LOC_UNRESOLVED); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT", ++ LOC_OPTIMIZED_OUT); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED", LOC_COMPUTED); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR", ++ LOC_REGPARM_ADDR); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_UNDEF_DOMAIN", UNDEF_DOMAIN); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_VAR_DOMAIN", VAR_DOMAIN); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_STRUCT_DOMAIN", STRUCT_DOMAIN); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_LABEL_DOMAIN", LABEL_DOMAIN); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_VARIABLES_DOMAIN", ++ VARIABLES_DOMAIN); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_FUNCTIONS_DOMAIN", ++ FUNCTIONS_DOMAIN); ++ PyModule_AddIntConstant (gdb_module, "SYMBOL_TYPES_DOMAIN", TYPES_DOMAIN); ++ ++ Py_INCREF (&symbol_object_type); ++ PyModule_AddObject (gdb_module, "Symbol", (PyObject *) &symbol_object_type); ++} ++ ++ ++ ++static PyGetSetDef symbol_object_getset[] = { ++ { "value", sympy_get_value, NULL, "Value of the symbol.", NULL }, ++ { "symtab", sympy_get_symtab, NULL, ++ "Symbol table in which the symbol appears.", NULL }, ++ { "name", sympy_get_name, NULL, ++ "Name of the symbol, as it appears in the source code.", NULL }, ++ { "linkage_name", sympy_get_linkage_name, NULL, ++ "Name of the symbol, as used by the linker (i.e., may be mangled).", NULL }, ++ { "print_name", sympy_get_print_name, NULL, ++ "Name of the symbol in a form suitable for output.\n\ ++This is either name or linkage_name, depending on whether the user asked GDB\n\ ++to display demangled or mangled names.", NULL }, ++ { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." }, ++ { "is_argument", sympy_is_argument, NULL, ++ "True if the symbol is an argument of a function." }, ++ { "is_constant", sympy_is_constant, NULL, ++ "True if the symbol is a constant." }, ++ { "is_function", sympy_is_function, NULL, ++ "True if the symbol is a function or method." }, ++ { "is_variable", sympy_is_variable, NULL, ++ "True if the symbol is a variable." }, ++ { NULL } /* Sentinel */ ++}; ++ ++PyTypeObject symbol_object_type = { ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Symbol", /*tp_name*/ ++ sizeof (symbol_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*/ ++ sympy_str, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT, /*tp_flags*/ ++ "GDB symbol 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 */ ++ symbol_object_getset /* tp_getset */ ++}; +diff --git a/gdb/python/python-symtab.c b/gdb/python/python-symtab.c new file mode 100644 -index 0000000..e1f3ed1 +index 0000000..830e586 --- /dev/null -+++ b/gdb/testsuite/gdb.base/vla.c -@@ -0,0 +1,55 @@ -+/* This testcase is part of GDB, the GNU debugger. ++++ b/gdb/python/python-symtab.c +@@ -0,0 +1,322 @@ ++/* Python interface to symbol tables. + -+ Copyright 2008 Free Software Foundation, Inc. ++ 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 @@ -37507,1682 +15734,3860 @@ index 0000000..e1f3ed1 + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + -+#include ++#include "defs.h" ++#include "charset.h" ++#include "symtab.h" ++#include "source.h" ++#include "python-internal.h" + -+void -+marker (void) ++typedef struct { ++ PyObject_HEAD ++ struct symtab *symtab; ++} symtab_object; ++ ++static PyTypeObject symtab_object_type; ++ ++typedef struct { ++ PyObject_HEAD ++ symtab_object *symtab; ++ struct symtab_and_line *sal; ++} sal_object; ++ ++static PyTypeObject sal_object_type; ++ ++ ++static PyObject * ++stpy_str (PyObject *self) +{ ++ int ret; ++ char *s; ++ PyObject *result; ++ ++ ret = asprintf (&s, "symbol table for %s", ++ ((symtab_object *) self)->symtab->filename); ++ if (ret < 0) ++ Py_RETURN_NONE; ++ ++ result = PyString_FromString (s); ++ xfree (s); ++ ++ return result; +} + -+void -+bar (char *a, char *b, char *c, int size) ++static PyObject * ++stpy_get_filename (PyObject *self, void *closure) +{ -+ memset (a, '1', size); -+ memset (b, '2', size); -+ memset (c, '3', 48); ++ symtab_object *self_symtab = (symtab_object *) self; ++ PyObject *str_obj; ++ ++ /* FIXME: Can symtab->filename really be NULL? */ ++ if (self_symtab->symtab->filename) ++ str_obj = PyString_Decode (self_symtab->symtab->filename, ++ strlen (self_symtab->symtab->filename), ++ host_charset (), NULL); ++ else ++ { ++ str_obj = Py_None; ++ Py_INCREF (Py_None); ++ } ++ ++ return str_obj; +} + -+void -+foo (int size) ++static PyObject * ++stpy_get_objfile (PyObject *self, void *closure) +{ -+ char temp1[size]; -+ char temp3[48]; ++ symtab_object *self_symtab = (symtab_object *) self; ++ PyObject *result = objfile_to_objfile_object (self_symtab->symtab->objfile); ++ Py_INCREF (result); ++ return result; ++} + -+ temp1[size - 1] = '\0'; -+ { -+ char temp2[size]; ++static PyObject * ++stpy_fullname (PyObject *self, PyObject *args) ++{ ++ char *fullname; + -+ bar (temp1, temp2, temp3, size); ++ fullname = symtab_to_fullname (((symtab_object *) self)->symtab); ++ if (fullname) ++ return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL); + -+ marker (); /* break-here */ -+ } ++ Py_RETURN_NONE; +} + -+int -+main (void) ++static PyObject * ++salpy_str (PyObject *self) +{ -+ foo (26); -+ foo (78); -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/vla.exp b/gdb/testsuite/gdb.base/vla.exp -new file mode 100644 -index 0000000..5da7378 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/vla.exp -@@ -0,0 +1,62 @@ -+# Copyright 2008 Free Software Foundation, Inc. ++ int ret; ++ char *s, *filename; ++ sal_object *sal_obj; ++ PyObject *result; + -+# 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 . ++ sal_obj = (sal_object *) self; ++ filename = (sal_obj->symtab == (symtab_object *) Py_None)? "" : ++ sal_obj->symtab->symtab->filename; ++ ret = asprintf (&s, "symbol and line for %s, line %d", filename, ++ sal_obj->sal->line); ++ if (ret < 0) ++ Py_RETURN_NONE; + -+set testfile vla -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} ++ result = PyString_FromString (s); ++ xfree (s); + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ return result; ++} + -+if ![runto_main] { -+ untested vla -+ return -1 ++static PyObject * ++salpy_get_pc (PyObject *self, void *closure) ++{ ++ return PyLong_FromUnsignedLongLong (((sal_object *) self)->sal->pc); +} + -+gdb_breakpoint [gdb_get_line_number "break-here"] ++static PyObject * ++salpy_get_line (PyObject *self, void *closure) ++{ ++ return PyLong_FromUnsignedLongLong (((sal_object *) self)->sal->line); ++} + -+gdb_continue_to_breakpoint "break-here" ++static PyObject * ++salpy_get_symtab (PyObject *self, void *closure) ++{ ++ sal_object *self_sal = (sal_object *) self; + -+gdb_test "whatis temp1" "type = char \\\[variable\\\]" "first: whatis temp1" -+gdb_test "whatis temp2" "type = char \\\[variable\\\]" "first: whatis temp2" -+gdb_test "whatis temp3" "type = char \\\[48\\\]" "first: whatis temp3" ++ Py_INCREF (self_sal->symtab); + -+gdb_test "ptype temp1" "type = char \\\[26\\\]" "first: ptype temp1" -+gdb_test "ptype temp2" "type = char \\\[26\\\]" "first: ptype temp2" -+gdb_test "ptype temp3" "type = char \\\[48\\\]" "first: ptype temp3" ++ return (PyObject *) self_sal->symtab; ++} + -+gdb_test "p temp1" " = '1' " "first: print temp1" -+gdb_test "p temp2" " = '2' " "first: print temp2" -+gdb_test "p temp3" " = '3' " "first: print temp3" ++static void ++salpy_dealloc (PyObject *self) ++{ ++ sal_object *self_sal = (sal_object *) self; + -+gdb_continue_to_breakpoint "break-here" ++ Py_DECREF (self_sal->symtab); ++ xfree (self_sal->sal); ++ self_sal->ob_type->tp_free (self); ++} + -+gdb_test "whatis temp1" "type = char \\\[variable\\\]" "second: whatis temp1" -+gdb_test "whatis temp2" "type = char \\\[variable\\\]" "second: whatis temp2" -+gdb_test "whatis temp3" "type = char \\\[48\\\]" "second: whatis temp3" ++PyObject * ++symtab_and_line_to_sal_object (struct symtab_and_line sal) ++{ ++ sal_object *sal_obj; ++ symtab_object *symtab_obj; + -+gdb_test "ptype temp1" "type = char \\\[78\\\]" "second: ptype temp1" -+gdb_test "ptype temp2" "type = char \\\[78\\\]" "second: ptype temp2" -+gdb_test "ptype temp3" "type = char \\\[48\\\]" "second: ptype temp3" ++ sal_obj = PyObject_New (sal_object, &sal_object_type); ++ if (sal_obj == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, ++ "Could not allocate Symtab_and_line object."); ++ return NULL; ++ } + -+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. ++ if (sal.symtab) ++ { ++ symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab); ++ if (symtab_obj == NULL) ++ { ++ Py_DECREF (sal_obj); ++ return NULL; ++ } + -+ Copyright 2008 Free Software Foundation, Inc. ++ symtab_obj->symtab = sal.symtab; ++ } ++ else ++ { ++ symtab_obj = (symtab_object *) Py_None; ++ Py_INCREF (Py_None); ++ } + -+ 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. ++ sal_obj->sal = (struct symtab_and_line *) ++ xmalloc (sizeof (struct symtab_and_line)); ++ *(sal_obj->sal) = sal; ++ sal_obj->symtab = symtab_obj; + -+ 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. ++ return (PyObject *) sal_obj; ++} + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ */ ++PyObject * ++symtab_to_symtab_object (struct symtab *symtab) ++{ ++ symtab_object *symtab_obj; ++ ++ symtab_obj = PyObject_New (symtab_object, &symtab_object_type); ++ if (symtab_obj == NULL) ++ { ++ PyErr_SetString (PyExc_MemoryError, ++ "Could not allocate Symtab object."); + -+extern void f (int *); ++ return NULL; ++ } + -+class A -+{ -+public: -+ A(int i); -+}; ++ symtab_obj->symtab = symtab; + -+A::A(int i) -+{ -+ static int *problem = new int(i); -+ f (problem); /* break-here */ ++ return (PyObject *) symtab_obj; +} + -+void f (int *) ++void ++gdbpy_initialize_symtabs (void) +{ -+} ++ symtab_object_type.tp_new = PyType_GenericNew; ++ if (PyType_Ready (&symtab_object_type) < 0) ++ return; + -+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. ++ sal_object_type.tp_new = PyType_GenericNew; ++ if (PyType_Ready (&sal_object_type) < 0) ++ return; + -+# 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 . ++ Py_INCREF (&symtab_object_type); ++ PyModule_AddObject (gdb_module, "Symtab", (PyObject *) &symtab_object_type); + -+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 ++ Py_INCREF (&sal_object_type); ++ PyModule_AddObject (gdb_module, "Symtab_and_line", ++ (PyObject *) &sal_object_type); +} + -+# Get things started. ++ + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++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 */ ++}; + -+if ![runto_main] { -+ untested abstract-origin -+ return -1 -+} ++static PyMethodDef symtab_object_methods[] = { ++ { "fullname", stpy_fullname, METH_NOARGS, ++ "Return the symtab's full source filename." }, ++ {NULL} /* Sentinel */ ++}; + -+gdb_breakpoint [gdb_get_line_number "break-here"] -+gdb_continue_to_breakpoint "break-here" ++static PyTypeObject symtab_object_type = { ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Symtab", /*tp_name*/ ++ sizeof (symtab_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*/ ++ stpy_str, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT, /*tp_flags*/ ++ "GDB symtab object", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ symtab_object_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ symtab_object_getset /* tp_getset */ ++}; + -+# The Bug was: No symbol "problem" in current context. -+gdb_test "p problem" " = \\(int \\*\\) 0x.*" -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 -+++ b/gdb/testsuite/gdb.cp/cplusfuncs.cc -@@ -191,6 +191,12 @@ char * dm_type_char_star (char * p) { return p; } - int dm_type_foo_ref (foo & foo) { return foo.ifoo; } - int * dm_type_int_star (int * p) { return p; } - long * dm_type_long_star (long * p) { return p; } -+int dm_type_short (short i) { return i; } -+int dm_type_long (long i) { return i; } - int dm_type_unsigned_int (unsigned int i) { return i; } -+int dm_type_unsigned_short (unsigned short i) { return i; } -+int dm_type_unsigned_long (unsigned long i) { return i; } - int dm_type_void (void) { return 0; } - void * dm_type_void_star (void * p) { return p; } -+typedef int myint; -+int dm_type_typedef (myint i) { return i; } -diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.exp b/gdb/testsuite/gdb.cp/cplusfuncs.exp -index 5e08768..8c8e038 100644 ---- a/gdb/testsuite/gdb.cp/cplusfuncs.exp -+++ b/gdb/testsuite/gdb.cp/cplusfuncs.exp -@@ -66,9 +66,25 @@ set dm_type_unsigned_int "unsigned" - set dm_type_void "" - set dm_type_void_star "void*" ++static PyGetSetDef sal_object_getset[] = { ++ { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL }, ++ { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL }, ++ { "line", salpy_get_line, NULL, ++ "Return the symtab_and_line's line.", NULL }, ++ {NULL} /* Sentinel */ ++}; ++ ++static PyTypeObject sal_object_type = { ++ PyObject_HEAD_INIT (NULL) ++ 0, /*ob_size*/ ++ "gdb.Symtab_and_line", /*tp_name*/ ++ sizeof (sal_object), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ salpy_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*/ ++ salpy_str, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT, /*tp_flags*/ ++ "GDB symtab_and_line 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 */ ++ sal_object_getset /* tp_getset */ ++}; +diff --git a/gdb/python/python-type.c b/gdb/python/python-type.c +index e185112..b55ce9a 100644 +--- a/gdb/python/python-type.c ++++ b/gdb/python/python-type.c +@@ -27,6 +27,8 @@ + #include "demangle.h" + #include "objfiles.h" + #include "language.h" ++#include "observer.h" ++#include "gdb_assert.h" -+# Some other vagaries of GDB's type printing machinery. The integer types -+# may have unsigned before or after their length, and may have "int" -+# appended. The char* conversion operator may have name "char*" even if -+# the type is "char *", because the name comes from the debug information -+# and the type from GDB. Function types may not see through typedefs. + 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. + -+set dm_type_short "short" -+set dm_type_long "long" -+set dm_type_unsigned_short "unsigned short" -+set dm_type_unsigned_long "unsigned long" -+set dm_operator_char_star "char*" -+set dm_operator_char_star_quoted "char\\*" -+set dm_type_typedef 0 ++ 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; + - proc probe_demangler { } { - global gdb_prompt - global dm_operator_comma -+ global dm_operator_char_star -+ global dm_operator_char_star_quoted - global dm_type_char_star - global dm_type_char_star_quoted - global dm_type_foo_ref -@@ -77,6 +93,11 @@ proc probe_demangler { } { - global dm_type_unsigned_int - global dm_type_void - global dm_type_void_star -+ global dm_type_short -+ global dm_type_unsigned_short -+ global dm_type_long -+ global dm_type_unsigned_long -+ global dm_type_typedef + static PyTypeObject type_object_type; - send_gdb "print &'foo::operator,(foo&)'\n" - gdb_expect { -@@ -97,6 +118,26 @@ proc probe_demangler { } { - } + /* 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, "is_base_class", arg) < 0) ++ goto failarg; ++ + 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; +@@ -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; +@@ -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; + +@@ -422,7 +436,7 @@ typy_lookup_type (struct demangle_component *demangled) } -+ send_gdb "print &'foo::operator char*()'\n" -+ gdb_expect { -+ -re ".*foo::operator char \\*\\(void\\).*\r\n$gdb_prompt $" { -+ # v2 demangler or GDB type printer -+ set dm_operator_char_star "char *" -+ set dm_operator_char_star_quoted "char \\*" -+ pass "detect dm_operator_char_star" -+ } -+ -re ".*foo::operator char\\*\\(\\).*\r\n$gdb_prompt $" { -+ # v3 demangler -+ pass "detect dm_operator_char_star" -+ } -+ -re ".*$gdb_prompt $" { -+ fail "detect dm_operator_char_star" -+ } -+ timeout { -+ fail "detect dm_operator_char_star" + 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; +@@ -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; + ++ if (block_obj) ++ { ++ block = block_object_to_block (block_obj); ++ if (! block) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "second argument must be block"); ++ return NULL; + } + } + - send_gdb "print &'dm_type_char_star'\n" - gdb_expect { - -re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" { -@@ -166,6 +207,11 @@ proc probe_demangler { } { - # v3 demangler - pass "detect dm_type_long_star" - } -+ -re ".*dm_type_long_star\\(long int \\*\\).*\r\n$gdb_prompt $" { -+ # GCC v3 and GDB's type printer -+ set dm_type_long_star "long int *" -+ pass "detect dm_type_long_star" -+ } - -re ".*$gdb_prompt $" { - fail "detect dm_type_long_star" - } -@@ -230,6 +276,101 @@ proc probe_demangler { } { - fail "detect dm_type_void_star (timeout)" - } + 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; + +@@ -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 ++typy_link (type_object *type_obj) ++{ ++ type_obj->prev = NULL; + -+ send_gdb "print &'dm_type_short'\n" -+ gdb_expect { -+ -re ".*dm_type_short\\(short\\).*\r\n$gdb_prompt $" { -+ # v2 and v3 demanglers -+ pass "detect dm_type_short" -+ } -+ -re ".*dm_type_short\\(short int\\).*\r\n$gdb_prompt $" { -+ # GDB type printer -+ set dm_type_short "short int" -+ pass "detect dm_type_short" -+ } -+ -re ".*$gdb_prompt $" { -+ fail "detect dm_type_short" -+ } -+ timeout { -+ fail "detect dm_type_short (timeout)" -+ } ++ if (type_obj->type && TYPE_OBJFILE (type_obj->type)) ++ { ++ struct objfile *objfile = TYPE_OBJFILE (type_obj->type); ++ ++ 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); ++ } ++ else if (type_obj->type && TYPE_DISCARDABLE (type_obj->type)) ++ { ++ type_obj->next = pyty_objects_discardable; ++ if (type_obj->next) ++ type_obj->next->prev = type_obj; ++ pyty_objects_discardable = type_obj; + } ++ else ++ type_obj->next = NULL; ++} + -+ send_gdb "print &'dm_type_unsigned_short'\n" -+ gdb_expect { -+ -re ".*dm_type_unsigned_short\\(unsigned short\\).*\r\n$gdb_prompt $" { -+ # v2 and v3 demanglers -+ pass "detect dm_type_unsigned_short" -+ } -+ -re ".*dm_type_unsigned_short\\(short unsigned int\\).*\r\n$gdb_prompt $" { -+ # GDB type printer -+ set dm_type_unsigned_short "short unsigned int" -+ pass "detect dm_type_unsigned_short" -+ } -+ -re ".*$gdb_prompt $" { -+ fail "detect dm_type_unsigned_short" -+ } -+ timeout { -+ fail "detect dm_type_unsigned_short (timeout)" -+ } ++/* Unlink TYPE_OBJ from its current list. Permanent types are not linked ++ anywhere and this function has no effect on them. */ ++static void ++typy_unlink (type_object *type_obj) ++{ ++ 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_obj->type); ++ ++ set_objfile_data (objfile, typy_objfile_data_key, type_obj->next); + } ++ else if (pyty_objects_discardable == type_obj) ++ pyty_objects_discardable = type_obj->next; + -+ send_gdb "print &'dm_type_long'\n" -+ gdb_expect { -+ -re ".*dm_type_long\\(long\\).*\r\n$gdb_prompt $" { -+ # v2 and v3 demanglers -+ pass "detect dm_type_long" -+ } -+ -re ".*dm_type_long\\(long int\\).*\r\n$gdb_prompt $" { -+ # GDB type printer -+ set dm_type_long "long int" -+ pass "detect dm_type_long" -+ } -+ -re ".*$gdb_prompt $" { -+ fail "detect dm_type_long" -+ } -+ timeout { -+ fail "detect dm_type_long (timeout)" ++ if (type_obj->next) ++ type_obj->next->prev = type_obj->prev; ++} ++ + 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->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; ++ 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; + +- type = typy_lookup_typename (type_name); ++ if (block_obj) ++ { ++ block = block_object_to_block (block_obj); ++ if (! block) ++ { ++ PyErr_SetString (PyExc_RuntimeError, ++ "'block' argument must be a Block"); ++ return NULL; + } + } + -+ send_gdb "print &'dm_type_unsigned_long'\n" -+ gdb_expect { -+ -re ".*dm_type_unsigned_long\\(unsigned long\\).*\r\n$gdb_prompt $" { -+ # v2 and v3 demanglers -+ pass "detect dm_type_unsigned_long" -+ } -+ -re ".*dm_type_unsigned_long\\(long unsigned int\\).*\r\n$gdb_prompt $" { -+ # GDB type printer -+ set dm_type_unsigned_long "long unsigned int" -+ pass "detect dm_type_unsigned_long" -+ } -+ -re ".*$gdb_prompt $" { -+ fail "detect dm_type_unsigned_long" -+ } -+ timeout { -+ fail "detect dm_type_unsigned_long (timeout)" -+ } ++ type = typy_lookup_typename (type_name, block); + 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); ++ ++ observer_attach_mark_used (typy_types_mark_used); + } + + +diff --git a/gdb/python/python-utils.c b/gdb/python/python-utils.c +index 49c0437..84a476e 100644 +--- a/gdb/python/python-utils.c ++++ b/gdb/python/python-utils.c +@@ -19,6 +19,7 @@ + + #include "defs.h" + #include "charset.h" ++#include "value.h" + #include "python-internal.h" + + +@@ -219,3 +220,48 @@ gdbpy_is_string (PyObject *obj) + { + return PyString_Check (obj) || PyUnicode_Check (obj); + } ++ ++/* Converts OBJ to a CORE_ADDR value. ++ ++ Returns 1 on success or 0 on failure, with a Python exception set. This ++ function can also throw GDB exceptions. */ ++ ++int ++get_addr_from_python (PyObject *obj, CORE_ADDR *addr) ++{ ++ if (gdbpy_is_value_object (obj)) ++ *addr = value_as_address (value_object_to_value (obj)); ++ else if (PyLong_Check (obj)) ++ { ++ /* Assume CORE_ADDR corresponds to unsigned long. */ ++ *addr = PyLong_AsUnsignedLong (obj); ++ if (PyErr_Occurred () != NULL) ++ return 0; + } ++ else if (PyInt_Check (obj)) ++ { ++ long val; + -+ send_gdb "print &'dm_type_typedef'\n" -+ gdb_expect { -+ -re ".*dm_type_typedef\\(int\\).*\r\n$gdb_prompt $" { -+ # v2 and v3 demanglers -+ pass "detect dm_type_typedef" -+ } -+ -re ".*dm_type_typedef\\(myint\\).*\r\n$gdb_prompt $" { -+ # GDB type printer -+ set dm_type_typedef 1 -+ pass "detect dm_type_typedef" -+ } -+ -re ".*$gdb_prompt $" { -+ fail "detect dm_type_typedef" -+ } -+ timeout { -+ fail "detect dm_type_typedef (timeout)" -+ } ++ /* Assume CORE_ADDR corresponds to unsigned long. */ ++ val = PyInt_AsLong (obj); ++ ++ if (val >= 0) ++ *addr = val; ++ else ++ { ++ /* If no error ocurred, VAL is indeed negative. */ ++ if (PyErr_Occurred () != NULL) ++ return 0; ++ ++ PyErr_SetString (PyExc_ValueError, "negative address"); ++ return 0; ++ } + } - } ++ else ++ { ++ PyErr_SetString (PyExc_TypeError, "invalid type for address"); ++ return 0; ++ } ++ ++ return 1; ++} +diff --git a/gdb/python/python-value.c b/gdb/python/python-value.c +index dd3c919..fb9dab2 100644 +--- a/gdb/python/python-value.c ++++ b/gdb/python/python-value.c +@@ -25,6 +25,7 @@ + #include "language.h" + #include "dfp.h" + #include "valprint.h" ++#include "observer.h" - # -@@ -345,8 +486,9 @@ proc print_addr { name } { + /* 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; - proc test_lookup_operator_functions {} { - global dm_operator_comma -+ global dm_operator_char_star - global dm_type_char_star -- global dm_type_char_star_quoted -+ global dm_operator_char_star_quoted - global dm_type_foo_ref - global dm_type_void - global dm_type_void_star -@@ -404,8 +546,8 @@ proc test_lookup_operator_functions {} { + #ifdef HAVE_PYTHON - info_func "operator int(" "int foo::operator int($dm_type_void);" - info_func "operator()(" "void foo::operator()($dm_type_foo_ref);" -- info_func "operator $dm_type_char_star_quoted\(" \ -- "char *foo::operator $dm_type_char_star\($dm_type_void);" -+ info_func "operator $dm_operator_char_star_quoted\(" \ -+ "char *foo::operator $dm_operator_char_star\($dm_type_void);" +@@ -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 (python_gdbarch)->builtin_long_long - } ++/* Python's long type corresponds to C's long long type. Unsigned version. */ ++#define builtin_type_upylong builtin_type \ ++ (python_gdbarch)->builtin_unsigned_long_long ++ + #define builtin_type_pybool \ + language_bool_type (python_language, python_gdbarch) -@@ -420,6 +562,7 @@ proc test_paddr_operator_functions {} { - global dm_type_unsigned_int - global dm_type_void - global dm_type_void_star -+ global dm_operator_char_star + #define builtin_type_pychar \ + language_string_char_type (python_language, python_gdbarch) - print_addr "foo::operator*($dm_type_foo_ref)" - print_addr "foo::operator%($dm_type_foo_ref)" -@@ -470,7 +613,7 @@ proc test_paddr_operator_functions {} { - } +-typedef struct { ++typedef struct value_object { + PyObject_HEAD + struct value *value; + PyObject *address; + PyObject *type; ++ struct value_object *next; ++ struct value_object *prev; + } value_object; - print_addr "foo::operator int($dm_type_void)" -- print_addr "foo::operator $dm_type_char_star\($dm_type_void)" -+ print_addr "foo::operator $dm_operator_char_star\($dm_type_void)" - } + /* Called by the Python interpreter when deallocating a value object. */ +@@ -71,7 +78,12 @@ valpy_dealloc (PyObject *obj) + { + value_object *self = (value_object *) obj; - # -@@ -480,17 +623,21 @@ proc test_paddr_operator_functions {} { - proc test_paddr_overloaded_functions {} { - global dm_type_unsigned_int - global dm_type_void -+ global dm_type_short -+ global dm_type_unsigned_short -+ global dm_type_long -+ global dm_type_unsigned_long +- 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; - print_addr "overload1arg($dm_type_void)" - print_addr "overload1arg(char)" - print_addr "overload1arg(signed char)" - print_addr "overload1arg(unsigned char)" -- print_addr "overload1arg(short)" -- print_addr "overload1arg(unsigned short)" -+ print_addr "overload1arg($dm_type_short)" -+ print_addr "overload1arg($dm_type_unsigned_short)" - print_addr "overload1arg(int)" - print_addr "overload1arg($dm_type_unsigned_int)" -- print_addr "overload1arg(long)" -- print_addr "overload1arg(unsigned long)" -+ print_addr "overload1arg($dm_type_long)" -+ print_addr "overload1arg($dm_type_unsigned_long)" - print_addr "overload1arg(float)" - print_addr "overload1arg(double)" + value_free (self->value); -@@ -513,17 +660,31 @@ proc test_paddr_hairy_functions {} { - global dm_type_char_star - global dm_type_int_star - global dm_type_long_star -+ global dm_type_typedef +@@ -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); ++ ++ /* 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; - print_addr_2 "hairyfunc1" "hairyfunc1(int)" -- print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" -- print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" -- print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" -- -- # gdb-gnats bug gdb/19: -- # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" -- print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" -- print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" -- print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" + return (PyObject *) value_obj; + } +@@ -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); ++ ++ /* 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; + } + + return (PyObject *) val_obj; +@@ -853,7 +885,34 @@ convert_value_from_python (PyObject *obj) + { + LONGEST l = PyLong_AsLongLong (obj); + +- if (! PyErr_Occurred ()) ++ if (PyErr_Occurred ()) ++ { ++ /* If the error was an overflow, we can try converting to ++ ULONGEST instead. */ ++ if (PyErr_ExceptionMatches (PyExc_OverflowError)) ++ { ++ PyObject *etype, *evalue, *etraceback, *zero; + -+ if {$dm_type_typedef == 0} { -+ print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" -+ print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" -+ print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" ++ PyErr_Fetch (&etype, &evalue, &etraceback); ++ zero = PyInt_FromLong (0); + -+ # gdb-gnats bug gdb/19: -+ # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" -+ print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" -+ print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" -+ print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" -+ } else { -+ print_addr_2 "hairyfunc2" "hairyfunc2(PFPc_i)" -+ print_addr_2 "hairyfunc3" "hairyfunc3(PFPFPl_s_i)" -+ print_addr_2 "hairyfunc4" "hairyfunc4(PFPFPc_s_i)" ++ /* Check whether obj is positive. */ ++ if (PyObject_RichCompareBool (obj, zero, Py_GT) > 0) ++ { ++ ULONGEST ul; + -+ # gdb-gnats bug gdb/19: -+ # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" -+ print_addr_2 "hairyfunc5" "hairyfunc5(PFPc_PFl_i)" -+ print_addr_2 "hairyfunc6" "hairyfunc6(PFPi_PFl_i)" -+ print_addr_2 "hairyfunc7" "hairyfunc7(PFPFPc_i_PFl_i)" -+ } ++ ul = PyLong_AsUnsignedLongLong (obj); ++ if (! PyErr_Occurred ()) ++ value = value_from_ulongest (builtin_type_upylong, ul); ++ } ++ else ++ /* There's nothing we can do. */ ++ PyErr_Restore (etype, evalue, etraceback); ++ ++ Py_DECREF (zero); ++ } ++ } ++ else + value = value_from_longest (builtin_type_pylong, l); + } + else if (PyFloat_Check (obj)) +@@ -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 ++gdbpy_is_value_object (PyObject *obj) ++{ ++ return PyObject_TypeCheck (obj, &value_object_type); ++} ++ + void + 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); + } + + +diff --git a/gdb/python/python.c b/gdb/python/python.c +index 254bd28..7cd2b3a 100644 +--- a/gdb/python/python.c ++++ b/gdb/python/python.c +@@ -27,6 +27,8 @@ + #include "observer.h" + #include "value.h" + #include "language.h" ++#include "event-loop.h" ++#include "valprint.h" + + #include + +@@ -45,11 +47,18 @@ static int gdbpy_auto_load = 1; + #include "cli/cli-decode.h" + #include "charset.h" + #include "top.h" ++#include "solib.h" + #include "exceptions.h" + #include "python-internal.h" ++#include "linespec.h" ++#include "symtab.h" ++#include "source.h" + #include "version.h" ++#include "inferior.h" ++#include "gdbthread.h" + #include "target.h" + #include "gdbthread.h" ++#include "event-top.h" + + static PyMethodDef GdbMethods[]; + +@@ -197,10 +206,10 @@ python_command (char *arg, int from_tty) + NULL (and set a Python exception) on error. Helper function for + get_parameter. */ + +-static PyObject * +-parameter_to_python (struct cmd_list_element *cmd) ++PyObject * ++gdbpy_parameter_value (enum var_types type, void *var) + { +- switch (cmd->var_type) ++ switch (type) + { + case var_string: + case var_string_noescape: +@@ -208,7 +217,7 @@ parameter_to_python (struct cmd_list_element *cmd) + case var_filename: + case var_enum: + { +- char *str = * (char **) cmd->var; ++ char *str = * (char **) var; + if (! str) + str = ""; + return PyString_Decode (str, strlen (str), host_charset (), NULL); +@@ -216,7 +225,7 @@ parameter_to_python (struct cmd_list_element *cmd) + + case var_boolean: + { +- if (* (int *) cmd->var) ++ if (* (int *) var) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +@@ -224,7 +233,7 @@ parameter_to_python (struct cmd_list_element *cmd) + + case var_auto_boolean: + { +- enum auto_boolean ab = * (enum auto_boolean *) cmd->var; ++ enum auto_boolean ab = * (enum auto_boolean *) var; + if (ab == AUTO_BOOLEAN_TRUE) + Py_RETURN_TRUE; + else if (ab == AUTO_BOOLEAN_FALSE) +@@ -234,15 +243,15 @@ parameter_to_python (struct cmd_list_element *cmd) + } + + case var_integer: +- if ((* (int *) cmd->var) == INT_MAX) ++ if ((* (int *) var) == INT_MAX) + Py_RETURN_NONE; + /* Fall through. */ + case var_zinteger: +- return PyLong_FromLong (* (int *) cmd->var); ++ return PyLong_FromLong (* (int *) var); + + case var_uinteger: + { +- unsigned int val = * (unsigned int *) cmd->var; ++ unsigned int val = * (unsigned int *) var; + if (val == UINT_MAX) + Py_RETURN_NONE; + return PyLong_FromUnsignedLong (val); +@@ -280,7 +289,7 @@ gdbpy_parameter (PyObject *self, PyObject *args) + + if (! cmd->var) + return PyErr_Format (PyExc_RuntimeError, "`%s' is not a parameter", arg); +- return parameter_to_python (cmd); ++ return gdbpy_parameter_value (cmd->var_type, cmd->var); } - 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 . */ + /* A Python function which evaluates a string using the gdb CLI. */ +@@ -319,6 +328,233 @@ execute_gdb_command (PyObject *self, PyObject *args) + Py_RETURN_NONE; + } + ++/* Implementation of gdb.solib_address (Long) -> String. ++ Returns the name of the shared library holding a given address, or None. */ + -+int -+func () ++static PyObject * ++gdbpy_solib_address (PyObject *self, PyObject *args) +{ -+ return 42; /* func-line */ -+} ++ unsigned long long pc; ++ char *soname; ++ PyObject *str_obj; + -+volatile int global_x; ++ if (!PyArg_ParseTuple (args, "K", &pc)) ++ return NULL; + -+class A -+{ -+public: -+ A () ++ soname = solib_name_from_address (pc); ++ if (soname) ++ str_obj = PyString_Decode (soname, strlen (soname), host_charset (), NULL); ++ else + { -+ global_x = func (); /* caller-line */ ++ str_obj = Py_None; ++ Py_INCREF (Py_None); + } -+}; -+ -+/* 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 */ ++ return str_obj; +} -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 -+++ 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 -+} ++/* A Python function which is a wrapper for decode_line_1. */ + -+gdb_breakpoint [gdb_get_line_number "exit-line"] ++static PyObject * ++gdbpy_decode_line (PyObject *self, PyObject *args) ++{ ++ struct symtabs_and_lines sals = { NULL, 0 }; /* Initialize to appease gcc. */ ++ struct symtab_and_line sal; ++ char *arg = NULL; ++ int free_sals = 0, i; ++ PyObject *result = NULL; ++ volatile struct gdb_exception except; + -+gdb_breakpoint [gdb_get_line_number "func-line"] -+gdb_continue_to_breakpoint "func" ".*func-line.*" ++ if (! PyArg_ParseTuple (args, "|s", &arg)) ++ return NULL; + -+gdb_test "up" "caller-line.*" ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ if (arg) ++ { ++ char *copy; + -+# PC should not be at the boundary of source lines to make the original bug -+# exploitable. ++ arg = strdup (arg); ++ copy = arg; + -+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 ++ sals = decode_line_1 (©, 0, 0, 0, 0, 0); ++ free_sals = 1; ++ } ++ else ++ { ++ set_default_source_symtab_and_line (); ++ sal = get_current_source_symtab_and_line (); ++ sals.sals = &sal; ++ sals.nelts = 1; ++ } + } -+} ++ if (arg) ++ xfree (arg); + -+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 ++ if (except.reason < 0) ++ { ++ if (free_sals) ++ xfree (sals.sals); ++ /* We know this will always throw. */ ++ GDB_PY_HANDLE_EXCEPTION (except); + } -+} + -+set test "caller line has trailing code" -+if {$pc != $end} { -+ pass $test -+} else { -+ fail $test -+} ++ if (sals.nelts) ++ { ++ result = PyTuple_New (sals.nelts); ++ for (i = 0; i < sals.nelts; ++i) ++ { ++ PyObject *obj; ++ char *str; + -+# 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 ++ obj = symtab_and_line_to_sal_object (sals.sals[i]); ++ if (! obj) ++ { ++ Py_DECREF (result); ++ result = NULL; ++ break; ++ } ++ ++ PyTuple_SetItem (result, i, obj); ++ } + } -+} + -+gdb_continue_to_breakpoint "caller" ".*caller-line.*" ++ if (free_sals) ++ xfree (sals.sals); + -+# 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 ".*" - - 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;" -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 -+++ b/gdb/testsuite/gdb.cp/member-ptr.cc -@@ -138,6 +138,7 @@ class Diamond : public Padding, public Left, public Right - { - public: - virtual int vget_base (); -+ int (*func_ptr) (int); - }; - - int Diamond::vget_base () -@@ -145,6 +146,12 @@ int Diamond::vget_base () - return this->Left::x + 2000; - } - -+int -+func (int x) -+{ -+ return 19 + x; ++ if (result) ++ return result; ++ Py_RETURN_NONE; +} + - int main () - { - A a; -@@ -162,6 +169,7 @@ int main () - int (Diamond::*right_vpmf) (); - int (Base::*base_vpmf) (); - int Diamond::*diamond_pmi; -+ int (* Diamond::*diamond_pfunc_ptr) (int); - - PMI null_pmi; - PMF null_pmf; -@@ -179,6 +187,7 @@ int main () - - diamond.Left::x = 77; - diamond.Right::x = 88; -+ diamond.func_ptr = func; - - /* Some valid pointer to members from a base class. */ - left_pmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::get_x); -@@ -193,11 +202,19 @@ int main () - /* A pointer to data member from a base class. */ - diamond_pmi = (int Diamond::*) (int Left::*) &Base::x; - -+ /* A pointer to data member, where the member is itself a pointer to -+ a function. */ -+ diamond_pfunc_ptr = (int (* Diamond::*) (int)) &Diamond::func_ptr; -+ - null_pmi = NULL; - null_pmf = NULL; - - pmi = NULL; /* Breakpoint 1 here. */ - -+ // Invalid (uses diamond_pfunc_ptr as a function): -+ // diamond.*diamond_pfunc_ptr (20); -+ (diamond.*diamond_pfunc_ptr) (20); -+ - k = (a.*pmf)(3); - - 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 ---- 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 { - } - } - -+# Check pointers to data members, which are themselves pointers to -+# functions. These behave like data members, not like pointers to -+# member functions. -+ -+gdb_test "ptype diamond_pfunc_ptr" \ -+ "type = int \\(\\*Diamond::\\*\\)\\(int\\)" -+ -+gdb_test "ptype diamond.*diamond_pfunc_ptr" \ -+ "type = int \\(\\*\\)\\(int\\)" -+ -+# This one is invalid; () binds more tightly than .*, so it tries to -+# call the member pointer as a normal pointer-to-function. -+ -+gdb_test "print diamond.*diamond_pfunc_ptr (20)" \ -+ "Invalid data type for function to be called." -+ -+# With parentheses, it is valid. -+ -+gdb_test "print (diamond.*diamond_pfunc_ptr) (20)" \ -+ "$vhn = 39" -+ -+# Make sure that we do not interpret this as either a member pointer -+# call or a member function call. ++/* Parse a string and evaluate it as an expression. */ ++static PyObject * ++gdbpy_parse_and_eval (PyObject *self, PyObject *args) ++{ ++ char *expr_str; ++ struct value *result = NULL; ++ volatile struct gdb_exception except; + -+gdb_test "print diamond.func_ptr (20)" \ -+ "$vhn = 39" ++ if (!PyArg_ParseTuple (args, "s", &expr_str)) ++ return NULL; + - # ========================== - # pointer to member function - # ========================== -@@ -608,6 +635,9 @@ gdb_test_multiple "print (a.*pmf)(3)" $name { - } - } - -+gdb_test "ptype a.*pmf" "type = int \\(A \\*, int\\)" -+gdb_test "ptype (a.*pmf)(3)" "type = int" ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ result = parse_and_eval (expr_str); ++ } ++ GDB_PY_HANDLE_EXCEPTION (except); + - # Print out a pointer to data member which requires looking into - # a base class. - gdb_test "print diamond_pmi" "$vhn = &Base::x" -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 ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc -@@ -0,0 +1,20 @@ -+namespace A { -+ int x = 11; -+ namespace{ -+ int xx = 22; -+ } ++ return value_to_value_object (result); +} + -+using namespace A; ++ + -+namespace{ -+ int xxx = 33; -+}; ++/* Posting and handling events. */ + -+int main() ++/* A single event. */ ++struct gdbpy_event +{ -+ x; -+ xx; -+ xxx; -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp b/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp -new file mode 100644 -index 0000000..e4bb9f8 ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp -@@ -0,0 +1,49 @@ -+# Copyright 2008 Free Software Foundation, Inc. ++ /* The Python event. This is just a callable object. */ ++ PyObject *event; ++ /* The next event. */ ++ struct gdbpy_event *next; ++}; + -+# 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 . ++/* All pending events. */ ++static struct gdbpy_event *gdbpy_event_list; ++/* The final link of the event list. */ ++static struct gdbpy_event **gdbpy_event_list_end; + -+if $tracelevel then { -+ strace $tracelevel -+} ++/* We use a file handler, and not an async handler, so that we can ++ wake up the main thread even when it is blocked in poll(). */ ++static int gdbpy_event_fds[2]; + -+set prms_id 0 -+set bug_id 0 ++/* The file handler callback. This reads from the internal pipe, and ++ then processes the Python event queue. This will always be run in ++ the main gdb thread. */ ++static void ++gdbpy_run_events (int err, gdb_client_data ignore) ++{ ++ PyGILState_STATE state; ++ char buffer[100]; ++ int r; + -+set testfile namespace-multiple-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 -+} ++ state = PyGILState_Ensure (); + -+# Get things started. ++ /* Just read whatever is available on the fd. It is relatively ++ harmless if there are any bytes left over. */ ++ r = read (gdbpy_event_fds[0], buffer, sizeof (buffer)); + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ while (gdbpy_event_list) ++ { ++ /* Dispatching the event might push a new element onto the event ++ loop, so we update here "atomically enough". */ ++ struct gdbpy_event *item = gdbpy_event_list; ++ gdbpy_event_list = gdbpy_event_list->next; ++ if (gdbpy_event_list == NULL) ++ gdbpy_event_list_end = &gdbpy_event_list; + -+############################################ -+# test printing of namespace imported within -+# the function. ++ /* Ignore errors. */ ++ PyObject_CallObject (item->event, NULL); + -+if ![runto_main] then { -+ perror "couldn't run to breakpoint main" -+ continue -+} ++ Py_DECREF (item->event); ++ xfree (item); ++ } + -+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 -new file mode 100644 -index 0000000..97af850 ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/namespace-using.cc -@@ -0,0 +1,131 @@ -+//-------------------------- -+namespace M{ -+ int x = 911; ++ PyGILState_Release (state); +} + -+namespace N{ -+ int x = 912; -+} ++/* Submit an event to the gdb thread. */ ++static PyObject * ++gdbpy_post_event (PyObject *self, PyObject *args) ++{ ++ struct gdbpy_event *event; ++ PyObject *func; ++ int wakeup; + -+int marker10(){ -+ using namespace M; -+ int y = x+1; // marker10 stop -+ using namespace N; -+ return y; -+} -+//-------------------------- -+namespace J { -+ int jx = 44; -+} ++ if (!PyArg_ParseTuple (args, "O", &func)) ++ return NULL; + -+namespace K{ -+ int marker9(){ -+ //x; -+ return marker10(); -+ } -+} ++ if (!PyCallable_Check (func)) ++ { ++ PyErr_SetString (PyExc_RuntimeError, "Posted event is not callable"); ++ return NULL; ++ } + -+namespace L{ -+ using namespace J; -+ int marker8(){ -+ jx; -+ return K::marker9(); -+ } -+} -+//-------------------------- ++ Py_INCREF (func); + -+//-------------------------- -+namespace G{ -+ namespace H { -+ int ghx = 6; -+ } -+} ++ /* From here until the end of the function, we have the GIL, so we ++ can operate on our global data structures without worrying. */ ++ wakeup = gdbpy_event_list == NULL; + -+namespace I{ -+ -+ int marker7(){ -+ using namespace G::H; -+ ghx; -+ return L::marker8(); -+ } -+} -+//-------------------------- ++ event = XNEW (struct gdbpy_event); ++ event->event = func; ++ event->next = NULL; ++ *gdbpy_event_list_end = event; ++ gdbpy_event_list_end = &event->next; + -+//-------------------------- -+namespace E{ -+ namespace F{ -+ int efx = 5; -+ } -+} -+using namespace E::F; -+int marker6(){ -+ efx; -+ return I::marker7(); -+} -+//-------------------------- ++ /* Wake up gdb when needed. */ ++ if (wakeup) ++ { ++ char c = 'q'; /* Anything. */ ++ if (write (gdbpy_event_fds[1], &c, 1) != 1) ++ return PyErr_SetFromErrno (PyExc_IOError); ++ } + -+namespace A -+{ -+ int _a = 1; -+ int x = 2; -+ ++ Py_RETURN_NONE; +} + -+namespace C ++/* Initialize the Python event handler. */ ++static void ++gdbpy_initialize_events (void) +{ -+ int cc = 3; ++ if (!pipe (gdbpy_event_fds)) ++ { ++ gdbpy_event_list_end = &gdbpy_event_list; ++ add_file_handler (gdbpy_event_fds[0], gdbpy_run_events, NULL); ++ } +} + -+namespace D -+{ -+ int dx = 4; -+} + + + /* Printing. */ +@@ -357,6 +593,69 @@ gdbpy_print_stack (void) + + + ++/* Script interface. */ + -+using namespace C; -+int marker5() -+{ -+ cc; -+ return marker6(); -+} ++/* True if 'gdb -P' was used, false otherwise. */ ++static int running_python_script; + -+int marker4() -+{ -+ using D::dx; -+ return marker5(); -+} ++/* True if we are currently in a call to 'gdb.cli', false otherwise. */ ++static int in_cli; + -+int marker3() ++/* Enter the command loop. */ ++ ++static PyObject * ++gdbpy_cli (PyObject *unused1, PyObject *unused2) +{ -+ return marker4(); ++ if (! running_python_script || in_cli) ++ return PyErr_Format (PyExc_RuntimeError, "cannot invoke CLI recursively"); ++ ++ in_cli = 1; ++ cli_command_loop (); ++ in_cli = 0; ++ ++ Py_RETURN_NONE; +} + -+int marker2() ++/* Set up the Python argument vector and evaluate a script. This is ++ used to implement 'gdb -P'. */ ++ ++void ++run_python_script (int argc, char **argv) +{ -+ namespace B = A; -+ B::_a; -+ return marker3(); -+} ++ FILE *input; ++ PyGILState_STATE state; + -+int marker1() -+{ -+ int total = 0; ++ /* We never free this, since we plan to exit at the end. */ ++ state = PyGILState_Ensure (); ++ ++ running_python_script = 1; ++ PySys_SetArgv (argc - 1, argv + 1); ++ input = fopen (argv[0], "r"); ++ if (! input) + { -+ int b = 1; -+ { -+ using namespace A; -+ int c = 2; -+ { -+ int d = 3; -+ total = _a + b + c + d + marker2(); // marker1 stop -+ } -+ } ++ fprintf (stderr, "could not open %s: %s\n", argv[0], strerror (errno)); ++ exit (1); + } -+ return total; ++ PyRun_SimpleFile (input, argv[0]); ++ fclose (input); ++ exit (0); +} + -+int main() ++void ++source_python_script (FILE *stream, char *file) +{ -+ using namespace A; -+ _a; -+ return marker1(); -+} -diff --git a/gdb/testsuite/gdb.cp/namespace-using.exp b/gdb/testsuite/gdb.cp/namespace-using.exp -new file mode 100644 -index 0000000..ab6e6a4 ---- /dev/null -+++ b/gdb/testsuite/gdb.cp/namespace-using.exp -@@ -0,0 +1,183 @@ -+# Copyright 2008 Free Software Foundation, Inc. ++ PyGILState_STATE state; + -+# 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 . ++ state = PyGILState_Ensure (); + -+if $tracelevel then { -+ strace $tracelevel ++ PyRun_SimpleFile (stream, file); ++ ++ fclose (stream); ++ PyGILState_Release (state); +} + -+set prms_id 0 -+set bug_id 0 ++ + -+set testfile namespace-using -+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 -+} + /* 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; + } + ++ + -+# Get things started. ++/* Helper function for find_pretty_printer which iterates over a ++ list, calls each function and inspects output. */ ++static PyObject * ++search_pp_list (PyObject *list, PyObject *value) ++{ ++ Py_ssize_t pp_list_size, list_index; ++ PyObject *function, *printer = NULL; ++ ++ pp_list_size = PyList_Size (list); ++ for (list_index = 0; list_index < pp_list_size; list_index++) ++ { ++ function = PyList_GetItem (list, list_index); ++ if (! function) ++ return NULL; + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ /* gdbpy_instantiate_printer can return three possible return ++ values: NULL on error; Py_None if the pretty-printer ++ in the list cannot print the value; or a printer instance if ++ the printer can print the value. */ ++ printer = gdbpy_instantiate_printer (function, value); ++ if (! printer) ++ return NULL; ++ else if (printer != Py_None) ++ return printer; + -+############################################ -+# test printing of namespace imported within -+# the function. ++ Py_DECREF (printer); ++ } + -+if ![runto_main] then { -+ perror "couldn't run to breakpoint main" -+ continue ++ Py_RETURN_NONE; +} + -+gdb_test "print _a" "= 1" -+ -+# Test that names are not printed when they -+# are not imported ++/* Find the pretty-printing constructor function for TYPE. If no ++ pretty-printer exists, return NULL. If one exists, return a new ++ reference. */ ++static PyObject * ++find_pretty_printer (PyObject *value) ++{ ++ PyObject *pp_list = NULL; ++ PyObject *function = NULL; ++ struct objfile *obj; ++ volatile struct gdb_exception except; + -+gdb_breakpoint marker3 -+gdb_continue_to_breakpoint "marker3" ++ /* Look at the pretty-printer dictionary for each objfile. */ ++ ALL_OBJFILES (obj) ++ { ++ PyObject *objf = objfile_to_objfile_object (obj); ++ if (!objf) ++ continue; + -+#send_gdb "break marker3\n" -+#send_gdb "continue\n" ++ pp_list = objfpy_get_printers (objf, NULL); ++ function = search_pp_list (pp_list, value); + -+gdb_test "print _a" "No symbol \"_a\" in current context." "Print _a without import" ++ /* If there is an error in any objfile list, abort the search and ++ exit. */ ++ if (! function) ++ { ++ Py_XDECREF (pp_list); ++ return NULL; ++ } + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ if (function != Py_None) ++ goto done; ++ ++ /* In this loop, if function is not an instantiation of a ++ pretty-printer, and it is not null, then it is a return of ++ Py_RETURN_NONE, which must be decremented. */ ++ Py_DECREF (function); ++ Py_XDECREF (pp_list); ++ } + ++ pp_list = NULL; ++ /* Fetch the global pretty printer dictionary. */ ++ if (! PyObject_HasAttrString (gdb_module, "pretty_printers")) ++ goto done; ++ pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers"); ++ if (! pp_list) ++ goto done; ++ if (! PyList_Check (pp_list)) ++ goto done; + -+############################################ -+# test printing of namespace imported into -+# a scope containing the pc. ++ function = search_pp_list (pp_list, value); + -+if ![runto_main] then { -+ perror "couldn't run to breakpoint main" -+ continue ++ done: ++ Py_XDECREF (pp_list); ++ ++ return function; +} + -+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" ++/* Pretty-print a single value, via the printer object PRINTER. If ++ the function returns a string, an xmalloc()d copy is returned. ++ Otherwise, if the function returns a value, a *OUT_VALUE is set to ++ the value, and NULL is returned. On error, *OUT_VALUE is set to ++ NULL and NULL is returned. */ ++static char * ++pretty_print_one_value (PyObject *printer, struct value **out_value) ++{ ++ char *output = NULL; ++ volatile struct gdb_exception except; + ++ TRY_CATCH (except, RETURN_MASK_ALL) ++ { ++ PyObject *result; + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL); ++ if (result) ++ { ++ if (gdbpy_is_string (result)) ++ output = python_string_to_host_string (result); ++ else if (PyObject_TypeCheck (result, &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. */ ++ struct value *v = value_object_to_value (result); ++ *out_value = value_copy (v); ++ } ++ else ++ *out_value = convert_value_from_python (result); ++ Py_DECREF (result); ++ } ++ } + -+############################################ -+# test printing of namespace imported into -+# file scope. ++ return output; ++} + ++/* Instantiate a pretty-printer given a constructor, CONS, and a ++ value, VAL. Return NULL on error. Ownership of the object ++ instance is transferred to the reciever */ ++PyObject * ++gdbpy_instantiate_printer (PyObject *cons, PyObject *value) ++{ ++ PyObject *result; ++ result = PyObject_CallFunctionObjArgs (cons, value, NULL); ++ return result; ++} + -+if ![runto marker5] then { -+ perror "couldn't run to breakpoint marker5" -+ continue + #else /* HAVE_PYTHON */ + + /* Dummy implementation of the gdb "python" command. */ +@@ -501,6 +938,13 @@ eval_python_from_control_command (struct command_line *cmd) + error (_("Python scripting is not supported in this copy of GDB.")); + } + ++void ++source_python_script (FILE *stream) ++{ ++ fclose (stream); ++ error (_("Python scripting is not supported in this copy of GDB.")); +} + -+gdb_test "print cc" "= 3" + #endif /* HAVE_PYTHON */ + + +@@ -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); ++#ifdef PYTHONDIR ++ PyModule_AddStringConstant (gdb_module, "pythondir", PYTHONDIR); ++#else ++ if (gdb_datadir) ++ PyModule_AddStringConstant (gdb_module, "datadir", gdb_datadir); ++#endif + + gdbpy_initialize_values (); ++ gdbpy_initialize_breakpoints (); + gdbpy_initialize_frames (); ++ gdbpy_initialize_symtabs (); + gdbpy_initialize_commands (); ++ gdbpy_initialize_symbols (); ++ gdbpy_initialize_blocks (); + gdbpy_initialize_functions (); + gdbpy_initialize_types (); ++ gdbpy_initialize_parameters (); + gdbpy_initialize_objfile (); ++ gdbpy_initialize_thread (); ++ gdbpy_initialize_inferior (); ++ gdbpy_initialize_events (); + + PyRun_SimpleString ("import gdb"); + PyRun_SimpleString ("gdb.pretty_printers = []"); +@@ -634,6 +1092,15 @@ class GdbOutputFile:\n\ + \n\ + sys.stderr = GdbOutputFile()\n\ + sys.stdout = GdbOutputFile()\n\ ++if hasattr (gdb, 'datadir'):\n\ ++ gdb.pythondir = gdb.datadir + '/python'\n\ ++if hasattr (gdb, 'pythondir'):\n\ ++ sys.path.insert(0, gdb.pythondir)\n\ ++ gdb.__path__ = [gdb.pythondir + '/gdb']\n\ ++ from os.path import exists\n\ ++ ipy = gdb.pythondir + '/gdb/__init__.py'\n\ ++ if exists (ipy):\n\ ++ execfile (ipy)\n\ + "); + + /* Release the GIL while gdb runs. */ +@@ -653,9 +1120,14 @@ static PyMethodDef GdbMethods[] = + "Get a value from history" }, + { "execute", execute_gdb_command, METH_VARARGS, + "Execute a gdb command" }, ++ { "cli", gdbpy_cli, METH_NOARGS, ++ "Enter the gdb CLI" }, + { "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." }, + +@@ -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\ ++Return a tuple with the symbol corresponding to the given name (or None) and\n\ ++a boolean indicating if name is a field of the current implied argument\n\ ++`this' (when the current language is object-oriented)." }, ++ { "solib_address", gdbpy_solib_address, METH_VARARGS, ++ "solib_address (Long) -> String.\n\ ++Return the name of the shared library holding a given address, or None." }, + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++ { "block_for_pc", gdbpy_block_for_pc, METH_VARARGS, ++ "Return the block containing the given pc value, or None." }, + ++ { "decode_line", gdbpy_decode_line, METH_VARARGS, ++ "Decode a string argument the way that 'break' or 'edit' does.\n\ ++Return a tuple holding the file name (or None) and line number (or None).\n\ ++Note: may later change to return an object." }, + -+############################################ -+# Test printing of namespace aliases ++ { "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." }, + -+if ![runto marker2] then { -+ perror "couldn't run to breakpoint marker2" -+ continue -+} ++ { "parse_and_eval", gdbpy_parse_and_eval, METH_VARARGS, ++ "Parse a string as an expression, evaluate it, and return the result." }, + -+gdb_test "print B::_a" "= 1" ++ { "post_event", gdbpy_post_event, METH_VARARGS, ++ "Post an event into gdb's event loop." }, + -+gdb_test "print _a" "No symbol \"_a\" in current context." "print _a in namespace alias scope" -+gdb_test "print x" "No symbol \"x\" in current context." "print x in namespace alias scope" + { "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 33b0437..b761a65 100644 +--- a/gdb/python/python.h ++++ b/gdb/python/python.h +@@ -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 *); + ++void source_python_script (FILE *stream, char *file); + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++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, +diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c +index de34894..07518b0 100644 +--- a/gdb/scm-lang.c ++++ b/gdb/scm-lang.c +@@ -233,6 +233,7 @@ const struct exp_descriptor exp_descriptor_scm = + { + 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 cc3319a..d0d4702 100644 +--- a/gdb/scm-valprint.c ++++ b/gdb/scm-valprint.c +@@ -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) + { + fixup_symbol_section (sym, objfile); +diff --git a/gdb/stabsread.c b/gdb/stabsread.c +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) + + if (typenums[0] == -1) + { +- return (alloc_type (objfile)); ++ return (alloc_type (objfile, NULL)); + } + + 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) + { +- *type_addr = alloc_type (objfile); ++ *type_addr = alloc_type (objfile, NULL); + } + + return (*type_addr); +diff --git a/gdb/stack.c b/gdb/stack.c +index 1c37801..594eb16 100644 +--- a/gdb/stack.c ++++ b/gdb/stack.c +@@ -1308,24 +1308,24 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty) + else + count = -1; + +- if (info_verbose) +- { +- struct partial_symtab *ps; +- +- /* Read in symbols for all of the frames. Need to do this in a +- separate pass so that "Reading in symbols for xxx" messages +- don't screw up the appearance of the backtrace. Also if +- people have strong opinions against reading symbols for +- backtrace this may have to be an option. */ +- i = count; +- for (fi = trailing; fi != NULL && i--; fi = get_prev_frame (fi)) +- { +- QUIT; +- ps = find_pc_psymtab (get_frame_address_in_block (fi)); +- if (ps) +- PSYMTAB_TO_SYMTAB (ps); /* Force syms to come in. */ +- } +- } ++ { ++ struct partial_symtab *ps; + -+############################################ -+# Test printing of namespace aliases ++ /* Read in symbols for all of the frames. Need to do this ++ unconditionally to ensure that psymbols are read. Also need to ++ do this in a separate pass so that "Reading in symbols for xxx" ++ messages don't screw up the appearance of the backtrace. Also ++ if people have strong opinions against reading symbols for ++ backtrace this may have to be an option. */ ++ i = count; ++ for (fi = trailing; fi != NULL && i--; fi = get_prev_frame (fi)) ++ { ++ QUIT; ++ ps = find_pc_psymtab (get_frame_address_in_block (fi)); ++ if (info_verbose && ps) ++ PSYMTAB_TO_SYMTAB (ps); /* Force syms to come in. */ ++ } ++ } + + for (i = 0, fi = trailing; fi && count--; i++, fi = get_prev_frame (fi)) + { +@@ -1473,6 +1473,8 @@ print_block_frame_locals (struct block *b, struct frame_info *frame, + case LOC_COMPUTED: + if (SYMBOL_IS_ARGUMENT (sym)) + break; ++ if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN) ++ break; + values_printed = 1; + print_variable_and_value (NULL, sym, frame, stream, 4 * num_tabs); + break; +diff --git a/gdb/symfile.c b/gdb/symfile.c +index 36480c1..4dea8d7 100644 +--- a/gdb/symfile.c ++++ b/gdb/symfile.c +@@ -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); + -+if ![runto marker4] then { -+ perror "couldn't run to breakpoint marker4" -+ continue ++ /* We have finished unloading of OBJFILE. */ ++ observer_notify_objfile_unloaded (); +} + -+gdb_test "print dx" "= 4" -+ -+############################################ -+# Test printing of namespace aliases ++/* A helper function which returns true if OBJFILE has any debug ++ symbols, and false otherwise. */ ++static int ++has_any_debug_symbols (struct objfile *objfile) ++{ ++ return (objfile->psymtabs || objfile->quick_addrmap ++ || (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 +@@ -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 ()) +- && (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 (add_flags & SYMFILE_MAINLINE) ++ objfile->flags |= OBJF_MAIN; + discard_cleanups (my_cleanups); + + if (addrs) +@@ -1007,6 +1023,8 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, + + if ((flags & OBJF_READNOW) || readnow_symbol_files) + { ++ require_partial_symbols (objfile); + -+if ![runto marker6] then { -+ perror "couldn't run to breakpoint marker6" -+ continue -+} + if ((from_tty || info_verbose) && print_symbol_loading) + { + printf_unfiltered (_("expanding to full symbols...")); +@@ -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'. */ +- if (objfile->psymtabs == NULL) ++ if (!has_any_debug_symbols (objfile)) + debugfile = find_separate_debug_file (objfile); + if (debugfile) + { +@@ -1049,8 +1067,11 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, + xfree (debugfile); + } + +- if (!have_partial_symbols () && !have_full_symbols () +- && print_symbol_loading) ++ /* 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 ++ && (add_flags & SYMFILE_MAINLINE) ++ && !has_any_debug_symbols (objfile)) + { + wrap_here (""); + printf_unfiltered (_("(no debugging symbols found)")); +@@ -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); +- if (!have_partial_symbols () && !have_full_symbols ()) ++ if (!has_any_debug_symbols (objfile)) + { + wrap_here (""); + printf_unfiltered (_("(no debugging symbols found)\n")); + wrap_here (""); + } + ++ objfile->flags &= ~OBJF_SYMTABS_READ; + -+gdb_test "print efx" "= 5" + /* We're done reading the symbol file; finish off complaints. */ + clear_complaints (&symfile_complaints, 0, 1); + +@@ -2440,6 +2463,9 @@ reread_symbols (void) + + reinit_frame_cache (); + ++ /* We have finished reloading of OBJFILE. */ ++ observer_notify_objfile_unloaded (); + -+############################################ -+# Test printing of variables imported from -+# nested namespaces + /* 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 * +-allocate_psymtab (char *filename, struct objfile *objfile) ++allocate_psymtab (const char *filename, struct objfile *objfile) + { + struct partial_symtab *psymtab; + +@@ -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, +- struct section_offsets *section_offsets, char *filename, ++ struct section_offsets *section_offsets, ++ const char *filename, + CORE_ADDR textlow, struct partial_symbol **global_syms, + struct partial_symbol **static_syms) + { +diff --git a/gdb/symfile.h b/gdb/symfile.h +index bba242c..58bd2d8 100644 +--- a/gdb/symfile.h ++++ b/gdb/symfile.h +@@ -140,6 +140,12 @@ struct sym_fns + + void (*sym_read) (struct objfile *, int); + ++ /* Read the partial symbols for an objfile. This may be NULL, in ++ which case gdb assumes that sym_read already read the partial ++ symbols. */ + -+if ![runto I::marker7] then { -+ perror "couldn't run to breakpoint I::marker7" -+ continue -+} ++ void (*sym_read_psymbols) (struct objfile *); + -+gdb_test "print ghx" "= 6" + /* Called when we are finished with an objfile. Should do all + cleanup that is specific to the object file format for the + particular objfile. */ +@@ -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 *, +- char *, CORE_ADDR, ++ const char *, CORE_ADDR, + struct partial_symbol **, + struct partial_symbol **); + +@@ -316,7 +322,7 @@ extern int auto_solib_limit; + + extern void set_initial_language (void); + +-extern struct partial_symtab *allocate_psymtab (char *, struct objfile *); ++extern struct partial_symtab *allocate_psymtab (const char *, struct objfile *); + + extern void discard_psymtab (struct partial_symtab *); + +@@ -385,7 +391,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data); + /* From dwarf2read.c */ + + extern int dwarf2_has_info (struct objfile *); +- ++extern void dwarf2_create_quick_addrmap (struct objfile *); + 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 c88156a..567fa07 100644 +--- a/gdb/symtab.c ++++ b/gdb/symtab.c +@@ -42,6 +42,7 @@ + #include "ada-lang.h" + #include "p-lang.h" + #include "addrmap.h" ++#include "cp-support.h" + + #include "hashtab.h" + +@@ -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); + } + +- ALL_PSYMTABS (objfile, pst) ++ ALL_PSYMTABS_REQUIRED (objfile, pst) + { + if (FILENAME_CMP (name, pst->filename) == 0) + { +@@ -474,7 +473,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, + || gsymbol->language == language_auto) + { + 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) +- if (objfile->psymtabs_addrmap != NULL) ++ { ++ if (objfile->quick_addrmap) ++ { ++ if (!addrmap_find (objfile->quick_addrmap, pc)) ++ continue; ++ } ++ if (require_partial_symbols (objfile)->psymtabs_addrmap != NULL) + { + struct partial_symtab *pst; + +@@ -901,6 +906,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section) + return pst; + } + } ++ } + + /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs + which still have no corresponding full SYMTABs read. But it is not +@@ -1168,6 +1174,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile) + return psym; + } + ++/* Ensure that the partial symbols for OBJFILE have been loaded. This ++ function always returns its argument, as a convenience. */ + -+############################################ -+# Test that variables are not printed in a namespace -+# that is sibling to the namespace containing an import ++struct objfile * ++require_partial_symbols (struct objfile *objfile) ++{ ++ if ((objfile->flags & OBJF_SYMTABS_READ) == 0) ++ { ++ objfile->flags |= OBJF_SYMTABS_READ; + -+if ![runto L::marker8] then { -+ perror "couldn't run to breakpoint L::marker8" -+ continue ++ if (objfile->sf->sym_read_psymbols) ++ (*objfile->sf->sym_read_psymbols) (objfile); ++ } ++ return objfile; +} + -+gdb_test "print jx" "= 44" + /* 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. +@@ -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; ++ block = NULL; ++ } ++ + modified_name = name; + + /* If we are using C++ or Java, demangle the name before doing a lookup, so +@@ -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; + make_cleanup (xfree, demangled_name); + } +@@ -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; + } + +- 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, +- 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; + -+gdb_breakpoint "K::marker9" -+gdb_continue_to_breakpoint "K::marker9" ++ langdef = language_def (language); + -+gdb_test "print jx" "No symbol \"jx\" in current context." + + /* Check if either no block is specified or it's a global block. */ + +- if (static_block == NULL) ++ if (global_block == NULL) + return NULL; + +- while (block != static_block) ++ while (block_iterator != global_block) + { +- sym = lookup_symbol_aux_block (name, linkage_name, block, domain); + -+############################################ -+# Test that variables are only printed after the line -+# containing the import ++ sym = lookup_symbol_aux_block (name, block_iterator, domain); + -+if ![runto_main] then { -+ perror "couldn't run to breakpoint main" -+ continue -+} + 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); + -+gdb_breakpoint [gdb_get_line_number "marker10 stop"] -+gdb_continue_to_breakpoint "marker10 stop" ++ if (sym != NULL) ++ return sym; ++ } + -+# 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 -+++ b/gdb/testsuite/gdb.cp/namespace.exp -@@ -24,6 +24,7 @@ - # for namespaces. - # Note: As of 2000-06-03, they passed under g++ - djb ++ 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 edge of the function without finding a result. */ ++ /* We've reached the global block without finding a result. */ + + return NULL; + } +@@ -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. */ ++ require_partial_symbols ((struct objfile *) objfile); + ALL_OBJFILE_PSYMTABS (objfile, ps) + { + if (!ps->readin +- && 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); + } + } -+load_lib "cp-support.exp" + if (objfile->separate_debug_objfile) + return lookup_global_symbol_from_objfile (objfile->separate_debug_objfile, +- name, linkage_name, domain); ++ name, domain); - if $tracelevel then { - strace $tracelevel -@@ -259,11 +260,16 @@ gdb_test "ptype E" "type = namespace C::D::E" - gdb_test "ptype CClass" "type = (class C::CClass \{\r\n public:|struct C::CClass \{)\r\n int x;\r\n\}" - gdb_test "ptype CClass::NestedClass" "type = (class C::CClass::NestedClass \{\r\n public:|struct C::CClass::NestedClass \{)\r\n int y;\r\n\}" - gdb_test "ptype NestedClass" "No symbol \"NestedClass\" in current context." --setup_kfail "gdb/1448" "*-*-*" --gdb_test "ptype ::C::CClass" "type = class C::CClass \{\r\n public:\r\n int x;\r\n\}" --setup_kfail "gdb/1448" "*-*-*" --gdb_test "ptype ::C::CClass::NestedClass" "type = class C::CClass::NestedClass \{\r\n public:\r\n int y;\r\n\}" --setup_kfail "gdb/1448" "*-*-*" -+cp_test_ptype_class \ -+ "ptype ::C::CClass" "" "class" "C::CClass" \ -+ { -+ { field public "int x;" } -+ } -+cp_test_ptype_class \ -+ "ptype ::C::CClass::NestedClass" "" "class" "C::CClass::NestedClass" \ -+ { -+ { field public "int y;" } -+ } - gdb_test "ptype ::C::NestedClass" "No symbol \"NestedClass\" in namespace \"C\"." - gdb_test "ptype C::CClass" "No symbol \"CClass\" in namespace \"C::C\"." - gdb_test "ptype C::CClass::NestedClass" "No type \"CClass\" within class or namespace \"C::C\"." -@@ -273,8 +279,11 @@ gdb_test "ptype C::NestedClass" "No symbol \"NestedClass\" in namespace \"C::C\" + return NULL; + } +@@ -1488,8 +1523,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile, + static symbols. */ - gdb_test "print cOtherFile" "\\$\[0-9\].* = 316" - gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n public:|struct C::OtherFileClass \{)\r\n int z;\r\n\}" --setup_kfail "gdb/1448" "*-*-*" --gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n public:\r\n int z;\r\n\}" -+cp_test_ptype_class \ -+ "ptype ::C::OtherFileClass" "" "class" "C::OtherFileClass" \ + 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); + +- ALL_PSYMTABS (objfile, ps) ++ ALL_PSYMTABS_REQUIRED (objfile, ps) + { + if (!ps->readin +- && 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); + } + } + +- ALL_PSYMTABS (objfile, ps) ++ /* FIXME: .debug_pubnames should be read in. ++ ++ One may also try to the first pass without the require_partial_symbols ++ call but that would behave nondeterministically. */ ++ ALL_PSYMTABS_REQUIRED (objfile, ps) + { +- 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); + } + } + +- ALL_PSYMTABS (objfile, ps) ++ /* FIXME: Something like .debug_pubnames containing also static symbols ++ should be read in. Compiler needs to be taught to generate it first. ++ ++ One may also try to the first pass without the require_partial_symbols ++ 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, 0, STRUCT_DOMAIN)) + { + 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; + +- ALL_PSYMTABS (objfile, pst) ++ ALL_OBJFILES (objfile) ++ { ++ if ((objfile->flags & OBJF_MAIN) == 0) ++ continue; ++ require_partial_symbols (objfile); ++ ALL_OBJFILE_PSYMTABS (objfile, pst) ++ { ++ if (lookup_partial_symbol (pst, main_name (), 1, VAR_DOMAIN)) + { -+ { field public "int z;" } ++ return pst; + } - gdb_test "ptype C::OtherFileClass" "No symbol \"OtherFileClass\" in namespace \"C::C\"." ++ } ++ } ++ ++ ALL_PSYMTABS_REQUIRED (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); + } +@@ -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. + */ - # Some anonymous namespace tests. -diff --git a/gdb/testsuite/gdb.cp/overload.exp b/gdb/testsuite/gdb.cp/overload.exp -index 24025a2..a72932e 100644 ---- a/gdb/testsuite/gdb.cp/overload.exp -+++ b/gdb/testsuite/gdb.cp/overload.exp -@@ -74,12 +74,12 @@ set re_methods "${re_methods}${ws}int overload1arg\\((void|)\\);" - set re_methods "${re_methods}${ws}int overload1arg\\(char\\);" - set re_methods "${re_methods}${ws}int overload1arg\\(signed char\\);" - set re_methods "${re_methods}${ws}int overload1arg\\(unsigned char\\);" --set re_methods "${re_methods}${ws}int overload1arg\\(short\\);" --set re_methods "${re_methods}${ws}int overload1arg\\(unsigned short\\);" -+set re_methods "${re_methods}${ws}int overload1arg\\(short( int)?\\);" -+set re_methods "${re_methods}${ws}int overload1arg\\((unsigned short|short unsigned)( int)?\\);" - set re_methods "${re_methods}${ws}int overload1arg\\(int\\);" - set re_methods "${re_methods}${ws}int overload1arg\\(unsigned int\\);" --set re_methods "${re_methods}${ws}int overload1arg\\(long\\);" --set re_methods "${re_methods}${ws}int overload1arg\\(unsigned long\\);" -+set re_methods "${re_methods}${ws}int overload1arg\\(long( int)?\\);" -+set re_methods "${re_methods}${ws}int overload1arg\\((unsigned long|long unsigned)( int)?\\);" - set re_methods "${re_methods}${ws}int overload1arg\\(float\\);" - 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 ---- 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} { + 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. */ + +- ALL_PSYMTABS (objfile, ps) ++ ALL_PSYMTABS_REQUIRED (objfile, ps) + { + struct partial_symbol **bound, **gbound, **sbound; + int keep_going = 1; +diff --git a/gdb/symtab.h b/gdb/symtab.h +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 *); + #define SYMBOL_SECTION(symbol) (symbol)->ginfo.section + #define SYMBOL_OBJ_SECTION(symbol) (symbol)->ginfo.obj_section + +-#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol) \ +- (symbol)->ginfo.language_specific.cplus_specific.demangled_name +- + /* 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,10 @@ typedef enum domain_enum_tag + FUNCTIONS_DOMAIN, + + /* All defined types */ +- TYPES_DOMAIN ++ TYPES_DOMAIN, ++ ++ /* Fortran common blocks. Their naming must be separate from VAR_DOMAIN. */ ++ COMMON_BLOCK_DOMAIN } + domain_enum; - # This is the expected menu for overload1arg. --# Note the arg type variations on lines 6 and 13. -+# Note the arg type variations for void and integer types. - # This accommodates different versions of g++. +@@ -990,7 +990,6 @@ extern struct symbol *lookup_symbol (const char *, const struct block *, + that can't think of anything better to do. */ --set menu_overload1arg "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n\\\[4\\\] foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r\n\\\[5\\\] foo::overload1arg\\(long\\) at.*$srcfile:118\r\n\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n\\\[8\\\] foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r\n\\\[9\\\] foo::overload1arg\\(short\\) at.*$srcfile:114\r\n\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n> $" -+set menu_overload1arg "\\\[0\\\] cancel\r\n" -+append menu_overload1arg "\\\[1\\\] all\r\n" -+append menu_overload1arg "\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n" -+append menu_overload1arg "\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n" -+append menu_overload1arg "\\\[4\\\] foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r\n" -+append menu_overload1arg "\\\[5\\\] foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r\n" -+append menu_overload1arg "\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n" -+append menu_overload1arg "\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n" -+append menu_overload1arg "\\\[8\\\] foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r\n" -+append menu_overload1arg "\\\[9\\\] foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r\n" -+append menu_overload1arg "\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n" -+append menu_overload1arg "\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n" -+append menu_overload1arg "\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n" -+append menu_overload1arg "\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n" -+append menu_overload1arg "> $" + extern struct symbol *basic_lookup_symbol_nonlocal (const char *, +- const char *, + const struct block *, + const domain_enum); + +@@ -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: */ + ++struct objfile *require_partial_symbols (struct objfile *); ++ + /* lookup partial symbol table by filename */ + + extern struct partial_symtab *lookup_partial_symtab (const char *); +@@ -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 2c743e9..ef29610 100644 +--- a/gdb/target.h ++++ b/gdb/target.h +@@ -1157,6 +1157,20 @@ extern int target_search_memory (CORE_ADDR start_addr, + ULONGEST pattern_len, + CORE_ADDR *found_addrp); + ++/* Utility functions which can be used by search_memory implementations. */ ++ ++void allocate_pattern_buffer (char **pattern_bufp, char **pattern_buf_end, ++ ULONGEST *pattern_buf_size); ++ ++void increase_pattern_buffer (char **pattern_bufp, char **pattern_buf_end, ++ ULONGEST *pattern_buf_size, int val_bytes); ++ ++int search_memory (CORE_ADDR *start_addr, ULONGEST *search_space_len, ++ const char *pattern_buf, ULONGEST pattern_len, ++ CORE_ADDR *found_addr); ++ ++void put_bits (bfd_uint64_t data, char *buf, int bits, bfd_boolean big_p); ++ + /* Command logging facility. */ - # Set multiple-symbols to "ask", to allow us to test the use - # of the multiple-choice menu when breaking on an overloaded method. -@@ -157,17 +171,17 @@ set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 13 13 110 + #define target_log_command(p) \ +@@ -1276,6 +1290,14 @@ extern struct target_ops *find_target_beneath (struct target_ops *); - 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 - \[\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 - \[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\\(short\\) at.*$srcfile:114\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ -@@ -215,17 +229,17 @@ gdb_expect { + extern char *target_get_osdata (const char *type); - 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 - \[\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 - \[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\\(short\\) at.*$srcfile:114\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ -@@ -296,12 +310,12 @@ gdb_test "info break" \ - "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r - \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r --\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r -+\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r - \[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.dwarf2/dw2-stripped.c b/gdb/testsuite/gdb.dwarf2/dw2-stripped.c ++/* 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 d1e38f3..c7511cc 100644 +--- a/gdb/testsuite/ChangeLog ++++ b/gdb/testsuite/ChangeLog +@@ -1252,6 +1252,103 @@ + gdb_start_cmd. + Use runto_main before any test that requires execution. + ++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 + + * 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..ae301db +--- /dev/null ++++ b/gdb/testsuite/gdb.arch/powerpc-power7.exp +@@ -0,0 +1,175 @@ ++# 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. ++ ++# Test PowerPC Power7 instructions disassembly. ++ ++if {![istarget "powerpc*-*-*"]} then { ++ verbose "Skipping PowerPC Power7 instructions disassembly." ++ return ++} ++ ++set testfile "powerpc-power7" ++set srcfile ${testfile}.s ++set objfile ${objdir}/${subdir}/${testfile}.o ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != "" } { ++ untested "PowerPC Power7 instructions disassembly" ++ return -1 ++} ++ ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${objfile} ++ ++ ++# Disassemble the function. ++ ++set test "disass func" ++gdb_test_multiple $test $test { ++ -re "\r\nDump of assembler code for function func:(\r\n.*\r\n)End of assembler dump.\r\n$gdb_prompt $" { ++ set func $expect_out(1,string) ++ pass $test ++ } ++} ++ ++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 ++ ++ set test "Found $offset: $instr" ++ 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 ++ } ++} ++ ++func_check 0x0 "lxvd2x vs3,r4,r5" ++func_check 0x4 "lxvd2ux vs3,r4,r5" ++func_check 0x8 "lxvd2x vs43,r4,r5" ++func_check 0xc "lxvd2ux vs43,r4,r5" ++func_check 0x10 "stxvd2x vs3,r4,r5" ++func_check 0x14 "stxvd2ux vs3,r4,r5" ++func_check 0x18 "stxvd2x vs43,r4,r5" ++func_check 0x1c "stxvd2ux vs43,r4,r5" ++func_check 0x20 "xxmrghd vs3,vs4,vs5" ++func_check 0x24 "xxmrghd vs43,vs44,vs45" ++func_check 0x28 "xxmrgld vs3,vs4,vs5" ++func_check 0x2c "xxmrgld vs43,vs44,vs45" ++func_check 0x30 "xxmrghd vs3,vs4,vs5" ++func_check 0x34 "xxmrghd vs43,vs44,vs45" ++func_check 0x38 "xxmrgld vs3,vs4,vs5" ++func_check 0x3c "xxmrgld vs43,vs44,vs45" ++func_check 0x40 "xxpermdi vs3,vs4,vs5,1" ++func_check 0x44 "xxpermdi vs43,vs44,vs45,1" ++func_check 0x48 "xxpermdi vs3,vs4,vs5,2" ++func_check 0x4c "xxpermdi vs43,vs44,vs45,2" ++func_check 0x50 "xvmovdp vs3,vs4" ++func_check 0x54 "xvmovdp vs43,vs44" ++func_check 0x58 "xvmovdp vs3,vs4" ++func_check 0x5c "xvmovdp vs43,vs44" ++func_check 0x60 "xvcpsgndp vs3,vs4,vs5" ++func_check 0x64 "xvcpsgndp vs43,vs44,vs45" ++func_check 0x68 "wait" ++func_check 0x6c "wait" ++func_check 0x70 "waitrsv" ++func_check 0x74 "waitrsv" ++func_check 0x78 "waitimpl" ++func_check 0x7c "waitimpl" ++func_check 0x80 "doze" ++func_check 0x84 "nap" ++func_check 0x88 "sleep" ++func_check 0x8c "rvwinkle" ++func_check 0x90 "prtyw r3,r4" ++func_check 0x94 "prtyd r13,r14" ++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" ++func_check 0xac "daddq f20,f22,f24" ++func_check 0xb0 "dss 3" ++func_check 0xb4 "dssall" ++func_check 0xb8 "dst r5,r4,1" ++func_check 0xbc "dstt r8,r7,0" ++func_check 0xc0 "dstst r5,r6,3" ++func_check 0xc4 "dststt r4,r5,2" ++func_check 0xc8 "divwe r10,r11,r12" ++func_check 0xcc "divwe. r11,r12,r13" ++func_check 0xd0 "divweo r12,r13,r14" ++func_check 0xd4 "divweo. r13,r14,r15" ++func_check 0xd8 "divweu r10,r11,r12" ++func_check 0xdc "divweu. r11,r12,r13" ++func_check 0xe0 "divweuo r12,r13,r14" ++func_check 0xe4 "divweuo. r13,r14,r15" ++func_check 0xe8 "bpermd r7,r17,r27" ++func_check 0xec "popcntw r10,r20" ++func_check 0xf0 "popcntd r10,r20" ++func_check 0xf4 "ldbrx r20,r21,r22" ++func_check 0xf8 "stdbrx r20,r21,r22" ++func_check 0xfc "lfiwzx f10,0,r10" ++func_check 0x100 "lfiwzx f10,r9,r10" ++func_check 0x104 "fcfids f4,f5" ++func_check 0x108 "fcfids. f4,f5" ++func_check 0x10c "fcfidus f4,f5" ++func_check 0x110 "fcfidus. f4,f5" ++func_check 0x114 "fctiwu f4,f5" ++func_check 0x118 "fctiwu. f4,f5" ++func_check 0x11c "fctiwuz f4,f5" ++func_check 0x120 "fctiwuz. f4,f5" ++func_check 0x124 "fctidu f4,f5" ++func_check 0x128 "fctidu. f4,f5" ++func_check 0x12c "fctiduz f4,f5" ++func_check 0x130 "fctiduz. f4,f5" ++func_check 0x134 "fcfidu f4,f5" ++func_check 0x138 "fcfidu. f4,f5" ++func_check 0x13c "ftdiv cr0,f10,f11" ++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" "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" ++func_check 0x160 "lbarx r10,r11,r12" ++func_check 0x164 "lbarx r10,r11,r12,1" ++func_check 0x168 "lharx r20,r21,r22" ++func_check 0x16c "lharx r20,r21,r22" ++func_check 0x170 "lharx r20,r21,r22,1" ++func_check 0x174 "stbcx. r10,r11,r12" ++func_check 0x178 "sthcx. r10,r11,r12" ++func_check 0x17c "fre f14,f15" ++func_check 0x180 "fre. f14,f15" ++func_check 0x184 "fres f14,f15" ++func_check 0x188 "fres. f14,f15" ++func_check 0x18c "frsqrte f14,f15" ++func_check 0x190 "frsqrte. f14,f15" ++func_check 0x194 "frsqrtes f14,f15" ++func_check 0x198 "frsqrtes. f14,f15" ++func_check 0x19c "isel r2,r3,r4,28" +diff --git a/gdb/testsuite/gdb.arch/powerpc-power7.s b/gdb/testsuite/gdb.arch/powerpc-power7.s +new file mode 100644 +index 0000000..98b2e79 +--- /dev/null ++++ b/gdb/testsuite/gdb.arch/powerpc-power7.s +@@ -0,0 +1,107 @@ ++ .text ++ .globl func ++func: ++ .long 0x7c642e98 /* 0: lxvd2x vs3,r4,r5 */ ++ .long 0x7c642ed8 /* 4: lxvd2ux vs3,r4,r5 */ ++ .long 0x7d642e99 /* 8: lxvd2x vs43,r4,r5 */ ++ .long 0x7d642ed9 /* c: lxvd2ux vs43,r4,r5 */ ++ .long 0x7c642f98 /* 10: stxvd2x vs3,r4,r5 */ ++ .long 0x7c642fd8 /* 14: stxvd2ux vs3,r4,r5 */ ++ .long 0x7d642f99 /* 18: stxvd2x vs43,r4,r5 */ ++ .long 0x7d642fd9 /* 1c: stxvd2ux vs43,r4,r5 */ ++ .long 0xf0642850 /* 20: xxmrghd vs3,vs4,vs5 */ ++ .long 0xf16c6857 /* 24: xxmrghd vs43,vs44,vs45 */ ++ .long 0xf0642b50 /* 28: xxmrgld vs3,vs4,vs5 */ ++ .long 0xf16c6b57 /* 2c: xxmrgld vs43,vs44,vs45 */ ++ .long 0xf0642850 /* 30: xxmrghd vs3,vs4,vs5 */ ++ .long 0xf16c6857 /* 34: xxmrghd vs43,vs44,vs45 */ ++ .long 0xf0642b50 /* 38: xxmrgld vs3,vs4,vs5 */ ++ .long 0xf16c6b57 /* 3c: xxmrgld vs43,vs44,vs45 */ ++ .long 0xf0642950 /* 40: xxpermdi vs3,vs4,vs5,1 */ ++ .long 0xf16c6957 /* 44: xxpermdi vs43,vs44,vs45,1 */ ++ .long 0xf0642a50 /* 48: xxpermdi vs3,vs4,vs5,2 */ ++ .long 0xf16c6a57 /* 4c: xxpermdi vs43,vs44,vs45,2 */ ++ .long 0xf0642780 /* 50: xvmovdp vs3,vs4 */ ++ .long 0xf16c6787 /* 54: xvmovdp vs43,vs44 */ ++ .long 0xf0642780 /* 58: xvmovdp vs3,vs4 */ ++ .long 0xf16c6787 /* 5c: xvmovdp vs43,vs44 */ ++ .long 0xf0642f80 /* 60: xvcpsgndp vs3,vs4,vs5 */ ++ .long 0xf16c6f87 /* 64: xvcpsgndp vs43,vs44,vs45 */ ++ .long 0x7c00007c /* 68: wait */ ++ .long 0x7c00007c /* 6c: wait */ ++ .long 0x7c20007c /* 70: waitrsv */ ++ .long 0x7c20007c /* 74: waitrsv */ ++ .long 0x7c40007c /* 78: waitimpl */ ++ .long 0x7c40007c /* 7c: waitimpl */ ++ .long 0x4c000324 /* 80: doze */ ++ .long 0x4c000364 /* 84: nap */ ++ .long 0x4c0003a4 /* 88: sleep */ ++ .long 0x4c0003e4 /* 8c: rvwinkle */ ++ .long 0x7c830134 /* 90: prtyw r3,r4 */ ++ .long 0x7dcd0174 /* 94: prtyd r13,r14 */ ++ .long 0x7d5c02a6 /* 98: mfcfar r10 */ ++ .long 0x7d7c03a6 /* 9c: mtcfar r11 */ ++ .long 0x7c832bf8 /* a0: cmpb r3,r4,r5 */ ++ .long 0x7d4b662a /* a4: lwzcix r10,r11,r12 */ ++ .long 0xee119004 /* a8: dadd f16,f17,f18 */ ++ .long 0xfe96c004 /* ac: daddq f20,f22,f24 */ ++ .long 0x7c60066c /* b0: dss 3 */ ++ .long 0x7e00066c /* b4: dssall */ ++ .long 0x7c2522ac /* b8: dst r5,r4,1 */ ++ .long 0x7e083aac /* bc: dstt r8,r7,0 */ ++ .long 0x7c6532ec /* c0: dstst r5,r6,3 */ ++ .long 0x7e442aec /* c4: dststt r4,r5,2 */ ++ .long 0x7d4b6356 /* c8: divwe r10,r11,r12 */ ++ .long 0x7d6c6b57 /* cc: divwe. r11,r12,r13 */ ++ .long 0x7d8d7756 /* d0: divweo r12,r13,r14 */ ++ .long 0x7dae7f57 /* d4: divweo. r13,r14,r15 */ ++ .long 0x7d4b6316 /* d8: divweu r10,r11,r12 */ ++ .long 0x7d6c6b17 /* dc: divweu. r11,r12,r13 */ ++ .long 0x7d8d7716 /* e0: divweuo r12,r13,r14 */ ++ .long 0x7dae7f17 /* e4: divweuo. r13,r14,r15 */ ++ .long 0x7e27d9f8 /* e8: bpermd r7,r17,r27 */ ++ .long 0x7e8a02f4 /* ec: popcntw r10,r20 */ ++ .long 0x7e8a03f4 /* f0: popcntd r10,r20 */ ++ .long 0x7e95b428 /* f4: ldbrx r20,r21,r22 */ ++ .long 0x7e95b528 /* f8: stdbrx r20,r21,r22 */ ++ .long 0x7d4056ee /* fc: lfiwzx f10,0,r10 */ ++ .long 0x7d4956ee /* 100: lfiwzx f10,r9,r10 */ ++ .long 0xec802e9c /* 104: fcfids f4,f5 */ ++ .long 0xec802e9d /* 108: fcfids. f4,f5 */ ++ .long 0xec802f9c /* 10c: fcfidus f4,f5 */ ++ .long 0xec802f9d /* 110: fcfidus. f4,f5 */ ++ .long 0xfc80291c /* 114: fctiwu f4,f5 */ ++ .long 0xfc80291d /* 118: fctiwu. f4,f5 */ ++ .long 0xfc80291e /* 11c: fctiwuz f4,f5 */ ++ .long 0xfc80291f /* 120: fctiwuz. f4,f5 */ ++ .long 0xfc802f5c /* 124: fctidu f4,f5 */ ++ .long 0xfc802f5d /* 128: fctidu. f4,f5 */ ++ .long 0xfc802f5e /* 12c: fctiduz f4,f5 */ ++ .long 0xfc802f5f /* 130: fctiduz. f4,f5 */ ++ .long 0xfc802f9c /* 134: fcfidu f4,f5 */ ++ .long 0xfc802f9d /* 138: fcfidu. f4,f5 */ ++ .long 0xfc0a5900 /* 13c: ftdiv cr0,f10,f11 */ ++ .long 0xff8a5900 /* 140: ftdiv cr7,f10,f11 */ ++ .long 0xfc005140 /* 144: ftsqrt cr0,f10 */ ++ .long 0xff805140 /* 148: ftsqrt cr7,f10 */ ++ .long 0x7e084a2c /* 14c: dcbtt r8,r9 */ ++ .long 0x7e0849ec /* 150: dcbtstt r8,r9 */ ++ .long 0xed406644 /* 154: dcffix f10,f12 */ ++ .long 0xee80b645 /* 158: dcffix. f20,f22 */ ++ .long 0x7d4b6068 /* 15c: lbarx r10,r11,r12 */ ++ .long 0x7d4b6068 /* 160: lbarx r10,r11,r12 */ ++ .long 0x7d4b6069 /* 164: lbarx r10,r11,r12,1 */ ++ .long 0x7e95b0e8 /* 168: lharx r20,r21,r22 */ ++ .long 0x7e95b0e8 /* 16c: lharx r20,r21,r22 */ ++ .long 0x7e95b0e9 /* 170: lharx r20,r21,r22,1 */ ++ .long 0x7d4b656d /* 174: stbcx. r10,r11,r12 */ ++ .long 0x7d4b65ad /* 178: sthcx. r10,r11,r12 */ ++ .long 0xfdc07830 /* 17c: fre f14,f15 */ ++ .long 0xfdc07831 /* 180: fre. f14,f15 */ ++ .long 0xedc07830 /* 184: fres f14,f15 */ ++ .long 0xedc07831 /* 188: fres. f14,f15 */ ++ .long 0xfdc07834 /* 18c: frsqrte f14,f15 */ ++ .long 0xfdc07835 /* 190: frsqrte. f14,f15 */ ++ .long 0xedc07834 /* 194: frsqrtes f14,f15 */ ++ .long 0xedc07835 /* 198: frsqrtes. f14,f15 */ ++ .long 0x7c43271e /* 19c: isel r2,r3,r4,28 */ +diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S b/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S +new file mode 100644 +index 0000000..66f7a39 +--- /dev/null ++++ b/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S +@@ -0,0 +1,455 @@ ++ .file "x86_64-vla-typedef.c" ++ .section .debug_abbrev,"",@progbits ++.Ldebug_abbrev0: ++ .section .debug_info,"",@progbits ++.Ldebug_info0: ++ .section .debug_line,"",@progbits ++.Ldebug_line0: ++ .text ++.Ltext0: ++.globl foo ++ .type foo, @function ++foo: ++.LFB2: ++ .file 1 "x86_64-vla-typedef.c" ++ .loc 1 22 0 ++ pushq %rbp ++.LCFI0: ++ movq %rsp, %rbp ++.LCFI1: ++ subq $64, %rsp ++.LCFI2: ++ movl %edi, -36(%rbp) ++ .loc 1 22 0 ++ movq %rsp, %rax ++ movq %rax, -48(%rbp) ++ .loc 1 23 0 ++ movl -36(%rbp), %edx ++ movslq %edx,%rax ++ subq $1, %rax ++ movq %rax, -24(%rbp) ++ .loc 1 24 0 ++ movslq %edx,%rax ++ addq $15, %rax ++ addq $15, %rax ++ shrq $4, %rax ++ salq $4, %rax ++ subq %rax, %rsp ++ movq %rsp, -56(%rbp) ++ movq -56(%rbp), %rax ++ addq $15, %rax ++ shrq $4, %rax ++ salq $4, %rax ++ movq %rax, -56(%rbp) ++ movq -56(%rbp), %rax ++ movq %rax, -16(%rbp) ++ .loc 1 27 0 ++ movl $0, -4(%rbp) ++ jmp .L2 ++.L3: ++ .loc 1 28 0 ++ movl -4(%rbp), %esi ++ movl -4(%rbp), %eax ++ movl %eax, %ecx ++ movq -16(%rbp), %rdx ++ movslq %esi,%rax ++ movb %cl, (%rdx,%rax) ++ .loc 1 27 0 ++ addl $1, -4(%rbp) ++.L2: ++ movl -4(%rbp), %eax ++ cmpl -36(%rbp), %eax ++ jl .L3 ++ .loc 1 30 0 ++ .globl break_here ++break_here: ++ movq -16(%rbp), %rax ++ movb $0, (%rax) ++ movq -48(%rbp), %rsp ++ .loc 1 31 0 ++ leave ++ ret ++.LFE2: ++ .size foo, .-foo ++ .section .debug_frame,"",@progbits ++.Lframe0: ++ .long .LECIE0-.LSCIE0 ++.LSCIE0: ++ .long 0xffffffff ++ .byte 0x1 ++ .string "" ++ .uleb128 0x1 ++ .sleb128 -8 ++ .byte 0x10 ++ .byte 0xc ++ .uleb128 0x7 ++ .uleb128 0x8 ++ .byte 0x90 ++ .uleb128 0x1 ++ .align 8 ++.LECIE0: ++.LSFDE0: ++ .long .LEFDE0-.LASFDE0 ++.LASFDE0: ++ .long .Lframe0 ++ .quad .LFB2 ++ .quad .LFE2-.LFB2 ++ .byte 0x4 ++ .long .LCFI0-.LFB2 ++ .byte 0xe ++ .uleb128 0x10 ++ .byte 0x86 ++ .uleb128 0x2 ++ .byte 0x4 ++ .long .LCFI1-.LCFI0 ++ .byte 0xd ++ .uleb128 0x6 ++ .align 8 ++.LEFDE0: ++ .section .eh_frame,"a",@progbits ++.Lframe1: ++ .long .LECIE1-.LSCIE1 ++.LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .string "zR" ++ .uleb128 0x1 ++ .sleb128 -8 ++ .byte 0x10 ++ .uleb128 0x1 ++ .byte 0x3 ++ .byte 0xc ++ .uleb128 0x7 ++ .uleb128 0x8 ++ .byte 0x90 ++ .uleb128 0x1 ++ .align 8 ++.LECIE1: ++.LSFDE1: ++ .long .LEFDE1-.LASFDE1 ++.LASFDE1: ++ .long .LASFDE1-.Lframe1 ++ .long .LFB2 ++ .long .LFE2-.LFB2 ++ .uleb128 0x0 ++ .byte 0x4 ++ .long .LCFI0-.LFB2 ++ .byte 0xe ++ .uleb128 0x10 ++ .byte 0x86 ++ .uleb128 0x2 ++ .byte 0x4 ++ .long .LCFI1-.LCFI0 ++ .byte 0xd ++ .uleb128 0x6 ++ .align 8 ++.LEFDE1: ++ .text ++.Letext0: ++ .section .debug_loc,"",@progbits ++.Ldebug_loc0: ++.LLST0: ++ .quad .LFB2-.Ltext0 ++ .quad .LCFI0-.Ltext0 ++ .value 0x2 ++ .byte 0x77 ++ .sleb128 8 ++ .quad .LCFI0-.Ltext0 ++ .quad .LCFI1-.Ltext0 ++ .value 0x2 ++ .byte 0x77 ++ .sleb128 16 ++ .quad .LCFI1-.Ltext0 ++ .quad .LFE2-.Ltext0 ++ .value 0x2 ++ .byte 0x76 ++ .sleb128 16 ++ .quad 0x0 ++ .quad 0x0 ++ .section .debug_info ++ .long .Ldebug_end - .Ldebug_start ++.Ldebug_start: ++ .value 0x2 ++ .long .Ldebug_abbrev0 ++ .byte 0x8 ++ .uleb128 0x1 ++ .long .LASF2 ++ .byte 0x1 ++ .long .LASF3 ++ .long .LASF4 ++ .quad .Ltext0 ++ .quad .Letext0 ++ .long .Ldebug_line0 ++ .uleb128 0x2 ++ .byte 0x1 ++ .string "foo" ++ .byte 0x1 ++ .byte 0x16 ++ .byte 0x1 ++ .quad .LFB2 ++ .quad .LFE2 ++ .long .LLST0 ++ .long 0x83 ++ .uleb128 0x3 ++ .long .LASF5 ++ .byte 0x1 ++ .byte 0x15 ++ .long 0x83 ++ .byte 0x2 ++ .byte 0x91 ++ .sleb128 -52 ++.Ltag_typedef: ++ .uleb128 0x4 ++ .long .LASF6 ++ .byte 0x1 ++ .byte 0x17 ++ .long .Ltag_array_type - .debug_info ++ .uleb128 0x5 /* Abbrev Number: 5 (DW_TAG_variable) */ ++ .long .LASF0 ++ .byte 0x1 ++ .byte 0x18 ++#if 1 ++ .long .Ltag_typedef - .debug_info ++#else ++ /* Debugging only: Skip the typedef indirection. */ ++ .long .Ltag_array_type - .debug_info ++#endif ++ /* DW_AT_location: DW_FORM_block1: start */ ++ .byte 0x3 ++ .byte 0x91 ++ .sleb128 -32 ++#if 0 ++ .byte 0x6 /* DW_OP_deref */ ++#else ++ .byte 0x96 /* DW_OP_nop */ ++#endif ++ /* DW_AT_location: DW_FORM_block1: end */ ++ .uleb128 0x6 ++ .string "i" ++ .byte 0x1 ++ .byte 0x19 ++ .long 0x83 ++ .byte 0x2 ++ .byte 0x91 ++ .sleb128 -20 ++ .byte 0x0 ++ .uleb128 0x7 ++ .byte 0x4 ++ .byte 0x5 ++ .string "int" ++.Ltag_array_type: ++ .uleb128 0x8 /* Abbrev Number: 8 (DW_TAG_array_type) */ ++ .long 0xa0 + (2f - 1f) /* DW_AT_type: DW_FORM_ref4 */ ++ .long 0x9d + (2f - 1f) /* DW_AT_sibling: DW_FORM_ref4 */ ++1: /* DW_AT_data_location: DW_FORM_block1: start */ ++ .byte 2f - 3f /* length */ ++3: ++ .byte 0x97 /* DW_OP_push_object_address */ ++ .byte 0x6 /* DW_OP_deref */ ++2: /* DW_AT_data_location: DW_FORM_block1: end */ ++ .uleb128 0x9 ++ .long 0x9d + (2b - 1b) /* DW_AT_type: DW_FORM_ref4 */ ++ .byte 0x3 ++ .byte 0x91 ++ .sleb128 -40 ++ .byte 0x6 ++ .byte 0x0 ++ .uleb128 0xa ++ .byte 0x8 ++ .byte 0x7 ++ .uleb128 0xb ++ .byte 0x1 ++ .byte 0x6 ++ .long .LASF1 ++ .byte 0x0 ++.Ldebug_end: ++ .section .debug_abbrev ++ .uleb128 0x1 ++ .uleb128 0x11 ++ .byte 0x1 ++ .uleb128 0x25 ++ .uleb128 0xe ++ .uleb128 0x13 ++ .uleb128 0xb ++ .uleb128 0x3 ++ .uleb128 0xe ++ .uleb128 0x1b ++ .uleb128 0xe ++ .uleb128 0x11 ++ .uleb128 0x1 ++ .uleb128 0x12 ++ .uleb128 0x1 ++ .uleb128 0x10 ++ .uleb128 0x6 ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x2 ++ .uleb128 0x2e ++ .byte 0x1 ++ .uleb128 0x3f ++ .uleb128 0xc ++ .uleb128 0x3 ++ .uleb128 0x8 ++ .uleb128 0x3a ++ .uleb128 0xb ++ .uleb128 0x3b ++ .uleb128 0xb ++ .uleb128 0x27 ++ .uleb128 0xc ++ .uleb128 0x11 ++ .uleb128 0x1 ++ .uleb128 0x12 ++ .uleb128 0x1 ++ .uleb128 0x40 ++ .uleb128 0x6 ++ .uleb128 0x1 ++ .uleb128 0x13 ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x3 ++ .uleb128 0x5 ++ .byte 0x0 ++ .uleb128 0x3 ++ .uleb128 0xe ++ .uleb128 0x3a ++ .uleb128 0xb ++ .uleb128 0x3b ++ .uleb128 0xb ++ .uleb128 0x49 ++ .uleb128 0x13 ++ .uleb128 0x2 ++ .uleb128 0xa ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x4 ++ .uleb128 0x16 ++ .byte 0x0 ++ .uleb128 0x3 ++ .uleb128 0xe ++ .uleb128 0x3a ++ .uleb128 0xb ++ .uleb128 0x3b ++ .uleb128 0xb ++ .uleb128 0x49 ++ .uleb128 0x13 ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x5 ++ .uleb128 0x34 ++ .byte 0x0 ++ .uleb128 0x3 ++ .uleb128 0xe ++ .uleb128 0x3a ++ .uleb128 0xb ++ .uleb128 0x3b ++ .uleb128 0xb ++ .uleb128 0x49 ++ .uleb128 0x13 ++ .uleb128 0x2 ++ .uleb128 0xa ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x6 ++ .uleb128 0x34 ++ .byte 0x0 ++ .uleb128 0x3 ++ .uleb128 0x8 ++ .uleb128 0x3a ++ .uleb128 0xb ++ .uleb128 0x3b ++ .uleb128 0xb ++ .uleb128 0x49 ++ .uleb128 0x13 ++ .uleb128 0x2 ++ .uleb128 0xa ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x7 ++ .uleb128 0x24 ++ .byte 0x0 ++ .uleb128 0xb ++ .uleb128 0xb ++ .uleb128 0x3e ++ .uleb128 0xb ++ .uleb128 0x3 ++ .uleb128 0x8 ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x8 /* Abbrev Number: 8 (DW_TAG_array_type) */ ++ .uleb128 0x1 ++ .byte 0x1 ++ .uleb128 0x49 /* DW_AT_type */ ++ .uleb128 0x13 /* DW_FORM_ref4 */ ++ .uleb128 0x1 /* DW_AT_sibling */ ++ .uleb128 0x13 /* DW_FORM_ref4 */ ++ .uleb128 0x50 /* DW_AT_data_location */ ++ .uleb128 0xa /* DW_FORM_block1 */ ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0x9 ++ .uleb128 0x21 ++ .byte 0x0 ++ .uleb128 0x49 /* DW_AT_type */ ++ .uleb128 0x13 /* DW_FORM_ref4 */ ++ .uleb128 0x2f ++ .uleb128 0xa ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0xa ++ .uleb128 0x24 ++ .byte 0x0 ++ .uleb128 0xb ++ .uleb128 0xb ++ .uleb128 0x3e ++ .uleb128 0xb ++ .byte 0x0 ++ .byte 0x0 ++ .uleb128 0xb ++ .uleb128 0x24 ++ .byte 0x0 ++ .uleb128 0xb ++ .uleb128 0xb ++ .uleb128 0x3e ++ .uleb128 0xb ++ .uleb128 0x3 ++ .uleb128 0xe ++ .byte 0x0 ++ .byte 0x0 ++ .byte 0x0 ++ .section .debug_pubnames,"",@progbits ++ .long 0x16 ++ .value 0x2 ++ .long .Ldebug_info0 ++ .long 0xa8 ++ .long 0x2d ++ .string "foo" ++ .long 0x0 ++ .section .debug_aranges,"",@progbits ++ .long 0x2c ++ .value 0x2 ++ .long .Ldebug_info0 ++ .byte 0x8 ++ .byte 0x0 ++ .value 0x0 ++ .value 0x0 ++ .quad .Ltext0 ++ .quad .Letext0-.Ltext0 ++ .quad 0x0 ++ .quad 0x0 ++ .section .debug_str,"MS",@progbits,1 ++.LASF0: ++ .string "array" ++.LASF5: ++ .string "size" ++.LASF3: ++ .string "x86_64-vla-typedef.c" ++.LASF6: ++ .string "array_t" ++.LASF1: ++ .string "char" ++.LASF4: ++ .string "gdb.arch" ++.LASF2: ++ .string "GNU C 4.3.2 20081105 (Red Hat 4.3.2-7)" ++ .ident "GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7)" ++ .section .note.GNU-stack,"",@progbits +diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef.c b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.c new file mode 100644 -index 0000000..1f02d90 +index 0000000..b809c4e --- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-stripped.c -@@ -0,0 +1,42 @@ ++++ b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.c +@@ -0,0 +1,43 @@ +/* This testcase is part of GDB, the GNU debugger. + -+ Copyright 2004 Free Software Foundation, Inc. ++ 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 2 of the License, or ++ 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, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -+ USA. */ + ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + -+/* The function `func1' traced into must have debug info on offset > 0; -+ (DW_UNSND (attr)). This is the reason of `func0' existence. */ ++#if 0 + +void -+func0(int a, int b) ++foo (int size) +{ -+} ++ typedef char array_t[size]; ++ array_t array; ++ int i; + -+/* `func1' being traced into must have some arguments to dump. */ ++ for (i = 0; i < size; i++) ++ array[i] = i; + -+void -+func1(int a, int b) -+{ -+ func0 (a,b); ++ array[0] = 0; /* break-here */ +} + ++#else ++ +int -+main(void) ++main (void) +{ -+ func1 (1, 2); ++ foo (26); ++ foo (78); + return 0; +} -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp b/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp ++ ++#endif +diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef.exp b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.exp new file mode 100644 -index 0000000..1c6e84a +index 0000000..534120a --- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp -@@ -0,0 +1,79 @@ -+# Copyright 2006 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.arch/x86_64-vla-typedef.exp +@@ -0,0 +1,64 @@ ++# 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 ++# 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, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# along with this program. If not, see . + -+# Minimal DWARF-2 unit test ++# Test DW_AT_data_location accessed through DW_TAG_typedef intermediate. + -+# This test can only be run on targets which support DWARF-2. -+# 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 ![istarget "x86_64-*-*"] then { ++ verbose "Skipping over gdb.arch/x86_64-vla-typedef.exp test made only for x86_64." ++ return +} + -+set testfile "dw2-stripped" ++set testfile x86_64-vla-typedef ++set srcasmfile ${testfile}-foo.S +set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile}.x -+ -+remote_exec build "rm -f ${binfile}" -+ -+# get the value of gcc_compiled -+if [get_compiler_info ${binfile}] { ++set binfile ${objdir}/${subdir}/${testfile} ++set binobjfile ${objdir}/${subdir}/${testfile}-foo.o ++if { [gdb_compile "${srcdir}/${subdir}/${srcasmfile}" "${binobjfile}" object {}] != "" } { ++ untested "Couldn't compile test program" + return -1 +} -+ -+# This test can only be run on gcc as we use additional_flags=FIXME -+if {$gcc_compiled == 0} { -+ return 0 ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${binobjfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 +} + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-ggdb3}] != "" } { ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++if ![runto_main] { ++ untested x86_64-vla-typedef + return -1 +} + -+remote_exec build "objcopy -R .debug_loc ${binfile}" -+set strip_output [remote_exec build "objdump -h ${binfile}"] ++gdb_breakpoint "break_here" + -+set test "stripping test file preservation" -+if [ regexp ".debug_info " $strip_output] { -+ pass "$test (.debug_info preserved)" -+} else { -+ fail "$test (.debug_info got also stripped)" -+} ++gdb_continue_to_breakpoint "break_here" + -+set test "stripping test file functionality" -+if [ regexp ".debug_loc " $strip_output] { -+ fail "$test (.debug_loc still present)" -+} else { -+ pass "$test (.debug_loc stripped)" -+} ++gdb_test "whatis array" "type = array_t" "first: whatis array" + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++gdb_test "ptype array" "type = char \\\[26\\\]" "first: ptype array" + -+# For C programs, "start" should stop in main(). ++gdb_test "p array\[1\]" "\\$\[0-9\] = 1 '\\\\1'" ++gdb_test "p array\[2\]" "\\$\[0-9\] = 2 '\\\\2'" ++gdb_test "p array\[3\]" "\\$\[0-9\] = 3 '\\\\3'" ++gdb_test "p array\[4\]" "\\$\[0-9\] = 4 '\\\\4'" + -+gdb_test "start" \ -+ ".*main \\(\\) at .*" \ -+ "start" -+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 */ ++gdb_continue_to_breakpoint "break_here" + -+ .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 */ ++gdb_test "whatis array" "type = array_t" "second: whatis array" + - .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 "ptype array" "type = char \\\[78\\\]" "second: ptype array" +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 ++++ b/gdb/testsuite/gdb.base/arrayidx.c +@@ -17,6 +17,13 @@ + + int array[] = {1, 2, 3, 4}; + ++#ifdef __GNUC__ ++struct ++ { ++ int a[0]; ++ } unbound; ++#endif ++ + int + main (void) + { +diff --git a/gdb/testsuite/gdb.base/arrayidx.exp b/gdb/testsuite/gdb.base/arrayidx.exp +index 71ce4aa..af0e5f8 100644 +--- a/gdb/testsuite/gdb.base/arrayidx.exp ++++ b/gdb/testsuite/gdb.base/arrayidx.exp +@@ -59,4 +59,12 @@ gdb_test "print array" \ + "\\{\\\[0\\\] = 1, \\\[1\\\] = 2, \\\[2\\\] = 3, \\\[3\\\] = 4\\}" \ + "Print array with array-indexes on" --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 +- ++set test "p unbound.a == &unbound.a\[0\]" ++gdb_test_multiple $test $test { ++ -re " = 1\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "No symbol \"unbound\" in current context.\r\n$gdb_prompt $" { ++ unsupported "$test (no GCC)" ++ } ++} +diff --git a/gdb/testsuite/gdb.base/help.exp b/gdb/testsuite/gdb.base/help.exp +index 5fc680b..d271c81 100644 +--- a/gdb/testsuite/gdb.base/help.exp ++++ b/gdb/testsuite/gdb.base/help.exp +@@ -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 +-gdb_test "help source" "Read commands from a file named FILE\.\[\r\n\]+Optional -v switch \\(before the filename\\) causes each command in\[\r\n\]+FILE to be echoed as it is executed\.\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way\[\r\n\]+when GDB is started\." "help source" ++gdb_test "help source" "Read commands from a file named FILE\.\[\r\n\]+Optional -v switch \\(before the filename\\) causes each command in\[\r\n\]+FILE to be echoed as it is executed\.\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way\[\r\n\]+when GDB is started\.\[\r\n\]+Optional -p switch \\(before the filename\\) causes FILE to be evaluated\[\r\n\]+as Python code\." "help source" + # test help stack + test_class_help "stack" { + "Examining the stack\..*\[\r\n\]+" +diff --git a/gdb/testsuite/gdb.base/lineno-makeup-func.c b/gdb/testsuite/gdb.base/lineno-makeup-func.c new file mode 100644 -index 0000000..5fcdd84 +index 0000000..1a0220e --- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.S -@@ -0,0 +1,83 @@ ++++ b/gdb/testsuite/gdb.base/lineno-makeup-func.c +@@ -0,0 +1,21 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009 Free Software Foundation, Inc. @@ -39200,78 +19605,57 @@ index 0000000..5fcdd84 + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + -+/* 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 */ -+ .ascii "dw2-struct-member-data-location.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_structure_type */ -+ .ascii "some_struct\0" /* DW_AT_name */ -+ -+ .uleb128 3 /* Abbrev: DW_TAG_member */ -+ .ascii "field\0" /* DW_AT_name */ -+ .byte 0 /* DW_AT_data_member_location */ ++void ++func (void) ++{ ++} +diff --git a/gdb/testsuite/gdb.base/lineno-makeup.c b/gdb/testsuite/gdb.base/lineno-makeup.c +new file mode 100644 +index 0000000..bb20e98 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/lineno-makeup.c +@@ -0,0 +1,35 @@ ++/* This testcase is part of GDB, the GNU debugger. + -+ .byte 0 /* End of children of some_struct */ ++ Copyright 2009 Free Software Foundation, Inc. + -+ .byte 0 /* End of children of CU */ ++ 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. + -+.Lcu1_end: ++ 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. + -+/* Abbrev table */ -+ .section .debug_abbrev -+.Labbrev1_begin: -+ .uleb128 1 /* Abbrev code */ -+ .uleb128 0x11 /* DW_TAG_compile_unit */ -+ .byte 1 /* has_children */ -+ .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 */ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + -+ .uleb128 2 /* Abbrev code */ -+ .uleb128 0x13 /* DW_TAG_structure_type */ -+ .byte 1 /* has_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ ++/* DW_AT_low_pc-DW_AT_high_pc should cover the function without line number ++ information (.debug_line) so we cannot use an external object file. ++ ++ It must not be just a label as it would alias on the next function even for ++ correct GDB. Therefore some stub data must be placed there. ++ ++ We need to provide a real stub function body as at least s390 ++ (s390_analyze_prologue) would skip the whole body till reaching `main'. */ + -+ .uleb128 3 /* Abbrev code */ -+ .uleb128 0x0d /* DW_TAG_member */ -+ .byte 0 /* has_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x38 /* DW_AT_data_member_location */ -+ .uleb128 0x0b /* DW_FORM_data1 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ ++extern void func (void); ++asm ("func: .incbin \"gdb.base/lineno-makeup-func.bin\""); + -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp ++int ++main (void) ++{ ++ func (); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/lineno-makeup.exp b/gdb/testsuite/gdb.base/lineno-makeup.exp new file mode 100644 -index 0000000..c41151c +index 0000000..0c75b84 --- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp -@@ -0,0 +1,37 @@ ++++ b/gdb/testsuite/gdb.base/lineno-makeup.exp +@@ -0,0 +1,78 @@ +# Copyright 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -39287,89 +19671,115 @@ index 0000000..c41151c +# 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 -+} -+ -+set testfile "dw2-struct-member-data-location" -+set srcfile ${testfile}.S -+set binfile ${testfile}.x ++set testfile "lineno-makeup" ++set srcfuncfile ${testfile}-func.c ++set srcfile ${testfile}.c ++set objfuncfile ${objdir}/${subdir}/${testfile}-func.o ++set binfuncfile ${objdir}/${subdir}/${testfile}-func.bin ++set binfile ${objdir}/${subdir}/${testfile} + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${binfile}" object {nodebug}] != "" } { -+ return -1 ++if { [gdb_compile "${srcdir}/${subdir}/${srcfuncfile}" "${objfuncfile}" object {}] != "" } { ++ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + -+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 . */ ++set objcopy [catch "exec objcopy -O binary --only-section .text ${objfuncfile} ${binfuncfile}" output] ++verbose -log "objcopy=$objcopy: $output" ++if { $objcopy != 0 } { ++ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." ++} ++set binfuncfilesize [file size $binfuncfile] ++verbose -log "file size $binfuncfile = $binfuncfilesize" + -+#include ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." ++} + -+asm (".globl cu_text_start"); -+asm ("cu_text_start:"); ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+int -+main (void) -+{ -+ unsigned char var = 1; ++set b_addr "" ++set test "break func" ++gdb_test_multiple $test $test { ++ -re "Breakpoint \[0-9\]+ at (0x\[0-9a-f\]+)\r\n$gdb_prompt $" { ++ set b_addr $expect_out(1,string) ++ pass $test ++ } ++ -re "Breakpoint \[0-9\]+ at (0x\[0-9a-f\]+): .*\r\n$gdb_prompt $" { ++ set b_addr $expect_out(1,string) ++ fail $test ++ } ++} ++verbose -log "b_addr=<$b_addr>" + -+ 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:"); -+ } ++set p_addr "" ++set test "print func" ++gdb_test_multiple $test $test { ++ -re "\\$\[0-9\]+ = {} (0x\[0-9a-f\]+) \r\n$gdb_prompt $" { ++ set p_addr $expect_out(1,string) ++ pass $test ++ } ++} ++verbose -log "p_addr=<$p_addr>" + -+ return 0; ++set test "break address belongs to func" ++if {$b_addr == $p_addr} { ++ pass "$test (exact match)" ++} else { ++ set skip [expr $b_addr - $p_addr] ++ if {$skip > 0 && $skip < $binfuncfilesize} { ++ pass "$test (prologue skip by $skip bytes)" ++ } else { ++ fail $test ++ } ++} +diff --git a/gdb/testsuite/gdb.base/macscp.exp b/gdb/testsuite/gdb.base/macscp.exp +index 55c4d31..df25d3c 100644 +--- a/gdb/testsuite/gdb.base/macscp.exp ++++ b/gdb/testsuite/gdb.base/macscp.exp +@@ -33,6 +33,14 @@ if [test_compiler_info gcc*] { + lappend options additional_flags=-g3 + } + ++# Workaround ccache making lineno non-zero for command-line definitions. ++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" ++ } +} + -+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 + # 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}" \ +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" + +-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" +- + 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..4c098f3 +index 0000000..84b57db --- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S -@@ -0,0 +1,171 @@ ++++ b/gdb/testsuite/gdb.base/valgrind-attach.c +@@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + -+ Copyright 2007, 2008, 2009 Free Software Foundation, Inc. ++ 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 @@ -39384,166 +19794,23 @@ index 0000000..4c098f3 + 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 */ ++#include + -+ .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 */ ++int ++main (void) ++{ ++ int *a = malloc (1); + -+ .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 */ ++ a[10] = 0; /* crash-here */ + -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/valgrind-attach.exp b/gdb/testsuite/gdb.base/valgrind-attach.exp new file mode 100644 -index 0000000..b955da9 +index 0000000..1f9b26e --- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp -@@ -0,0 +1,41 @@ ++++ b/gdb/testsuite/gdb.base/valgrind-attach.exp +@@ -0,0 +1,94 @@ +# Copyright 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -39559,548 +19826,329 @@ index 0000000..b955da9 +# 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] { ++set testfile valgrind-attach ++set shfile ${testfile}.sh ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${testfile} ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" + 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 ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/common-block.exp -@@ -0,0 +1,101 @@ -+# Copyright 2008 Free Software Foundation, Inc. ++gdb_exit ++gdb_stop_suppressing_tests; + -+# 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. ++set VALGRIND "valgrind" + -+# This file was written by Jan Kratochvil . ++# Syntax for ${shfile} is: ++set VALGRIND_SPAWN "sh ${srcdir}/${subdir}/${shfile} $binfile $VALGRIND $GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]" + -+set testfile "common-block" -+set srcfile ${testfile}.f90 -+set binfile ${objdir}/${subdir}/${testfile} ++set test "spawn valgrind" ++verbose "Spawning $VALGRIND_SPAWN" + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { -+ untested "Couldn't compile ${srcfile}" ++if [info exists gdb_spawn_id] { ++ fail $test + 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 ++if ![is_remote host] { ++ if { [which $VALGRIND] == 0 } then { ++ untested "Couldn't find $VALGRIND" ++ return -1 ++ } +} ++set res [remote_spawn host "$VALGRIND_SPAWN"] ++if { $res < 0 || $res == "" } { ++ perror "Spawning $VALGRIND_SPAWN failed." ++ return -1 ++} ++set gdb_spawn_id -1; + -+gdb_breakpoint [gdb_get_line_number "stop-here-out"] -+gdb_continue_to_breakpoint "stop-here-out" -+ -+# Common block naming with source name /foo/: -+# .symtab DW_TAG_common_block's DW_AT_name -+# Intel Fortran foo_ foo_ -+# GNU Fortran foo_ foo -+#set suffix "_" -+set suffix "" -+ -+set int4 {(integer\(kind=4\)|INTEGER\(4\))} -+set real4 {(real\(kind=4\)|REAL\(4\))} -+set real8 {(real\(kind=8\)|REAL\(8\))} -+ -+gdb_test "whatis foo$suffix" "No symbol \"foo$suffix\" in current context." -+gdb_test "ptype foo$suffix" "No symbol \"foo$suffix\" in current context." -+gdb_test "p foo$suffix" "No symbol \"foo$suffix\" in current context." -+gdb_test "whatis fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." -+gdb_test "ptype fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." -+gdb_test "p fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." -+ -+gdb_test "info locals" "ix_x = 11\r\niy_y = 22\r\niz_z = 33\r\nix = 1\r\niy = 2\r\niz = 3" "info locals out" -+gdb_test "info common" "Contents of F77 COMMON block 'fo_o':\r\nix_x = 11\r\niy_y = 22\r\niz_z = 33\r\n\r\nContents of F77 COMMON block 'foo':\r\nix = 1\r\niy = 2\r\niz = 3" "info common out" -+ -+gdb_test "ptype ix" "type = $int4" "ptype ix out" -+gdb_test "ptype iy" "type = $real4" "ptype iy out" -+gdb_test "ptype iz" "type = $real8" "ptype iz out" -+gdb_test "ptype ix_x" "type = $int4" "ptype ix_x out" -+gdb_test "ptype iy_y" "type = $real4" "ptype iy_y out" -+gdb_test "ptype iz_z" "type = $real8" "ptype iz_z out" -+ -+gdb_test "p ix" " = 1 *" "p ix out" -+gdb_test "p iy" " = 2 *" "p iy out" -+gdb_test "p iz" " = 3 *" "p iz out" -+gdb_test "p ix_x" " = 11 *" "p ix_x out" -+gdb_test "p iy_y" " = 22 *" "p iy_y out" -+gdb_test "p iz_z" " = 33 *" "p iz_z out" -+ -+gdb_breakpoint [gdb_get_line_number "stop-here-in"] -+gdb_continue_to_breakpoint "stop-here-in" -+ -+gdb_test "whatis foo$suffix" "No symbol \"foo$suffix\" in current context." "whatis foo$suffix in" -+gdb_test "ptype foo$suffix" "No symbol \"foo$suffix\" in current context." "ptype foo$suffix in" -+gdb_test "p foo$suffix" "No symbol \"foo$suffix\" in current context." "p foo$suffix in" -+gdb_test "whatis fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "whatis fo_o$suffix in" -+gdb_test "ptype fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "ptype fo_o$suffix in" -+gdb_test "p fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "p fo_o$suffix in" -+ -+gdb_test "info locals" "ix = 11\r\niy2 = 22\r\niz = 33\r\nix_x = 1\r\niy_y = 2\r\niz_z2 = 3\r\niy = 5\r\niz_z = 55" "info locals in" -+gdb_test "info common" "Contents of F77 COMMON block 'fo_o':\r\nix = 11\r\niy2 = 22\r\niz = 33\r\n\r\nContents of F77 COMMON block 'foo':\r\nix_x = 1\r\niy_y = 2\r\niz_z2 = 3" "info common in" -+ -+gdb_test "ptype ix" "type = $int4" "ptype ix in" -+gdb_test "ptype iy2" "type = $real4" "ptype iy2 in" -+gdb_test "ptype iz" "type = $real8" "ptype iz in" -+gdb_test "ptype ix_x" "type = $int4" "ptype ix_x in" -+gdb_test "ptype iy_y" "type = $real4" "ptype iy_y in" -+gdb_test "ptype iz_z2" "type = $real8" "ptype iz_z2 in" -+ -+gdb_test "p ix" " = 11 *" "p ix in" -+gdb_test "p iy2" " = 22 *" "p iy2 in" -+gdb_test "p iz" " = 33 *" "p iz in" -+gdb_test "p ix_x" " = 1 *" "p ix_x in" -+gdb_test "p iy_y" " = 2 *" "p iy_y in" -+gdb_test "p iz_z2" " = 3 *" "p iz_z2 in" -diff --git a/gdb/testsuite/gdb.fortran/common-block.f90 b/gdb/testsuite/gdb.fortran/common-block.f90 -new file mode 100644 -index 0000000..b614e8a ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/common-block.f90 -@@ -0,0 +1,67 @@ -+! 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 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. -+! -+! Ihis file is the Fortran source file for dynamic.exp. -+! Original file written by Jakub Jelinek . -+! Modified for the GDB testcase by Jan Kratochvil . -+ -+subroutine in -+ -+ INTEGER*4 ix -+ REAL*4 iy2 -+ REAL*8 iz ++gdb_expect { ++ -re "---- Attach to debugger \\? --- \\\[Return/N/n/Y/y/C/c\\\] ---- $" { ++ pass $test ++ } ++ eof { ++ perror "(eof) $VALGRIND never initialized" ++ remote_close host ++ return -1 ++ } ++ timeout { ++ perror "(timeout) $VALGRIND never initialized" ++ remote_close host ++ return -1 ++ } ++} ++send_gdb "y\n" + -+ INTEGER*4 ix_x -+ REAL*4 iy_y -+ REAL*8 iz_z2 ++set test "spawn gdb" ++set test2 "crash line caught" ++gdb_expect { ++ -re "starting debugger with cmd:.* in main .* crash-here .*\[\r\n\]$gdb_prompt $" { ++ pass $test ++ pass $test2 ++ } ++ -re "starting debugger with cmd:.*\[\r\n\]$gdb_prompt $" { ++ pass $test ++ fail $test2 ++ } ++ eof { ++ perror "(eof) $GDB never initialized" ++ remote_close host ++ return -1 ++ } ++ timeout { ++ perror "(timeout) $GDB never initialized" ++ remote_close host ++ return -1 ++ } ++} + -+ common /fo_o/ix,iy2,iz -+ common /foo/ix_x,iy_y,iz_z2 ++remote_close host +diff --git a/gdb/testsuite/gdb.base/valgrind-attach.sh b/gdb/testsuite/gdb.base/valgrind-attach.sh +new file mode 100755 +index 0000000..f02c6f7 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/valgrind-attach.sh +@@ -0,0 +1,20 @@ ++#! /bin/sh + -+ iy = 5 -+ iz_z = 55 ++# Copyright 2009 Free Software Foundation, Inc. + -+ if (ix .ne. 11 .or. iy2 .ne. 22.0 .or. iz .ne. 33.0) call abort -+ if (ix_x .ne. 1 .or. iy_y .ne. 2.0 .or. iz_z2 .ne. 3.0) call abort ++# 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 . + -+ ix = 0 ! stop-here-in ++BINFILE="$1"; shift ++VALGRIND="$1"; shift ++"$VALGRIND" --db-attach=yes --db-command="$* %f %p" "$BINFILE" +diff --git a/gdb/testsuite/gdb.base/vla-overflow.c b/gdb/testsuite/gdb.base/vla-overflow.c +new file mode 100644 +index 0000000..c5d5ee0 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/vla-overflow.c +@@ -0,0 +1,30 @@ ++/* This testcase is part of GDB, the GNU debugger. + -+end subroutine in ++ Copyright 2008 Free Software Foundation, Inc. + -+program common_test ++ 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. + -+ INTEGER*4 ix -+ REAL*4 iy -+ REAL*8 iz ++ 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. + -+ INTEGER*4 ix_x -+ REAL*4 iy_y -+ REAL*8 iz_z ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + -+ common /foo/ix,iy,iz -+ common /fo_o/ix_x,iy_y,iz_z ++#include + -+ ix = 1 -+ iy = 2.0 -+ iz = 3.0 ++int ++main (int argc, char **argv) ++{ ++ int array[argc]; + -+ ix_x = 11 -+ iy_y = 22.0 -+ iz_z = 33.0 ++ array[0] = array[0]; + -+ call in ! stop-here-out ++ abort (); + -+end program common_test -diff --git a/gdb/testsuite/gdb.fortran/dynamic.exp b/gdb/testsuite/gdb.fortran/dynamic.exp ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/vla-overflow.exp b/gdb/testsuite/gdb.base/vla-overflow.exp new file mode 100644 -index 0000000..77a1203 +index 0000000..7203a48 --- /dev/null -+++ b/gdb/testsuite/gdb.fortran/dynamic.exp -@@ -0,0 +1,156 @@ -+# Copyright 2007 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.base/vla-overflow.exp +@@ -0,0 +1,108 @@ ++# 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 2 of the License, or ++# 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, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ -+# This file was written by Jan Kratochvil . ++# along with this program. If not, see . + -+# This file is part of the gdb testsuite. It contains tests for dynamically -+# allocated Fortran arrays. -+# It depends on the GCC dynamic Fortran arrays DWARF support: -+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22244 ++# We could crash in: ++# #0 block_linkage_function (bl=0x0) at ../../gdb/block.c:69 ++# #1 in dwarf_block_get_frame_base (...) at ../../gdb/dwarf2block.c:97 ++# 97 framefunc = block_linkage_function (get_frame_block (frame, NULL)); ++# #2 in execute_stack_op (...) at ../../gdb/dwarf2expr.c:496 ++# #3 in dwarf_block_exec_core () at ../../gdb/dwarf2block.c:156 ++# #4 dwarf_block_exec (...) at ../../gdb/dwarf2block.c:206 ++# #5 in range_type_count_bound_internal (...) at ../../gdb/gdbtypes.c:1430 ++# #6 in create_array_type (...) at ../../gdb/gdbtypes.c:840 ++# ... ++# #21 in psymtab_to_symtab (...) at ../../gdb/symfile.c:292 ++# ... ++# #29 in backtrace_command_1 () at ../../gdb/stack.c:1273 + -+set testfile "dynamic" -+set srcfile ${testfile}.f90 ++set testfile vla-overflow ++set shfile ${objdir}/${subdir}/${testfile}-gdb.sh ++set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { -+ untested "Couldn't compile ${srcfile}" ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" + return -1 +} + ++set f [open "|getconf PAGESIZE" "r"] ++gets $f pagesize ++close $f ++ +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + -+if ![runto MAIN__] then { -+ perror "couldn't run to breakpoint MAIN__" -+ continue ++set pid_of_gdb [exp_pid -i [board_info host fileid]] ++ ++if { [runto_main] < 0 } { ++ untested vla-overflow ++ return -1 +} + -+gdb_breakpoint [gdb_get_line_number "varx-init"] -+gdb_continue_to_breakpoint "varx-init" -+gdb_test "p varx" "\\$\[0-9\]* = <(object|the array) is not allocated>" "p varx unallocated" -+gdb_test "ptype varx" "type = <(object|the array) is not allocated>" "ptype varx unallocated" -+gdb_test "p varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "p varx(1,5,17) unallocated" -+gdb_test "p varx(1,5,17)=1" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "p varx(1,5,17)=1 unallocated" -+gdb_test "ptype varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "ptype varx(1,5,17) unallocated" ++# Get the GDB memory size when we stay at main. + -+gdb_breakpoint [gdb_get_line_number "varx-allocated"] -+gdb_continue_to_breakpoint "varx-allocated" -+# $1 = (( ( 0, 0, 0, 0, 0, 0) ( 0, 0, 0, 0, 0, 0) --- , 0) ) ( ( 0, 0, ...) ...) ...) -+gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)" "ptype varx allocated" -+# Intel Fortran Compiler 10.1.008 uses -1 there, GCC uses 1. -+gdb_test "p l" "\\$\[0-9\]* = (\\.TRUE\\.|4294967295)" "p l if varx allocated" ++proc memory_v_pages_get {} { ++ global pid_of_gdb pagesize ++ set fd [open "/proc/$pid_of_gdb/statm"] ++ gets $fd line ++ close $fd ++ # number of pages of virtual memory ++ scan $line "%d" drs ++ return $drs ++} + -+gdb_breakpoint [gdb_get_line_number "varx-filled"] -+gdb_continue_to_breakpoint "varx-filled" -+gdb_test "p varx(2, 5, 17)" "\\$\[0-9\]* = 6" -+gdb_test "p varx(1, 5, 17)" "\\$\[0-9\]* = 7" -+gdb_test "p varx(2, 6, 18)" "\\$\[0-9\]* = 8" -+gdb_test "p varx(6, 15, 28)" "\\$\[0-9\]* = 9" -+# The latter one is for the Intel Fortran Compiler 10.1.008 pointer type. -+gdb_test "p varv" "\\$\[0-9\]* = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "p varv unassociated" -+gdb_test "ptype varv" "type = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "ptype varv unassociated" ++set pages_found [memory_v_pages_get] + -+gdb_breakpoint [gdb_get_line_number "varv-associated"] -+gdb_continue_to_breakpoint "varv-associated" -+gdb_test "p varx(3, 7, 19)" "\\$\[0-9\]* = 6" "p varx(3, 7, 19) with varv associated" -+gdb_test "p varv(3, 7, 19)" "\\$\[0-9\]* = 6" "p varv(3, 7, 19) associated" -+# Intel Fortran Compiler 10.1.008 uses -1 there, GCC uses 1. -+gdb_test "p l" "\\$\[0-9\]* = (\\.TRUE\\.|4294967295)" "p l if varv associated" -+gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)" "ptype varx with varv associated" -+# Intel Fortran Compiler 10.1.008 uses the pointer type. -+gdb_test "ptype varv" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)\\)?" "ptype varv associated" ++set mb_reserve 10 ++verbose -log "pages_found = $pages_found, mb_reserve = $mb_reserve" ++set kb_found [expr $pages_found * $pagesize / 1024] ++set kb_permit [expr $kb_found + 1 * 1024 + $mb_reserve * 1024] ++verbose -log "kb_found = $kb_found, kb_permit = $kb_permit" ++ ++# Create the ulimit wrapper. ++set f [open $shfile "w"] ++puts $f "#! /bin/sh" ++puts $f "ulimit -v $kb_permit" ++puts $f "exec $GDB \"\$@\"" ++close $f ++remote_exec host "chmod +x $shfile" ++ ++gdb_exit ++set GDBold $GDB ++set GDB "$shfile" ++gdb_start ++set GDB $GDBold ++ ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++set pid_of_gdb [exp_pid -i [board_info host fileid]] ++ ++# Check the size again after the second run. ++# We must not stop in main as it would cache `array' and never crash later. ++ ++gdb_run_cmd ++ ++verbose -log "kb_found before abort() = [expr [memory_v_pages_get] * $pagesize / 1024]" ++ ++gdb_test "" "Program received signal SIGABRT, Aborted..*" "Enter abort()" ++ ++verbose -log "kb_found in abort() = [expr [memory_v_pages_get] * $pagesize / 1024]" + -+gdb_breakpoint [gdb_get_line_number "varv-filled"] -+gdb_continue_to_breakpoint "varv-filled" -+gdb_test "p varx(3, 7, 19)" "\\$\[0-9\]* = 10" "p varx(3, 7, 19) with varv filled" -+gdb_test "p varv(3, 7, 19)" "\\$\[0-9\]* = 10" "p varv(3, 7, 19) filled" ++# `abort' can get expressed as `*__GI_abort'. ++gdb_test "bt" "in \[^ \]*abort \\(.* in main \\(.*" "Backtrace after abort()" + -+gdb_breakpoint [gdb_get_line_number "varv-deassociated"] -+gdb_continue_to_breakpoint "varv-deassociated" -+# The latter one is for the Intel Fortran Compiler 10.1.008 pointer type. -+gdb_test "p varv" "\\$\[0-9\]* = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "p varv deassociated" -+gdb_test "ptype varv" "type = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "ptype varv deassociated" -+gdb_test "p l" "\\$\[0-9\]* = \\.FALSE\\." "p l if varv deassociated" -+gdb_test "p varv(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not associated\\." -+gdb_test "ptype varv(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not associated\\." ++verbose -log "kb_found in bt after abort() = [expr [memory_v_pages_get] * $pagesize / 1024]" +diff --git a/gdb/testsuite/gdb.base/vla.c b/gdb/testsuite/gdb.base/vla.c +new file mode 100644 +index 0000000..e1f3ed1 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/vla.c +@@ -0,0 +1,55 @@ ++/* This testcase is part of GDB, the GNU debugger. + -+gdb_breakpoint [gdb_get_line_number "varx-deallocated"] -+gdb_continue_to_breakpoint "varx-deallocated" -+gdb_test "p varx" "\\$\[0-9\]* = <(object|the array) is not allocated>" "p varx deallocated" -+gdb_test "ptype varx" "type = <(object|the array) is not allocated>" "ptype varx deallocated" -+gdb_test "p l" "\\$\[0-9\]* = \\.FALSE\\." "p l if varx deallocated" -+gdb_test "p varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "p varx(1,5,17) deallocated" -+gdb_test "ptype varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "ptype varx(1,5,17) deallocated" ++ Copyright 2008 Free Software Foundation, Inc. + -+gdb_breakpoint [gdb_get_line_number "vary-passed"] -+gdb_continue_to_breakpoint "vary-passed" -+# $1 = (( ( 1, 1, 1, 1, 1, 1) ( 1, 1, 1, 1, 1, 1) --- , 1) ) ( ( 1, 1, ...) ...) ...) -+gdb_test "p vary" "\\$\[0-9\]* = \\(\[()1, .\]*\\)" ++ 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. + -+gdb_breakpoint [gdb_get_line_number "vary-filled"] -+gdb_continue_to_breakpoint "vary-filled" -+gdb_test "ptype vary" "type = real(\\(kind=4\\)|\\*4) \\(10,10\\)" -+gdb_test "p vary(1, 1)" "\\$\[0-9\]* = 8" -+gdb_test "p vary(2, 2)" "\\$\[0-9\]* = 9" -+gdb_test "p vary(1, 3)" "\\$\[0-9\]* = 10" -+# $1 = (( ( 3, 3, 3, 3, 3, 3) ( 3, 3, 3, 3, 3, 3) --- , 3) ) ( ( 3, 3, ...) ...) ...) -+gdb_test "p varw" "\\$\[0-9\]* = \\(\[()3, .\]*\\)" ++ 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. + -+gdb_breakpoint [gdb_get_line_number "varw-almostfilled"] -+gdb_continue_to_breakpoint "varw-almostfilled" -+gdb_test "ptype varw" "type = real(\\(kind=4\\)|\\*4) \\(5,4,3\\)" -+gdb_test "p varw(3,1,1)=1" "\\$\[0-9\]* = 1" -+# $1 = (( ( 6, 5, 1, 5, 5, 5) ( 5, 5, 5, 5, 5, 5) --- , 5) ) ( ( 5, 5, ...) ...) ...) -+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\\)" -+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" -+gdb_test "p z(4,4,6)" "\\$\[0-9\]* = 1" ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ + -+gdb_breakpoint [gdb_get_line_number "varz-almostfilled"] -+gdb_continue_to_breakpoint "varz-almostfilled" -+# GCC uses the pointer type here, Intel Fortran Compiler 10.1.008 does not. -+gdb_test "ptype varz" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(\\*\\)\\)?" -+# Intel Fortran Compiler 10.1.008 has a bug here - (2:11,7:7) -+# as it produces DW_AT_lower_bound == DW_AT_upper_bound == 7. -+gdb_test "ptype vart" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(2:11,7:\\*\\)\\)?" -+gdb_test "p varz" "\\$\[0-9\]* = \\(\\)" -+gdb_test "p vart" "\\$\[0-9\]* = \\(\\)" -+gdb_test "p varz(3)" "\\$\[0-9\]* = 4" -+# maps to foo::vary(1,1) -+gdb_test "p vart(2,7)" "\\$\[0-9\]* = 8" -+# maps to foo::vary(2,2) -+gdb_test "p vart(3,8)" "\\$\[0-9\]* = 9" -+# maps to foo::vary(1,3) -+gdb_test "p vart(2,9)" "\\$\[0-9\]* = 10" ++#include + -+set test "quit #1" -+gdb_test_multiple "quit" $test { -+ -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) " { -+ pass $test -+ } ++void ++marker (void) ++{ +} -+set test "quit #2" -+gdb_test_multiple "y" $test { -+ eof { -+ pass $test -+ } ++ ++void ++bar (char *a, char *b, char *c, int size) ++{ ++ memset (a, '1', size); ++ memset (b, '2', size); ++ memset (c, '3', 48); +} -diff --git a/gdb/testsuite/gdb.fortran/dynamic.f90 b/gdb/testsuite/gdb.fortran/dynamic.f90 -new file mode 100644 -index 0000000..0f43564 ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/dynamic.f90 -@@ -0,0 +1,98 @@ -+! Copyright 2007 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. -+! -+! Ihis file is the Fortran source file for dynamic.exp. -+! Original file written by Jakub Jelinek . -+! Modified for the GDB testcase by Jan Kratochvil . + -+subroutine baz -+ real, target, allocatable :: varx (:, :, :) -+ real, pointer :: varv (:, :, :) -+ real, target :: varu (1, 2, 3) -+ logical :: l -+ allocate (varx (1:6, 5:15, 17:28)) ! varx-init -+ l = allocated (varx) -+ varx(:, :, :) = 6 ! varx-allocated -+ varx(1, 5, 17) = 7 -+ varx(2, 6, 18) = 8 -+ varx(6, 15, 28) = 9 -+ varv => varx ! varx-filled -+ l = associated (varv) -+ varv(3, 7, 19) = 10 ! varv-associated -+ varv => null () ! varv-filled -+ l = associated (varv) -+ deallocate (varx) ! varv-deassociated -+ l = allocated (varx) -+ varu(:, :, :) = 10 ! varx-deallocated -+ allocate (varv (1:6, 5:15, 17:28)) -+ l = associated (varv) -+ varv(:, :, :) = 6 -+ varv(1, 5, 17) = 7 -+ varv(2, 6, 18) = 8 -+ varv(6, 15, 28) = 9 -+ deallocate (varv) -+ l = associated (varv) -+ varv => varu -+ varv(1, 1, 1) = 6 -+ varv(1, 2, 3) = 7 -+ l = associated (varv) -+end subroutine baz -+subroutine foo (vary, varw) -+ real :: vary (:, :) -+ real :: varw (:, :, :) -+ vary(:, :) = 4 ! vary-passed -+ vary(1, 1) = 8 -+ vary(2, 2) = 9 -+ vary(1, 3) = 10 -+ varw(:, :, :) = 5 ! vary-filled -+ varw(1, 1, 1) = 6 -+ varw(2, 2, 2) = 7 ! varw-almostfilled -+end subroutine foo -+subroutine bar (varz, vart) -+ real :: varz (*) -+ real :: vart (2:11, 7:*) -+ varz(1:3) = 4 -+ varz(2) = 5 ! varz-almostfilled -+ vart(2,7) = vart(2,7) -+end subroutine bar -+program test -+ interface -+ subroutine foo (vary, varw) -+ real :: vary (:, :) -+ real :: varw (:, :, :) -+ end subroutine -+ end interface -+ interface -+ subroutine bar (varz, vart) -+ real :: varz (*) -+ real :: vart (2:11, 7:*) -+ end subroutine -+ end interface -+ real :: x (10, 10), y (5), z(8, 8, 8) -+ x(:,:) = 1 -+ y(:) = 2 -+ z(:,:,:) = 3 -+ call baz -+ call foo (x, z(2:6, 4:7, 6:8)) -+ call bar (y, x) -+ if (x (1, 1) .ne. 8 .or. x (2, 2) .ne. 9 .or. x (1, 2) .ne. 4) call abort -+ if (x (1, 3) .ne. 10) call abort -+ if (z (2, 4, 6) .ne. 6 .or. z (3, 5, 7) .ne. 7 .or. z (2, 4, 7) .ne. 5) call abort -+ if (any (y .ne. (/4, 5, 4, 2, 2/))) call abort -+ call foo (transpose (x), z) -+ 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 ++void ++foo (int size) ++{ ++ char temp1[size]; ++ char temp3[48]; ++ ++ temp1[size - 1] = '\0'; ++ { ++ char temp2[size]; ++ ++ bar (temp1, temp2, temp3, size); ++ ++ marker (); /* break-here */ ++ } ++} ++ ++int ++main (void) ++{ ++ foo (26); ++ foo (78); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/vla.exp b/gdb/testsuite/gdb.base/vla.exp new file mode 100644 -index 0000000..4b4ea4c +index 0000000..5da7378 --- /dev/null -+++ b/gdb/testsuite/gdb.fortran/library-module.exp -@@ -0,0 +1,53 @@ -+# Copyright 2009 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.base/vla.exp +@@ -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 @@ -40115,504 +20163,654 @@ index 0000000..4b4ea4c +# 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} ++set testfile vla ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${testfile} ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+# Required for -fPIC by gdb_compile_shlib. -+if [get_compiler_info not-used] { -+ warning "Could not get compiler info" -+ return -1 ++if ![runto_main] { ++ untested vla ++ return -1 +} + -+if { [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}] != "" } { -+ untested "Couldn't compile ${srclibfile}" -+ return -1 -+} ++gdb_breakpoint [gdb_get_line_number "break-here"] ++ ++gdb_continue_to_breakpoint "break-here" ++ ++gdb_test "whatis temp1" "type = char \\\[variable\\\]" "first: whatis temp1" ++gdb_test "whatis temp2" "type = char \\\[variable\\\]" "first: whatis temp2" ++gdb_test "whatis temp3" "type = char \\\[48\\\]" "first: whatis temp3" ++ ++gdb_test "ptype temp1" "type = char \\\[26\\\]" "first: ptype temp1" ++gdb_test "ptype temp2" "type = char \\\[26\\\]" "first: ptype temp2" ++gdb_test "ptype temp3" "type = char \\\[48\\\]" "first: ptype temp3" ++ ++gdb_test "p temp1" " = '1' " "first: print temp1" ++gdb_test "p temp2" " = '2' " "first: print temp2" ++gdb_test "p temp3" " = '3' " "first: print temp3" ++ ++gdb_continue_to_breakpoint "break-here" ++ ++gdb_test "whatis temp1" "type = char \\\[variable\\\]" "second: whatis temp1" ++gdb_test "whatis temp2" "type = char \\\[variable\\\]" "second: whatis temp2" ++gdb_test "whatis temp3" "type = char \\\[48\\\]" "second: whatis temp3" ++ ++gdb_test "ptype temp1" "type = char \\\[78\\\]" "second: ptype temp1" ++gdb_test "ptype temp2" "type = char \\\[78\\\]" "second: ptype temp2" ++gdb_test "ptype temp3" "type = char \\\[48\\\]" "second: ptype temp3" ++ ++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/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 ++++ b/gdb/testsuite/gdb.cp/cplusfuncs.cc +@@ -191,6 +191,12 @@ char * dm_type_char_star (char * p) { return p; } + int dm_type_foo_ref (foo & foo) { return foo.ifoo; } + int * dm_type_int_star (int * p) { return p; } + long * dm_type_long_star (long * p) { return p; } ++int dm_type_short (short i) { return i; } ++int dm_type_long (long i) { return i; } + int dm_type_unsigned_int (unsigned int i) { return i; } ++int dm_type_unsigned_short (unsigned short i) { return i; } ++int dm_type_unsigned_long (unsigned long i) { return i; } + int dm_type_void (void) { return 0; } + void * dm_type_void_star (void * p) { return p; } ++typedef int myint; ++int dm_type_typedef (myint i) { return i; } +diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.exp b/gdb/testsuite/gdb.cp/cplusfuncs.exp +index 5e08768..8c8e038 100644 +--- a/gdb/testsuite/gdb.cp/cplusfuncs.exp ++++ b/gdb/testsuite/gdb.cp/cplusfuncs.exp +@@ -66,9 +66,25 @@ set dm_type_unsigned_int "unsigned" + set dm_type_void "" + set dm_type_void_star "void*" + ++# Some other vagaries of GDB's type printing machinery. The integer types ++# may have unsigned before or after their length, and may have "int" ++# appended. The char* conversion operator may have name "char*" even if ++# the type is "char *", because the name comes from the debug information ++# and the type from GDB. Function types may not see through typedefs. ++ ++set dm_type_short "short" ++set dm_type_long "long" ++set dm_type_unsigned_short "unsigned short" ++set dm_type_unsigned_long "unsigned long" ++set dm_operator_char_star "char*" ++set dm_operator_char_star_quoted "char\\*" ++set dm_type_typedef 0 ++ + proc probe_demangler { } { + global gdb_prompt + global dm_operator_comma ++ global dm_operator_char_star ++ global dm_operator_char_star_quoted + global dm_type_char_star + global dm_type_char_star_quoted + global dm_type_foo_ref +@@ -77,6 +93,11 @@ proc probe_demangler { } { + global dm_type_unsigned_int + global dm_type_void + global dm_type_void_star ++ global dm_type_short ++ global dm_type_unsigned_short ++ global dm_type_long ++ global dm_type_unsigned_long ++ global dm_type_typedef + + send_gdb "print &'foo::operator,(foo&)'\n" + gdb_expect { +@@ -97,6 +118,26 @@ proc probe_demangler { } { + } + } + ++ send_gdb "print &'foo::operator char*()'\n" ++ gdb_expect { ++ -re ".*foo::operator char \\*\\(void\\).*\r\n$gdb_prompt $" { ++ # v2 demangler or GDB type printer ++ set dm_operator_char_star "char *" ++ set dm_operator_char_star_quoted "char \\*" ++ pass "detect dm_operator_char_star" ++ } ++ -re ".*foo::operator char\\*\\(\\).*\r\n$gdb_prompt $" { ++ # v3 demangler ++ pass "detect dm_operator_char_star" ++ } ++ -re ".*$gdb_prompt $" { ++ fail "detect dm_operator_char_star" ++ } ++ timeout { ++ fail "detect dm_operator_char_star" ++ } ++ } ++ + send_gdb "print &'dm_type_char_star'\n" + gdb_expect { + -re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" { +@@ -166,6 +207,11 @@ proc probe_demangler { } { + # v3 demangler + pass "detect dm_type_long_star" + } ++ -re ".*dm_type_long_star\\(long int \\*\\).*\r\n$gdb_prompt $" { ++ # GCC v3 and GDB's type printer ++ set dm_type_long_star "long int *" ++ pass "detect dm_type_long_star" ++ } + -re ".*$gdb_prompt $" { + fail "detect dm_type_long_star" + } +@@ -230,6 +276,101 @@ proc probe_demangler { } { + fail "detect dm_type_void_star (timeout)" + } + } ++ ++ send_gdb "print &'dm_type_short'\n" ++ gdb_expect { ++ -re ".*dm_type_short\\(short\\).*\r\n$gdb_prompt $" { ++ # v2 and v3 demanglers ++ pass "detect dm_type_short" ++ } ++ -re ".*dm_type_short\\(short int\\).*\r\n$gdb_prompt $" { ++ # GDB type printer ++ set dm_type_short "short int" ++ pass "detect dm_type_short" ++ } ++ -re ".*$gdb_prompt $" { ++ fail "detect dm_type_short" ++ } ++ timeout { ++ fail "detect dm_type_short (timeout)" ++ } ++ } ++ ++ send_gdb "print &'dm_type_unsigned_short'\n" ++ gdb_expect { ++ -re ".*dm_type_unsigned_short\\(unsigned short\\).*\r\n$gdb_prompt $" { ++ # v2 and v3 demanglers ++ pass "detect dm_type_unsigned_short" ++ } ++ -re ".*dm_type_unsigned_short\\(short unsigned int\\).*\r\n$gdb_prompt $" { ++ # GDB type printer ++ set dm_type_unsigned_short "short unsigned int" ++ pass "detect dm_type_unsigned_short" ++ } ++ -re ".*$gdb_prompt $" { ++ fail "detect dm_type_unsigned_short" ++ } ++ timeout { ++ fail "detect dm_type_unsigned_short (timeout)" ++ } ++ } ++ ++ send_gdb "print &'dm_type_long'\n" ++ gdb_expect { ++ -re ".*dm_type_long\\(long\\).*\r\n$gdb_prompt $" { ++ # v2 and v3 demanglers ++ pass "detect dm_type_long" ++ } ++ -re ".*dm_type_long\\(long int\\).*\r\n$gdb_prompt $" { ++ # GDB type printer ++ set dm_type_long "long int" ++ pass "detect dm_type_long" ++ } ++ -re ".*$gdb_prompt $" { ++ fail "detect dm_type_long" ++ } ++ timeout { ++ fail "detect dm_type_long (timeout)" ++ } ++ } ++ ++ send_gdb "print &'dm_type_unsigned_long'\n" ++ gdb_expect { ++ -re ".*dm_type_unsigned_long\\(unsigned long\\).*\r\n$gdb_prompt $" { ++ # v2 and v3 demanglers ++ pass "detect dm_type_unsigned_long" ++ } ++ -re ".*dm_type_unsigned_long\\(long unsigned int\\).*\r\n$gdb_prompt $" { ++ # GDB type printer ++ set dm_type_unsigned_long "long unsigned int" ++ pass "detect dm_type_unsigned_long" ++ } ++ -re ".*$gdb_prompt $" { ++ fail "detect dm_type_unsigned_long" ++ } ++ timeout { ++ fail "detect dm_type_unsigned_long (timeout)" ++ } ++ } ++ ++ send_gdb "print &'dm_type_typedef'\n" ++ gdb_expect { ++ -re ".*dm_type_typedef\\(int\\).*\r\n$gdb_prompt $" { ++ # v2 and v3 demanglers ++ pass "detect dm_type_typedef" ++ } ++ -re ".*dm_type_typedef\\(myint\\).*\r\n$gdb_prompt $" { ++ # GDB type printer ++ set dm_type_typedef 1 ++ pass "detect dm_type_typedef" ++ } ++ -re ".*$gdb_prompt $" { ++ fail "detect dm_type_typedef" ++ } ++ timeout { ++ fail "detect dm_type_typedef (timeout)" ++ } ++ } + } + + # +@@ -345,8 +486,9 @@ proc print_addr { name } { + + proc test_lookup_operator_functions {} { + global dm_operator_comma ++ global dm_operator_char_star + global dm_type_char_star +- global dm_type_char_star_quoted ++ global dm_operator_char_star_quoted + global dm_type_foo_ref + global dm_type_void + global dm_type_void_star +@@ -404,8 +546,8 @@ proc test_lookup_operator_functions {} { + + info_func "operator int(" "int foo::operator int($dm_type_void);" + info_func "operator()(" "void foo::operator()($dm_type_foo_ref);" +- info_func "operator $dm_type_char_star_quoted\(" \ +- "char *foo::operator $dm_type_char_star\($dm_type_void);" ++ info_func "operator $dm_operator_char_star_quoted\(" \ ++ "char *foo::operator $dm_operator_char_star\($dm_type_void);" + + } + +@@ -420,6 +562,7 @@ proc test_paddr_operator_functions {} { + global dm_type_unsigned_int + global dm_type_void + global dm_type_void_star ++ global dm_operator_char_star + + print_addr "foo::operator*($dm_type_foo_ref)" + print_addr "foo::operator%($dm_type_foo_ref)" +@@ -470,7 +613,7 @@ proc test_paddr_operator_functions {} { + } + + print_addr "foo::operator int($dm_type_void)" +- print_addr "foo::operator $dm_type_char_star\($dm_type_void)" ++ print_addr "foo::operator $dm_operator_char_star\($dm_type_void)" + } + + # +@@ -480,17 +623,21 @@ proc test_paddr_operator_functions {} { + proc test_paddr_overloaded_functions {} { + global dm_type_unsigned_int + global dm_type_void ++ global dm_type_short ++ global dm_type_unsigned_short ++ global dm_type_long ++ global dm_type_unsigned_long + + print_addr "overload1arg($dm_type_void)" + print_addr "overload1arg(char)" + print_addr "overload1arg(signed char)" + print_addr "overload1arg(unsigned char)" +- print_addr "overload1arg(short)" +- print_addr "overload1arg(unsigned short)" ++ print_addr "overload1arg($dm_type_short)" ++ print_addr "overload1arg($dm_type_unsigned_short)" + print_addr "overload1arg(int)" + print_addr "overload1arg($dm_type_unsigned_int)" +- print_addr "overload1arg(long)" +- print_addr "overload1arg(unsigned long)" ++ print_addr "overload1arg($dm_type_long)" ++ print_addr "overload1arg($dm_type_unsigned_long)" + print_addr "overload1arg(float)" + print_addr "overload1arg(double)" + +@@ -513,17 +660,31 @@ proc test_paddr_hairy_functions {} { + global dm_type_char_star + global dm_type_int_star + global dm_type_long_star ++ global dm_type_typedef + + print_addr_2 "hairyfunc1" "hairyfunc1(int)" +- print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" +- print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" +- print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" +- +- # gdb-gnats bug gdb/19: +- # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" +- print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" +- print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" +- print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" ++ ++ if {$dm_type_typedef == 0} { ++ print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" ++ print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" ++ print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" + -+# 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. ++ # gdb-gnats bug gdb/19: ++ # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" ++ print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" ++ print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" ++ print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" ++ } else { ++ print_addr_2 "hairyfunc2" "hairyfunc2(PFPc_i)" ++ print_addr_2 "hairyfunc3" "hairyfunc3(PFPFPl_s_i)" ++ print_addr_2 "hairyfunc4" "hairyfunc4(PFPFPc_s_i)" + -+if { [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}] != "" } { -+ untested "Couldn't compile ${srcfile}" -+ return -1 ++ # gdb-gnats bug gdb/19: ++ # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" ++ print_addr_2 "hairyfunc5" "hairyfunc5(PFPc_PFl_i)" ++ print_addr_2 "hairyfunc6" "hairyfunc6(PFPi_PFl_i)" ++ print_addr_2 "hairyfunc7" "hairyfunc7(PFPFPc_i_PFl_i)" ++ } + } + + proc do_tests {} { +diff --git a/gdb/testsuite/gdb.cp/expand-sals.exp b/gdb/testsuite/gdb.cp/expand-sals.exp +index 3c302c3..cd0496d 100644 +--- a/gdb/testsuite/gdb.cp/expand-sals.exp ++++ b/gdb/testsuite/gdb.cp/expand-sals.exp +@@ -48,7 +48,7 @@ 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 \[^\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 ++++ b/gdb/testsuite/gdb.cp/member-ptr.cc +@@ -138,6 +138,7 @@ class Diamond : public Padding, public Left, public Right + { + public: + virtual int vget_base (); ++ int (*func_ptr) (int); + }; + + int Diamond::vget_base () +@@ -145,6 +146,12 @@ int Diamond::vget_base () + return this->Left::x + 2000; + } + ++int ++func (int x) ++{ ++ return 19 + x; +} + -+clean_restart $binfile + int main () + { + A a; +@@ -162,6 +169,7 @@ int main () + int (Diamond::*right_vpmf) (); + int (Base::*base_vpmf) (); + int Diamond::*diamond_pmi; ++ int (* Diamond::*diamond_pfunc_ptr) (int); + + PMI null_pmi; + PMF null_pmf; +@@ -179,6 +187,7 @@ int main () + + diamond.Left::x = 77; + diamond.Right::x = 88; ++ diamond.func_ptr = func; + + /* Some valid pointer to members from a base class. */ + left_pmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::get_x); +@@ -193,11 +202,19 @@ int main () + /* A pointer to data member from a base class. */ + diamond_pmi = (int Diamond::*) (int Left::*) &Base::x; + ++ /* A pointer to data member, where the member is itself a pointer to ++ a function. */ ++ diamond_pfunc_ptr = (int (* Diamond::*) (int)) &Diamond::func_ptr; + -+if ![runto MAIN__] then { -+ perror "couldn't run to breakpoint MAIN__" -+ continue -+} + null_pmi = NULL; + null_pmf = NULL; + + pmi = NULL; /* Breakpoint 1 here. */ + ++ // Invalid (uses diamond_pfunc_ptr as a function): ++ // diamond.*diamond_pfunc_ptr (20); ++ (diamond.*diamond_pfunc_ptr) (20); + -+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 ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/logical.exp -@@ -0,0 +1,44 @@ -+# Copyright 2007 Free Software Foundation, Inc. + k = (a.*pmf)(3); + + pmi = &A::jj; +diff --git a/gdb/testsuite/gdb.cp/member-ptr.exp b/gdb/testsuite/gdb.cp/member-ptr.exp +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 { + } + } + ++# Check pointers to data members, which are themselves pointers to ++# functions. These behave like data members, not like pointers to ++# member functions. + -+# 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. ++gdb_test "ptype diamond_pfunc_ptr" \ ++ "type = int \\(\\*Diamond::\\*\\)\\(int\\)" + -+# This file was written by Jan Kratochvil . ++gdb_test "ptype diamond.*diamond_pfunc_ptr" \ ++ "type = int \\(\\*\\)\\(int\\)" + -+set testfile "logical" -+set srcfile ${testfile}.f90 -+set binfile ${objdir}/${subdir}/${testfile} ++# This one is invalid; () binds more tightly than .*, so it tries to ++# call the member pointer as a normal pointer-to-function. + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { -+ untested "Couldn't compile ${srcfile}" -+ return -1 -+} ++gdb_test "print diamond.*diamond_pfunc_ptr (20)" \ ++ "Invalid data type for function to be called." + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} ++# With parentheses, it is valid. + -+if ![runto MAIN__] then { -+ perror "couldn't run to breakpoint MAIN__" -+ continue -+} ++gdb_test "print (diamond.*diamond_pfunc_ptr) (20)" \ ++ "$vhn = 39" + -+gdb_breakpoint [gdb_get_line_number "stop-here"] -+gdb_continue_to_breakpoint "stop-here" -+gdb_test "p l" " = \\.TRUE\\." -+gdb_test "p l1" " = \\.TRUE\\." -+gdb_test "p l2" " = \\.TRUE\\." -+gdb_test "p l4" " = \\.TRUE\\." -+gdb_test "p l8" " = \\.TRUE\\." -diff --git a/gdb/testsuite/gdb.fortran/logical.f90 b/gdb/testsuite/gdb.fortran/logical.f90 -new file mode 100644 -index 0000000..4229304 ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/logical.f90 -@@ -0,0 +1,33 @@ -+! 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 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. -+! -+! Ihis file is the Fortran source file for dynamic.exp. -+! Original file written by Jakub Jelinek . -+! Modified for the GDB testcase by Jan Kratochvil . ++# Make sure that we do not interpret this as either a member pointer ++# call or a member function call. + -+program test -+ logical :: l -+ logical (kind=1) :: l1 -+ logical (kind=2) :: l2 -+ logical (kind=4) :: l4 -+ logical (kind=8) :: l8 -+ l = .TRUE. -+ l1 = .TRUE. -+ l2 = .TRUE. -+ l4 = .TRUE. -+ 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} ++gdb_test "print diamond.func_ptr (20)" \ ++ "$vhn = 39" ++ + # ========================== + # pointer to member function + # ========================== +@@ -420,7 +447,7 @@ gdb_test_multiple "ptype pmf" $name { --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 + 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 { + } } --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 "ptype a.*pmf" "type = int \\(A \\*, int\\)" ++gdb_test "ptype (a.*pmf)(3)" "type = int" ++ + # 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 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 + 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..ab72206 +index 0000000..6b180d6 --- /dev/null -+++ b/gdb/testsuite/gdb.fortran/string.exp -@@ -0,0 +1,72 @@ ++++ b/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc +@@ -0,0 +1,20 @@ ++namespace A { ++ int x = 11; ++ namespace{ ++ int xx = 22; ++ } ++} ++ ++using namespace A; ++ ++namespace{ ++ int xxx = 33; ++}; ++ ++int main() ++{ ++ x; ++ xx; ++ xxx; ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp b/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp +new file mode 100644 +index 0000000..e4bb9f8 +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp +@@ -0,0 +1,49 @@ +# 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 2 of the License, or ++# 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, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# along with this program. If not, see . + -+# This file was written by Jan Kratochvil . ++if $tracelevel then { ++ strace $tracelevel ++} + -+# This file is part of the gdb testsuite. It contains tests for Fortran -+# strings with dynamic length. ++set prms_id 0 ++set bug_id 0 + -+set testfile "string" -+set srcfile ${testfile}.f90 ++set testfile namespace-multiple-imports ++set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { -+ untested "Couldn't compile ${srcfile}" ++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_breakpoint [gdb_get_line_number "var-init"] -+gdb_continue_to_breakpoint "var-init" -+gdb_test "ptype c" "type = character(\\(kind=1\\)|\\*1)" -+gdb_test "ptype d" "type = character(\\(kind=8\\)|\\*8)" -+gdb_test "ptype e" "type = character(\\(kind=4\\)|\\*4)" -+gdb_test "ptype f" "type = character(\\(kind=4\\)|\\*4) \\(7,8:10\\)" -+gdb_test "ptype *e" "Attempt to take contents of a non-pointer value." -+gdb_test "ptype *f" "type = character(\\(kind=4\\)|\\*4) \\(7\\)" -+gdb_test "p c" "\\$\[0-9\]* = 'c'" -+gdb_test "p d" "\\$\[0-9\]* = 'd '" -+gdb_test "p e" "\\$\[0-9\]* = 'g '" -+gdb_test "p f" "\\$\[0-9\]* = \\(\\( 'h ', 'h ', 'h ', 'h ', 'h ', 'h ', 'h '\\) \\( 'h ', 'h ', 'h ', 'h ', 'h ', 'h ', 'h '\\) \\( 'h ', 'h ', 'h ', 'h ', 'h ', 'h ', 'h '\\) \\)" -+gdb_test "p *e" "Attempt to take contents of a non-pointer value." -+gdb_test "p *f" "Attempt to take contents of a non-pointer value." -+ -+gdb_breakpoint [gdb_get_line_number "var-finish"] -+gdb_continue_to_breakpoint "var-finish" -+gdb_test "p e" "\\$\[0-9\]* = 'e '" "p e re-set" -+gdb_test "p f" "\\$\[0-9\]* = \\(\\( 'f ', 'f ', 'f ', 'f ', 'f ', 'f ', 'f '\\) \\( 'f2 ', 'f ', 'f ', 'f ', 'f ', 'f ', 'f '\\) \\( 'f ', 'f ', 'f ', 'f ', 'f ', 'f ', 'f '\\) \\)" "p *f re-set" ++############################################ ++# test printing of namespace imported within ++# the function. + -+set test "quit #1" -+gdb_test_multiple "quit" $test { -+ -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) " { -+ pass $test -+ } -+} -+set test "quit #2" -+gdb_test_multiple "y" $test { -+ eof { -+ pass $test -+ } ++if ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue +} -diff --git a/gdb/testsuite/gdb.fortran/string.f90 b/gdb/testsuite/gdb.fortran/string.f90 -new file mode 100644 -index 0000000..226dc5d ---- /dev/null -+++ b/gdb/testsuite/gdb.fortran/string.f90 -@@ -0,0 +1,37 @@ -+! 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 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. -+! -+! Ihis file is the Fortran source file for dynamic.exp. -+! Original file written by Jakub Jelinek . -+! Modified for the GDB testcase by Jan Kratochvil . + -+subroutine foo (e, f) -+ character (len=1) :: c -+ character (len=8) :: d -+ character (len=*) :: e -+ character (len=*) :: f (1:7, 8:10) -+ c = 'c' -+ d = 'd' -+ e = 'e' ! var-init -+ f = 'f' -+ f(1,9) = 'f2' -+ c = 'c' ! var-finish -+end subroutine foo -+ character (len=4) :: g, h (1:7, 8:10) -+ g = 'g' -+ h = 'h' -+ call foo (g, h) -+end -diff --git a/gdb/testsuite/gdb.gdb/selftest.exp b/gdb/testsuite/gdb.gdb/selftest.exp -index 495ae45..d08d7a4 100644 ---- a/gdb/testsuite/gdb.gdb/selftest.exp -+++ b/gdb/testsuite/gdb.gdb/selftest.exp -@@ -95,6 +95,10 @@ proc do_steps_and_nexts {} { - set description "step over ttyarg initialization" - set command "step" - } -+ -re ".*python_script = 0.*$gdb_prompt $" { -+ set description "step over python_script initialization" -+ set command "step" -+ } - -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" - -- 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/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" - -- 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.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" - -- 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 ++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-nested-imports.cc b/gdb/testsuite/gdb.cp/namespace-nested-imports.cc new file mode 100644 -index 0000000..729f457 +index 0000000..9723f87 --- /dev/null -+++ b/gdb/testsuite/gdb.opt/array-from-register-func.c -@@ -0,0 +1,22 @@ -+/* This file 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 . */ -+ -+int -+func (int *arr) ++++ b/gdb/testsuite/gdb.cp/namespace-nested-imports.cc +@@ -0,0 +1,36 @@ ++namespace A +{ -+ return arr[0]; ++ namespace B ++ { ++ int ab = 11; ++ } +} -diff --git a/gdb/testsuite/gdb.opt/array-from-register.c b/gdb/testsuite/gdb.opt/array-from-register.c -new file mode 100644 -index 0000000..3090e7e ---- /dev/null -+++ b/gdb/testsuite/gdb.opt/array-from-register.c -@@ -0,0 +1,28 @@ -+/* This file 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. ++namespace C ++{ ++ namespace D ++ { ++ using namespace A::B; + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ ++ int ++ second() ++ { ++ ab; ++ return 0; ++ } ++ } + -+extern int func (int *arr); ++ int ++ first() ++ { ++ //ab; ++ return D::second(); ++ } ++} + +int -+main (void) ++main() +{ -+ int arr[] = { 42 }; -+ -+ func (arr); -+ -+ return 0; ++ //ab; ++ return C::first(); +} -diff --git a/gdb/testsuite/gdb.opt/array-from-register.exp b/gdb/testsuite/gdb.opt/array-from-register.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..f2de718 +index 0000000..d279fb5 --- /dev/null -+++ b/gdb/testsuite/gdb.opt/array-from-register.exp -@@ -0,0 +1,33 @@ -+# Copyright 2009 Free Software Foundation, Inc. -+# ++++ 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 +# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or ++# 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, @@ -40621,116 +20819,100 @@ index 0000000..f2de718 +# 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 is part of the gdb testsuite. ++# along with this program. If not, see . + -+if { [prepare_for_testing array-from-register.exp "array-from-register" \ -+ {array-from-register.c array-from-register-func.c} \ -+ {debug optimize=-O2}] } { -+ return -1 ++if $tracelevel then { ++ strace $tracelevel +} + -+if ![runto func] then { ++set prms_id 0 ++set bug_id 0 ++ ++set testfile namespace-nested-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 +} + -+gdb_test "p arr" "\\$\[0-9\]+ = \\(int \\*\\) *0x\[0-9a-f\]+" ++# Get things started. + -+# Seen regression: -+# Address requested for identifier "arr" which is in register $rdi -+gdb_test "p arr\[0\]" "\\$\[0-9\]+ = 42" -diff --git a/gdb/testsuite/gdb.python/Makefile.in b/gdb/testsuite/gdb.python/Makefile.in -index 79be9e7..c49f713 100644 ---- a/gdb/testsuite/gdb.python/Makefile.in -+++ b/gdb/testsuite/gdb.python/Makefile.in -@@ -1,7 +1,7 @@ - VPATH = @srcdir@ - srcdir = @srcdir@ - --EXECUTABLES = python-value -+EXECUTABLES = python-value python-prettyprint python-template - - 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 -new file mode 100644 -index 0000000..35ddd8c ---- /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. ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+ Copyright 2009 Free Software Foundation, Inc. ++############################################ ++if ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue ++} + -+ 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. ++gdb_test "print ab" "No symbol .* in current context." + -+ 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. ++############################################ ++gdb_breakpoint C::first ++gdb_continue_to_breakpoint "C::first" + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . ++gdb_test "print ab" "No symbol .* in current context." ++gdb_test "print C::D::ab" "= 11" + -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@gnu.org */ ++############################################ ++gdb_breakpoint C::D::second ++gdb_continue_to_breakpoint "C::D::second" + -+/* Based on the gdb.base/find.c testcase. */ ++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 @@ + -+#include -+#include ++namespace A ++{ ++ int _a = 11; + -+#define CHUNK_SIZE 16000 /* same as findcmd.c's */ -+#define BUF_SIZE (2 * CHUNK_SIZE) /* at least two chunks */ ++ namespace B{ + -+static int8_t int8_search_buf[100]; -+static int16_t int16_search_buf[100]; -+static int32_t int32_search_buf[100]; -+static int64_t int64_search_buf[100]; ++ int ab = 22; + -+static char *search_buf; -+static int search_buf_size; ++ namespace C{ + -+static int x; ++ int abc = 33; + -+static void -+stop_here () -+{ -+ x = 1; // stop here -+} ++ int second(){ ++ return 0; ++ } + -+static void -+init_bufs () -+{ -+ search_buf_size = BUF_SIZE; -+ search_buf = malloc (search_buf_size); -+ if (search_buf == NULL) -+ exit (1); -+ memset (search_buf, 'x', search_buf_size); ++ } ++ ++ int first(){ ++ _a; ++ ab; ++ C::abc; ++ return C::second(); ++ } ++ } +} + ++ +int -+main () ++main() +{ -+ init_bufs (); -+ -+ stop_here (); -+ -+ return 0; ++ A::_a; ++ A::B::ab; ++ A::B::C::abc; ++ return A::B::first(); +} -diff --git a/gdb/testsuite/gdb.python/find.exp b/gdb/testsuite/gdb.python/find.exp +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..defc31c +index 0000000..e508103 --- /dev/null -+++ b/gdb/testsuite/gdb.python/find.exp -@@ -0,0 +1,203 @@ -+# Copyright 2008, 2009 Free Software Foundation, Inc. ++++ 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 @@ -40745,258 +20927,606 @@ 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. -+ +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 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 ++ ++gdb_breakpoint marker3 ++gdb_continue_to_breakpoint "marker3" + -+set testfile "find" -+set srcfile ${testfile}.c -+set binfile ${objdir}/${subdir}/${testfile} ++#send_gdb "break marker3\n" ++#send_gdb "continue\n" + -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { -+ untested find.exp -+ return -1 -+} ++gdb_test "print _a" "No symbol \"_a\" in current context." "Print _a without import" + +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 $" {} -+} -+ -+gdb_test "break $srcfile:stop_here" \ -+ "Breakpoint.*at.* file .*$srcfile, line.*" \ -+ "breakpoint function in file" + -+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 printing of namespace imported into + # a scope containing the pc. + ++if ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue +} + -+# We've now got the target program in a state where we can test "find". -+ -+set hex_number {0x[0-9a-fA-F][0-9a-fA-F]*} -+set dec_number {[0-9]+} -+set history_prefix {[$][0-9]* = } -+set newline {[\r\n]+} -+set pattern_not_found "${newline}.]" -+set one_pattern_found "${newline}.${dec_number}L]" -+set two_patterns_found "${newline}.${dec_number}L, ${dec_number}L]" -+ -+# Test string pattern. -+ -+gdb_test "set *(int32_t*) &int8_search_buf\[10\] = 0x61616161" "" "" -+gdb_test "py search_buf = gdb.selected_frame ().read_var ('int8_search_buf')" "" "" -+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')" \ -+ "${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')" \ -+ "${pattern_not_found}" "pattern not found at end of range" -+ -+# Increase the search range by 1 and we should find the pattern. + 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_test "py print gdb.search_memory (start_addr, 10+3+1, \['a', 'a', 'a', 'a'\])" \ -+ "${one_pattern_found}" "pattern found at end of range" ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+# Test max-count with size, with different parameter position ++############################################ ++# test printing of namespace imported into ++# file scope. + -+gdb_test "py print gdb.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)" \ -+ "${two_patterns_found}" "size = 1, max_count = 2, normal ordering" ++if ![runto marker5] then { ++ perror "couldn't run to breakpoint marker5" ++ continue ++} + -+gdb_test "py print gdb.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 "print cc" "= 3" + -+gdb_test "py print gdb.search_memory (start_addr, length, \[0x61, 0x61\], max_count = 2, size = 1)" \ -+ "${two_patterns_found}" "size = 1, max_count = 2, inverted ordering" ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+gdb_test "py print gdb.search_memory (start_addr, length, \['a', 'a'\], max_count = 2)" \ -+ "${two_patterns_found}" "max_count = 2, with keyword" + -+# Test 16-bit pattern. + ############################################ + # 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 "set int16_search_buf\[10\] = 0x1234" "" "" -+gdb_test "py search_buf = gdb.selected_frame ().read_var ('int16_search_buf')" "" "" -+gdb_test "py start_addr = search_buf.address" "" "" -+gdb_test "py length = search_buf.type.sizeof" "" "" -+gdb_test "py pattern = gdb.parse_and_eval ('(int16_t) 0x1234')" "" "" ++gdb_test "print _a" "No symbol \"_a\" in current context." "print _a in namespace alias scope" ++gdb_test "print x" "No symbol \"x\" in current context." "print x in namespace alias scope" + -+gdb_test "py print gdb.search_memory (start_addr, length, 0x1234, 2)" \ -+ "${one_pattern_found}" "find 16-bit pattern, with python pattern" ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \ -+ "${one_pattern_found}" "find 16-bit pattern, with value pattern" + + ############################################ + # 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" + -+# Test 32-bit pattern. ++############################################ ++# Test printing of namespace aliases + -+gdb_test "set int32_search_buf\[10\] = 0x12345678" "" "" -+gdb_test "py search_buf = gdb.selected_frame ().read_var ('int32_search_buf')" "" "" -+gdb_test "py start_addr = search_buf.address" "" "" -+gdb_test "py length = search_buf.type.sizeof" "" "" -+gdb_test "py pattern = gdb.parse_and_eval ('(int32_t) 0x12345678')" "" "" ++if ![runto marker6] then { ++ perror "couldn't run to breakpoint marker6" ++ continue ++} + -+gdb_test "py print gdb.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)" \ -+ "${one_pattern_found}" "find 32-bit pattern, with value pattern" ++gdb_test "print efx" "= 5" + -+# Test 64-bit pattern. ++############################################ ++# Test printing of variables imported from ++# nested namespaces + -+gdb_test "set int64_search_buf\[10\] = 0xfedcba9876543210LL" "" "" -+gdb_test "py search_buf = gdb.selected_frame ().read_var ('int64_search_buf')" "" "" -+gdb_test "py start_addr = search_buf.address" "" "" -+gdb_test "py length = search_buf.type.sizeof" "" "" -+gdb_test "py pattern = gdb.parse_and_eval ('(int64_t) 0xfedcba9876543210LL')" "" "" ++if ![runto I::marker7] then { ++ perror "couldn't run to breakpoint I::marker7" ++ continue ++} + -+gdb_test "py print gdb.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)" \ -+ "${one_pattern_found}" "find 64-bit pattern, with value pattern" ++gdb_test "print ghx" "= 6" + -+# Test mixed-sized patterns. ++############################################ ++# Test that variables are not printed in a namespace ++# that is sibling to the namespace containing an import + -+gdb_test "set *(int8_t*) &search_buf\[10\] = 0x62" "" "" -+gdb_test "set *(int16_t*) &search_buf\[11\] = 0x6363" "" "" -+gdb_test "set *(int32_t*) &search_buf\[13\] = 0x64646464" "" "" -+gdb_test "py search_buf = gdb.selected_frame ().read_var ('search_buf')" "" "" -+gdb_test "py start_addr = search_buf\[0\].address" "" "" -+gdb_test "py pattern1 = gdb.parse_and_eval ('(int8_t) 0x62')" "" "" -+gdb_test "py pattern2 = gdb.parse_and_eval ('(int16_t) 0x6363')" "" "" -+gdb_test "py pattern3 = gdb.parse_and_eval ('(int32_t) 0x64646464')" "" "" ++if ![runto L::marker8] then { ++ perror "couldn't run to breakpoint L::marker8" ++ continue ++} + -+gdb_test "py print gdb.search_memory (start_addr, 100, \[pattern1, pattern2, pattern3\])" \ -+ "${one_pattern_found}" "find mixed-sized pattern" ++gdb_test "print jx" "= 44" + -+# Test search spanning a large range, in the particular case of native -+# targets, test the search spanning multiple chunks. -+# Remote targets may implement the search differently. ++gdb_breakpoint "K::marker9" ++gdb_continue_to_breakpoint "K::marker9" + -+set CHUNK_SIZE 16000 ; ++gdb_test "print jx" "No symbol \"jx\" in current context." + -+gdb_test "set *(int32_t*) &search_buf\[0*${CHUNK_SIZE}+100\] = 0x12345678" "" "" -+gdb_test "set *(int32_t*) &search_buf\[1*${CHUNK_SIZE}+100\] = 0x12345678" "" "" -+gdb_test "py start_addr = gdb.selected_frame ().read_var ('search_buf')" "" "" -+gdb_test "py length = gdb.selected_frame ().read_var ('search_buf_size')" "" "" ++############################################ ++# Test that variables are only printed after the line ++# containing the import + -+gdb_test "py print gdb.search_memory (start_addr, length, 0x12345678, 4)" \ -+ "${two_patterns_found}" "search spanning large range" ++if ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue ++} + -+# For native targets, test a pattern straddling a chunk boundary. ++gdb_breakpoint [gdb_get_line_number "marker10 stop"] ++gdb_continue_to_breakpoint "marker10 stop" + -+if [isnative] { -+ gdb_test "set *(int32_t*) &search_buf\[${CHUNK_SIZE}-1\] = 0xfdb97531" "" "" ++# Assert that M::x is printed and not N::x ++gdb_test "print x" "= 911" "print x (from M::x)" + -+ gdb_test "py print gdb.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" \ +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 ++++ b/gdb/testsuite/gdb.cp/namespace.exp +@@ -24,6 +24,7 @@ + # for namespaces. + # Note: As of 2000-06-03, they passed under g++ - djb + ++load_lib "cp-support.exp" + + if $tracelevel then { + strace $tracelevel +@@ -259,11 +260,16 @@ gdb_test "ptype E" "type = namespace C::D::E" + gdb_test "ptype CClass" "type = (class C::CClass \{\r\n public:|struct C::CClass \{)\r\n int x;\r\n\}" + gdb_test "ptype CClass::NestedClass" "type = (class C::CClass::NestedClass \{\r\n public:|struct C::CClass::NestedClass \{)\r\n int y;\r\n\}" + gdb_test "ptype NestedClass" "No symbol \"NestedClass\" in current context." +-setup_kfail "gdb/1448" "*-*-*" +-gdb_test "ptype ::C::CClass" "type = class C::CClass \{\r\n public:\r\n int x;\r\n\}" +-setup_kfail "gdb/1448" "*-*-*" +-gdb_test "ptype ::C::CClass::NestedClass" "type = class C::CClass::NestedClass \{\r\n public:\r\n int y;\r\n\}" +-setup_kfail "gdb/1448" "*-*-*" ++cp_test_ptype_class \ ++ "ptype ::C::CClass" "" "class" "C::CClass" \ ++ { ++ { field public "int x;" } ++ } ++cp_test_ptype_class \ ++ "ptype ::C::CClass::NestedClass" "" "class" "C::CClass::NestedClass" \ ++ { ++ { field public "int y;" } ++ } + gdb_test "ptype ::C::NestedClass" "No symbol \"NestedClass\" in namespace \"C\"." + gdb_test "ptype C::CClass" "No symbol \"CClass\" in namespace \"C::C\"." + gdb_test "ptype C::CClass::NestedClass" "No type \"CClass\" within class or namespace \"C::C\"." +@@ -273,8 +279,11 @@ gdb_test "ptype C::NestedClass" "No symbol \"NestedClass\" in namespace \"C::C\" + + gdb_test "print cOtherFile" "\\$\[0-9\].* = 316" + gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n public:|struct C::OtherFileClass \{)\r\n int z;\r\n\}" +-setup_kfail "gdb/1448" "*-*-*" +-gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n public:\r\n int z;\r\n\}" ++cp_test_ptype_class \ ++ "ptype ::C::OtherFileClass" "" "class" "C::OtherFileClass" \ ++ { ++ { field public "int z;" } ++ } + gdb_test "ptype C::OtherFileClass" "No symbol \"OtherFileClass\" in namespace \"C::C\"." + + # Some anonymous namespace tests. +diff --git a/gdb/testsuite/gdb.cp/overload.exp b/gdb/testsuite/gdb.cp/overload.exp +index 24025a2..a72932e 100644 +--- a/gdb/testsuite/gdb.cp/overload.exp ++++ b/gdb/testsuite/gdb.cp/overload.exp +@@ -74,12 +74,12 @@ set re_methods "${re_methods}${ws}int overload1arg\\((void|)\\);" + set re_methods "${re_methods}${ws}int overload1arg\\(char\\);" + set re_methods "${re_methods}${ws}int overload1arg\\(signed char\\);" + set re_methods "${re_methods}${ws}int overload1arg\\(unsigned char\\);" +-set re_methods "${re_methods}${ws}int overload1arg\\(short\\);" +-set re_methods "${re_methods}${ws}int overload1arg\\(unsigned short\\);" ++set re_methods "${re_methods}${ws}int overload1arg\\(short( int)?\\);" ++set re_methods "${re_methods}${ws}int overload1arg\\((unsigned short|short unsigned)( int)?\\);" + set re_methods "${re_methods}${ws}int overload1arg\\(int\\);" + set re_methods "${re_methods}${ws}int overload1arg\\(unsigned int\\);" +-set re_methods "${re_methods}${ws}int overload1arg\\(long\\);" +-set re_methods "${re_methods}${ws}int overload1arg\\(unsigned long\\);" ++set re_methods "${re_methods}${ws}int overload1arg\\(long( int)?\\);" ++set re_methods "${re_methods}${ws}int overload1arg\\((unsigned long|long unsigned)( int)?\\);" + set re_methods "${re_methods}${ws}int overload1arg\\(float\\);" + 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..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} { + } - gdb_test "prefix_cmd subcmd ugh" "subcmd output, arg = ugh" "call subcmd" + # This is the expected menu for overload1arg. +-# Note the arg type variations on lines 6 and 13. ++# Note the arg type variations for void and integer types. + # This accommodates different versions of g++. -+# 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. +-set menu_overload1arg "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n\\\[4\\\] foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r\n\\\[5\\\] foo::overload1arg\\(long\\) at.*$srcfile:118\r\n\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n\\\[8\\\] foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r\n\\\[9\\\] foo::overload1arg\\(short\\) at.*$srcfile:114\r\n\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n> $" ++set menu_overload1arg "\\\[0\\\] cancel\r\n" ++append menu_overload1arg "\\\[1\\\] all\r\n" ++append menu_overload1arg "\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n" ++append menu_overload1arg "\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n" ++append menu_overload1arg "\\\[4\\\] foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r\n" ++append menu_overload1arg "\\\[5\\\] foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r\n" ++append menu_overload1arg "\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n" ++append menu_overload1arg "\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n" ++append menu_overload1arg "\\\[8\\\] foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r\n" ++append menu_overload1arg "\\\[9\\\] foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r\n" ++append menu_overload1arg "\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n" ++append menu_overload1arg "\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n" ++append menu_overload1arg "\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n" ++append menu_overload1arg "\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n" ++append menu_overload1arg "> $" + + # Set multiple-symbols to "ask", to allow us to test the use + # of the multiple-choice menu when breaking on an overloaded method. +@@ -157,17 +171,17 @@ set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 13 13 110 + + 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 + \[\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 + \[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\\(short\\) at.*$srcfile:114\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ +@@ -215,17 +229,17 @@ gdb_expect { - 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 + 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 + \[\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 + \[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\\(short\\) at.*$srcfile:114\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ +@@ -296,12 +310,12 @@ gdb_test "info break" \ + "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r + \[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r +-\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r ++\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r + \[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/shadowing.cc b/gdb/testsuite/gdb.cp/shadowing.cc new file mode 100644 -index 0000000..22eb9f2 +index 0000000..1651510 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-frame.c -@@ -0,0 +1,14 @@ -+int f2 (int a) ++++ b/gdb/testsuite/gdb.cp/shadowing.cc +@@ -0,0 +1,45 @@ ++namespace A +{ -+ return ++a; ++ int x = 11; +} + -+int f1 (int a, int b) ++int x = 22; ++int y = 0; ++ ++class B +{ -+ return f2(a) + b; -+} ++public: ++ int x; + -+int main (int argc, char *argv[]) ++ 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() +{ -+ return f1 (1, 2); ++ B theB; ++ return theB.func(); +} -diff --git a/gdb/testsuite/gdb.python/python-frame.exp b/gdb/testsuite/gdb.python/python-frame.exp +diff --git a/gdb/testsuite/gdb.cp/shadowing.exp b/gdb/testsuite/gdb.cp/shadowing.exp new file mode 100644 -index 0000000..674c25e +index 0000000..fcbf680 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-frame.exp -@@ -0,0 +1,92 @@ -+# Copyright (C) 2009 Free Software Foundation, Inc. ++++ 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 @@ -41011,307 +21541,218 @@ index 0000000..674c25e +# 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-frame" -+set srcfile ${testfile}.c ++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}] != "" } { -+ untested "Couldn't compile ${srcfile}" ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { ++ untested "Couldn't compile test program" + 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. ++# Get things started. + +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 ![runto_main] then { ++ perror "couldn't run to breakpoint main" ++ continue +} + -+# The following tests require execution. ++############################################ ++# Test printing of class variable is not shadowed ++# by global variable + -+if ![runto_main] then { -+ fail "Can't run to main" -+ return 0 -+} ++gdb_breakpoint [gdb_get_line_number "marker1"] ++gdb_continue_to_breakpoint "marker1" + -+gdb_breakpoint "f2" -+gdb_continue_to_breakpoint "breakpoint at f2" -+gdb_test "up" "" "" ++gdb_test "print x" "= 33" "Print class x shadowing global x" + -+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 + -+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" ++############################################ ++# Test printing local variable is not shadowed ++# by class variable + -+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 ++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..7feca2b +index 0000000..1f02d90 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-function.exp -@@ -0,0 +1,79 @@ -+# Copyright (C) 2009 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.dwarf2/dw2-stripped.c +@@ -0,0 +1,42 @@ ++/* This testcase is part of GDB, the GNU debugger. + -+# 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 . ++ Copyright 2004 Free Software Foundation, Inc. + -+# This file is part of the GDB testsuite. It tests the mechanism -+# exposing convenience functions to Python. ++ 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. + -+if $tracelevel then { -+ strace $tracelevel -+} ++ 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. */ + -+# 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 ++ ++/* The function `func1' traced into must have debug info on offset > 0; ++ (DW_UNSND (attr)). This is the reason of `func0' existence. */ ++ ++void ++func0(int a, int b) ++{ +} + -+# Start with a fresh gdb. ++/* `func1' being traced into must have some arguments to dump. */ + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir ++void ++func1(int a, int b) ++{ ++ func0 (a,b); ++} + -+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" -diff --git a/gdb/testsuite/gdb.python/python-mi.exp b/gdb/testsuite/gdb.python/python-mi.exp ++int ++main(void) ++{ ++ func1 (1, 2); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp b/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp new file mode 100644 -index 0000000..5c9f3c7 +index 0000000..1c6e84a --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-mi.exp -@@ -0,0 +1,124 @@ -+# Copyright (C) 2008 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp +@@ -0,0 +1,79 @@ ++# Copyright 2006 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 ++# 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, see . -+ -+# This file is part of the GDB testsuite. It tests Python-based -+# pretty-printing for MI. ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + -+load_lib mi-support.exp -+set MIFLAGS "-i=mi2" ++# Minimal DWARF-2 unit test + -+gdb_exit -+if [mi_gdb_start] { -+ continue ++# This test can only be run on targets which support DWARF-2. ++# 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 +} + -+set testfile "python-prettyprint" ++set testfile "dw2-stripped" +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 -+} ++set binfile ${objdir}/${subdir}/${testfile}.x + -+mi_delete_breakpoints -+mi_gdb_reinitialize_dir $srcdir/$subdir -+mi_gdb_load ${binfile} ++remote_exec build "rm -f ${binfile}" + -+if {[lsearch -exact [mi_get_features] python] < 0} { -+ unsupported "python support is disabled" ++# get the value of gcc_compiled ++if [get_compiler_info ${binfile}] { + 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" -+ -+mi_list_varobj_children container { -+} "examine container children=0" -+ -+mi_next "next over update 1" -+ -+mi_varobj_update_dynamic container { -+ { {container.\[0\]} {\[0\]} 0 int } -+} "varobj update 1" -+ -+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" ++# This test can only be run on gcc as we use additional_flags=FIXME ++if {$gcc_compiled == 0} { ++ return 0 ++} + -+mi_gdb_test "-var-update container" \ -+ "\\^done,changelist=\\\[\\\]" \ -+ "varobj update after selecting child range" ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-ggdb3}] != "" } { ++ return -1 ++} + -+mi_list_varobj_children_range container 2 { -+ { {container.\[1\]} {\[1\]} 0 int } -+} "list varobj children after selecting child range" ++remote_exec build "objcopy -R .debug_loc ${binfile}" ++set strip_output [remote_exec build "objdump -h ${binfile}"] + -+mi_gdb_test "-var-set-child-range container -1 -1" \ -+ "\\^done" \ -+ "reset child range" ++set test "stripping test file preservation" ++if [ regexp ".debug_info " $strip_output] { ++ pass "$test (.debug_info preserved)" ++} else { ++ fail "$test (.debug_info got also stripped)" ++} + -+mi_gdb_test "-var-update container" \ -+ "\\^done,changelist=\\\[\\\]" \ -+ "varobj update after resetting child range" ++set test "stripping test file functionality" ++if [ regexp ".debug_loc " $strip_output] { ++ fail "$test (.debug_loc still present)" ++} else { ++ pass "$test (.debug_loc stripped)" ++} + -+mi_list_varobj_children container { -+ { {container.\[0\]} {\[0\]} 0 int } -+ { {container.\[1\]} {\[1\]} 0 int } -+} "list varobj children after resetting child range" ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+mi_continue_to_line \ -+ [gdb_get_line_number {Another MI breakpoint} ${testfile}.c] \ -+ "step to second breakpoint" ++# For C programs, "start" should stop in main(). + -+mi_varobj_update_with_type_change container int 0 "update after type change" -diff --git a/gdb/testsuite/gdb.python/python-prettyprint.c b/gdb/testsuite/gdb.python/python-prettyprint.c ++gdb_test "start" \ ++ ".*main \\(\\) at .*" \ ++ "start" ++gdb_test "step" \ ++ "func.* \\(.*\\) at .*" \ ++ "step" +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..399be23 +index 0000000..5fcdd84 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-prettyprint.c -@@ -0,0 +1,191 @@ ++++ b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.S +@@ -0,0 +1,83 @@ +/* This testcase is part of GDB, the GNU debugger. + -+ Copyright 2008, 2009 Free Software Foundation, Inc. ++ 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 @@ -41326,6623 +21767,3804 @@ index 0000000..399be23 + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + -+struct s -+{ -+ int a; -+ int *b; -+}; -+ -+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 ++/* Debug information */ + -+typedef struct string_repr -+{ -+ struct whybother -+ { -+ const char *contents; -+ } whybother; -+} string; ++ .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 */ + -+/* This lets us avoid malloc. */ -+int array[100]; ++ /* CU die */ ++ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ ++ .ascii "dw2-struct-member-data-location.c\0" /* DW_AT_name */ ++ .ascii "GNU C 4.3.2\0" /* DW_AT_producer */ ++ .byte 1 /* DW_AT_language (C) */ + -+struct container -+{ -+ string name; -+ int len; -+ int *elements; -+}; ++.Ltype_uchar: ++ .uleb128 2 /* Abbrev: DW_TAG_structure_type */ ++ .ascii "some_struct\0" /* DW_AT_name */ + -+typedef struct container zzz_type; ++ .uleb128 3 /* Abbrev: DW_TAG_member */ ++ .ascii "field\0" /* DW_AT_name */ ++ .byte 0 /* DW_AT_data_member_location */ + -+string -+make_string (const char *s) -+{ -+ string result; -+ result.whybother.contents = s; -+ return result; -+} ++ .byte 0 /* End of children of some_struct */ + -+zzz_type -+make_container (const char *s) -+{ -+ zzz_type result; ++ .byte 0 /* End of children of CU */ + -+ result.name = make_string (s); -+ result.len = 0; -+ result.elements = 0; ++.Lcu1_end: + -+ return result; -+} ++/* Abbrev table */ ++ .section .debug_abbrev ++.Labbrev1_begin: ++ .uleb128 1 /* Abbrev code */ ++ .uleb128 0x11 /* DW_TAG_compile_unit */ ++ .byte 1 /* has_children */ ++ .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 */ + -+void -+add_item (zzz_type *c, int val) -+{ -+ if (c->len == 0) -+ c->elements = array; -+ c->elements[c->len] = val; -+ ++c->len; -+} ++ .uleb128 2 /* Abbrev code */ ++ .uleb128 0x13 /* DW_TAG_structure_type */ ++ .byte 1 /* has_children */ ++ .uleb128 0x3 /* DW_AT_name */ ++ .uleb128 0x8 /* DW_FORM_string */ ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ + -+void init_s(struct s *s, int a) -+{ -+ s->a = a; -+ s->b = &s->a; -+} ++ .uleb128 3 /* Abbrev code */ ++ .uleb128 0x0d /* DW_TAG_member */ ++ .byte 0 /* has_children */ ++ .uleb128 0x3 /* DW_AT_name */ ++ .uleb128 0x8 /* DW_FORM_string */ ++ .uleb128 0x38 /* DW_AT_data_member_location */ ++ .uleb128 0x0b /* DW_FORM_data1 */ ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ + -+void init_ss(struct ss *s, int a, int b) -+{ -+ init_s(&s->a, a); -+ init_s(&s->b, b); -+} ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp +new file mode 100644 +index 0000000..c41151c +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp +@@ -0,0 +1,37 @@ ++# Copyright 2009 Free Software Foundation, Inc. + -+void do_nothing(void) -+{ -+ int c; ++# 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 . + -+ c = 23; /* Another MI breakpoint */ ++# 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 +} + -+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 ++set testfile "dw2-struct-member-data-location" ++set srcfile ${testfile}.S ++set binfile ${testfile}.x + -+ add_item (&c, 23); /* MI breakpoint here */ -+ add_item (&c, 72); ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${binfile}" object {nodebug}] != "" } { ++ return -1 ++} + -+#ifdef MI -+ do_nothing (); -+#endif ++clean_restart $binfile + -+ return 0; /* break to inspect struct and union */ -+} -diff --git a/gdb/testsuite/gdb.python/python-prettyprint.exp b/gdb/testsuite/gdb.python/python-prettyprint.exp ++gdb_test "ptype struct some_struct" "type = struct some_struct {\[\r\n \t\]*void field;\[\r\n \t\]*}" +diff --git a/gdb/testsuite/gdb.fortran/common-block.exp b/gdb/testsuite/gdb.fortran/common-block.exp new file mode 100644 -index 0000000..f83b1cd +index 0000000..888f6c3 --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-prettyprint.exp -@@ -0,0 +1,92 @@ -+# Copyright (C) 2008, 2009 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.fortran/common-block.exp +@@ -0,0 +1,101 @@ ++# 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 ++# 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, see . -+ -+# This file is part of the GDB testsuite. It tests Python-based -+# pretty-printing for the CLI. ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + -+if $tracelevel then { -+ strace $tracelevel -+} ++# This file was written by Jan Kratochvil . + -+set testfile "python-prettyprint" -+set srcfile ${testfile}.c ++set testfile "common-block" ++set srcfile ${testfile}.f90 +set binfile ${objdir}/${subdir}/${testfile} + -+# Start with a fresh gdb. ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 ++} ++ +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 $" {} ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++if ![runto MAIN__] then { ++ perror "couldn't run to breakpoint MAIN__" ++ continue +} + -+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 -+ } ++gdb_breakpoint [gdb_get_line_number "stop-here-out"] ++gdb_continue_to_breakpoint "stop-here-out" ++ ++# Common block naming with source name /foo/: ++# .symtab DW_TAG_common_block's DW_AT_name ++# Intel Fortran foo_ foo_ ++# GNU Fortran foo_ foo ++#set suffix "_" ++set suffix "" + -+ set nl "\[\r\n\]+" ++set int4 {(integer\(kind=4\)|INTEGER\(4\))} ++set real4 {(real\(kind=4\)|REAL\(4\))} ++set real8 {(real\(kind=8\)|REAL\(8\))} + -+ # Start with a fresh gdb. -+ gdb_exit -+ gdb_start -+ gdb_reinitialize_dir $srcdir/$subdir -+ gdb_load ${binfile} ++gdb_test "whatis foo$suffix" "No symbol \"foo$suffix\" in current context." ++gdb_test "ptype foo$suffix" "No symbol \"foo$suffix\" in current context." ++gdb_test "p foo$suffix" "No symbol \"foo$suffix\" in current context." ++gdb_test "whatis fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." ++gdb_test "ptype fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." ++gdb_test "p fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." + ++gdb_test "info locals" "ix_x = 11\r\niy_y = 22\r\niz_z = 33\r\nix = 1\r\niy = 2\r\niz = 3" "info locals out" ++gdb_test "info common" "Contents of F77 COMMON block 'fo_o':\r\nix_x = 11\r\niy_y = 22\r\niz_z = 33\r\n\r\nContents of F77 COMMON block 'foo':\r\nix = 1\r\niy = 2\r\niz = 3" "info common out" + -+ if ![runto_main ] then { -+ perror "couldn't run to breakpoint" -+ return -+ } ++gdb_test "ptype ix" "type = $int4" "ptype ix out" ++gdb_test "ptype iy" "type = $real4" "ptype iy out" ++gdb_test "ptype iz" "type = $real8" "ptype iz out" ++gdb_test "ptype ix_x" "type = $int4" "ptype ix_x out" ++gdb_test "ptype iy_y" "type = $real4" "ptype iy_y out" ++gdb_test "ptype iz_z" "type = $real8" "ptype iz_z out" + -+ gdb_test "set print pretty on" "" ++gdb_test "p ix" " = 1 *" "p ix out" ++gdb_test "p iy" " = 2 *" "p iy out" ++gdb_test "p iz" " = 3 *" "p iz out" ++gdb_test "p ix_x" " = 11 *" "p ix_x out" ++gdb_test "p iy_y" " = 22 *" "p iy_y out" ++gdb_test "p iz_z" " = 33 *" "p iz_z out" + -+ 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_breakpoint [gdb_get_line_number "stop-here-in"] ++gdb_continue_to_breakpoint "stop-here-in" + -+ gdb_test "print x" " = $hex \"this is x\"" -+ gdb_test "print cstring" " = $hex \"const string\"" ++gdb_test "whatis foo$suffix" "No symbol \"foo$suffix\" in current context." "whatis foo$suffix in" ++gdb_test "ptype foo$suffix" "No symbol \"foo$suffix\" in current context." "ptype foo$suffix in" ++gdb_test "p foo$suffix" "No symbol \"foo$suffix\" in current context." "p foo$suffix in" ++gdb_test "whatis fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "whatis fo_o$suffix in" ++gdb_test "ptype fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "ptype fo_o$suffix in" ++gdb_test "p fo_o$suffix" "No symbol \"fo_o$suffix\" in current context." "p fo_o$suffix in" + -+ gdb_test "print c" " = container $hex \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}" ++gdb_test "info locals" "ix = 11\r\niy2 = 22\r\niz = 33\r\nix_x = 1\r\niy_y = 2\r\niz_z2 = 3\r\niy = 5\r\niz_z = 55" "info locals in" ++gdb_test "info common" "Contents of F77 COMMON block 'fo_o':\r\nix = 11\r\niy2 = 22\r\niz = 33\r\n\r\nContents of F77 COMMON block 'foo':\r\nix_x = 1\r\niy_y = 2\r\niz_z2 = 3" "info common in" + -+ gdb_test "continue" "Program exited normally\." -+} ++gdb_test "ptype ix" "type = $int4" "ptype ix in" ++gdb_test "ptype iy2" "type = $real4" "ptype iy2 in" ++gdb_test "ptype iz" "type = $real8" "ptype iz in" ++gdb_test "ptype ix_x" "type = $int4" "ptype ix_x in" ++gdb_test "ptype iy_y" "type = $real4" "ptype iy_y in" ++gdb_test "ptype iz_z2" "type = $real8" "ptype iz_z2 in" + -+run_lang_tests "c" -+run_lang_tests "c++" -diff --git a/gdb/testsuite/gdb.python/python-prettyprint.py b/gdb/testsuite/gdb.python/python-prettyprint.py ++gdb_test "p ix" " = 11 *" "p ix in" ++gdb_test "p iy2" " = 22 *" "p iy2 in" ++gdb_test "p iz" " = 33 *" "p iz in" ++gdb_test "p ix_x" " = 1 *" "p ix_x in" ++gdb_test "p iy_y" " = 2 *" "p iy_y in" ++gdb_test "p iz_z2" " = 3 *" "p iz_z2 in" +diff --git a/gdb/testsuite/gdb.fortran/common-block.f90 b/gdb/testsuite/gdb.fortran/common-block.f90 new file mode 100644 -index 0000000..a53e412 +index 0000000..b614e8a --- /dev/null -+++ 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: -+ def __init__(self, val): -+ self.val = val -+ -+ def to_string(self): -+ return self.val['whybother']['contents'] -+ -+# 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 ++++ b/gdb/testsuite/gdb.fortran/common-block.f90 +@@ -0,0 +1,67 @@ ++! 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 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. ++! ++! Ihis file is the Fortran source file for dynamic.exp. ++! Original file written by Jakub Jelinek . ++! Modified for the GDB testcase by Jan Kratochvil . + -+ def to_string(self): -+ return 'container %s with %d elements' % (self.val['name'], self.val['len']) ++subroutine in + -+ def children(self): -+ return self._iterator(self.val['elements'], self.val['len']) ++ INTEGER*4 ix ++ REAL*4 iy2 ++ REAL*8 iz + -+class pp_s: -+ def __init__(self, val): -+ self.val = val ++ INTEGER*4 ix_x ++ REAL*4 iy_y ++ REAL*8 iz_z2 + -+ 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"]) + ">" ++ common /fo_o/ix,iy2,iz ++ common /foo/ix_x,iy_y,iz_z2 + -+class pp_ss: -+ def __init__(self, val): -+ self.val = val ++ iy = 5 ++ iz_z = 55 + -+ def to_string(self): -+ return "a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">" ++ if (ix .ne. 11 .or. iy2 .ne. 22.0 .or. iz .ne. 33.0) call abort ++ if (ix_x .ne. 1 .or. iy_y .ne. 2.0 .or. iz_z2 .ne. 3.0) call abort + -+class pp_sss: -+ def __init__(self, val): -+ self.val = val ++ ix = 0 ! stop-here-in + -+ def to_string(self): -+ return "a=<" + str(self.val['a']) + "> b=<" + str(self.val["b"]) + ">" ++end subroutine in + -+class pp_multiple_virtual: -+ def __init__ (self, val): -+ self.val = val ++program common_test + -+ def to_string (self): -+ return "pp value variable is: " + str (self.val['value']) ++ INTEGER*4 ix ++ REAL*4 iy ++ REAL*8 iz + -+class pp_vbase1: -+ def __init__ (self, val): -+ self.val = val ++ INTEGER*4 ix_x ++ REAL*4 iy_y ++ REAL*8 iz_z + -+ def to_string (self): -+ return "pp class name: " + self.val.type.tag ++ common /foo/ix,iy,iz ++ common /fo_o/ix_x,iy_y,iz_z + -+def lookup_function (val): -+ "Look-up and return a pretty-printer that can print val." ++ ix = 1 ++ iy = 2.0 ++ iz = 3.0 + -+ # Get the type. -+ type = val.type ++ ix_x = 11 ++ iy_y = 22.0 ++ iz_z = 33.0 + -+ # If it points to a reference, get the reference. -+ if type.code == gdb.TYPE_CODE_REF: -+ type = type.target () ++ call in ! stop-here-out + -+ # Get the unqualified type, stripped of typedefs. -+ type = type.unqualified ().strip_typedefs () ++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. + -+ # Get the type name. -+ typename = type.tag ++# 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. + -+ if typename == None: -+ return None ++# This file was written by Jan Kratochvil . + -+ # 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. ++# 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 + -+ return None ++set testfile dwarf-stride ++set srcfile ${testfile}.f90 + ++if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77}] } { ++ return -1 ++} + -+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 ++if ![runto MAIN__] then { ++ perror "couldn't run to breakpoint MAIN__" ++ continue ++} + -+ 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 = {} ++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. + -+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. ++program repro + -+ Copyright 2008 Free Software Foundation, Inc. ++ type small_stride ++ character*40 long_string ++ integer small_pad ++ end type small_stride + -+ 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. ++ type(small_stride), dimension (20), target :: unpleasant ++ character*40, pointer, dimension(:):: c40pt + -+ 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. ++ integer i + -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ ++ do i = 0,19 ++ unpleasant(i+1)%small_pad = i+1 ++ unpleasant(i+1)%long_string = char (ichar('0') + i) // '-hello' ++ end do + -+template -+struct Foo { -+}; ++ c40pt => unpleasant%long_string + -+#ifndef TYPE -+#define TYPE int -+#endif ++ print *, c40pt ! break-here + -+int main() -+{ -+ Foo foo; -+ return 0; // break here -+} -diff --git a/gdb/testsuite/gdb.python/python-template.exp b/gdb/testsuite/gdb.python/python-template.exp ++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..1ace5d6 +index 0000000..f89cf6b --- /dev/null -+++ b/gdb/testsuite/gdb.python/python-template.exp -@@ -0,0 +1,75 @@ -+# Copyright (C) 2008, 2009 Free Software Foundation, Inc. ++++ b/gdb/testsuite/gdb.fortran/dynamic.exp +@@ -0,0 +1,158 @@ ++# Copyright 2007 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 ++# 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, see . ++# 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 is part of the GDB testsuite. It tests the mechanism -+# exposing values to Python. ++# This file was written by Jan Kratochvil . + -+if $tracelevel then { -+ strace $tracelevel -+} ++# This file is part of the gdb testsuite. It contains tests for dynamically ++# allocated Fortran arrays. ++# It depends on the GCC dynamic Fortran arrays DWARF support: ++# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22244 + -+set testfile "python-template" -+set srcfile ${testfile}.cc ++set testfile "dynamic" ++set srcfile ${testfile}.f90 +set binfile ${objdir}/${subdir}/${testfile} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ -+ {debug c++}] != "" } { ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { + untested "Couldn't compile ${srcfile}" + return -1 +} + -+# Start with a fresh gdb. -+ +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+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}" \ -+ 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 - }; - -+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; -diff --git a/gdb/testsuite/gdb.python/python-value.exp b/gdb/testsuite/gdb.python/python-value.exp -index 8f5e0ab..c1a051c 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" - } - - proc test_value_numeric_ops {} { -@@ -225,6 +228,43 @@ proc test_value_in_inferior {} { - - # 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" ++if ![runto MAIN__] then { ++ perror "couldn't run to breakpoint MAIN__" ++ continue +} + -+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" ++gdb_breakpoint [gdb_get_line_number "varx-init"] ++gdb_continue_to_breakpoint "varx-init" ++gdb_test "p varx" "\\$\[0-9\]* = <(object|the array) is not allocated>" "p varx unallocated" ++gdb_test "ptype varx" "type = <(object|the array) is not allocated>" "ptype varx unallocated" ++gdb_test "p varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "p varx(1,5,17) unallocated" ++gdb_test "p varx(1,5,17)=1" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "p varx(1,5,17)=1 unallocated" ++gdb_test "ptype varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "ptype varx(1,5,17) unallocated" + -+ # 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" ++gdb_breakpoint [gdb_get_line_number "varx-allocated"] ++gdb_continue_to_breakpoint "varx-allocated" ++# $1 = (( ( 0, 0, 0, 0, 0, 0) ( 0, 0, 0, 0, 0, 0) --- , 0) ) ( ( 0, 0, ...) ...) ...) ++gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)" "ptype varx allocated" ++# Intel Fortran Compiler 10.1.008 uses -1 there, GCC uses 1. ++gdb_test "p l" "\\$\[0-9\]* = (\\.TRUE\\.|4294967295)" "p l if varx allocated" + -+ # 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 ++gdb_breakpoint [gdb_get_line_number "varx-filled"] ++gdb_continue_to_breakpoint "varx-filled" ++gdb_test "p varx(2, 5, 17)" "\\$\[0-9\]* = 6" ++gdb_test "p varx(1, 5, 17)" "\\$\[0-9\]* = 7" ++gdb_test "p varx(2, 6, 18)" "\\$\[0-9\]* = 8" ++gdb_test "p varx(6, 15, 28)" "\\$\[0-9\]* = 9" ++# The latter one is for the Intel Fortran Compiler 10.1.008 pointer type. ++gdb_test "p varv" "\\$\[0-9\]* = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "p varv unassociated" ++gdb_test "ptype varv" "type = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "ptype varv unassociated" + -+ # Make sure the type is deleted. -+ gdb_py_test_silent_cmd "python ptrtype = None" \ -+ "delete PTR type" 1 ++gdb_breakpoint [gdb_get_line_number "varv-associated"] ++gdb_continue_to_breakpoint "varv-associated" ++gdb_test "p varx(3, 7, 19)" "\\$\[0-9\]* = 6" "p varx(3, 7, 19) with varv associated" ++gdb_test "p varv(3, 7, 19)" "\\$\[0-9\]* = 6" "p varv(3, 7, 19) associated" ++# Intel Fortran Compiler 10.1.008 uses -1 there, GCC uses 1. ++gdb_test "p l" "\\$\[0-9\]* = (\\.TRUE\\.|4294967295)" "p l if varv associated" ++gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)" "ptype varx with varv associated" ++# Intel Fortran Compiler 10.1.008 uses the pointer type. ++gdb_test "ptype varv" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)\\)?" "ptype varv associated" + -+ # Now see if the value's type is still valid. -+ gdb_test "python print castval.type" "PTR \\*" \ -+ "print value's type" - } - - -@@ -256,3 +296,4 @@ if ![runto_main] then { - } - - test_value_in_inferior -+test_value_after_death -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 -+++ b/gdb/testsuite/lib/cp-support.exp -@@ -222,7 +222,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { - - set parse_okay 0 - gdb_test_multiple "$in_command" "$in_testname // parse failed" { -- -re "type = (struct|class)${wsopt}(\[A-Za-z0-9_\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" { -+ -re "type = (struct|class)${wsopt}(\[A-Za-z0-9_:\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" { - set parse_okay 1 - set actual_key $expect_out(1,string) - set actual_tag $expect_out(2,string) -@@ -231,6 +231,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { - set actual_tail $expect_out(6,string) - } - } -+ - if { ! $parse_okay } then { return } - - # 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 ---- 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 - - gdb_stop_suppressing_tests; - -+ set env(LC_CTYPE) C ++gdb_breakpoint [gdb_get_line_number "varv-filled"] ++gdb_continue_to_breakpoint "varv-filled" ++gdb_test "p varx(3, 7, 19)" "\\$\[0-9\]* = 10" "p varx(3, 7, 19) with varv filled" ++gdb_test "p varv(3, 7, 19)" "\\$\[0-9\]* = 10" "p varv(3, 7, 19) filled" + - verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS" - - 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 ---- 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 } { - 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] ++gdb_breakpoint [gdb_get_line_number "varv-deassociated"] ++gdb_continue_to_breakpoint "varv-deassociated" ++# The latter one is for the Intel Fortran Compiler 10.1.008 pointer type. ++gdb_test "p varv" "\\$\[0-9\]* = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "p varv deassociated" ++gdb_test "ptype varv" "type = (<(object|the array) is not associated>|.*(Cannot access it|Unable to access the object) because the object is not associated.)" "ptype varv deassociated" ++gdb_test "p l" "\\$\[0-9\]* = \\.FALSE\\." "p l if varv deassociated" ++gdb_test "p varv(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not associated\\." ++gdb_test "ptype varv(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not associated\\." + -+ set er "\\^done,changelist=\\\[" ++gdb_breakpoint [gdb_get_line_number "varx-deallocated"] ++gdb_continue_to_breakpoint "varx-deallocated" ++gdb_test "p varx" "\\$\[0-9\]* = <(object|the array) is not allocated>" "p varx deallocated" ++gdb_test "ptype varx" "type = <(object|the array) is not allocated>" "ptype varx deallocated" ++gdb_test "p l" "\\$\[0-9\]* = \\.FALSE\\." "p l if varx deallocated" ++gdb_test "p varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "p varx(1,5,17) deallocated" ++gdb_test "ptype varx(1,5,17)" "(Cannot access it|Unable to access the object) because the (object|array) is not allocated\\." "ptype varx(1,5,17) deallocated" + -+ append er "{name=\"$name\",in_scope=\"true\",type_changed=\"false\"" -+ append er ",children=\\\[$children_exp_j.*\\\]}\\\]" ++gdb_breakpoint [gdb_get_line_number "vary-passed"] ++gdb_continue_to_breakpoint "vary-passed" ++# $1 = (( ( 1, 1, 1, 1, 1, 1) ( 1, 1, 1, 1, 1, 1) --- , 1) ) ( ( 1, 1, ...) ...) ...) ++gdb_test "p vary" "\\$\[0-9\]* = \\(\[()1, .\]*\\)" + -+ verbose -log "Expecting: $er" -+ mi_gdb_test "-var-update $name" $er $testname -+} ++gdb_breakpoint [gdb_get_line_number "vary-filled"] ++gdb_continue_to_breakpoint "vary-filled" ++gdb_test "ptype vary" "type = real(\\(kind=4\\)|\\*4) \\(10,10\\)" ++gdb_test "p vary(1, 1)" "\\$\[0-9\]* = 8" ++gdb_test "p vary(2, 2)" "\\$\[0-9\]* = 9" ++gdb_test "p vary(1, 3)" "\\$\[0-9\]* = 10" ++# $1 = (( ( 3, 3, 3, 3, 3, 3) ( 3, 3, 3, 3, 3, 3) --- , 3) ) ( ( 3, 3, ...) ...) ...) ++gdb_test "p varw" "\\$\[0-9\]* = \\(\[()3, .\]*\\)" + - 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 "\"\[^\"\]+\"" ++gdb_breakpoint [gdb_get_line_number "varw-almostfilled"] ++gdb_continue_to_breakpoint "varw-almostfilled" ++gdb_test "ptype varw" "type = real(\\(kind=4\\)|\\*4) \\(5,4,3\\)" ++gdb_test "p varw(3,1,1)=1" "\\$\[0-9\]* = 1" ++# $1 = (( ( 6, 5, 1, 5, 5, 5) ( 5, 5, 5, 5, 5, 5) --- , 5) ) ( ( 5, 5, ...) ...) ...) ++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. ++# 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" ++gdb_test "p z(4,4,6)" "\\$\[0-9\]* = 1" + -+ if {$add_child} { -+ set pre "child=" -+ } else { -+ set pre "" -+ } ++gdb_breakpoint [gdb_get_line_number "varz-almostfilled"] ++gdb_continue_to_breakpoint "varz-almostfilled" ++# GCC uses the pointer type here, Intel Fortran Compiler 10.1.008 does not. ++gdb_test "ptype varz" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(\\*\\)\\)?" ++# Intel Fortran Compiler 10.1.008 has a bug here - (2:11,7:7) ++# as it produces DW_AT_lower_bound == DW_AT_upper_bound == 7. ++gdb_test "ptype vart" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(2:11,7:\\*\\)\\)?" ++gdb_test "p varz" "\\$\[0-9\]* = \\(\\)" ++gdb_test "p vart" "\\$\[0-9\]* = \\(\\)" ++gdb_test "p varz(3)" "\\$\[0-9\]* = 4" ++# maps to foo::vary(1,1) ++gdb_test "p vart(2,7)" "\\$\[0-9\]* = 8" ++# maps to foo::vary(2,2) ++gdb_test "p vart(3,8)" "\\$\[0-9\]* = 9" ++# maps to foo::vary(1,3) ++gdb_test "p vart(2,9)" "\\$\[0-9\]* = 10" + -+ 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\]+\")?}" -+ } ++set test "quit #1" ++gdb_test_multiple "quit" $test { ++ -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) " { ++ pass $test + } -+ 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 } { - # have no value. - # - proc mi_list_varobj_children { varname children testname } { -+ mi_list_varobj_children_range $varname [llength $children] $children \ -+ $testname ++set test "quit #2" ++gdb_test_multiple "y" $test { ++ eof { ++ pass $test ++ } +} - -+# 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} { - set options "" - if {[llength $varname] == 2} { - set options [lindex $varname 1] - set varname [lindex $varname 0] - } - -- set numchildren [llength $children] -- set children_exp {} - set whatever "\"\[^\"\]+\"" - -- 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 - } -+ -+# Return a list of MI features supported by this gdb. -+proc mi_get_features {} { -+ global expect_out mi_gdb_prompt -+ -+ send_gdb "-list-features\n" +diff --git a/gdb/testsuite/gdb.fortran/dynamic.f90 b/gdb/testsuite/gdb.fortran/dynamic.f90 +new file mode 100644 +index 0000000..0f43564 +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/dynamic.f90 +@@ -0,0 +1,98 @@ ++! Copyright 2007 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. ++! ++! Ihis file is the Fortran source file for dynamic.exp. ++! Original file written by Jakub Jelinek . ++! Modified for the GDB testcase by Jan Kratochvil . + -+ 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 "" -+ } -+ } -+} -diff --git a/gdb/thread.c b/gdb/thread.c -index 9dea7c2..326e44e 100644 ---- a/gdb/thread.c -+++ b/gdb/thread.c -@@ -61,7 +61,6 @@ static int thread_alive (struct thread_info *); - static void info_threads_command (char *, int); - static void thread_apply_command (char *, int); - static void restore_current_thread (ptid_t); --static void prune_threads (void); - - /* Frontend view of the thread state. Possible extensions: stepping, - finishing, until(ling),... */ -@@ -459,16 +458,23 @@ thread_alive (struct thread_info *tp) - return 1; - } - --static void -+void - prune_threads (void) - { -- struct thread_info *tp, *next; -+ struct thread_info *tp; -+ struct thread_info **prevp = &thread_list; - -- for (tp = thread_list; tp; tp = next) -+ for (tp = *prevp; tp; tp = *prevp) - { -- next = tp->next; -+ /* If the thread has died, free it and unlink it from the list. -+ Otherwise, advance to the next thread. */ - if (!thread_alive (tp)) -- delete_thread (tp->ptid); -+ { -+ *prevp = tp->next; -+ free_thread (tp); -+ } -+ else -+ prevp = &tp->next; - } - } - -diff --git a/gdb/top.c b/gdb/top.c -index d676f02..d6b17f0 100644 ---- a/gdb/top.c -+++ b/gdb/top.c -@@ -377,6 +377,7 @@ execute_command (char *p, int from_tty) - } - - free_all_values (); -+ free_all_types (); - - /* 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 ---- a/gdb/typeprint.c -+++ b/gdb/typeprint.c -@@ -35,6 +35,7 @@ - #include "gdb_string.h" - #include "exceptions.h" - #include "valprint.h" -+#include "dwarf2loc.h" - #include - - extern void _initialize_typeprint (void); -@@ -76,6 +77,9 @@ void - type_print (struct type *type, char *varstring, struct ui_file *stream, - int show) - { -+ if (show >= 0) -+ type = check_typedef (type); ++subroutine baz ++ real, target, allocatable :: varx (:, :, :) ++ real, pointer :: varv (:, :, :) ++ real, target :: varu (1, 2, 3) ++ logical :: l ++ allocate (varx (1:6, 5:15, 17:28)) ! varx-init ++ l = allocated (varx) ++ varx(:, :, :) = 6 ! varx-allocated ++ varx(1, 5, 17) = 7 ++ varx(2, 6, 18) = 8 ++ varx(6, 15, 28) = 9 ++ varv => varx ! varx-filled ++ l = associated (varv) ++ varv(3, 7, 19) = 10 ! varv-associated ++ varv => null () ! varv-filled ++ l = associated (varv) ++ deallocate (varx) ! varv-deassociated ++ l = allocated (varx) ++ varu(:, :, :) = 10 ! varx-deallocated ++ allocate (varv (1:6, 5:15, 17:28)) ++ l = associated (varv) ++ varv(:, :, :) = 6 ++ varv(1, 5, 17) = 7 ++ varv(2, 6, 18) = 8 ++ varv(6, 15, 28) = 9 ++ deallocate (varv) ++ l = associated (varv) ++ varv => varu ++ varv(1, 1, 1) = 6 ++ varv(1, 2, 3) = 7 ++ l = associated (varv) ++end subroutine baz ++subroutine foo (vary, varw) ++ real :: vary (:, :) ++ real :: varw (:, :, :) ++ vary(:, :) = 4 ! vary-passed ++ vary(1, 1) = 8 ++ vary(2, 2) = 9 ++ vary(1, 3) = 10 ++ varw(:, :, :) = 5 ! vary-filled ++ varw(1, 1, 1) = 6 ++ varw(2, 2, 2) = 7 ! varw-almostfilled ++end subroutine foo ++subroutine bar (varz, vart) ++ real :: varz (*) ++ real :: vart (2:11, 7:*) ++ varz(1:3) = 4 ++ varz(2) = 5 ! varz-almostfilled ++ vart(2,7) = vart(2,7) ++end subroutine bar ++program test ++ interface ++ subroutine foo (vary, varw) ++ real :: vary (:, :) ++ real :: varw (:, :, :) ++ end subroutine ++ end interface ++ interface ++ subroutine bar (varz, vart) ++ real :: varz (*) ++ real :: vart (2:11, 7:*) ++ end subroutine ++ end interface ++ real :: x (10, 10), y (5), z(8, 8, 8) ++ x(:,:) = 1 ++ y(:) = 2 ++ z(:,:,:) = 3 ++ call baz ++ call foo (x, z(2:6, 4:7, 6:8)) ++ call bar (y, x) ++ if (x (1, 1) .ne. 8 .or. x (2, 2) .ne. 9 .or. x (1, 2) .ne. 4) call abort ++ if (x (1, 3) .ne. 10) call abort ++ if (z (2, 4, 6) .ne. 6 .or. z (3, 5, 7) .ne. 7 .or. z (2, 4, 7) .ne. 5) call abort ++ if (any (y .ne. (/4, 5, 4, 2, 2/))) call abort ++ call foo (transpose (x), z) ++ 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/logical.exp b/gdb/testsuite/gdb.fortran/logical.exp +new file mode 100644 +index 0000000..ef76f43 +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/logical.exp +@@ -0,0 +1,44 @@ ++# Copyright 2007 Free Software Foundation, Inc. + - LA_PRINT_TYPE (type, varstring, stream, show, 0); - } - -@@ -115,7 +119,8 @@ whatis_exp (char *exp, int show) - { - struct expression *expr; - struct value *val; -- struct cleanup *old_chain = NULL; -+ /* Required at least for the object_address_set call. */ -+ struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); - struct type *real_type = NULL; - struct type *type; - int full = 0; -@@ -126,12 +131,13 @@ whatis_exp (char *exp, int show) - if (exp) - { - expr = parse_expression (exp); -- old_chain = make_cleanup (free_current_contents, &expr); -+ make_cleanup (free_current_contents, &expr); - val = evaluate_type (expr); - } - else - val = access_value_history (0); - -+ object_address_set (VALUE_ADDRESS (val)); - type = value_type (val); - - get_user_print_options (&opts); -@@ -168,8 +174,7 @@ whatis_exp (char *exp, int show) - type_print (type, "", gdb_stdout, show); - printf_filtered ("\n"); - -- if (exp) -- do_cleanups (old_chain); -+ do_cleanups (old_chain); - } - - 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 ---- a/gdb/typeprint.h -+++ b/gdb/typeprint.h -@@ -26,4 +26,6 @@ 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); ++# 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. + -+void c_type_print_args (struct type *, struct ui_file *, int); - #endif -diff --git a/gdb/ui-file.c b/gdb/ui-file.c -index 02a0314..5c8c96e 100644 ---- a/gdb/ui-file.c -+++ b/gdb/ui-file.c -@@ -22,6 +22,7 @@ - - #include "defs.h" - #include "ui-file.h" -+#include "gdb_obstack.h" - #include "gdb_string.h" - - #include -@@ -263,7 +264,7 @@ set_ui_file_data (struct ui_file *file, void *data, - } - - /* ui_file utility function for converting a ``struct ui_file'' into -- a memory buffer''. */ -+ a memory buffer. */ - - struct accumulated_ui_file - { -@@ -297,6 +298,23 @@ ui_file_xstrdup (struct ui_file *file, - *length = acc.length; - return acc.buffer; - } ++# This file was written by Jan Kratochvil . + -+static void -+do_ui_file_obsavestring (void *context, const char *buffer, long length) -+{ -+ struct obstack *obstack = (struct obstack *) context; -+ obstack_grow (obstack, buffer, length); -+} ++set testfile "logical" ++set srcfile ${testfile}.f90 ++set binfile ${objdir}/${subdir}/${testfile} + -+char * -+ui_file_obsavestring (struct ui_file *file, struct obstack *obstack, -+ long *length) -+{ -+ ui_file_put (file, do_ui_file_obsavestring, obstack); -+ *length = obstack_object_size (obstack); -+ obstack_1grow (obstack, '\0'); -+ return obstack_finish (obstack); -+} - - /* A pure memory based ``struct ui_file'' that can be used an output - buffer. The buffers accumulated contents are available via -diff --git a/gdb/ui-file.h b/gdb/ui-file.h -index 1562d5a..d86a7eb 100644 ---- a/gdb/ui-file.h -+++ b/gdb/ui-file.h -@@ -19,6 +19,7 @@ - #ifndef UI_FILE_H - #define UI_FILE_H - -+struct obstack; - struct ui_file; - - /* Create a generic ui_file object with null methods. */ -@@ -77,7 +78,10 @@ extern void ui_file_put (struct ui_file *src, ui_file_put_method_ftype *write, v - appended NUL. */ - extern char *ui_file_xstrdup (struct ui_file *file, long *length); - -- -+/* Similar to ui_file_xstrdup, but return a new string allocated on -+ OBSTACK. */ -+extern char *ui_file_obsavestring (struct ui_file *file, -+ struct obstack *obstack, long *length); - - 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 ---- 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); ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 +} + -+struct cleanup * -+make_cleanup_obstack_free (struct obstack *obstack) -+{ -+ return make_cleanup (do_obstack_free, obstack); ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++if ![runto MAIN__] then { ++ perror "couldn't run to breakpoint MAIN__" ++ continue +} + -+static void - do_ui_file_delete (void *arg) - { - ui_file_delete (arg); -@@ -1554,21 +1567,33 @@ query (const char *ctlstr, ...) - va_end (args); - } - --/* 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. */ ++gdb_breakpoint [gdb_get_line_number "stop-here"] ++gdb_continue_to_breakpoint "stop-here" ++gdb_test "p l" " = \\.TRUE\\." ++gdb_test "p l1" " = \\.TRUE\\." ++gdb_test "p l2" " = \\.TRUE\\." ++gdb_test "p l4" " = \\.TRUE\\." ++gdb_test "p l8" " = \\.TRUE\\." +diff --git a/gdb/testsuite/gdb.fortran/logical.f90 b/gdb/testsuite/gdb.fortran/logical.f90 +new file mode 100644 +index 0000000..4229304 +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/logical.f90 +@@ -0,0 +1,33 @@ ++! 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 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. ++! ++! Ihis file is the Fortran source file for dynamic.exp. ++! Original file written by Jakub Jelinek . ++! Modified for the GDB testcase by Jan Kratochvil . + -+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; ++program test ++ logical :: l ++ logical (kind=1) :: l1 ++ logical (kind=2) :: l2 ++ logical (kind=4) :: l4 ++ logical (kind=8) :: l8 ++ l = .TRUE. ++ l1 = .TRUE. ++ l2 = .TRUE. ++ l4 = .TRUE. ++ l8 = .TRUE. ++ l = .FALSE. ! stop-here ++end +diff --git a/gdb/testsuite/gdb.fortran/string.exp b/gdb/testsuite/gdb.fortran/string.exp +new file mode 100644 +index 0000000..ab72206 +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/string.exp +@@ -0,0 +1,72 @@ ++# 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 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. + -+ obstack_init (&host_data); -+ cleanups = make_cleanup_obstack_free (&host_data); ++# This file was written by Jan Kratochvil . + -+ 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; - } -- 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; -- } ++# This file is part of the gdb testsuite. It contains tests for Fortran ++# strings with dynamic length. + -+ 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; ++set testfile "string" ++set srcfile ${testfile}.f90 ++set binfile ${objdir}/${subdir}/${testfile} + -+ default: -+ break; -+ } ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 ++} + -+ 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; - } - - /* 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; - } -diff --git a/gdb/valarith.c b/gdb/valarith.c -index f38cdb8..8e103cf 100644 ---- a/gdb/valarith.c -+++ b/gdb/valarith.c -@@ -164,9 +164,9 @@ an integer nor a pointer of the same type.")); - struct value * - value_subscript (struct value *array, struct value *idx) - { -- 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) - get_discrete_bounds (range_type, &lowerbound, &upperbound); - - if (VALUE_LVAL (array) != lval_memory) -- return value_subscripted_rvalue (array, idx, lowerbound); -+ { -+ if (index >= lowerbound && index <= upperbound) -+ { -+ CORE_ADDR element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (tarray)); -+ CORE_ADDR offset = (index - lowerbound) * element_size; ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} + -+ return value_subscripted_rvalue (array, offset); -+ } -+ error (_("array or string index out of range")); -+ } - - if (c_style == 0) - { -- LONGEST index = value_as_long (idx); - if (index >= lowerbound && index <= upperbound) -- return value_subscripted_rvalue (array, idx, lowerbound); -+ { -+ CORE_ADDR element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (tarray)); -+ CORE_ADDR offset = (index - lowerbound) * element_size; ++if ![runto MAIN__] then { ++ perror "couldn't run to breakpoint MAIN__" ++ continue ++} + -+ return value_subscripted_rvalue (array, offset); -+ } - /* 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; ++gdb_breakpoint [gdb_get_line_number "var-init"] ++gdb_continue_to_breakpoint "var-init" ++gdb_test "ptype c" "type = character(\\(kind=1\\)|\\*1)" ++gdb_test "ptype d" "type = character(\\(kind=8\\)|\\*8)" ++gdb_test "ptype e" "type = character(\\(kind=4\\)|\\*4)" ++gdb_test "ptype f" "type = character(\\(kind=4\\)|\\*4) \\(7,8:10\\)" ++gdb_test "ptype *e" "Attempt to take contents of a non-pointer value." ++gdb_test "ptype *f" "type = character(\\(kind=4\\)|\\*4) \\(7\\)" ++gdb_test "p c" "\\$\[0-9\]* = 'c'" ++gdb_test "p d" "\\$\[0-9\]* = 'd '" ++gdb_test "p e" "\\$\[0-9\]* = 'g '" ++gdb_test "p f" "\\$\[0-9\]* = \\(\\( 'h ', 'h ', 'h ', 'h ', 'h ', 'h ', 'h '\\) \\( 'h ', 'h ', 'h ', 'h ', 'h ', 'h ', 'h '\\) \\( 'h ', 'h ', 'h ', 'h ', 'h ', 'h ', 'h '\\) \\)" ++gdb_test "p *e" "Attempt to take contents of a non-pointer value." ++gdb_test "p *f" "Attempt to take contents of a non-pointer value." ++ ++gdb_breakpoint [gdb_get_line_number "var-finish"] ++gdb_continue_to_breakpoint "var-finish" ++gdb_test "p e" "\\$\[0-9\]* = 'e '" "p e re-set" ++gdb_test "p f" "\\$\[0-9\]* = \\(\\( 'f ', 'f ', 'f ', 'f ', 'f ', 'f ', 'f '\\) \\( 'f2 ', 'f ', 'f ', 'f ', 'f ', 'f ', 'f '\\) \\( 'f ', 'f ', 'f ', 'f ', 'f ', 'f ', 'f '\\) \\)" "p *f re-set" + -+ idx = value_from_longest (builtin_type_int32, index); -+ return value_ind (value_ptradd (array, idx)); ++set test "quit #1" ++gdb_test_multiple "quit" $test { ++ -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) " { ++ pass $test + } - else - error (_("not an array or string")); - } - --/* Return the value of EXPR[IDX], expr an aggregate rvalue -- (eg, a vector register). This routine used to promote floats -- to doubles, but no longer does. */ -+/* Return the value of *((void *) ARRAY + ELEMENT), ARRAY an aggregate rvalue -+ (eg, a vector register). This routine used to promote floats to doubles, -+ but no longer does. OFFSET is zero-based with 0 for the lowermost existing -+ element, it must be expressed in bytes (therefore multiplied by -+ 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, 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; - -- if (index < lowerbound || elt_offs >= TYPE_LENGTH (array_type)) -- error (_("no such vector element")); -+ /* Do not check TYPE_LENGTH (array_type) as we may have been given the -+ innermost dimension of a multi-dimensional Fortran array where its length -+ is shorter than the possibly accessed element offset. */ - - v = allocate_value (elt_type); - if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) - set_value_lazy (v, 1); - else -- memcpy (value_contents_writeable (v), -- value_contents (array) + elt_offs, elt_size); -+ { -+ unsigned int elt_size = TYPE_LENGTH (elt_type); -+ memcpy (value_contents_writeable (v), -+ value_contents (array) + offset, elt_size); ++} ++set test "quit #2" ++gdb_test_multiple "y" $test { ++ eof { ++ pass $test + } - - set_value_component_location (v, array); - VALUE_REGNUM (v) = VALUE_REGNUM (array); - VALUE_FRAME_ID (v) = VALUE_FRAME_ID (array); -- set_value_offset (v, value_offset (array) + elt_offs); -+ set_value_offset (v, value_offset (array) + offset); - return v; ++} +diff --git a/gdb/testsuite/gdb.fortran/string.f90 b/gdb/testsuite/gdb.fortran/string.f90 +new file mode 100644 +index 0000000..226dc5d +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/string.f90 +@@ -0,0 +1,37 @@ ++! 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 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. ++! ++! Ihis file is the Fortran source file for dynamic.exp. ++! Original file written by Jakub Jelinek . ++! Modified for the GDB testcase by Jan Kratochvil . ++ ++subroutine foo (e, f) ++ character (len=1) :: c ++ character (len=8) :: d ++ character (len=*) :: e ++ character (len=*) :: f (1:7, 8:10) ++ c = 'c' ++ d = 'd' ++ e = 'e' ! var-init ++ f = 'f' ++ f(1,9) = 'f2' ++ c = 'c' ! var-finish ++end subroutine foo ++ character (len=4) :: g, h (1:7, 8:10) ++ g = 'g' ++ h = 'h' ++ call foo (g, h) ++end +diff --git a/gdb/testsuite/gdb.gdb/selftest.exp b/gdb/testsuite/gdb.gdb/selftest.exp +index 495ae45..d08d7a4 100644 +--- a/gdb/testsuite/gdb.gdb/selftest.exp ++++ b/gdb/testsuite/gdb.gdb/selftest.exp +@@ -95,6 +95,10 @@ proc do_steps_and_nexts {} { + set description "step over ttyarg initialization" + set command "step" + } ++ -re ".*python_script = 0.*$gdb_prompt $" { ++ set description "step over python_script initialization" ++ set command "step" ++ } + -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/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" \ + + 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" } -diff --git a/gdb/valops.c b/gdb/valops.c -index 9810f2b..14c562e 100644 ---- a/gdb/valops.c -+++ b/gdb/valops.c -@@ -38,6 +38,7 @@ - #include "cp-support.h" - #include "dfp.h" - #include "user-regs.h" -+#include "dwarf2loc.h" +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" + + # 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" + + +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" + + # 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" - #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) - new_length = val_length / element_length; - if (val_length % element_length != 0) - warning (_("array element type size does not divide object size in cast")); -- /* FIXME-type-allocation: need a way to free this type when -- we are done with it. */ - 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) - return val; - } -+/* object_address_set must be already called before this function. */ +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 +--- /dev/null ++++ b/gdb/testsuite/gdb.opt/array-from-register-func.c +@@ -0,0 +1,22 @@ ++/* This file is part of GDB, the GNU debugger. + -+const char * -+object_address_data_not_valid (struct type *type) -+{ -+ /* Attributes are present only at the target type of a typedef. Make the -+ call conditional as it would otherwise loop through type_length_get. */ -+ if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) -+ CHECK_TYPEDEF (type); ++ Copyright 2009 Free Software Foundation, Inc. + -+ /* DW_AT_associated has a preference over DW_AT_allocated. */ -+ if (TYPE_NOT_ASSOCIATED (type) -+ || (TYPE_ASSOCIATED (type) != NULL -+ && 0 == dwarf_locexpr_baton_eval (TYPE_ASSOCIATED (type)))) -+ return N_("object is not associated"); ++ 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. + -+ if (TYPE_NOT_ALLOCATED (type) -+ || (TYPE_ALLOCATED (type) != NULL -+ && 0 == dwarf_locexpr_baton_eval (TYPE_ALLOCATED (type)))) -+ return N_("object is not allocated"); ++ 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. + -+ return NULL; ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++int ++func (int *arr) ++{ ++ return arr[0]; +} +diff --git a/gdb/testsuite/gdb.opt/array-from-register.c b/gdb/testsuite/gdb.opt/array-from-register.c +new file mode 100644 +index 0000000..3090e7e +--- /dev/null ++++ b/gdb/testsuite/gdb.opt/array-from-register.c +@@ -0,0 +1,28 @@ ++/* This file is part of GDB, the GNU debugger. + -+/* 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 -+ 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. */ ++ 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 . */ ++ ++extern int func (int *arr); + +int -+object_address_get_data (struct type *type, CORE_ADDR *address_return) ++main (void) +{ -+ gdb_assert (address_return != NULL); -+ -+ object_address_set (*address_return); ++ int arr[] = { 42 }; + -+ /* TYPE_DATA_LOCATION_DWARF_BLOCK / TYPE_DATA_LOCATION_ADDR are present only -+ at the target type of a typedef. */ -+ CHECK_TYPEDEF (type); ++ func (arr); + -+ if (object_address_data_not_valid (type) != NULL) -+ { -+ /* Do not try to evaluate DW_AT_data_location as it may even crash -+ (it would just return the value zero in the gfortran case). */ -+ return 0; -+ } ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.opt/array-from-register.exp b/gdb/testsuite/gdb.opt/array-from-register.exp +new file mode 100644 +index 0000000..f2de718 +--- /dev/null ++++ b/gdb/testsuite/gdb.opt/array-from-register.exp +@@ -0,0 +1,33 @@ ++# 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 is part of the gdb testsuite. + -+ if (TYPE_DATA_LOCATION_IS_ADDR (type)) -+ *address_return = TYPE_DATA_LOCATION_ADDR (type); -+ else if (TYPE_DATA_LOCATION_DWARF_BLOCK (type) != NULL) -+ *address_return -+ = dwarf_locexpr_baton_eval (TYPE_DATA_LOCATION_DWARF_BLOCK (type)); ++if { [prepare_for_testing array-from-register.exp "array-from-register" \ ++ {array-from-register.c array-from-register-func.c} \ ++ {debug optimize=-O2}] } { ++ return -1 ++} + -+ return 1; ++if ![runto func] then { ++ return -1 +} + - /* 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) - { -- CORE_ADDR addr = VALUE_ADDRESS (val) + value_offset (val); -- int length = TYPE_LENGTH (check_typedef (value_enclosing_type (val))); -+ CORE_ADDR addr = VALUE_ADDRESS (val); ++gdb_test "p arr" "\\$\[0-9\]+ = \\(int \\*\\) *0x\[0-9a-f\]+" + -+ if (object_address_get_data (value_type (val), &addr)) -+ { -+ struct type *type = value_enclosing_type (val); -+ int length = TYPE_LENGTH (check_typedef (type)); - -- if (length) -- read_memory (addr, value_contents_all_raw (val), length); -+ if (length) -+ { -+ addr += value_offset (val); -+ read_memory (addr, value_contents_all_raw (val), length); -+ } -+ } - } - 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); ++# Seen regression: ++# Address requested for identifier "arr" which is in register $rdi ++gdb_test "p arr\[0\]" "\\$\[0-9\]+ = 42" +diff --git a/gdb/testsuite/gdb.python/Makefile.in b/gdb/testsuite/gdb.python/Makefile.in +index 79be9e7..c49f713 100644 +--- a/gdb/testsuite/gdb.python/Makefile.in ++++ b/gdb/testsuite/gdb.python/Makefile.in +@@ -1,7 +1,7 @@ + VPATH = @srcdir@ + srcdir = @srcdir@ -- 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)); +-EXECUTABLES = python-value ++EXECUTABLES = python-value python-prettyprint python-template - return val; + all info install-info dvi install uninstall installcheck check: + @echo "Nothing to be done for $@..." +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 } -@@ -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))) - || TYPE_CODE (type) == TYPE_CODE_FUNC) - { -- CORE_ADDR addr = VALUE_ADDRESS (val); -+ CORE_ADDR addr = value_address (val); - return value_from_pointer (lookup_pointer_type (type), addr); - } - -@@ -1145,6 +1209,7 @@ struct value * - value_coerce_array (struct value *arg1) - { - struct type *type = check_typedef (value_type (arg1)); -+ CORE_ADDR address; - - /* 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) - if (VALUE_LVAL (arg1) != lval_memory) - error (_("Attempt to take address of value not located in memory.")); -+ address = VALUE_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))); -+ address + value_offset (arg1)); - } +-# 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. - /* 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.")); + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir - retval = value_from_pointer (lookup_pointer_type (value_type (arg1)), -- (VALUE_ADDRESS (arg1) + value_offset (arg1))); -+ (value_address (arg1))); - return retval; +-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 } -@@ -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; + # 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 } -+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, - if (method) - { - gdb_assert (obj); -+ -+ /* OBJ may be a pointer value rather than the object itself. */ -+ obj = coerce_ref (obj); -+ while (TYPE_CODE (check_typedef (value_type (obj))) == TYPE_CODE_PTR) -+ obj = coerce_ref (value_ind (obj)); - obj_type_name = TYPE_NAME (value_type (obj)); -- /* Hack: evaluate_subexp_standard often passes in a pointer -- value rather than the object itself, so try again. */ -- if ((!obj_type_name || !*obj_type_name) -- && (TYPE_CODE (value_type (obj)) == TYPE_CODE_PTR)) -- obj_type_name = TYPE_NAME (TYPE_TARGET_TYPE (value_type (obj))); -+ -+ /* First check whether this is a data member, e.g. a pointer to -+ a function. */ -+ if (TYPE_CODE (check_typedef (value_type (obj))) == TYPE_CODE_STRUCT) -+ { -+ *valp = search_struct_field (name, obj, 0, -+ check_typedef (value_type (obj)), 0); -+ if (*valp) -+ { -+ *staticp = 1; -+ return 0; -+ } -+ } - - 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, - } - 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). */ -+ if (qualified_name -+ && TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym))) == TYPE_CODE_FUNC) -+ { -+ 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. */ -+ if (func_name && strcmp (func_name, qualified_name) == 0) -+ { -+ xfree (func_name); -+ func_name = NULL; -+ } -+ } - -- /* If there was no C++ name, this must be a C-style function. -- Just return the same symbol. Do the same if cp_func_name -- fails for some reason. */ -+ /* If there was no C++ name, this must be a C-style function or -+ not a function at all. Just return the same symbol. Do the -+ same if cp_func_name fails for some reason. */ - if (func_name == NULL) - { - *symp = fsym; -@@ -2558,8 +2667,8 @@ check_field (struct type *type, const char *name) - the comment before value_struct_elt_for_reference. */ - - struct value * --value_aggregate_elt (struct type *curtype, -- char *name, int want_address, -+value_aggregate_elt (struct type *curtype, char *name, -+ struct type *expect_type, int want_address, - enum noside noside) - { - switch (TYPE_CODE (curtype)) -@@ -2567,7 +2676,7 @@ value_aggregate_elt (struct type *curtype, - case TYPE_CODE_STRUCT: - case TYPE_CODE_UNION: - return value_struct_elt_for_reference (curtype, 0, curtype, -- name, NULL, -+ name, expect_type, - 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, - if (intype) - { - 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, - 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, - get_selected_block (0), - VAR_DOMAIN); - -@@ -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) - || lowbound + length - 1 > upperbound) - error (_("slice out of range")); - -- /* FIXME-type-allocation: need a way to free this type when we are -- done with it. */ - slice_range_type = create_range_type ((struct type *) NULL, - TYPE_TARGET_TYPE (range_type), - lowbound, -diff --git a/gdb/valprint.c b/gdb/valprint.c -index b02e9df..a9e8227 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; -+ } ++# Start with a fresh gdb. + - 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; -+ } ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir + - 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; -+ } ++if ![python_supported] then { ++ unsupported "python support is disabled" ++ return -1 ++} ++ + set testfile "python-frame" + set srcfile ${testfile}.c + set binfile ${objdir}/${subdir}/${testfile} + - return LA_VALUE_PRINT (val, stream, options); + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + untested "Couldn't compile ${srcfile}" + return -1 } -@@ -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, +-# 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} - 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, +-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. - for (; i < len && things_printed < options->print_max; i++) - { -+ size_t elt_offset = i * eltlen; - if (i != 0) - { - if (options->prettyprint_arrays) -@@ -1104,7 +1137,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, - rep1 = i + 1; - reps = 1; - while ((rep1 < len) && -- !memcmp (valaddr + i * eltlen, valaddr + rep1 * eltlen, eltlen)) -+ !memcmp (valaddr + elt_offset, valaddr + rep1 * eltlen, eltlen)) - { - ++reps; - ++rep1; -@@ -1112,7 +1145,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, + if ![runto_main] then { +@@ -65,19 +53,20 @@ gdb_breakpoint "f2" + gdb_continue_to_breakpoint "breakpoint at f2" + gdb_test "up" "" "" - 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. */ +-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 - 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); - } + 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 + } - 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; - }; +-# 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. - /* 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); + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir --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); +-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 + } - int read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, - gdb_byte **buffer, int *bytes_read); + 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..0b48299 +--- /dev/null ++++ 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 */ ++ ++static int8_t int8_search_buf[100]; ++static int16_t int16_search_buf[100]; ++static int32_t int32_search_buf[100]; ++static int64_t int64_search_buf[100]; ++ ++static char *search_buf; ++static int search_buf_size; ++ ++static int x; ++ ++ ++int f2 (int a) ++{ ++ char *str = "hello, testsuite"; ++ ++ puts (str); /* Break here. */ ++ ++ return ++a; ++} ++ ++int f1 (int a, int b) ++{ ++ return f2(a) + b; ++} ++ ++static void ++init_bufs () ++{ ++ search_buf_size = BUF_SIZE; ++ search_buf = malloc (search_buf_size); ++ if (search_buf == NULL) ++ exit (1); ++ memset (search_buf, 'x', search_buf_size); ++} ++ ++int main (int argc, char *argv[]) ++{ ++ init_bufs (); ++ ++ return f1 (1, 2); ++} +diff --git a/gdb/testsuite/gdb.python/python-inferior.exp b/gdb/testsuite/gdb.python/python-inferior.exp +new file mode 100644 +index 0000000..ea413c6 +--- /dev/null ++++ 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 ++# 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 inferiors to Python. ++ ++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-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} ++ ++# The following tests require execution. ++ ++if ![runto_main] then { ++ fail "Can't run to main" ++ return 0 ++} ++ ++runto [gdb_get_line_number "Break here."] ++ ++# Test basic gdb.Inferior attributes and methods. ++ ++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]+} ++set history_prefix {[$][0-9]* = } ++set newline {[\r\n]+} ++set pattern_not_found "${newline}.]" ++set one_pattern_found "${newline}.${dec_number}L]" ++set two_patterns_found "${newline}.${dec_number}L, ${dec_number}L]" ++ ++# Test string pattern. ++ ++gdb_test "set *(int32_t*) &int8_search_buf\[10\] = 0x61616161" "" "" ++gdb_test "py search_buf = gdb.selected_frame ().read_var ('int8_search_buf')" "" "" ++gdb_test "py start_addr = search_buf.address" "" "" ++gdb_test "py length = search_buf.type.sizeof" "" "" ++ ++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.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.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.inferiors()\[0\].search_memory (start_addr, length, \[0x61, 0x61\], 1, 1)" \ ++ "${one_pattern_found}" "size = 1, max_count = 1" ++ ++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.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.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.inferiors()\[0\].search_memory (start_addr, length, \['a', 'a'\], max_count = 2)" \ ++ "${two_patterns_found}" "max_count = 2, with keyword" ++ ++# Test 16-bit pattern. ++ ++gdb_test "set int16_search_buf\[10\] = 0x1234" "" "" ++gdb_test "py search_buf = gdb.selected_frame ().read_var ('int16_search_buf')" "" "" ++gdb_test "py start_addr = search_buf.address" "" "" ++gdb_test "py length = search_buf.type.sizeof" "" "" ++gdb_test "py pattern = gdb.parse_and_eval ('(int16_t) 0x1234')" "" "" ++ ++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.inferiors()\[0\].search_memory (start_addr, length, pattern)" \ ++ "${one_pattern_found}" "find 16-bit pattern, with value pattern" ++ ++# Test 32-bit pattern. ++ ++gdb_test "set int32_search_buf\[10\] = 0x12345678" "" "" ++gdb_test "py search_buf = gdb.selected_frame ().read_var ('int32_search_buf')" "" "" ++gdb_test "py start_addr = search_buf.address" "" "" ++gdb_test "py length = search_buf.type.sizeof" "" "" ++gdb_test "py pattern = gdb.parse_and_eval ('(int32_t) 0x12345678')" "" "" ++ ++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.inferiors()\[0\].search_memory (start_addr, length, pattern)" \ ++ "${one_pattern_found}" "find 32-bit pattern, with value pattern" ++ ++# Test 64-bit pattern. ++ ++gdb_test "set int64_search_buf\[10\] = 0xfedcba9876543210LL" "" "" ++gdb_test "py search_buf = gdb.selected_frame ().read_var ('int64_search_buf')" "" "" ++gdb_test "py start_addr = search_buf.address" "" "" ++gdb_test "py length = search_buf.type.sizeof" "" "" ++gdb_test "py pattern = gdb.parse_and_eval ('(int64_t) 0xfedcba9876543210LL')" "" "" ++ ++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.inferiors()\[0\].search_memory (start_addr, length, pattern)" \ ++ "${one_pattern_found}" "find 64-bit pattern, with value pattern" ++ ++# Test mixed-sized patterns. ++ ++gdb_test "set *(int8_t*) &search_buf\[10\] = 0x62" "" "" ++gdb_test "set *(int16_t*) &search_buf\[11\] = 0x6363" "" "" ++gdb_test "set *(int32_t*) &search_buf\[13\] = 0x64646464" "" "" ++gdb_test "py search_buf = gdb.selected_frame ().read_var ('search_buf')" "" "" ++gdb_test "py start_addr = search_buf\[0\].address" "" "" ++gdb_test "py pattern1 = gdb.parse_and_eval ('(int8_t) 0x62')" "" "" ++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.inferiors()\[0\].search_memory (start_addr, 100, \[pattern1, pattern2, pattern3\])" \ ++ "${one_pattern_found}" "find mixed-sized pattern" + - #endif -diff --git a/gdb/value.c b/gdb/value.c -index 4d4329e..5c81d83 100644 ---- a/gdb/value.c -+++ b/gdb/value.c -@@ -36,6 +36,7 @@ - #include "block.h" - #include "dfp.h" - #include "objfiles.h" -+#include "cli/cli-decode.h" - #include "valprint.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; ++# Test search spanning a large range, in the particular case of native ++# targets, test the search spanning multiple chunks. ++# Remote targets may implement the search differently. + -+ /* The handler. */ -+ internal_function_fn handler; ++set CHUNK_SIZE 16000 ; + -+ /* User data for the handler. */ -+ void *cookie; -+}; ++gdb_test "set *(int32_t*) &search_buf\[0*${CHUNK_SIZE}+100\] = 0x12345678" "" "" ++gdb_test "set *(int32_t*) &search_buf\[1*${CHUNK_SIZE}+100\] = 0x12345678" "" "" ++gdb_test "py start_addr = gdb.selected_frame ().read_var ('search_buf')" "" "" ++gdb_test "py length = gdb.selected_frame ().read_var ('search_buf_size')" "" "" + -+static struct cmd_list_element *functionlist; ++gdb_test "py print gdb.inferiors()\[0\].search_memory (start_addr, length, 0x12345678, 4)" \ ++ "${two_patterns_found}" "search spanning large range" + - 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 */ ++# For native targets, test a pattern straddling a chunk boundary. + -+/* The type of internal functions. */ ++if [isnative] { ++ gdb_test "set *(int32_t*) &search_buf\[${CHUNK_SIZE}-1\] = 0xfdb97531" "" "" + -+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) - val->next = all_values; - all_values = val; - val->type = type; -+ type_incref (type); - val->enclosing_type = type; -+ type_incref (type); - VALUE_LVAL (val) = not_lval; -- VALUE_ADDRESS (val) = 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) - void - deprecated_set_value_type (struct value *value, struct type *type) - { -+ type_incref (type); -+ type_decref (value->type); - 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) ++ 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-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-infthread.c +@@ -0,0 +1,14 @@ ++int f2 (int a) +{ -+ if (value->lval == lval_internalvar -+ || value->lval == lval_internalvar_component) -+ return 0; -+ return value->location.address + value->offset; ++ return ++a; +} + -+CORE_ADDR -+value_raw_address (struct value *value) ++int f1 (int a, int b) +{ -+ if (value->lval == lval_internalvar -+ || value->lval == lval_internalvar_component) -+ return 0; -+ return value->location.address; ++ return f2(a) + b; +} + -+void -+set_value_address (struct value *value, CORE_ADDR addr) ++int main (int argc, char *argv[]) +{ -+ gdb_assert (value->lval != lval_internalvar -+ && value->lval != lval_internalvar_component); -+ value->location.address = addr; ++ return f1 (1, 2); +} +diff --git a/gdb/testsuite/gdb.python/python-infthread.exp b/gdb/testsuite/gdb.python/python-infthread.exp +new file mode 100644 +index 0000000..d444554 +--- /dev/null ++++ b/gdb/testsuite/gdb.python/python-infthread.exp +@@ -0,0 +1,58 @@ ++# Copyright (C) 2009 Free Software Foundation, Inc. + - struct internalvar ** - deprecated_value_internalvar_hack (struct value *value) - { -@@ -547,11 +595,16 @@ value_mark (void) - return all_values; - } ++# 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 inferior threads to Python. ++ ++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-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 { ++ fail "Can't run to main" ++ return 0 ++} ++ ++runto [gdb_get_line_number "Break here."] ++ ++# Test basic gdb.Inferior attributes and methods. ++ ++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 +index 3258810..e7bfe54 100644 +--- a/gdb/testsuite/gdb.python/python-mi.exp ++++ b/gdb/testsuite/gdb.python/python-mi.exp +@@ -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" -+/* Deallocate a value and run destructors if needed. */ +-mi_create_floating_varobj container c "create container varobj" ++mi_create_floating_varobj container c \ ++ "create container varobj, no pretty-printing" + - void - value_free (struct value *val) - { - if (val) - { -+ type_decref (val->type); -+ type_decref (val->enclosing_type); ++mi_list_varobj_children container { ++ { container.name name 1 string } ++ { container.len len 0 int } ++ { container.elements elements 1 "int ." } ++} "examine container children=0, no pretty-printing" + - if (VALUE_LVAL (val) == lval_computed) - { - struct lval_funcs *funcs = val->location.computed.funcs; -@@ -655,6 +708,8 @@ 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) - VALUE_LVAL (component) = VALUE_LVAL (whole); ++mi_delete_varobj container "delete varobj" ++ ++mi_gdb_test "-enable-pretty-printing" "" ++ ++mi_create_floating_varobj container c \ ++ "create container varobj" - component->location = whole->location; + 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" + - 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) - if (funcs->copy_closure) - component->location.computed.closure = funcs->copy_closure (whole); - } ++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" +diff --git a/gdb/testsuite/gdb.python/python-prettyprint.c b/gdb/testsuite/gdb.python/python-prettyprint.c +index 3cafc48..5cc35be 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 + -+ object_address_get_data (value_type (whole), &VALUE_ADDRESS (component)); + struct s + { + int a; +@@ -148,6 +150,11 @@ void do_nothing(void) + c = 23; /* Another MI breakpoint */ } - -@@ -830,6 +888,25 @@ show_values (char *num_exp, int from_tty) - num_exp[1] = '\0'; - } ++struct nullstr ++{ ++ char *s; ++}; ++ + 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 +index 01d4a06..b2dc85d 100644 +--- a/gdb/testsuite/gdb.python/python-prettyprint.exp ++++ b/gdb/testsuite/gdb.python/python-prettyprint.exp +@@ -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.*" + -+/* Sanity check for memory leaks and proper types reference counting. */ + 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 bf009a1..c3e0dc4 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 + -+static void -+value_history_cleanup (void *unused) -+{ -+ while (value_history_chain) -+ { -+ struct value_history_chunk *chunk = value_history_chain; -+ int i; ++ def to_string(self): ++ return self.val['s'].string(gdb.parameter('target-charset')) + -+ for (i = 0; i < ARRAY_SIZE (chunk->values); i++) -+ value_free (chunk->values[i]); + 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 + -+ value_history_chain = chunk->next; -+ xfree (chunk); -+ } -+ value_history_count = 0; -+} - - /* 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. */ ++ 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 +index 1ace5d6..b80f56e 100644 +--- a/gdb/testsuite/gdb.python/python-template.exp ++++ b/gdb/testsuite/gdb.python/python-template.exp +@@ -20,6 +20,17 @@ if $tracelevel then { + strace $tracelevel + } - struct internalvar * --lookup_only_internalvar (char *name) -+lookup_only_internalvar (const char *name) - { - struct internalvar *var; ++# 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-template" + set srcfile ${testfile}.cc + set binfile ${objdir}/${subdir}/${testfile} +@@ -29,20 +40,6 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ + return -1 + } -@@ -894,7 +971,7 @@ lookup_only_internalvar (char *name) - NAME should not normally include a dollar sign. */ +-# 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 19cabeb..ccf438f 100644 +--- a/gdb/testsuite/gdb.python/python-value.exp ++++ b/gdb/testsuite/gdb.python/python-value.exp +@@ -20,43 +20,6 @@ if $tracelevel then { + strace $tracelevel + } - 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; +-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 -@@ -1031,6 +1109,9 @@ set_internalvar (struct internalvar *var, struct value *val) - { - struct value *newval; +@@ -292,21 +255,37 @@ proc test_value_after_death {} { + "print value's type" + } -+ if (var->canonical) -+ error (_("Cannot overwrite convenience function %s"), var->name); ++# 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" ++} + - newval = value_copy (val); - newval->modifiable = 1; + # Start with a fresh gdb. -@@ -1042,7 +1123,7 @@ set_internalvar (struct internalvar *var, struct value *val) + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir +-gdb_load ${binfile} - /* 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; +-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 } -+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; -+} -+ -+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) -+{ -+ /* Do nothing. */ -+} ++set testfile "python-value" ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${testfile} + -+/* 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); ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile ${srcfile}" ++ return -1 +} + -+/* 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; -+} ++gdb_load ${binfile} + - /* Update VALUE before discarding OBJFILE. COPIED_TYPES is used to - prevent cycles / duplicates. */ + test_value_creation + test_value_numeric_ops + test_value_boolean +@@ -322,3 +301,4 @@ if ![runto_main] then { -@@ -1067,12 +1218,21 @@ preserve_one_value (struct value *value, struct objfile *objfile, - htab_t copied_types) - { - if (TYPE_OBJFILE (value->type) == objfile) -- value->type = copy_type_recursive (objfile, value->type, copied_types); -+ { -+ /* No need to decref the old type here, since we know it has no -+ reference count. */ -+ value->type = copy_type_recursive (value->type, copied_types); -+ type_incref (value->type); -+ } + test_value_in_inferior + 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 - if (TYPE_OBJFILE (value->enclosing_type) == objfile) -- value->enclosing_type = copy_type_recursive (objfile, -- value->enclosing_type, -- copied_types); -+ { -+ /* No need to decref the old type here, since we know it has no -+ reference count. */ -+ value->enclosing_type = copy_type_recursive (value->enclosing_type, -+ copied_types); -+ type_incref (value->enclosing_type); -+ } +-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 } - /* Update the internal variables and value history when OBJFILE is -@@ -1196,7 +1356,7 @@ value_as_address (struct value *val) - - 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); - - val = coerce_array (val); - -@@ -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; - } -@@ -1465,6 +1625,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)); + 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 ++++ b/gdb/testsuite/lib/cp-support.exp +@@ -222,7 +222,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { -+ type_incref (new_encl_type); -+ type_decref (val->enclosing_type); - val->enclosing_type = new_encl_type; - return val; - } -@@ -1516,6 +1678,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))); + set parse_okay 0 + gdb_test_multiple "$in_command" "$in_testname // parse failed" { +- -re "type = (struct|class)${wsopt}(\[A-Za-z0-9_\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" { ++ -re "type = (struct|class)${wsopt}(\[A-Za-z0-9_:\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" { + set parse_okay 1 + set actual_key $expect_out(1,string) + set actual_tag $expect_out(2,string) +@@ -231,6 +231,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { + set actual_tail $expect_out(6,string) } -+ type_incref (type); -+ type_decref (v->type); - 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 { ! $parse_okay } then { return } - if (arg1p) -@@ -1750,6 +1914,41 @@ pack_long (gdb_byte *buf, struct type *type, LONGEST num) + # 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 0c93a73..d0c3493 100644 +--- a/gdb/testsuite/lib/gdb.exp ++++ b/gdb/testsuite/lib/gdb.exp +@@ -27,6 +27,7 @@ if {$tool == ""} { } + load_lib libgloss.exp ++load_lib python-support.exp -+/* Pack NUM into BUF using a target format of TYPE. */ -+ -+void -+pack_unsigned_long (gdb_byte *buf, struct type *type, ULONGEST num) -+{ -+ int len; -+ -+ type = check_typedef (type); -+ len = TYPE_LENGTH (type); -+ -+ switch (TYPE_CODE (type)) -+ { -+ case TYPE_CODE_INT: -+ case TYPE_CODE_CHAR: -+ case TYPE_CODE_ENUM: -+ case TYPE_CODE_FLAGS: -+ case TYPE_CODE_BOOL: -+ case TYPE_CODE_RANGE: -+ case TYPE_CODE_MEMBERPTR: -+ store_unsigned_integer (buf, len, num); -+ break; -+ -+ case TYPE_CODE_REF: -+ case TYPE_CODE_PTR: -+ store_typed_address (buf, type, (CORE_ADDR) num); -+ break; -+ -+ default: -+ error (_("\ -+Unexpected type (%d) encountered for unsigned integer constant."), -+ TYPE_CODE (type)); -+ } -+} -+ -+ - /* Convert C numbers into newly allocated values. */ + global GDB - struct value * -@@ -1763,6 +1962,19 @@ value_from_longest (struct type *type, LONGEST num) +diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp +index 9b4c464..33f277a 100644 +--- a/gdb/testsuite/lib/mi-support.exp ++++ b/gdb/testsuite/lib/mi-support.exp +@@ -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 +@@ -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 \ ++ 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 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] +@@ -1351,9 +1350,18 @@ proc mi_list_varobj_children_range {varname numchildren children testname} { + set expected "\\^done,numchild=\"0\"" + } -+/* Convert C unsigned numbers into newly allocated values. */ ++ if {"$to" == ""} { ++ append expected ",has_more=\"0\"" ++ } elseif {$to >= 0 && $numchildren > $to} { ++ append expected ",has_more=\"1\"" ++ } else { ++ append expected ",has_more=\"0\"" ++ } + -+struct value * -+value_from_ulongest (struct type *type, ULONGEST num) -+{ -+ struct value *val = allocate_value (type); + verbose -log "Expecting: $expected" + +- 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 + -+ pack_unsigned_long (value_contents_raw (val), type, num); ++# Return 1 if Python scripting is supported in GDB, 0 if not. ++proc python_supported { } { ++ global gdb_prompt ++ global python_supported_saved + -+ return val; -+} ++ if [info exists python_supported_saved] { ++ verbose "python_supported: returning saved $python_supported_saved" 2 ++ return $python_supported_saved ++ } + ++ 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] ++ } ++ } + - /* 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.")); ++ return [set python_supported_saved 0] ++} + -+ add_prefix_cmd ("function", no_class, function_command, _("\ -+Placeholder command for showing help on convenience functions."), -+ &functionlist, "function ", 0, &cmdlist); ++# 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 + -+ 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) = ""; ++ gdb_test_multiple $cmd $name { ++ -re "Traceback.*$gdb_prompt $" { fail $name } ++ -re "$gdb_prompt $" { if $report_pass { pass $name } } ++ } ++} + -+ make_final_cleanup (value_history_cleanup, NULL); - } -diff --git a/gdb/value.h b/gdb/value.h -index aa43365..1ad3c75 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, - extern void pack_long (gdb_byte *buf, struct type *type, LONGEST num); - - extern struct value *value_from_longest (struct type *type, LONGEST num); -+extern struct value *value_from_ulongest (struct type *type, ULONGEST num); - extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr); - 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, -+ CORE_ADDR *address_return); ++# 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 + - 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, ++ 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 a7ac3c8..815c82d 100644 +--- a/gdb/thread.c ++++ b/gdb/thread.c +@@ -61,7 +61,6 @@ static int thread_alive (struct thread_info *); + static void info_threads_command (char *, int); + static void thread_apply_command (char *, int); + static void restore_current_thread (ptid_t); +-static void prune_threads (void); - extern struct value *value_aggregate_elt (struct type *curtype, - char *name, -+ struct type *expect_type, - int want_address, - enum noside noside); + /* Frontend view of the thread state. Possible extensions: stepping, + finishing, until(ling),... */ +@@ -497,16 +496,23 @@ thread_alive (struct thread_info *tp) + return 1; + } -@@ -533,14 +555,14 @@ extern void set_internalvar_component (struct internalvar *var, - int bitpos, int bitsize, - struct value *newvalue); +-static void ++void + prune_threads (void) + { +- struct thread_info *tp, *next; ++ struct thread_info *tp; ++ struct thread_info **prevp = &thread_list; --extern struct internalvar *lookup_only_internalvar (char *name); -+extern struct internalvar *lookup_only_internalvar (const char *name); +- for (tp = thread_list; tp; tp = next) ++ for (tp = *prevp; tp; tp = *prevp) + { +- next = tp->next; ++ /* If the thread has died, free it and unlink it from the list. ++ Otherwise, advance to the next thread. */ + if (!thread_alive (tp)) +- delete_thread (tp->ptid); ++ { ++ *prevp = tp->next; ++ free_thread (tp); ++ } ++ else ++ prevp = &tp->next; + } + } --extern struct internalvar *create_internalvar (char *name); -+extern struct internalvar *create_internalvar (const char *name); +diff --git a/gdb/top.c b/gdb/top.c +index de49418..237e575 100644 +--- a/gdb/top.c ++++ b/gdb/top.c +@@ -378,6 +378,7 @@ execute_command (char *p, int from_tty) + } + + free_all_values (); ++ free_all_types (); - extern struct internalvar * - create_internalvar_type_lazy (char *name, internalvar_make_value fun); + /* Force cleanup of any alloca areas if using C alloca instead of + a builtin alloca. */ +diff --git a/gdb/typeprint.c b/gdb/typeprint.c +index 8133ad0..0af62e1 100644 +--- a/gdb/typeprint.c ++++ b/gdb/typeprint.c +@@ -35,6 +35,8 @@ + #include "gdb_string.h" + #include "exceptions.h" + #include "valprint.h" ++#include "dwarf2loc.h" ++ + #include --extern struct internalvar *lookup_internalvar (char *name); -+extern struct internalvar *lookup_internalvar (const char *name); + extern void _initialize_typeprint (void); +@@ -76,6 +78,9 @@ void + type_print (struct type *type, char *varstring, struct ui_file *stream, + int show) + { ++ if (show >= 0) ++ type = check_typedef (type); ++ + LA_PRINT_TYPE (type, varstring, stream, show, 0); + } - extern int value_equal (struct value *arg1, struct value *arg2); +@@ -115,7 +120,8 @@ whatis_exp (char *exp, int show) + { + struct expression *expr; + struct value *val; +- struct cleanup *old_chain = NULL; ++ /* Required at least for the object_address_set call. */ ++ struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); + struct type *real_type = NULL; + struct type *type; + int full = 0; +@@ -126,12 +132,13 @@ whatis_exp (char *exp, int show) + if (exp) + { + expr = parse_expression (exp); +- old_chain = make_cleanup (free_current_contents, &expr); ++ make_cleanup (free_current_contents, &expr); + val = evaluate_type (expr); + } + else + val = access_value_history (0); -@@ -619,7 +641,7 @@ extern int common_val_print (struct value *val, - const struct value_print_options *options, - const struct language_defn *language); ++ object_address_set (value_raw_address (val)); + type = value_type (val); --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); + get_user_print_options (&opts); +@@ -168,8 +175,7 @@ whatis_exp (char *exp, int show) + type_print (type, "", gdb_stdout, show); + printf_filtered ("\n"); -@@ -658,5 +680,22 @@ extern struct value *value_allocate_space_in_inferior (int); +- if (exp) +- do_cleanups (old_chain); ++ do_cleanups (old_chain); + } - extern struct value *value_of_local (const char *name, int complain); + static void +diff --git a/gdb/typeprint.h b/gdb/typeprint.h +index f561310..d261c79 100644 +--- a/gdb/typeprint.h ++++ b/gdb/typeprint.h +@@ -20,10 +20,13 @@ + #ifndef TYPEPRINT_H + #define TYPEPRINT_H --extern struct value * value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound); -+extern struct value *value_subscripted_rvalue (struct value *array, -+ 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) */ -diff --git a/gdb/varobj.c b/gdb/varobj.c -index 2ec6d90..1237c96 100644 ---- a/gdb/varobj.c -+++ b/gdb/varobj.c -@@ -29,11 +29,20 @@ ++enum language; + struct ui_file; - #include "gdb_assert.h" - #include "gdb_string.h" -+#include "gdb_regex.h" + void print_type_scalar (struct type * type, LONGEST, struct ui_file *); - #include "varobj.h" - #include "vec.h" - #include "gdbthread.h" - #include "inferior.h" -+#include "valprint.h" + void c_type_print_varspec_suffix (struct type *, struct ui_file *, int, + int, int); + -+#if HAVE_PYTHON -+#include "python/python.h" -+#include "python/python-internal.h" -+#else -+typedef int PyObject; -+#endif ++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 +--- a/gdb/ui-file.c ++++ b/gdb/ui-file.c +@@ -22,6 +22,7 @@ - /* Non-zero if we want to see trace of varobj level stuff. */ + #include "defs.h" + #include "ui-file.h" ++#include "gdb_obstack.h" + #include "gdb_string.h" -@@ -138,6 +147,12 @@ struct varobj - /* Children of this object. */ - VEC (varobj_p) *children; + #include +@@ -263,7 +264,7 @@ set_ui_file_data (struct ui_file *file, void *data, + } -+ /* 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; -+ - /* Description of the root variable. Points to root variable for children. */ - struct varobj_root *root; + /* ui_file utility function for converting a ``struct ui_file'' into +- a memory buffer''. */ ++ a memory buffer. */ -@@ -159,6 +174,16 @@ struct varobj - not fetched if either the variable is frozen, or any parents is - 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; + struct accumulated_ui_file + { +@@ -297,6 +298,23 @@ ui_file_xstrdup (struct ui_file *file, + *length = acc.length; + return acc.buffer; + } + -+ /* 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); ++static void ++do_ui_file_obsavestring (void *context, const char *buffer, long length) ++{ ++ struct obstack *obstack = (struct obstack *) context; ++ obstack_grow (obstack, buffer, length); ++} + - /* Utility routines */ ++char * ++ui_file_obsavestring (struct ui_file *file, struct obstack *obstack, ++ long *length) ++{ ++ ui_file_put (file, do_ui_file_obsavestring, obstack); ++ *length = obstack_object_size (obstack); ++ obstack_1grow (obstack, '\0'); ++ return obstack_finish (obstack); ++} + + /* A pure memory based ``struct ui_file'' that can be used an output + buffer. The buffers accumulated contents are available via +diff --git a/gdb/ui-file.h b/gdb/ui-file.h +index 1562d5a..d86a7eb 100644 +--- a/gdb/ui-file.h ++++ b/gdb/ui-file.h +@@ -19,6 +19,7 @@ + #ifndef UI_FILE_H + #define UI_FILE_H - static struct varobj *new_variable (void); -@@ -200,6 +229,8 @@ static void free_variable (struct varobj *var); ++struct obstack; + struct ui_file; - static struct cleanup *make_cleanup_free_variable (struct varobj *var); + /* Create a generic ui_file object with null methods. */ +@@ -77,7 +78,10 @@ extern void ui_file_put (struct ui_file *src, ui_file_put_method_ftype *write, v + appended NUL. */ + extern char *ui_file_xstrdup (struct ui_file *file, long *length); -+static struct cleanup *make_cleanup_uninstall_variable (struct varobj *var); -+ - static struct type *get_type (struct varobj *var); +- ++/* Similar to ui_file_xstrdup, but return a new string allocated on ++ OBSTACK. */ ++extern char *ui_file_obsavestring (struct ui_file *file, ++ struct obstack *obstack, long *length); - static struct type *get_value_type (struct varobj *var); -@@ -215,6 +246,8 @@ static char *cppop (struct cpstack **pstack); - static int install_new_value (struct varobj *var, struct value *value, - int initial); + extern long ui_file_read (struct ui_file *file, char *buf, long length_buf); -+static void install_default_visualizer (struct varobj *var); +diff --git a/gdb/utils.c b/gdb/utils.c +index eb75f2e..1e246b8 100644 +--- a/gdb/utils.c ++++ b/gdb/utils.c +@@ -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). + - /* Language-specific routines. */ ++ As an extra-special hack, we do the same with ' ', so that ++ "FOO(ARGS) const" can match "FOO", too. */ - 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); + int + strcmp_iw (const char *string1, const char *string2) +@@ -2630,7 +2633,7 @@ strcmp_iw (const char *string1, const char *string2) + string2++; + } + } +- return (*string1 != '\0' && *string1 != '(') || (*string2 != '\0'); ++ return (*string1 != ' ' && *string1 != '\0' && *string1 != '(') || (*string2 != '\0' && *string2 != '('); + } --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); + /* This is like strcmp except that it ignores whitespace and treats +diff --git a/gdb/valarith.c b/gdb/valarith.c +index a9c875d..12f6f07 100644 +--- a/gdb/valarith.c ++++ b/gdb/valarith.c +@@ -139,7 +139,6 @@ an integer nor a pointer of the same type.")); + struct value * + value_subscript (struct value *array, LONGEST index) + { +- struct value *bound; + int c_style = current_language->c_style_arrays; + struct type *tarray; - static int varobj_value_is_changeable_p (struct varobj *var); +@@ -154,12 +153,26 @@ value_subscript (struct value *array, LONGEST index) + get_discrete_bounds (range_type, &lowerbound, &upperbound); - static int is_root_p (struct varobj *var); + if (VALUE_LVAL (array) != lval_memory) +- return value_subscripted_rvalue (array, index, lowerbound); ++ { ++ if (index >= lowerbound && index <= upperbound) ++ { ++ CORE_ADDR element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (tarray)); ++ CORE_ADDR offset = (index - lowerbound) * element_size; ++ ++ return value_subscripted_rvalue (array, offset); ++ } ++ error (_("array or string index out of range")); ++ } -+static struct varobj * -+varobj_add_child (struct varobj *var, const char *name, struct value *value); + if (c_style == 0) + { + if (index >= lowerbound && index <= upperbound) +- return value_subscripted_rvalue (array, index, lowerbound); ++ { ++ CORE_ADDR element_size = TYPE_LENGTH (TYPE_TARGET_TYPE (tarray)); ++ CORE_ADDR offset = (index - lowerbound) * element_size; + - /* C implementation */ ++ return value_subscripted_rvalue (array, offset); ++ } + /* Emit warning unless we have an array of unknown size. + An array of unknown size has lowerbound 0 and upperbound -1. */ + if (upperbound > -1) +@@ -178,33 +191,37 @@ value_subscript (struct value *array, LONGEST index) + error (_("not an array or string")); + } - static int c_number_of_children (struct varobj *var); -@@ -570,8 +607,10 @@ varobj_create (char *objname, - do_cleanups (old_chain); - return NULL; - } -+ make_cleanup_uninstall_variable (var); - } +-/* Return the value of EXPR[IDX], expr an aggregate rvalue +- (eg, a vector register). This routine used to promote floats +- to doubles, but no longer does. */ ++/* Return the value of *((void *) ARRAY + ELEMENT), ARRAY an aggregate rvalue ++ (eg, a vector register). This routine used to promote floats to doubles, ++ but no longer does. OFFSET is zero-based with 0 for the lowermost existing ++ element, it must be expressed in bytes (therefore multiplied by ++ check_typedef (TYPE_TARGET_TYPE (array_type)). */ -+ 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; - } + struct value * +-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); +- unsigned int elt_offs = elt_size * longest_to_int (index - lowerbound); + struct value *v; + +- if (index < lowerbound || elt_offs >= TYPE_LENGTH (array_type)) +- error (_("no such vector element")); ++ /* Do not check TYPE_LENGTH (array_type) as we may have been given the ++ innermost dimension of a multi-dimensional Fortran array where its length ++ is shorter than the possibly accessed element offset. */ -+/* 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) + v = allocate_value (elt_type); + if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) + set_value_lazy (v, 1); + else +- memcpy (value_contents_writeable (v), +- value_contents (array) + elt_offs, elt_size); + { -+ value = value_copy (value); ++ unsigned int elt_size = TYPE_LENGTH (elt_type); ++ memcpy (value_contents_writeable (v), ++ value_contents (array) + offset, elt_size); + } -+ 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); - } - - return var->format; -@@ -714,6 +781,21 @@ varobj_get_display_format (struct varobj *var) - return var->format; + set_value_component_location (v, array); + VALUE_REGNUM (v) = VALUE_REGNUM (array); + VALUE_FRAME_ID (v) = VALUE_FRAME_ID (array); +- set_value_offset (v, value_offset (array) + elt_offs); ++ set_value_offset (v, value_offset (array) + offset); + return v; } -+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; +diff --git a/gdb/valops.c b/gdb/valops.c +index 5e5c4ed..59c9018 100644 +--- a/gdb/valops.c ++++ b/gdb/valops.c +@@ -38,6 +38,7 @@ + #include "cp-support.h" + #include "dfp.h" + #include "user-regs.h" ++#include "dwarf2loc.h" + + #include + #include "gdb_string.h" +@@ -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")); +- /* FIXME-type-allocation: need a way to free this type when +- we are done with it. */ + range_type = create_range_type ((struct type *) NULL, + TYPE_TARGET_TYPE (range_type), + low_bound, +@@ -565,6 +564,64 @@ value_one (struct type *type, enum lval_type lv) + return val; } -+static int -+update_dynamic_varobj_children (struct varobj *var, -+ VEC (varobj_p) **changed, -+ VEC (varobj_p) **new_and_unchanged, -+ int *cchanged) ++/* object_address_set must be already called before this function. */ + ++const char * ++object_address_data_not_valid (struct type *type) +{ -+#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; ++ /* Attributes are present only at the target type of a typedef. Make the ++ call conditional as it would otherwise loop through type_length_get. */ ++ if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) ++ CHECK_TYPEDEF (type); + -+ state = PyGILState_Ensure (); -+ back_to = make_cleanup_py_restore_gil (&state); ++ /* DW_AT_associated has a preference over DW_AT_allocated. */ ++ if (TYPE_NOT_ASSOCIATED (type) ++ || (TYPE_ASSOCIATED (type) != NULL ++ && 0 == dwarf_locexpr_baton_eval (TYPE_ASSOCIATED (type)))) ++ return N_("object is not associated"); + -+ *cchanged = 0; -+ if (!PyObject_HasAttr (printer, gdbpy_children_cst)) -+ { -+ do_cleanups (back_to); -+ return 0; -+ } ++ if (TYPE_NOT_ALLOCATED (type) ++ || (TYPE_ALLOCATED (type) != NULL ++ && 0 == dwarf_locexpr_baton_eval (TYPE_ALLOCATED (type)))) ++ return N_("object is not allocated"); + -+ children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, -+ NULL); ++ return NULL; ++} + -+ if (!children) -+ { -+ gdbpy_print_stack (); -+ error ("Null value returned for children"); -+ } ++/* 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 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. */ + -+ make_cleanup_py_decref (children); ++int ++object_address_get_data (struct type *type, CORE_ADDR *address_return) ++{ ++ gdb_assert (address_return != NULL); + -+ if (!PyIter_Check (children)) -+ error ("Returned value is not iterable"); ++ object_address_set (*address_return); + -+ iterator = PyObject_GetIter (children); -+ if (!iterator) -+ { -+ gdbpy_print_stack (); -+ error ("Could not get children iterator"); -+ } -+ make_cleanup_py_decref (iterator); ++ /* TYPE_DATA_LOCATION_DWARF_BLOCK / TYPE_DATA_LOCATION_ADDR are present only ++ at the target type of a typedef. */ ++ CHECK_TYPEDEF (type); + -+ for (i = 0; ; ++i) ++ if (object_address_data_not_valid (type) != NULL) + { -+ 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); ++ /* Do not try to evaluate DW_AT_data_location as it may even crash ++ (it would just return the value zero in the gfortran case). */ ++ return 0; + } + -+ 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); ++ if (TYPE_DATA_LOCATION_IS_ADDR (type)) ++ *address_return = TYPE_DATA_LOCATION_ADDR (type); ++ else if (TYPE_DATA_LOCATION_DWARF_BLOCK (type) != NULL) ++ *address_return ++ = dwarf_locexpr_baton_eval (TYPE_DATA_LOCATION_DWARF_BLOCK (type)); + -+ *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; + /* Return a value with type TYPE located at ADDR. - if (var->num_children == -1) - var->num_children = number_of_children (var); -@@ -790,12 +1010,24 @@ 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); - } + Call value_at only if the data needs to be fetched immediately; +@@ -652,11 +709,19 @@ value_fetch_lazy (struct value *val) } - - return var->children; - } - -+static struct varobj * -+varobj_add_child (struct varobj *var, const char *name, struct value *value) -+{ -+ 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; -+} + else if (VALUE_LVAL (val) == lval_memory) + { +- CORE_ADDR addr = value_address (val); +- int length = TYPE_LENGTH (check_typedef (value_enclosing_type (val))); ++ CORE_ADDR addr = value_raw_address (val); + - /* Obtain the type of an object Variable as a string similar to the one gdb - prints on the console */ ++ if (object_address_get_data (value_type (val), &addr)) ++ { ++ struct type *type = value_enclosing_type (val); ++ int length = TYPE_LENGTH (check_typedef (type)); -@@ -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); +- if (length) +- read_memory (addr, value_contents_all_raw (val), length); ++ if (length) ++ { ++ addr += value_offset (val); ++ read_memory (addr, value_contents_all_raw (val), length); ++ } ++ } + } + else if (VALUE_LVAL (val) == lval_register) + { +@@ -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; + -+ /* 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; ++ 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); ++ } + - 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) - } ++ addr = value_address (val); + return value_from_pointer (lookup_pointer_type (type), addr); } -+ - /* 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); +@@ -1167,6 +1243,7 @@ struct value * + value_coerce_array (struct value *arg1) + { + struct type *type = check_typedef (value_type (arg1)); ++ CORE_ADDR address; - /* 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; - } + /* 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 +@@ -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.")); -+/* 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 -+ will be set to the full range of CHILDREN. Otherwise, *FROM and -+ *TO will be set to the selected sub-range of VAR, clipped to be in -+ range of CHILDREN. */ -+void -+varobj_get_child_range (struct varobj *var, VEC (varobj_p) *children, -+ int *from, int *to) -+{ -+ if (var->from < 0 || var->to < 0) -+ { -+ *from = 0; -+ *to = VEC_length (varobj_p, children); -+ } -+ else -+ { -+ *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); -+ } -+} -+ -+/* Set the selected sub-range of children of VAR to start at index -+ FROM and end at index TO. If either FROM or TO is less than zero, -+ this is interpreted as a request for all children. */ -+void -+varobj_set_child_range (struct varobj *var, int from, int to) -+{ -+ var->from = from; -+ var->to = to; -+} -+ -+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); ++ address = value_raw_address (arg1); ++ if (!object_address_get_data (type, &address)) ++ error (_("Attempt to take address of non-valid value.")); + -+ /* 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 -+} + return value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)), +- value_address (arg1)); ++ address + value_offset (arg1)); + } + + /* Given a value which is a function, return a value which is a pointer +@@ -2060,12 +2141,25 @@ find_overload_match (struct type **arg_types, int nargs, + if (method) + { + gdb_assert (obj); + -+static void -+install_default_visualizer (struct varobj *var) -+{ -+#if HAVE_PYTHON -+ struct cleanup *cleanup; -+ PyGILState_STATE state; -+ PyObject *pretty_printer = NULL; ++ /* OBJ may be a pointer value rather than the object itself. */ ++ obj = coerce_ref (obj); ++ while (TYPE_CODE (check_typedef (value_type (obj))) == TYPE_CODE_PTR) ++ obj = coerce_ref (value_ind (obj)); + obj_type_name = TYPE_NAME (value_type (obj)); +- /* Hack: evaluate_subexp_standard often passes in a pointer +- value rather than the object itself, so try again. */ +- if ((!obj_type_name || !*obj_type_name) +- && (TYPE_CODE (value_type (obj)) == TYPE_CODE_PTR)) +- obj_type_name = TYPE_NAME (TYPE_TARGET_TYPE (value_type (obj))); + -+ state = PyGILState_Ensure (); -+ cleanup = make_cleanup_py_restore_gil (&state); ++ /* First check whether this is a data member, e.g. a pointer to ++ a function. */ ++ if (TYPE_CODE (check_typedef (value_type (obj))) == TYPE_CODE_STRUCT) ++ { ++ *valp = search_struct_field (name, obj, 0, ++ check_typedef (value_type (obj)), 0); ++ if (*valp) ++ { ++ *staticp = 1; ++ return 0; ++ } ++ } + + fns_ptr = value_find_oload_method_list (&temp, name, + 0, &num_fns, +@@ -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 (var->value) -+ { -+ pretty_printer = gdbpy_get_varobj_pretty_printer (var->value); -+ if (! pretty_printer) ++ /* 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). */ ++ if (qualified_name ++ && TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym))) == TYPE_CODE_FUNC) + { -+ gdbpy_print_stack (); -+ error (_("Cannot instantiate printer for default visualizer")); ++ 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. */ ++ if (func_name && strcmp (func_name, qualified_name) == 0) ++ { ++ xfree (func_name); ++ func_name = NULL; ++ } + } -+ } -+ -+ 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 -+} + +- /* If there was no C++ name, this must be a C-style function. +- Just return the same symbol. Do the same if cp_func_name +- fails for some reason. */ ++ /* If there was no C++ name, this must be a C-style function or ++ not a function at all. Just return the same symbol. Do the ++ same if cp_func_name fails for some reason. */ + if (func_name == NULL) + { + *symp = fsym; +@@ -2525,8 +2632,8 @@ check_field (struct type *type, const char *name) + the comment before value_struct_elt_for_reference. */ + + struct value * +-value_aggregate_elt (struct type *curtype, +- char *name, int want_address, ++value_aggregate_elt (struct type *curtype, char *name, ++ struct type *expect_type, int want_address, + enum noside noside) + { + switch (TYPE_CODE (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, +- name, NULL, ++ name, expect_type, + want_address, noside); + case TYPE_CODE_NAMESPACE: + return value_namespace_elt (curtype, name, +@@ -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. + -+void -+varobj_set_visualizer (struct varobj *var, const char *visualizer) ++ 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) +{ -+#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); ++ int start = 0; + -+ mainmod = PyImport_AddModule ("__main__"); -+ globals = PyModule_GetDict (mainmod); -+ Py_INCREF (globals); -+ make_cleanup_py_decref (globals); ++ if (TYPE_FIELD_ARTIFICIAL (t1, 0)) ++ ++start; + -+ constructor = PyRun_String (visualizer, Py_eval_input, globals, globals); -+ -+ /* Do not instantiate NoneType. */ -+ if (constructor == Py_None) ++ /* If skipping artificial fields, find the first real field ++ in T1. */ ++ if (skip_artificial) + { -+ pretty_printer = Py_None; -+ Py_INCREF (pretty_printer); ++ while (start < TYPE_NFIELDS (t1) ++ && TYPE_FIELD_ARTIFICIAL (t1, start)) ++ ++start; + } -+ else -+ pretty_printer = instantiate_pretty_printer (constructor, var->value); + -+ Py_XDECREF (constructor); ++ /* Now compare parameters */ + -+ if (! pretty_printer) -+ { -+ gdbpy_print_stack (); -+ error ("Could not evaluate visualizer expression: %s", visualizer); -+ } ++ /* 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 (pretty_printer == Py_None) ++ if ((TYPE_NFIELDS (t1) - start) == TYPE_NFIELDS (t2)) + { -+ Py_DECREF (pretty_printer); -+ pretty_printer = NULL; -+ } ++ 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; ++ } + -+ install_visualizer (var, pretty_printer); ++ return 1; ++ } + -+ do_cleanups (back_to); -+#else -+ error ("Python support required"); -+#endif ++ return 0; +} + - /* 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; + /* 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); - 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); + check_stub_method_group (t, i); - /* 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) +- if (intype == 0 && j > 1) +- error (_("non-unique member `%s' requires type instantiation"), name); + if (intype) + { +- while (j--) +- if (TYPE_FN_FIELD_TYPE (f, j) == intype) +- break; +- if (j < 0) +- error (_("no member function matches that type instantiation")); +- } ++ for (j = 0; j < len; ++j) + { -+ varobj_update_result r = {tmp}; -+ r.changed = 1; -+ r.value_installed = 1; -+ VEC_safe_push (varobj_update_result, stack, &r); ++ if (compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype, 0) ++ || compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype, 1)) ++ break; + } -+ for (i = 0; -+ VEC_iterate (varobj_p, new_and_unchanged, i, tmp); -+ ++i) ++ ++ 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) + { -+ varobj_update_result r = {tmp}; -+ r.value_installed = 1; -+ VEC_safe_push (varobj_update_result, stack, &r); ++ if (TYPE_FN_FIELD_ARTIFICIAL (f, ii)) ++ --len; + } -+ if (r.changed || r.children_changed) -+ VEC_safe_push (varobj_update_result, result, &r); -+ continue; ++ ++ /* 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; + } -+ } - /* 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 */)) + if (TYPE_FN_FIELD_STATIC_P (f, j)) { -- /* 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); - } - } +@@ -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, + get_selected_block (0), +- VAR_DOMAIN); ++ VAR_DOMAIN, 0); + + 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")); + +- /* FIXME-type-allocation: need a way to free this type when we are +- done with it. */ + slice_range_type = create_range_type ((struct type *) NULL, + TYPE_TARGET_TYPE (range_type), + lowbound, +diff --git a/gdb/valprint.c b/gdb/valprint.c +index cbb5d94..cf35bf0 100644 +--- a/gdb/valprint.c ++++ b/gdb/valprint.c +@@ -1153,6 +1153,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, + + for (; i < len && things_printed < options->print_max; i++) + { ++ size_t elt_offset = i * eltlen; + if (i != 0) + { + if (options->prettyprint_arrays) +@@ -1172,7 +1173,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, + rep1 = i + 1; + reps = 1; + while ((rep1 < len) && +- !memcmp (valaddr + i * eltlen, valaddr + rep1 * eltlen, eltlen)) ++ !memcmp (valaddr + elt_offset, valaddr + rep1 * eltlen, eltlen)) + { + ++reps; + ++rep1; +diff --git a/gdb/value.c b/gdb/value.c +index 65a5aa9..007e4b0 100644 +--- a/gdb/value.c ++++ b/gdb/value.c +@@ -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" + +@@ -257,7 +259,9 @@ allocate_value_lazy (struct type *type) + val->next = all_values; + all_values = val; + val->type = type; ++ type_incref (type); + val->enclosing_type = type; ++ type_incref (type); + VALUE_LVAL (val) = not_lval; + val->location.address = 0; + VALUE_FRAME_ID (val) = null_frame_id; +@@ -367,6 +371,8 @@ value_type (struct value *value) + void + deprecated_set_value_type (struct value *value, struct type *type) + { ++ type_incref (type); ++ type_decref (value->type); + value->type = type; + } + +@@ -623,6 +629,9 @@ value_free (struct value *val) + { + if (val) + { ++ type_decref (val->type); ++ type_decref (val->enclosing_type); + -+ if (r.changed || r.type_changed) -+ VEC_safe_push (varobj_update_result, result, &r); + 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); + } -- VEC_free (varobj_p, stack); -+ VEC_free (varobj_update_result, stack); + /* 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); + - return result; - } - -@@ -1429,16 +1871,23 @@ uninstall_variable (struct varobj *var) - static struct varobj * - create_child (struct varobj *parent, int index, char *name) ++ type_incref (arg->type); ++ type_decref (val->type); + val->type = arg->type; + VALUE_LVAL (val) = VALUE_LVAL (arg); + val->location = arg->location; +@@ -771,12 +783,15 @@ value_copy (struct value *arg) + void + set_value_component_location (struct value *component, struct value *whole) { -+ return create_child_with_value (parent, index, name, -+ value_of_child (parent, index)); -+} ++ CORE_ADDR addr; + -+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; - var->frozen = 0; - var->not_fetched = 0; -+ var->children_requested = 0; -+ var->from = -1; -+ var->to = -1; -+ var->pretty_printer = 0; + if (VALUE_LVAL (whole) == lval_internalvar) + VALUE_LVAL (component) = lval_internalvar_component; + else + VALUE_LVAL (component) = VALUE_LVAL (whole); - return var; - } -@@ -1519,6 +1972,14 @@ free_variable (struct varobj *var) - xfree (var->root); + component->location = whole->location; ++ + if (VALUE_LVAL (whole) == lval_computed) + { + struct lval_funcs *funcs = whole->location.computed.funcs; +@@ -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); } - -+#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) - return make_cleanup (do_free_variable_cleanup, var); ++ addr = value_raw_address (component); ++ object_address_get_data (value_type (whole), &addr); ++ set_value_address (component, addr); } + +@@ -914,6 +933,29 @@ show_values (char *num_exp, int from_tty) + num_exp[1] = '\0'; + } + } ++ ++/* Sanity check for memory leaks and proper types reference counting. */ ++ +static void -+do_uninstall_variable_cleanup (void *var) ++value_history_cleanup (void *unused) +{ -+ uninstall_variable (var); -+} ++ while (value_history_chain) ++ { ++ struct value_history_chunk *chunk = value_history_chain; ++ int i; + -+static struct cleanup * -+make_cleanup_uninstall_variable (struct varobj *var) -+{ -+ return make_cleanup (do_uninstall_variable_cleanup, var); -+} ++ for (i = 0; i < ARRAY_SIZE (chunk->values); i++) ++ value_free (chunk->values[i]); + - /* 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; ++ value_history_chain = chunk->next; ++ 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. +@@ -1388,6 +1430,37 @@ call_internal_function (struct gdbarch *gdbarch, + return (*ifn->handler) (gdbarch, language, ifn->cookie, argc, argv); } --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) - { - long dummy; - struct ui_file *stb; - struct cleanup *old_chain; -- char *thevalue; -+ char *thevalue = NULL; - struct value_print_options opts; - - if (value == NULL) - return NULL; - -+#if HAVE_PYTHON -+ { -+ PyGILState_STATE state = PyGILState_Ensure (); -+ if (value_formatter && PyObject_HasAttr (value_formatter, -+ gdbpy_to_string_cst)) ++/* Call type_mark_used for any TYPEs referenced from this GDB source file. */ ++ ++static void ++value_types_mark_used (void) ++{ ++ struct internalvar *var; ++ struct value_history_chunk *chunk; ++ ++ for (var = internalvars; var != NULL; var = var->next) ++ switch (var->kind) + { -+ char *hint; -+ struct value *replacement; -+ int string_print = 0; ++ case INTERNALVAR_VALUE: ++ type_mark_used (value_type (var->u.value)); ++ break; + -+ hint = gdbpy_get_display_hint (value_formatter); -+ if (hint) -+ { -+ if (!strcmp (hint, "string")) -+ string_print = 1; -+ xfree (hint); -+ } ++ case INTERNALVAR_SCALAR: ++ type_mark_used (var->u.scalar.type); ++ break; + -+ 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 + - stb = mem_fileopen (); - old_chain = make_cleanup_ui_file_delete (stb); - - 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) ++ for (chunk = value_history_chain; chunk != NULL; chunk = chunk->next) + { -+ struct type *string_char_type; ++ int i; + -+ 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); ++ for (i = 0; i < ARRAY_SIZE (chunk->values); i++) ++ if (chunk->values[i]) ++ type_mark_used (value_type (chunk->values[i])); + } -+ else -+ common_val_print (value, stb, 0, &opts, current_language); - thevalue = ui_file_xstrdup (stb, &dummy); ++} ++ + /* 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. */ - do_cleanups (old_chain); -@@ -1900,7 +2420,7 @@ varobj_floating_p (struct varobj *var) - value is not known. +-static void ++void + preserve_one_value (struct value *value, struct objfile *objfile, + htab_t copied_types) + { + if (TYPE_OBJFILE (value->type) == objfile) +- value->type = copy_type_recursive (objfile, value->type, copied_types); ++ { ++ /* No need to decref the old type here, since we know it has no ++ reference count. */ ++ value->type = copy_type_recursive (value->type, copied_types); ++ type_incref (value->type); ++ } - 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); - } - } - } -diff --git a/gdb/varobj.h b/gdb/varobj.h -index f2cdcf8..10758d6 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); + if (TYPE_OBJFILE (value->enclosing_type) == objfile) +- value->enclosing_type = copy_type_recursive (objfile, +- value->enclosing_type, +- copied_types); ++ { ++ /* No need to decref the old type here, since we know it has no ++ reference count. */ ++ value->enclosing_type = copy_type_recursive (value->enclosing_type, ++ copied_types); ++ type_incref (value->enclosing_type); ++ } + } - extern int varobj_get_frozen (struct varobj *var); + /* 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; -+extern void varobj_get_child_range (struct varobj *var, -+ VEC (varobj_p) *children, -+ int *from, int *to); -+ -+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); + 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. */ - /* Return the list of children of VAR. The returned vector -@@ -141,4 +154,13 @@ extern int varobj_editable_p (struct varobj *var); +-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); - extern int varobj_floating_p (struct varobj *var); +- for (val = values_in_python; val; val = val->next) +- preserve_one_value (val, objfile, copied_types); ++ preserve_python_values (objfile, copied_types); -+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); -+ - #endif /* VAROBJ_H */ -diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c -index aab3e48..d41738b 100644 ---- a/gdb/xcoffread.c -+++ b/gdb/xcoffread.c -@@ -3021,6 +3021,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 */ -+ NULL, /* sym_read_psymbols */ - 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" + htab_delete (copied_types); + } +@@ -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)); + ++ type_incref (new_encl_type); ++ type_decref (val->enclosing_type); + val->enclosing_type = new_encl_type; + return val; + } +@@ -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))); + } ++ type_incref (type); ++ type_decref (v->type); + v->type = type; + v->offset = value_offset (arg1); + v->embedded_offset = (offset + value_embedded_offset (arg1) +@@ -2171,6 +2256,42 @@ pack_long (gdb_byte *buf, struct type *type, LONGEST num) + } + + ++/* Pack NUM into BUF using a target format of TYPE. */ + -+#include "filenames.h" ++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; + -+#include "gdb_assert.h" ++ type = check_typedef (type); ++ len = TYPE_LENGTH (type); + -+#ifndef HAVE_LIBEXPAT ++ switch (TYPE_CODE (type)) ++ { ++ case TYPE_CODE_INT: ++ case TYPE_CODE_CHAR: ++ case TYPE_CODE_ENUM: ++ case TYPE_CODE_FLAGS: ++ case TYPE_CODE_BOOL: ++ case TYPE_CODE_RANGE: ++ case TYPE_CODE_MEMBERPTR: ++ store_unsigned_integer (buf, len, byte_order, num); ++ break; + -+/* Dummy functions to indicate that there's no support for fetching -+ syscalls information. */ ++ case TYPE_CODE_REF: ++ case TYPE_CODE_PTR: ++ store_typed_address (buf, type, (CORE_ADDR) num); ++ break; + -+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")); ++ default: ++ error (_("\ ++Unexpected type (%d) encountered for unsigned integer constant."), ++ TYPE_CODE (type)); + } +} + -+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; -+} + /* Convert C numbers into newly allocated values. */ + + struct value * +@@ -2184,6 +2305,19 @@ value_from_longest (struct type *type, LONGEST num) + } + + ++/* Convert C unsigned numbers into newly allocated values. */ + -+int -+xml_number_of_syscalls (const struct syscalls_info *sysinfo) ++struct value * ++value_from_ulongest (struct type *type, ULONGEST num) +{ -+ syscall_warn_user (); -+ return 0; -+} ++ struct value *val = allocate_value (type); + -+const char ** -+xml_list_of_syscalls (const struct syscalls_info *sysinfo) -+{ -+ syscall_warn_user (); -+ return NULL; -+} ++ pack_unsigned_long (value_contents_raw (val), type, num); + -+#else ++ return val; ++} + -+/* Structure which describes a syscall. */ + -+typedef struct syscall_desc -+{ -+ /* The syscall number. */ + /* Create a value representing a pointer of type TYPE to the address + ADDR. */ + struct value * +@@ -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); + -+ int number; ++ make_final_cleanup (value_history_cleanup, NULL); + -+ /* The syscall name. */ ++ 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 29ad783..bc96309 100644 +--- a/gdb/value.h ++++ b/gdb/value.h +@@ -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); ++extern struct value *value_from_ulongest (struct type *type, ULONGEST num); + extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr); + 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 const char *object_address_data_not_valid (struct type *type); ++extern int object_address_get_data (struct type *type, ++ CORE_ADDR *address_return); + -+ char *name; -+} *syscall_desc_p; -+DEF_VEC_P(syscall_desc_p); + extern struct value *value_at (struct type *type, CORE_ADDR addr); + extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr); + +@@ -438,6 +443,7 @@ extern struct value *value_struct_elt (struct value **argp, + + extern struct value *value_aggregate_elt (struct type *curtype, + char *name, ++ struct type *expect_type, + int want_address, + enum noside noside); + +@@ -658,12 +664,13 @@ extern void typedef_print (struct type *type, struct symbol *news, + + extern char *internalvar_name (struct internalvar *var); + +-extern void preserve_values (struct objfile *); +- + /* From values.c */ + + extern struct value *value_copy (struct value *); + ++extern void preserve_one_value (struct value *value, struct objfile *objfile, ++ htab_t copied_types); + -+/* Structure that represents syscalls information. */ + /* 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, +- LONGEST index, int lowerbound); ++ CORE_ADDR offset); + + /* User function handler. */ + +diff --git a/gdb/varobj.c b/gdb/varobj.c +index 4a94988..9bfc130 100644 +--- a/gdb/varobj.c ++++ b/gdb/varobj.c +@@ -29,11 +29,14 @@ + + #include "gdb_assert.h" + #include "gdb_string.h" ++#include "gdb_regex.h" + + #include "varobj.h" + #include "vec.h" + #include "gdbthread.h" + #include "inferior.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; + -+struct syscalls_info ++void ++varobj_enable_pretty_printing (void) +{ -+ /* The syscalls. */ -+ -+ VEC(syscall_desc_p) *syscalls; -+}; ++ pretty_printing = 1; ++} + -+/* Callback data for syscall information parsing. */ + /* Data structures */ + + /* 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; + -+struct syscall_parsing_data -+{ -+ /* The syscalls_info we are building. */ ++ /* 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; + -+ struct syscalls_info *sysinfo; -+}; + /* 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); + ++static struct cleanup *make_cleanup_uninstall_variable (struct varobj *var); + + static struct type *get_type (struct varobj *var); + + static struct type *get_value_type (struct varobj *var); +@@ -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); +- + /* Language-specific routines. */ + + static enum varobj_languages variable_language (struct varobj *var); +@@ -614,9 +637,9 @@ varobj_create (char *objname, + do_cleanups (old_chain); + return NULL; + } ++ make_cleanup_uninstall_variable (var); + } + +- install_default_visualizer (var); + discard_cleanups (old_chain); + return var; + } +@@ -884,7 +907,9 @@ update_dynamic_varobj_children (struct varobj *var, + } + make_cleanup_py_decref (iterator); + +- 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); + } + } + +@@ -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; + } + +@@ -1168,6 +1191,112 @@ varobj_set_value (struct varobj *var, char *expression) + return 1; + } + ++#if HAVE_PYTHON + -+static struct syscalls_info * -+allocate_syscalls_info (void) -+{ -+ return XZALLOC (struct syscalls_info); -+} ++/* A helper function to install a constructor function and visualizer ++ in a varobj. */ + +static void -+sysinfo_free_syscalls_desc (struct syscall_desc *sd) ++install_visualizer (struct varobj *var, PyObject *constructor, ++ PyObject *visualizer) +{ -+ xfree (sd->name); ++ Py_XDECREF (var->constructor); ++ var->constructor = constructor; ++ ++ Py_XDECREF (var->pretty_printer); ++ var->pretty_printer = visualizer; +} + ++/* Install the default visualizer for VAR. */ ++ +static void -+free_syscalls_info (void *arg) ++install_default_visualizer (struct varobj *var) +{ -+ 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); -+} ++ if (pretty_printing) ++ { ++ PyObject *pretty_printer = NULL; + -+struct cleanup * -+make_cleanup_free_syscalls_info (struct syscalls_info *sysinfo) -+{ -+ return make_cleanup (free_syscalls_info, sysinfo); ++ 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); ++ } +} + -+/* Open FILENAME, read all its text into memory, close it, and return -+ the text. If something goes wrong, return NULL and warn. */ ++/* Instantiate and install a visualizer for VAR using CONSTRUCTOR to ++ make a new object. */ + -+static char * -+fetch_xml_from_file (const char *filename, void *baton) ++static void ++construct_visualizer (struct varobj *var, PyObject *constructor) +{ -+ const char *dirname = baton; -+ FILE *file; -+ struct cleanup *back_to; -+ char *text; -+ size_t len, offset; ++ PyObject *pretty_printer; + -+ if (dirname && *dirname) ++ Py_INCREF (constructor); ++ if (constructor == Py_None) ++ pretty_printer = NULL; ++ else + { -+ char *fullname = concat (dirname, "/", filename, (char *) NULL); -+ if (fullname == NULL) -+ nomem (0); -+ file = fopen (fullname, FOPEN_RT); -+ xfree (fullname); ++ 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; ++ } + } -+ else -+ file = fopen (filename, FOPEN_RT); + -+ if (file == NULL) -+ return NULL; ++ install_visualizer (var, constructor, pretty_printer); ++} + -+ back_to = make_cleanup_fclose (file); ++#endif /* HAVE_PYTHON */ + -+ /* 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; ++/* A helper function for install_new_value. This creates and installs ++ a visualizer for VAR, if appropriate. */ + -+ /* 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; -+ } ++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; + -+ offset += bytes_read; ++ cleanup = varobj_ensure_python_env (var); + -+ if (feof (file)) -+ break; ++ if (!var->constructor) ++ install_default_visualizer (var); ++ else ++ construct_visualizer (var, var->constructor); + -+ len = len * 2; -+ text = xrealloc (text, len); ++ do_cleanups (cleanup); + } ++#else ++ /* Do nothing. */ ++#endif ++} + -+ fclose (file); -+ discard_cleanups (back_to); + /* 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); + -+ text[offset] = '\0'; -+ return text; + gdb_assert (!var->value || value_type (var->value)); + + 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 ++ will be set to the full range of CHILDREN. Otherwise, *FROM and ++ *TO will be set to the selected sub-range of VAR, clipped to be in ++ range of CHILDREN. */ ++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 ++ FROM and end at index TO. If either FROM or TO is less than zero, ++ this is interpreted as a request for all children. */ ++void ++varobj_set_child_range (struct varobj *var, int from, int to) ++{ ++ var->from = from; ++ var->to = to; + } + + 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; + + do_cleanups (back_to); + #else +@@ -1864,6 +1963,9 @@ new_variable (void) + var->frozen = 0; + var->not_fetched = 0; + var->children_requested = 0; ++ var->from = -1; ++ var->to = -1; ++ var->constructor = 0; + var->pretty_printer = 0; + + return var; +@@ -1927,6 +2029,18 @@ make_cleanup_free_variable (struct varobj *var) + return make_cleanup (do_free_variable_cleanup, var); + } + +static void -+syscall_create_syscall_desc (struct syscalls_info *sysinfo, -+ const char *name, int number) ++do_uninstall_variable_cleanup (void *var) +{ -+ struct syscall_desc *sysdesc = XZALLOC (struct syscall_desc); -+ -+ sysdesc->name = xstrdup (name); -+ sysdesc->number = number; ++ uninstall_variable (var); ++} + -+ VEC_safe_push (syscall_desc_p, sysinfo->syscalls, sysdesc); ++static struct cleanup * ++make_cleanup_uninstall_variable (struct varobj *var) ++{ ++ return make_cleanup (do_uninstall_variable_cleanup, var); +} + -+/* Handle the start of a element. */ + /* This returns the type of the variable. It also skips past typedefs + to return the real type of the variable. + +@@ -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; +- gdb_byte *thevalue = NULL; ++ char *thevalue = NULL; + struct value_print_options opts; + int len = 0; + +@@ -3173,6 +3287,19 @@ java_value_of_variable (struct varobj *var, enum varobj_display_formats format) + return cplus_value_of_variable (var, format); + } + ++/* Iterate all the existing VAROBJs and call the FUNC callback for them with an ++ arbitrary caller supplied DATA pointer. */ + +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) ++all_varobjs (void (*func) (struct varobj *var, void *data), void *data) +{ -+ struct syscall_parsing_data *data = user_data; -+ struct syscalls_info *sysinfo = data->sysinfo; ++ struct vlist **vlp, *vl; ++ ++ for (vlp = varobj_table; vlp < varobj_table + VAROBJ_TABLE_SIZE; vlp++) ++ for (vl = *vlp; vl != NULL; vl = vl->next) ++ (*func) (vl->var, data); +} + -+/* Handle the start of a element. */ + /* Iterate all the existing _root_ VAROBJs and call the FUNC callback for them + with an arbitrary caller supplied DATA pointer. */ + +@@ -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) + -+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; ++/* Helper for varobj_types_mark_used. Call type_mark_used for any TYPEs ++ referenced from this VAR. */ + -+ len = VEC_length (gdb_xml_value_s, attributes); ++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. */ + -+ for (i = 0; i < len; i++) ++ if (var->root->rootvar == var) + { -+ 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); ++ 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. */ + -+ syscall_create_syscall_desc (data->sysinfo, name, number); ++ 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. + -+/* 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 } -+}; ++ Call varobj_revalidate_iter after the OBJFILE update get finished. + -+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 } -+}; ++ Invalidated varobjs will be always printed in_scope="invalid". */ + -+static struct syscalls_info * -+syscall_parse_xml (const char *document, xml_fetch_another fetcher, -+ void *fetcher_baton) ++static void ++varobj_invalidate_iter (struct varobj *var, void *objfile_voidp) +{ -+ struct cleanup *result_cleanup; -+ struct gdb_xml_parser *parser; -+ struct syscall_parsing_data data; -+ char *expanded_text; -+ int i; ++ struct objfile *objfile = objfile_voidp; + -+ parser = gdb_xml_create_parser_and_cleanup (_("syscalls info"), -+ syselements, &data); ++ /* Check VAROBJROOTs only once during the varobj_invalidate pass. */ + -+ 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 ++ if (var->root->rootvar == var) + { -+ warning (_("Could not load XML syscalls info; ignoring")); -+ do_cleanups (result_cleanup); -+ return NULL; -+ } -+} ++ /* Check even FLOATING VAROBJROOTs as their data will be still checked ++ during varobj_update by varobj_get_type. */ + -+const struct syscalls_info * -+xml_init_syscalls_info (const char *filename) -+{ -+ char *full_file; -+ char *dirname; -+ struct syscalls_info *sysinfo; -+ struct cleanup *back_to; ++ if (var->root->is_valid ++ && block_objfile (var->root->valid_block) == objfile) ++ var->root->is_valid = 0; + -+ full_file = fetch_xml_from_file (filename, gdb_datadir); -+ if (full_file == NULL) -+ { -+ warning (_("Could not open \"%s\""), filename); -+ return NULL; ++ 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; ++ } + } + -+ back_to = make_cleanup (xfree, full_file); ++ if (var->type && TYPE_OBJFILE (var->type) == objfile) ++ { ++ var->root->is_valid = 0; + -+ dirname = ldirname (filename); -+ if (dirname != NULL) -+ make_cleanup (xfree, dirname); ++ var->type = NULL; ++ } + -+ sysinfo = syscall_parse_xml (full_file, fetch_xml_from_file, dirname); -+ do_cleanups (back_to); ++ if (var->value && TYPE_OBJFILE (value_type (var->value)) == objfile) ++ { ++ var->root->is_valid = 0; + -+ return sysinfo; ++ value_free (var->value); ++ var->value = NULL; ++ } +} + -+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; -+} ++/* Recreate any global varobjs possibly previously invalidated. If the ++ expressions are no longer evaluatable set/keep the VAR invalid. */ + -+const char * -+xml_get_syscall_name (const struct syscalls_info *sysinfo, -+ int syscall_number) ++static void ++varobj_revalidate_iter (struct varobj *var, void *unused) +{ -+ 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; ++ /* 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. */ + -+ return NULL; ++ all_varobjs (varobj_invalidate_iter, objfile); +} + -+int -+xml_number_of_syscalls (const struct syscalls_info *sysinfo) -+{ -+ return (sysinfo == NULL ? 0 : VEC_length(syscall_desc_p, -+ sysinfo->syscalls)); -+} ++/* Call varobj_revalidate_iter for all the root VAROBJs. */ + -+const char ** -+xml_list_of_syscalls (const struct syscalls_info *sysinfo) ++static void ++varobj_revalidate (void) +{ -+ 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 *)); ++ /* 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. */ + -+ for (i = 0; -+ VEC_iterate (syscall_desc_p, sysinfo->syscalls, i, sysdesc); -+ i++) -+ names[i] = sysdesc->name; -+ -+ names[i] = NULL; -+ -+ return names; ++ all_root_varobjs (varobj_revalidate_iter, NULL); +} + -+#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. */ ++/* Call varobj_revalidate just providing a different function prototype. ++ Currently existing VAROBJs may become valid or change with new symbols ++ loaded. */ + -+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) ++static void ++varobj_revalidate_for_objfile (struct objfile *objfile) +{ -+ /* 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; ++ varobj_revalidate (); +} -+ -+/* 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"); ++ ++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/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}}, +diff --git a/gdb/varobj.h b/gdb/varobj.h +index 7297243..aabd743 100644 +--- a/gdb/varobj.h ++++ b/gdb/varobj.h +@@ -112,6 +112,12 @@ extern void varobj_set_frozen (struct varobj *var, int frozen); --{"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}}, + extern int varobj_get_frozen (struct varobj *var); - {"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[] = { ++extern void varobj_get_child_range (struct varobj *var, ++ VEC (varobj_p) *children, ++ int *from, int *to); ++ ++extern void varobj_set_child_range (struct varobj *var, int from, int to); ++ + extern char *varobj_get_display_hint (struct varobj *var); - {"stxvd2x", X(31,972), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA, RB}}, + 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); -+{"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}}, +-extern void varobj_invalidate (void); +- + extern int varobj_editable_p (struct varobj *var); - {"stbcix", X(31,981), X_MASK, POWER6, PPCNONE, {RS, RA0, RB}}, + extern int varobj_floating_p (struct varobj *var); -@@ -4796,16 +4796,12 @@ const struct powerpc_opcode powerpc_opcodes[] = { - {"stfdu", OP(55), OP_MASK, COM, PPCNONE, {FRS, D, RAS}}, +-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_enable_pretty_printing (void); - {"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}}, + #endif /* VAROBJ_H */ +diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c +index c56ab86..dacf913 100644 +--- a/gdb/xcoffread.c ++++ b/gdb/xcoffread.c +@@ -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 */ ++ NULL, /* sym_read_psymbols */ + 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-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