- Fix more the variable-length-arrays support (BZ 468266, feature BZ
377541). - Fix the watchpoints conditionals. - Fix on PPC spurious SIGTRAPs on active watchpoints. - Fix occasional stepping lockup on many threads, seen on ia64.
This commit is contained in:
parent
3e31985da5
commit
bb9a89cb8a
@ -1,146 +0,0 @@
|
|||||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=196439
|
|
||||||
|
|
||||||
|
|
||||||
2006-08-26 Jan Kratochvil <jan.kratochvil@redhat.com>
|
|
||||||
|
|
||||||
* gdb.dwarf2/dw2-stripped.exp: New file, Handle corrupted
|
|
||||||
or missing location list information.
|
|
||||||
* gdb.dwarf2/dw2-stripped.c: New file, Handle corrupted
|
|
||||||
or missing location list information.
|
|
||||||
|
|
||||||
|
|
||||||
Index: gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.c
|
|
||||||
===================================================================
|
|
||||||
RCS file: gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.c
|
|
||||||
diff -N gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.c
|
|
||||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
|
||||||
+++ gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.c 26 Aug 2006 11:47:26 -0000
|
|
||||||
@@ -0,0 +1,42 @@
|
|
||||||
+/* This testcase is part of GDB, the GNU debugger.
|
|
||||||
+
|
|
||||||
+ Copyright 2004 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. */
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+/* 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)
|
|
||||||
+{
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* `func1' being traced into must have some arguments to dump. */
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+func1(int a, int b)
|
|
||||||
+{
|
|
||||||
+ func0 (a,b);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main(void)
|
|
||||||
+{
|
|
||||||
+ func1 (1, 2);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
Index: gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp
|
|
||||||
===================================================================
|
|
||||||
RCS file: gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp
|
|
||||||
diff -N gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp
|
|
||||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
|
||||||
+++ gdb-6.5/gdb/testsuite/gdb.dwarf2/dw2-stripped.exp 26 Aug 2006 11:47:27 -0000
|
|
||||||
@@ -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 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.
|
|
||||||
+
|
|
||||||
+# Minimal DWARF-2 unit test
|
|
||||||
+
|
|
||||||
+# 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 "dw2-stripped"
|
|
||||||
+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}] {
|
|
||||||
+ 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}" "${binfile}" executable {debug additional_flags=-ggdb3}] != "" } {
|
|
||||||
+ return -1
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+remote_exec build "objcopy -R .debug_loc ${binfile}"
|
|
||||||
+set strip_output [remote_exec build "objdump -h ${binfile}"]
|
|
||||||
+
|
|
||||||
+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)"
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+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_exit
|
|
||||||
+gdb_start
|
|
||||||
+gdb_reinitialize_dir $srcdir/$subdir
|
|
||||||
+gdb_load ${binfile}
|
|
||||||
+
|
|
||||||
+# For C programs, "start" should stop in main().
|
|
||||||
+
|
|
||||||
+gdb_test "start" \
|
|
||||||
+ ".*main \\(\\) at .*" \
|
|
||||||
+ "start"
|
|
||||||
+gdb_test "step" \
|
|
||||||
+ "func.* \\(.*\\) at .*" \
|
|
||||||
+ "step"
|
|
@ -1,9 +1,9 @@
|
|||||||
Based on:
|
Based on:
|
||||||
http://people.redhat.com/jkratoch/vla/
|
http://people.redhat.com/jkratoch/vla/
|
||||||
fortran-dynamic-arrays-HEAD-i.patch
|
fortran-dynamic-arrays-HEAD-j.patch
|
||||||
|
|
||||||
--- ./gdb/c-typeprint.c 2008-10-29 20:56:57.000000000 +0100
|
--- ./gdb/c-typeprint.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/c-typeprint.c 2008-10-29 21:32:13.000000000 +0100
|
+++ ./gdb/c-typeprint.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -541,7 +541,12 @@ c_type_print_varspec_suffix (struct type
|
@@ -541,7 +541,12 @@ c_type_print_varspec_suffix (struct type
|
||||||
fprintf_filtered (stream, ")");
|
fprintf_filtered (stream, ")");
|
||||||
|
|
||||||
@ -18,8 +18,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
&& !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
|
&& !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
|
||||||
fprintf_filtered (stream, "%d",
|
fprintf_filtered (stream, "%d",
|
||||||
(TYPE_LENGTH (type)
|
(TYPE_LENGTH (type)
|
||||||
--- ./gdb/dwarf2expr.c 2008-10-29 10:50:23.000000000 +0100
|
--- ./gdb/dwarf2expr.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/dwarf2expr.c 2008-10-29 21:32:13.000000000 +0100
|
+++ ./gdb/dwarf2expr.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -750,6 +750,13 @@ execute_stack_op (struct dwarf_expr_cont
|
@@ -750,6 +750,13 @@ execute_stack_op (struct dwarf_expr_cont
|
||||||
ctx->initialized = 0;
|
ctx->initialized = 0;
|
||||||
goto no_push;
|
goto no_push;
|
||||||
@ -34,8 +34,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
default:
|
default:
|
||||||
error (_("Unhandled dwarf expression opcode 0x%x"), op);
|
error (_("Unhandled dwarf expression opcode 0x%x"), op);
|
||||||
}
|
}
|
||||||
--- ./gdb/dwarf2expr.h 2008-10-29 10:50:23.000000000 +0100
|
--- ./gdb/dwarf2expr.h 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/dwarf2expr.h 2008-10-29 21:32:13.000000000 +0100
|
+++ ./gdb/dwarf2expr.h 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -61,10 +61,10 @@ struct dwarf_expr_context
|
@@ -61,10 +61,10 @@ struct dwarf_expr_context
|
||||||
The result must be live until the current expression evaluation
|
The result must be live until the current expression evaluation
|
||||||
is complete. */
|
is complete. */
|
||||||
@ -48,8 +48,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
/* The current depth of dwarf expression recursion, via DW_OP_call*,
|
/* The current depth of dwarf expression recursion, via DW_OP_call*,
|
||||||
DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum
|
DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum
|
||||||
--- ./gdb/dwarf2loc.c 2008-10-29 10:50:23.000000000 +0100
|
--- ./gdb/dwarf2loc.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/dwarf2loc.c 2008-11-01 20:31:51.000000000 +0100
|
+++ ./gdb/dwarf2loc.c 2008-11-06 20:51:35.000000000 +0100
|
||||||
@@ -106,6 +106,9 @@ struct dwarf_expr_baton
|
@@ -106,6 +106,9 @@ struct dwarf_expr_baton
|
||||||
{
|
{
|
||||||
struct frame_info *frame;
|
struct frame_info *frame;
|
||||||
@ -60,7 +60,49 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Helper functions for dwarf2_evaluate_loc_desc. */
|
/* Helper functions for dwarf2_evaluate_loc_desc. */
|
||||||
@@ -189,6 +192,105 @@ dwarf_expr_tls_address (void *baton, COR
|
@@ -164,22 +167,32 @@ dwarf_expr_frame_base (void *baton, gdb_
|
||||||
|
*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;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- *start = NULL;
|
||||||
|
+ gdb_assert (symbaton != NULL);
|
||||||
|
+ *start = symbaton->data;
|
||||||
|
+ *length = symbaton->size;
|
||||||
|
}
|
||||||
|
+ else if (SYMBOL_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_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));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Using the objfile specified in BATON, find the address for the
|
||||||
|
@@ -192,6 +205,117 @@ dwarf_expr_tls_address (void *baton, COR
|
||||||
return target_translate_tls_address (debaton->objfile, offset);
|
return target_translate_tls_address (debaton->objfile, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +137,10 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ xfree (prev_save);
|
+ xfree (prev_save);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+/* It would be useful to sanity check ADDRESS - such as for some objects with
|
+/* 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.
|
||||||
|
+
|
||||||
|
+ It would be useful to sanity check ADDRESS - such as for some objects with
|
||||||
+ unset VALUE_ADDRESS - but some valid addresses may be zero (such as first
|
+ unset VALUE_ADDRESS - but some valid addresses may be zero (such as first
|
||||||
+ objects in relocatable .o files). */
|
+ objects in relocatable .o files). */
|
||||||
+
|
+
|
||||||
@ -113,9 +158,10 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+
|
+
|
||||||
+/* Evaluate DWARF expression at DATA ... DATA + SIZE with its result readable
|
+/* Evaluate DWARF expression at DATA ... DATA + SIZE with its result readable
|
||||||
+ by dwarf_expr_fetch (RETVAL, 0). FRAME parameter can be NULL to call
|
+ by dwarf_expr_fetch (RETVAL, 0). FRAME parameter can be NULL to call
|
||||||
+ get_selected_frame to find it. */
|
+ get_selected_frame to find it. Returned dwarf_expr_context freeing is
|
||||||
|
+ pushed on the cleanup chain. */
|
||||||
+
|
+
|
||||||
+struct dwarf_expr_context *
|
+static struct dwarf_expr_context *
|
||||||
+dwarf_expr_prep_ctx (struct frame_info *frame, gdb_byte *data,
|
+dwarf_expr_prep_ctx (struct frame_info *frame, gdb_byte *data,
|
||||||
+ unsigned short size, struct objfile *objfile)
|
+ unsigned short size, struct objfile *objfile)
|
||||||
+{
|
+{
|
||||||
@ -137,8 +183,13 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ ctx->get_tls_address = dwarf_expr_tls_address;
|
+ ctx->get_tls_address = dwarf_expr_tls_address;
|
||||||
+ ctx->get_object_address = dwarf_expr_object_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);
|
+ dwarf_expr_eval (ctx, data, size);
|
||||||
+
|
+
|
||||||
|
+ /* It was used only during dwarf_expr_eval. */
|
||||||
|
+ ctx->baton = NULL;
|
||||||
|
+
|
||||||
+ return ctx;
|
+ return ctx;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
@ -150,6 +201,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+{
|
+{
|
||||||
+ struct dwarf_expr_context *ctx;
|
+ struct dwarf_expr_context *ctx;
|
||||||
+ CORE_ADDR retval;
|
+ CORE_ADDR retval;
|
||||||
|
+ struct cleanup *back_to = make_cleanup (null_cleanup, 0);
|
||||||
+
|
+
|
||||||
+ ctx = dwarf_expr_prep_ctx (NULL, dlbaton->data, dlbaton->size,
|
+ ctx = dwarf_expr_prep_ctx (NULL, dlbaton->data, dlbaton->size,
|
||||||
+ dlbaton->objfile);
|
+ dlbaton->objfile);
|
||||||
@ -160,40 +212,44 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+
|
+
|
||||||
+ retval = dwarf_expr_fetch (ctx, 0);
|
+ retval = dwarf_expr_fetch (ctx, 0);
|
||||||
+
|
+
|
||||||
|
+ do_cleanups (back_to);
|
||||||
|
+
|
||||||
+ return retval;
|
+ return retval;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
/* Evaluate a location description, starting at DATA and with length
|
/* Evaluate a location description, starting at DATA and with length
|
||||||
SIZE, to find the current location of variable VAR in the context
|
SIZE, to find the current location of variable VAR in the context
|
||||||
of FRAME. */
|
of FRAME. */
|
||||||
@@ -199,7 +301,6 @@ dwarf2_evaluate_loc_desc (struct symbol
|
@@ -202,8 +326,8 @@ dwarf2_evaluate_loc_desc (struct symbol
|
||||||
{
|
{
|
||||||
struct gdbarch *arch = get_frame_arch (frame);
|
struct gdbarch *arch = get_frame_arch (frame);
|
||||||
struct value *retval;
|
struct value *retval;
|
||||||
- struct dwarf_expr_baton baton;
|
- struct dwarf_expr_baton baton;
|
||||||
struct dwarf_expr_context *ctx;
|
struct dwarf_expr_context *ctx;
|
||||||
|
+ struct cleanup *back_to = make_cleanup (null_cleanup, 0);
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
@@ -210,17 +311,8 @@ dwarf2_evaluate_loc_desc (struct symbol
|
{
|
||||||
|
@@ -213,17 +337,8 @@ dwarf2_evaluate_loc_desc (struct symbol
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
- baton.frame = frame;
|
- baton.frame = frame;
|
||||||
- baton.objfile = objfile;
|
- baton.objfile = objfile;
|
||||||
-
|
+ ctx = dwarf_expr_prep_ctx (frame, data, size, objfile);
|
||||||
|
|
||||||
- ctx = new_dwarf_expr_context ();
|
- ctx = new_dwarf_expr_context ();
|
||||||
- ctx->baton = &baton;
|
- ctx->baton = &baton;
|
||||||
- ctx->read_reg = dwarf_expr_read_reg;
|
- ctx->read_reg = dwarf_expr_read_reg;
|
||||||
- ctx->read_mem = dwarf_expr_read_mem;
|
- ctx->read_mem = dwarf_expr_read_mem;
|
||||||
- ctx->get_frame_base = dwarf_expr_frame_base;
|
- ctx->get_frame_base = dwarf_expr_frame_base;
|
||||||
- ctx->get_tls_address = dwarf_expr_tls_address;
|
- ctx->get_tls_address = dwarf_expr_tls_address;
|
||||||
+ ctx = dwarf_expr_prep_ctx (frame, data, size, objfile);
|
-
|
||||||
|
|
||||||
- dwarf_expr_eval (ctx, data, size);
|
- dwarf_expr_eval (ctx, data, size);
|
||||||
if (ctx->num_pieces > 0)
|
if (ctx->num_pieces > 0)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -258,6 +351,10 @@ dwarf2_evaluate_loc_desc (struct symbol
|
@@ -261,6 +376,10 @@ dwarf2_evaluate_loc_desc (struct symbol
|
||||||
{
|
{
|
||||||
CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
|
CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
|
||||||
|
|
||||||
@ -204,24 +260,100 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
retval = allocate_value (SYMBOL_TYPE (var));
|
retval = allocate_value (SYMBOL_TYPE (var));
|
||||||
VALUE_LVAL (retval) = lval_memory;
|
VALUE_LVAL (retval) = lval_memory;
|
||||||
set_value_lazy (retval, 1);
|
set_value_lazy (retval, 1);
|
||||||
--- ./gdb/dwarf2loc.h 2008-10-29 10:50:23.000000000 +0100
|
@@ -269,7 +388,7 @@ dwarf2_evaluate_loc_desc (struct symbol
|
||||||
+++ ./gdb/dwarf2loc.h 2008-11-01 20:16:31.000000000 +0100
|
|
||||||
@@ -66,4 +66,13 @@ struct dwarf2_loclist_baton
|
set_value_initialized (retval, ctx->initialized);
|
||||||
|
|
||||||
|
- free_dwarf_expr_context (ctx);
|
||||||
|
+ do_cleanups (back_to);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
@@ -578,7 +697,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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -594,16 +713,56 @@ loclist_tracepoint_var_ref (struct symbo
|
||||||
|
|
||||||
|
data = find_location_expression (dlbaton, &size, ax->scope);
|
||||||
|
if (data == NULL)
|
||||||
|
- error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
|
||||||
|
+ error (_("Variable \"%s\" is not available."), SYMBOL_PRINT_NAME (symbol));
|
||||||
|
|
||||||
|
dwarf2_tracepoint_var_ref (symbol, ax, value, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* 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
|
||||||
|
+};
|
||||||
|
--- ./gdb/dwarf2loc.h 2008-11-06 20:50:14.000000000 +0100
|
||||||
|
+++ ./gdb/dwarf2loc.h 2008-11-06 20:52:23.000000000 +0100
|
||||||
|
@@ -65,5 +65,11 @@ struct dwarf2_loclist_baton
|
||||||
|
|
||||||
extern const struct symbol_ops dwarf2_locexpr_funcs;
|
extern const struct symbol_ops dwarf2_locexpr_funcs;
|
||||||
extern const struct symbol_ops dwarf2_loclist_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 struct dwarf_expr_context *dwarf_expr_prep_ctx
|
+extern void object_address_set (CORE_ADDR address);
|
||||||
+ (struct frame_info *frame, gdb_byte *data, unsigned short size,
|
|
||||||
+ struct objfile *objfile);
|
|
||||||
+
|
+
|
||||||
+extern CORE_ADDR dwarf_locexpr_baton_eval
|
+extern CORE_ADDR dwarf_locexpr_baton_eval
|
||||||
+ (struct dwarf2_locexpr_baton *dlbaton);
|
+ (struct dwarf2_locexpr_baton *dlbaton);
|
||||||
+
|
|
||||||
#endif /* dwarf2loc.h */
|
#endif /* dwarf2loc.h */
|
||||||
--- ./gdb/dwarf2read.c 2008-10-29 20:56:57.000000000 +0100
|
--- ./gdb/dwarf2read.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/dwarf2read.c 2008-11-01 20:30:52.000000000 +0100
|
+++ ./gdb/dwarf2read.c 2008-11-06 20:51:35.000000000 +0100
|
||||||
@@ -1005,7 +1005,14 @@ static void store_in_ref_table (unsigned
|
@@ -1005,7 +1005,14 @@ static void store_in_ref_table (unsigned
|
||||||
static unsigned int dwarf2_get_ref_die_offset (struct attribute *,
|
static unsigned int dwarf2_get_ref_die_offset (struct attribute *,
|
||||||
struct dwarf2_cu *);
|
struct dwarf2_cu *);
|
||||||
@ -338,12 +470,12 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+
|
+
|
||||||
attr = dwarf2_attr (die, DW_AT_string_length, cu);
|
attr = dwarf2_attr (die, DW_AT_string_length, cu);
|
||||||
- if (attr)
|
- if (attr)
|
||||||
- {
|
+ switch (dwarf2_get_attr_constant_value (attr, &length))
|
||||||
|
{
|
||||||
- length = DW_UNSND (attr);
|
- length = DW_UNSND (attr);
|
||||||
- }
|
- }
|
||||||
- else
|
- else
|
||||||
+ switch (dwarf2_get_attr_constant_value (attr, &length))
|
- {
|
||||||
{
|
|
||||||
- /* check for the DW_AT_byte_size attribute */
|
- /* check for the DW_AT_byte_size attribute */
|
||||||
+ case dwarf2_attr_const:
|
+ case dwarf2_attr_const:
|
||||||
+ /* We currently do not support a constant address where the location
|
+ /* We currently do not support a constant address where the location
|
||||||
@ -616,7 +748,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
- return default_value;
|
- return default_value;
|
||||||
+ *val_return = DW_SND (attr);
|
+ *val_return = DW_SND (attr);
|
||||||
+ return dwarf2_attr_const;
|
+ return dwarf2_attr_const;
|
||||||
}
|
+ }
|
||||||
+ if (attr->form == DW_FORM_udata
|
+ if (attr->form == DW_FORM_udata
|
||||||
+ || attr->form == DW_FORM_data1
|
+ || attr->form == DW_FORM_data1
|
||||||
+ || attr->form == DW_FORM_data2
|
+ || attr->form == DW_FORM_data2
|
||||||
@ -625,7 +757,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ {
|
+ {
|
||||||
+ *val_return = DW_UNSND (attr);
|
+ *val_return = DW_UNSND (attr);
|
||||||
+ return dwarf2_attr_const;
|
+ return dwarf2_attr_const;
|
||||||
+ }
|
}
|
||||||
+ if (attr->form == DW_FORM_block
|
+ if (attr->form == DW_FORM_block
|
||||||
+ || attr->form == DW_FORM_block1
|
+ || attr->form == DW_FORM_block1
|
||||||
+ || attr->form == DW_FORM_block2
|
+ || attr->form == DW_FORM_block2
|
||||||
@ -672,19 +804,28 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
static void
|
static void
|
||||||
dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
|
dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
|
||||||
struct dwarf2_cu *cu)
|
struct dwarf2_cu *cu)
|
||||||
@@ -9938,34 +10113,18 @@ dwarf2_symbol_mark_computed (struct attr
|
@@ -9938,34 +10113,24 @@ dwarf2_symbol_mark_computed (struct attr
|
||||||
SYMBOL_OPS (sym) = &dwarf2_loclist_funcs;
|
SYMBOL_OPS (sym) = &dwarf2_loclist_funcs;
|
||||||
SYMBOL_LOCATION_BATON (sym) = baton;
|
SYMBOL_LOCATION_BATON (sym) = baton;
|
||||||
}
|
}
|
||||||
- else
|
|
||||||
+ else if (attr_form_is_block (attr))
|
+ 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
|
||||||
{
|
{
|
||||||
- struct dwarf2_locexpr_baton *baton;
|
- struct dwarf2_locexpr_baton *baton;
|
||||||
-
|
+ dwarf2_invalid_attrib_class_complaint ("location description",
|
||||||
|
+ SYMBOL_NATURAL_NAME (sym));
|
||||||
|
|
||||||
- baton = obstack_alloc (&cu->objfile->objfile_obstack,
|
- baton = obstack_alloc (&cu->objfile->objfile_obstack,
|
||||||
- sizeof (struct dwarf2_locexpr_baton));
|
- sizeof (struct dwarf2_locexpr_baton));
|
||||||
- baton->objfile = objfile;
|
- baton->objfile = objfile;
|
||||||
-
|
+ /* Some methods are called without checking SYMBOL_OPS validity. */
|
||||||
|
+ SYMBOL_OPS (sym) = &dwarf2_missing_funcs;
|
||||||
|
+ SYMBOL_LOCATION_BATON (sym) = NULL;
|
||||||
|
|
||||||
- if (attr_form_is_block (attr))
|
- if (attr_form_is_block (attr))
|
||||||
- {
|
- {
|
||||||
- /* Note that we're just copying the block's data pointer
|
- /* Note that we're just copying the block's data pointer
|
||||||
@ -703,21 +844,16 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
- baton->data = NULL;
|
- baton->data = NULL;
|
||||||
- }
|
- }
|
||||||
-
|
-
|
||||||
SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs;
|
- SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs;
|
||||||
- SYMBOL_LOCATION_BATON (sym) = baton;
|
- SYMBOL_LOCATION_BATON (sym) = baton;
|
||||||
+ SYMBOL_LOCATION_BATON (sym) = dwarf2_attr_to_locexpr_baton (attr, cu);
|
+ /* For functions a missing DW_AT_frame_base does not optimize out the
|
||||||
+ }
|
+ whole function definition, only its frame base resolving. */
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ dwarf2_invalid_attrib_class_complaint ("location description",
|
|
||||||
+ SYMBOL_NATURAL_NAME (sym));
|
|
||||||
+ /* We have no valid SYMBOL_OPS. */
|
|
||||||
+ if (attr->name == DW_AT_location)
|
+ if (attr->name == DW_AT_location)
|
||||||
+ SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT;
|
+ SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10205,6 +10363,27 @@ offset_and_type_eq (const void *item_lhs
|
@@ -10205,6 +10370,27 @@ offset_and_type_eq (const void *item_lhs
|
||||||
return ofs_lhs->offset == ofs_rhs->offset;
|
return ofs_lhs->offset == ofs_rhs->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -745,7 +881,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
/* Set the type associated with DIE to TYPE. Save it in CU's hash
|
/* Set the type associated with DIE to TYPE. Save it in CU's hash
|
||||||
table if necessary. */
|
table if necessary. */
|
||||||
|
|
||||||
@@ -10215,6 +10394,8 @@ set_die_type (struct die_info *die, stru
|
@@ -10215,6 +10401,8 @@ set_die_type (struct die_info *die, stru
|
||||||
|
|
||||||
die->type = type;
|
die->type = type;
|
||||||
|
|
||||||
@ -754,8 +890,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
if (cu->per_cu == NULL)
|
if (cu->per_cu == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
--- ./gdb/eval.c 2008-10-29 20:56:57.000000000 +0100
|
--- ./gdb/eval.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/eval.c 2008-11-01 19:58:56.000000000 +0100
|
+++ ./gdb/eval.c 2008-11-06 20:51:35.000000000 +0100
|
||||||
@@ -38,6 +38,7 @@
|
@@ -38,6 +38,7 @@
|
||||||
#include "ui-out.h"
|
#include "ui-out.h"
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
@ -764,7 +900,26 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
#include "gdb_assert.h"
|
#include "gdb_assert.h"
|
||||||
|
|
||||||
@@ -1644,9 +1645,12 @@ evaluate_subexp_standard (struct type *e
|
@@ -429,6 +430,7 @@ evaluate_subexp_standard (struct type *e
|
||||||
|
long mem_offset;
|
||||||
|
struct type **arg_types;
|
||||||
|
int save_pos1;
|
||||||
|
+ struct cleanup *old_chain;
|
||||||
|
|
||||||
|
pc = (*pos)++;
|
||||||
|
op = exp->elts[pc].opcode;
|
||||||
|
@@ -1280,7 +1282,10 @@ evaluate_subexp_standard (struct type *e
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
if (code == TYPE_CODE_PTR)
|
||||||
|
@@ -1644,13 +1649,19 @@ evaluate_subexp_standard (struct type *e
|
||||||
{
|
{
|
||||||
int subscript_array[MAX_FORTRAN_DIMS];
|
int subscript_array[MAX_FORTRAN_DIMS];
|
||||||
int array_size_array[MAX_FORTRAN_DIMS];
|
int array_size_array[MAX_FORTRAN_DIMS];
|
||||||
@ -777,7 +932,14 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
if (nargs > MAX_FORTRAN_DIMS)
|
if (nargs > MAX_FORTRAN_DIMS)
|
||||||
error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS);
|
error (_("Too many subscripts for F77 (%d Max)"), MAX_FORTRAN_DIMS);
|
||||||
@@ -1678,6 +1682,9 @@ evaluate_subexp_standard (struct type *e
|
|
||||||
|
+ 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);
|
||||||
|
|
||||||
|
@@ -1678,6 +1689,9 @@ evaluate_subexp_standard (struct type *e
|
||||||
upper = f77_get_upperbound (tmp_type);
|
upper = f77_get_upperbound (tmp_type);
|
||||||
lower = f77_get_lowerbound (tmp_type);
|
lower = f77_get_lowerbound (tmp_type);
|
||||||
|
|
||||||
@ -787,12 +949,17 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
array_size_array[nargs - i - 1] = upper - lower + 1;
|
array_size_array[nargs - i - 1] = upper - lower + 1;
|
||||||
|
|
||||||
/* Zero-normalize subscripts so that offsetting will work. */
|
/* Zero-normalize subscripts so that offsetting will work. */
|
||||||
@@ -1698,15 +1705,20 @@ evaluate_subexp_standard (struct type *e
|
@@ -1696,17 +1710,25 @@ evaluate_subexp_standard (struct type *e
|
||||||
|
tmp_type = check_typedef (TYPE_TARGET_TYPE (tmp_type));
|
||||||
|
}
|
||||||
|
|
||||||
/* Now let us calculate the offset for this item */
|
- /* Now let us calculate the offset for this item */
|
||||||
|
+ /* Kept for the f77_get_upperbound / f77_get_lowerbound calls above. */
|
||||||
|
+ do_cleanups (old_chain);
|
||||||
|
|
||||||
- offset_item = subscript_array[ndimensions - 1];
|
- offset_item = subscript_array[ndimensions - 1];
|
||||||
-
|
+ /* Now let us calculate the offset for this item */
|
||||||
|
|
||||||
- for (i = ndimensions - 1; i > 0; --i)
|
- for (i = ndimensions - 1; i > 0; --i)
|
||||||
- offset_item =
|
- offset_item =
|
||||||
- array_size_array[i - 1] * offset_item + subscript_array[i - 1];
|
- array_size_array[i - 1] * offset_item + subscript_array[i - 1];
|
||||||
@ -815,7 +982,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
/* Let us now play a dirty trick: we will take arg1
|
/* Let us now play a dirty trick: we will take arg1
|
||||||
which is a value node pointing to the topmost level
|
which is a value node pointing to the topmost level
|
||||||
@@ -1716,7 +1728,7 @@ evaluate_subexp_standard (struct type *e
|
@@ -1716,7 +1738,7 @@ evaluate_subexp_standard (struct type *e
|
||||||
returns the correct type value */
|
returns the correct type value */
|
||||||
|
|
||||||
deprecated_set_value_type (arg1, tmp_type);
|
deprecated_set_value_type (arg1, tmp_type);
|
||||||
@ -824,7 +991,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
}
|
}
|
||||||
|
|
||||||
case BINOP_LOGICAL_AND:
|
case BINOP_LOGICAL_AND:
|
||||||
@@ -2300,9 +2312,12 @@ evaluate_subexp_for_sizeof (struct expre
|
@@ -2300,9 +2322,12 @@ evaluate_subexp_for_sizeof (struct expre
|
||||||
|
|
||||||
case OP_VAR_VALUE:
|
case OP_VAR_VALUE:
|
||||||
(*pos) += 4;
|
(*pos) += 4;
|
||||||
@ -840,8 +1007,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
|
val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
|
||||||
--- ./gdb/f-lang.h 2008-10-29 10:55:07.000000000 +0100
|
--- ./gdb/f-lang.h 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/f-lang.h 2008-10-29 21:32:13.000000000 +0100
|
+++ ./gdb/f-lang.h 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -28,6 +28,10 @@ extern void f_error (char *); /* Defined
|
@@ -28,6 +28,10 @@ extern void f_error (char *); /* Defined
|
||||||
extern void f_print_type (struct type *, char *, struct ui_file *, int,
|
extern void f_print_type (struct type *, char *, struct ui_file *, int,
|
||||||
int);
|
int);
|
||||||
@ -853,8 +1020,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
extern int f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
|
extern int f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
|
||||||
struct ui_file *, int, int, int,
|
struct ui_file *, int, int, int,
|
||||||
enum val_prettyprint);
|
enum val_prettyprint);
|
||||||
--- ./gdb/f-typeprint.c 2008-10-29 10:55:07.000000000 +0100
|
--- ./gdb/f-typeprint.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/f-typeprint.c 2008-11-01 17:51:42.000000000 +0100
|
+++ ./gdb/f-typeprint.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -31,7 +31,7 @@
|
@@ -31,7 +31,7 @@
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
@ -990,8 +1157,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
if (passed_a_ptr)
|
if (passed_a_ptr)
|
||||||
fprintf_filtered (stream, ")");
|
fprintf_filtered (stream, ")");
|
||||||
|
|
||||||
--- ./gdb/f-valprint.c 2008-10-29 20:48:30.000000000 +0100
|
--- ./gdb/f-valprint.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/f-valprint.c 2008-11-01 17:55:30.000000000 +0100
|
+++ ./gdb/f-valprint.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -54,15 +54,17 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIM
|
@@ -54,15 +54,17 @@ int f77_array_offset_tbl[MAX_FORTRAN_DIM
|
||||||
/* The following macro gives us the size of the nth dimension, Where
|
/* The following macro gives us the size of the nth dimension, Where
|
||||||
n is 1 based. */
|
n is 1 based. */
|
||||||
@ -1111,8 +1278,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
CHECK_TYPEDEF (type);
|
CHECK_TYPEDEF (type);
|
||||||
switch (TYPE_CODE (type))
|
switch (TYPE_CODE (type))
|
||||||
{
|
{
|
||||||
--- ./gdb/findvar.c 2008-10-29 10:50:23.000000000 +0100
|
--- ./gdb/findvar.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/findvar.c 2008-11-01 20:13:39.000000000 +0100
|
+++ ./gdb/findvar.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -34,6 +34,7 @@
|
@@ -34,6 +34,7 @@
|
||||||
#include "regcache.h"
|
#include "regcache.h"
|
||||||
#include "user-regs.h"
|
#include "user-regs.h"
|
||||||
@ -1315,8 +1482,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
--- ./gdb/gdbtypes.c 2008-10-29 21:22:30.000000000 +0100
|
--- ./gdb/gdbtypes.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/gdbtypes.c 2008-11-01 20:20:42.000000000 +0100
|
+++ ./gdb/gdbtypes.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -38,6 +38,8 @@
|
@@ -38,6 +38,8 @@
|
||||||
#include "cp-abi.h"
|
#include "cp-abi.h"
|
||||||
#include "gdb_assert.h"
|
#include "gdb_assert.h"
|
||||||
@ -1683,8 +1850,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
--- ./gdb/gdbtypes.h 2008-10-29 20:56:57.000000000 +0100
|
--- ./gdb/gdbtypes.h 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/gdbtypes.h 2008-11-02 11:01:18.000000000 +0100
|
+++ ./gdb/gdbtypes.h 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -310,6 +310,16 @@ enum type_code
|
@@ -310,6 +310,16 @@ enum type_code
|
||||||
#define TYPE_FLAG_NOTTEXT (1 << 17)
|
#define TYPE_FLAG_NOTTEXT (1 << 17)
|
||||||
#define TYPE_NOTTEXT(t) (TYPE_FLAGS (t) & TYPE_FLAG_NOTTEXT)
|
#define TYPE_NOTTEXT(t) (TYPE_FLAGS (t) & TYPE_FLAG_NOTTEXT)
|
||||||
@ -1817,8 +1984,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
extern struct type *create_string_type (struct type *, struct type *);
|
extern struct type *create_string_type (struct type *, struct type *);
|
||||||
|
|
||||||
extern struct type *create_set_type (struct type *, struct type *);
|
extern struct type *create_set_type (struct type *, struct type *);
|
||||||
--- ./gdb/printcmd.c 2008-10-29 10:50:23.000000000 +0100
|
--- ./gdb/printcmd.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/printcmd.c 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/printcmd.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -888,6 +888,11 @@ print_command_1 (char *exp, int inspect,
|
@@ -888,6 +888,11 @@ print_command_1 (char *exp, int inspect,
|
||||||
else
|
else
|
||||||
val = access_value_history (0);
|
val = access_value_history (0);
|
||||||
@ -1832,7 +1999,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
TYPE_CODE (value_type (val)) != TYPE_CODE_VOID))
|
TYPE_CODE (value_type (val)) != TYPE_CODE_VOID))
|
||||||
{
|
{
|
||||||
--- ./gdb/testsuite/gdb.base/vla-overflow.c 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.base/vla-overflow.c 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.base/vla-overflow.c 2008-11-01 17:18:12.000000000 +0100
|
+++ ./gdb/testsuite/gdb.base/vla-overflow.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,30 @@
|
@@ -0,0 +1,30 @@
|
||||||
+/* This testcase is part of GDB, the GNU debugger.
|
+/* This testcase is part of GDB, the GNU debugger.
|
||||||
+
|
+
|
||||||
@ -1865,7 +2032,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ return 0;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
--- ./gdb/testsuite/gdb.base/vla-overflow.exp 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.base/vla-overflow.exp 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.base/vla-overflow.exp 2008-11-01 17:42:32.000000000 +0100
|
+++ ./gdb/testsuite/gdb.base/vla-overflow.exp 2008-11-06 20:51:35.000000000 +0100
|
||||||
@@ -0,0 +1,108 @@
|
@@ -0,0 +1,108 @@
|
||||||
+# Copyright 2008 Free Software Foundation, Inc.
|
+# Copyright 2008 Free Software Foundation, Inc.
|
||||||
+
|
+
|
||||||
@ -1972,11 +2139,11 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+verbose -log "kb_found in abort() = [expr [memory_v_pages_get] * $pagesize / 1024]"
|
+verbose -log "kb_found in abort() = [expr [memory_v_pages_get] * $pagesize / 1024]"
|
||||||
+
|
+
|
||||||
+# `abort' can get expressed as `*__GI_abort'.
|
+# `abort' can get expressed as `*__GI_abort'.
|
||||||
+gdb_test "bt" "in \[^ \]*abort \\(.* in main \\(.*" "Backter after abort()"
|
+gdb_test "bt" "in \[^ \]*abort \\(.* in main \\(.*" "Backtrace after abort()"
|
||||||
+
|
+
|
||||||
+verbose -log "kb_found in bt after abort() = [expr [memory_v_pages_get] * $pagesize / 1024]"
|
+verbose -log "kb_found in bt after abort() = [expr [memory_v_pages_get] * $pagesize / 1024]"
|
||||||
--- ./gdb/testsuite/gdb.base/vla.c 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.base/vla.c 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.base/vla.c 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/testsuite/gdb.base/vla.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,55 @@
|
@@ -0,0 +1,55 @@
|
||||||
+/* This testcase is part of GDB, the GNU debugger.
|
+/* This testcase is part of GDB, the GNU debugger.
|
||||||
+
|
+
|
||||||
@ -2034,7 +2201,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ return 0;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
--- ./gdb/testsuite/gdb.base/vla.exp 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.base/vla.exp 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.base/vla.exp 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/testsuite/gdb.base/vla.exp 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,62 @@
|
@@ -0,0 +1,62 @@
|
||||||
+# Copyright 2008 Free Software Foundation, Inc.
|
+# Copyright 2008 Free Software Foundation, Inc.
|
||||||
+
|
+
|
||||||
@ -2098,8 +2265,135 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+gdb_test "p temp1" " = '1' <repeats 78 times>" "second: print temp1"
|
+gdb_test "p temp1" " = '1' <repeats 78 times>" "second: print temp1"
|
||||||
+gdb_test "p temp2" " = '2' <repeats 78 times>" "second: print temp2"
|
+gdb_test "p temp2" " = '2' <repeats 78 times>" "second: print temp2"
|
||||||
+gdb_test "p temp3" " = '3' <repeats 48 times>" "second: print temp3"
|
+gdb_test "p temp3" " = '3' <repeats 48 times>" "second: print temp3"
|
||||||
|
--- ./gdb/testsuite/gdb.dwarf2/dw2-stripped.c 1970-01-01 01:00:00.000000000 +0100
|
||||||
|
+++ ./gdb/testsuite/gdb.dwarf2/dw2-stripped.c 2008-11-06 20:51:35.000000000 +0100
|
||||||
|
@@ -0,0 +1,42 @@
|
||||||
|
+/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
+
|
||||||
|
+ Copyright 2004 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. */
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* 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)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* `func1' being traced into must have some arguments to dump. */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+func1(int a, int b)
|
||||||
|
+{
|
||||||
|
+ func0 (a,b);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main(void)
|
||||||
|
+{
|
||||||
|
+ func1 (1, 2);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
--- ./gdb/testsuite/gdb.dwarf2/dw2-stripped.exp 1970-01-01 01:00:00.000000000 +0100
|
||||||
|
+++ ./gdb/testsuite/gdb.dwarf2/dw2-stripped.exp 2008-11-06 20:51:35.000000000 +0100
|
||||||
|
@@ -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 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.
|
||||||
|
+
|
||||||
|
+# Minimal DWARF-2 unit test
|
||||||
|
+
|
||||||
|
+# 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 "dw2-stripped"
|
||||||
|
+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}] {
|
||||||
|
+ 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}" "${binfile}" executable {debug additional_flags=-ggdb3}] != "" } {
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+remote_exec build "objcopy -R .debug_loc ${binfile}"
|
||||||
|
+set strip_output [remote_exec build "objdump -h ${binfile}"]
|
||||||
|
+
|
||||||
|
+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)"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+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_exit
|
||||||
|
+gdb_start
|
||||||
|
+gdb_reinitialize_dir $srcdir/$subdir
|
||||||
|
+gdb_load ${binfile}
|
||||||
|
+
|
||||||
|
+# For C programs, "start" should stop in main().
|
||||||
|
+
|
||||||
|
+gdb_test "start" \
|
||||||
|
+ ".*main \\(\\) at .*" \
|
||||||
|
+ "start"
|
||||||
|
+gdb_test "step" \
|
||||||
|
+ "func.* \\(.*\\) at .*" \
|
||||||
|
+ "step"
|
||||||
--- ./gdb/testsuite/gdb.fortran/dynamic.exp 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.fortran/dynamic.exp 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.fortran/dynamic.exp 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/testsuite/gdb.fortran/dynamic.exp 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,141 @@
|
@@ -0,0 +1,141 @@
|
||||||
+# Copyright 2007 Free Software Foundation, Inc.
|
+# Copyright 2007 Free Software Foundation, Inc.
|
||||||
+
|
+
|
||||||
@ -2243,7 +2537,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+# maps to foo::vary(1,3)
|
+# maps to foo::vary(1,3)
|
||||||
+gdb_test "p vart(2,9)" "\\$\[0-9\]* = 10"
|
+gdb_test "p vart(2,9)" "\\$\[0-9\]* = 10"
|
||||||
--- ./gdb/testsuite/gdb.fortran/dynamic.f90 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.fortran/dynamic.f90 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.fortran/dynamic.f90 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/testsuite/gdb.fortran/dynamic.f90 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,97 @@
|
@@ -0,0 +1,97 @@
|
||||||
+! Copyright 2007 Free Software Foundation, Inc.
|
+! Copyright 2007 Free Software Foundation, Inc.
|
||||||
+!
|
+!
|
||||||
@ -2343,7 +2637,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ if (x (3, 1) .ne. 10) call abort
|
+ if (x (3, 1) .ne. 10) call abort
|
||||||
+end
|
+end
|
||||||
--- ./gdb/testsuite/gdb.fortran/string.exp 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.fortran/string.exp 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.fortran/string.exp 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/testsuite/gdb.fortran/string.exp 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,59 @@
|
@@ -0,0 +1,59 @@
|
||||||
+# Copyright 2008 Free Software Foundation, Inc.
|
+# Copyright 2008 Free Software Foundation, Inc.
|
||||||
+
|
+
|
||||||
@ -2405,7 +2699,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+gdb_test "p e" "\\$\[0-9\]* = 'e '" "p e re-set"
|
+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"
|
+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"
|
||||||
--- ./gdb/testsuite/gdb.fortran/string.f90 1970-01-01 01:00:00.000000000 +0100
|
--- ./gdb/testsuite/gdb.fortran/string.f90 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ ./gdb/testsuite/gdb.fortran/string.f90 2008-10-29 21:32:14.000000000 +0100
|
+++ ./gdb/testsuite/gdb.fortran/string.f90 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -0,0 +1,37 @@
|
@@ -0,0 +1,37 @@
|
||||||
+! Copyright 2008 Free Software Foundation, Inc.
|
+! Copyright 2008 Free Software Foundation, Inc.
|
||||||
+!
|
+!
|
||||||
@ -2444,8 +2738,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+ h = 'h'
|
+ h = 'h'
|
||||||
+ call foo (g, h)
|
+ call foo (g, h)
|
||||||
+end
|
+end
|
||||||
--- ./gdb/typeprint.c 2008-10-29 10:50:23.000000000 +0100
|
--- ./gdb/typeprint.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/typeprint.c 2008-10-29 21:32:46.000000000 +0100
|
+++ ./gdb/typeprint.c 2008-11-06 20:51:35.000000000 +0100
|
||||||
@@ -33,6 +33,7 @@
|
@@ -33,6 +33,7 @@
|
||||||
#include "cp-abi.h"
|
#include "cp-abi.h"
|
||||||
#include "typeprint.h"
|
#include "typeprint.h"
|
||||||
@ -2464,8 +2758,43 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
LA_PRINT_TYPE (type, varstring, stream, show, 0);
|
LA_PRINT_TYPE (type, varstring, stream, show, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
--- ./gdb/valarith.c 2008-02-04 01:23:04.000000000 +0100
|
@@ -113,7 +117,8 @@ whatis_exp (char *exp, int show)
|
||||||
+++ ./gdb/valarith.c 2008-11-01 20:17:00.000000000 +0100
|
{
|
||||||
|
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;
|
||||||
|
@@ -123,12 +128,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);
|
||||||
|
|
||||||
|
if (objectprint)
|
||||||
|
@@ -164,8 +170,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
|
||||||
|
--- ./gdb/valarith.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
|
+++ ./gdb/valarith.c 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -39,7 +39,6 @@
|
@@ -39,7 +39,6 @@
|
||||||
#define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
|
#define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
|
||||||
#endif
|
#endif
|
||||||
@ -2601,8 +2930,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
--- ./gdb/valops.c 2008-10-29 20:56:57.000000000 +0100
|
--- ./gdb/valops.c 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/valops.c 2008-10-29 21:57:54.000000000 +0100
|
+++ ./gdb/valops.c 2008-11-06 20:51:35.000000000 +0100
|
||||||
@@ -37,6 +37,7 @@
|
@@ -37,6 +37,7 @@
|
||||||
#include "dictionary.h"
|
#include "dictionary.h"
|
||||||
#include "cp-support.h"
|
#include "cp-support.h"
|
||||||
@ -2611,10 +2940,12 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "gdb_string.h"
|
#include "gdb_string.h"
|
||||||
@@ -504,6 +505,46 @@ value_one (struct type *type, enum lval_
|
@@ -504,6 +505,49 @@ value_one (struct type *type, enum lval_
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+/* object_address_set must be already called before this function. */
|
||||||
|
+
|
||||||
+const char *
|
+const char *
|
||||||
+object_address_data_not_valid (struct type *type)
|
+object_address_data_not_valid (struct type *type)
|
||||||
+{
|
+{
|
||||||
@ -2632,8 +2963,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+
|
+
|
||||||
+/* Return non-zero if the variable is valid. If it is valid the function
|
+/* 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.
|
+ may store the data address (DW_AT_DATA_LOCATION) of TYPE at *ADDRESS_RETURN.
|
||||||
+ You should set *ADDRESS_RETURN as VALUE_ADDRESS (VAL) before calling this
|
+ You must set *ADDRESS_RETURN as VALUE_ADDRESS (VAL) before calling this
|
||||||
+ function as if no DW_AT_DATA_LOCATION is present for TYPE the address at
|
+ 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
|
+ *ADDRESS_RETURN is left unchanged. ADDRESS_RETURN must not be NULL, use
|
||||||
+ object_address_data_not_valid () for just the data validity check. */
|
+ object_address_data_not_valid () for just the data validity check. */
|
||||||
+
|
+
|
||||||
@ -2642,6 +2973,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
+{
|
+{
|
||||||
+ gdb_assert (address_return != NULL);
|
+ gdb_assert (address_return != NULL);
|
||||||
+
|
+
|
||||||
|
+ object_address_set (*address_return);
|
||||||
+ if (object_address_data_not_valid (type) != NULL)
|
+ if (object_address_data_not_valid (type) != NULL)
|
||||||
+ {
|
+ {
|
||||||
+ /* Do not try to evaluate DW_AT_data_location as it may even crash
|
+ /* Do not try to evaluate DW_AT_data_location as it may even crash
|
||||||
@ -2658,7 +2990,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
/* Return a value with type TYPE located at ADDR.
|
/* Return a value with type TYPE located at ADDR.
|
||||||
|
|
||||||
Call value_at only if the data needs to be fetched immediately;
|
Call value_at only if the data needs to be fetched immediately;
|
||||||
@@ -570,12 +611,21 @@ value_at_lazy (struct type *type, CORE_A
|
@@ -570,12 +614,21 @@ value_at_lazy (struct type *type, CORE_A
|
||||||
int
|
int
|
||||||
value_fetch_lazy (struct value *val)
|
value_fetch_lazy (struct value *val)
|
||||||
{
|
{
|
||||||
@ -2685,7 +3017,7 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
|
|
||||||
set_value_lazy (val, 0);
|
set_value_lazy (val, 0);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -887,12 +937,17 @@ struct value *
|
@@ -887,12 +940,17 @@ struct value *
|
||||||
value_coerce_array (struct value *arg1)
|
value_coerce_array (struct value *arg1)
|
||||||
{
|
{
|
||||||
struct type *type = check_typedef (value_type (arg1));
|
struct type *type = check_typedef (value_type (arg1));
|
||||||
@ -2704,8 +3036,8 @@ fortran-dynamic-arrays-HEAD-i.patch
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Given a value which is a function, return a value which is a pointer
|
/* Given a value which is a function, return a value which is a pointer
|
||||||
--- ./gdb/value.h 2008-02-04 01:23:04.000000000 +0100
|
--- ./gdb/value.h 2008-11-06 20:50:14.000000000 +0100
|
||||||
+++ ./gdb/value.h 2008-11-01 20:16:57.000000000 +0100
|
+++ ./gdb/value.h 2008-11-06 20:51:03.000000000 +0100
|
||||||
@@ -284,6 +284,10 @@ extern struct value *value_from_decfloat
|
@@ -284,6 +284,10 @@ extern struct value *value_from_decfloat
|
||||||
const gdb_byte *decbytes);
|
const gdb_byte *decbytes);
|
||||||
extern struct value *value_from_string (char *string);
|
extern struct value *value_from_string (char *string);
|
||||||
|
276
gdb-6.8-ia64-breakpoint-restoration.patch
Normal file
276
gdb-6.8-ia64-breakpoint-restoration.patch
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
gdb/
|
||||||
|
2008-10-28 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
Fix automatic restoration of breakpoints memory for ia64.
|
||||||
|
* ia64-tdep.c (ia64_memory_insert_breakpoint): New comment part for
|
||||||
|
SHADOW_CONTENTS content. Remova variable instr. New variable cleanup.
|
||||||
|
Force automatic breakpoints restoration. PLACED_SIZE and SHADOW_LEN
|
||||||
|
are now set larger, to BUNDLE_LEN - 2.
|
||||||
|
(ia64_memory_remove_breakpoint): Rename variables bundle to bundle_mem
|
||||||
|
and instr to instr_saved. New variables bundle_saved and
|
||||||
|
instr_breakpoint. Comment new reasons why we need to disable automatic
|
||||||
|
restoration of breakpoints. Assert PLACED_SIZE and SHADOW_LEN. New
|
||||||
|
check of the original memory content.
|
||||||
|
(ia64_breakpoint_from_pc): Array breakpoint extended to BUNDLE_LEN.
|
||||||
|
Sanity check the PCPTR parameter SLOTNUM value. New #if check on
|
||||||
|
BREAKPOINT_MAX vs. BUNDLE_LEN. Increase LENPTR to BUNDLE_LEN - 2.
|
||||||
|
|
||||||
|
gdb/testsuite/
|
||||||
|
2008-10-28 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/breakpoint-shadow.exp, gdb.base/breakpoint-shadow.c: New.
|
||||||
|
|
||||||
|
[ RHEL-5 disable of `set breakpoint always-inserted'. ]
|
||||||
|
|
||||||
|
--- ./gdb/ia64-tdep.c 11 Sep 2008 14:23:15 -0000 1.184
|
||||||
|
+++ ./gdb/ia64-tdep.c 28 Oct 2008 10:28:41 -0000
|
||||||
|
@@ -545,7 +545,21 @@ fetch_instruction (CORE_ADDR addr, instr
|
||||||
|
simulators. So I changed the pattern slightly to do "break.i 0x080001"
|
||||||
|
instead. But that didn't work either (I later found out that this
|
||||||
|
pattern was used by the simulator that I was using.) So I ended up
|
||||||
|
- using the pattern seen below. */
|
||||||
|
+ using the pattern seen below.
|
||||||
|
+
|
||||||
|
+ SHADOW_CONTENTS has byte-based addressing (PLACED_ADDRESS and SHADOW_LEN)
|
||||||
|
+ while we need bit-based addressing as the instructions length is 41 bits and
|
||||||
|
+ we must not modify/corrupt the adjacent ones in the same bundle.
|
||||||
|
+ Fortunately we may store larger memory incl. the adjacent bits with the
|
||||||
|
+ original memory content (not the possibly already stored breakpoints there).
|
||||||
|
+ We need to be careful in ia64_memory_remove_breakpoint to always restore
|
||||||
|
+ only the specific bits of this instruction ignoring any adjacent stored
|
||||||
|
+ bits.
|
||||||
|
+
|
||||||
|
+ We use the original addressing with the low nibble 0..2 which gets
|
||||||
|
+ incorrectly interpreted by the generic GDB code as the byte offset of
|
||||||
|
+ SHADOW_CONTENTS. We store whole BUNDLE_LEN bytes just without these two
|
||||||
|
+ possibly skipped bytes. */
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define IA64_BREAKPOINT 0x00002000040LL
|
||||||
|
@@ -559,15 +573,21 @@ ia64_memory_insert_breakpoint (struct gd
|
||||||
|
CORE_ADDR addr = bp_tgt->placed_address;
|
||||||
|
char bundle[BUNDLE_LEN];
|
||||||
|
int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
|
||||||
|
- long long instr;
|
||||||
|
int val;
|
||||||
|
int template;
|
||||||
|
+ struct cleanup *cleanup;
|
||||||
|
|
||||||
|
if (slotnum > 2)
|
||||||
|
error (_("Can't insert breakpoint for slot numbers greater than 2."));
|
||||||
|
|
||||||
|
addr &= ~0x0f;
|
||||||
|
|
||||||
|
+ /* Enable the automatic memory restoration from breakpoints while
|
||||||
|
+ we read our instruction bundle. Otherwise, we could store into
|
||||||
|
+ SHADOW_CONTENTS an already stored breakpoint at the same location.
|
||||||
|
+ In practice it is already being prevented by the DUPLICATE field and
|
||||||
|
+ update_global_location_list. */
|
||||||
|
+ cleanup = make_show_memory_breakpoints_cleanup (0);
|
||||||
|
val = target_read_memory (addr, bundle, BUNDLE_LEN);
|
||||||
|
|
||||||
|
/* Check for L type instruction in 2nd slot, if present then
|
||||||
|
@@ -578,13 +598,18 @@ ia64_memory_insert_breakpoint (struct gd
|
||||||
|
slotnum = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
- instr = slotN_contents (bundle, slotnum);
|
||||||
|
- memcpy (bp_tgt->shadow_contents, &instr, sizeof (instr));
|
||||||
|
- bp_tgt->placed_size = bp_tgt->shadow_len = sizeof (instr);
|
||||||
|
+ /* Slot number 2 may skip at most 2 bytes at the beginning. */
|
||||||
|
+ bp_tgt->placed_size = bp_tgt->shadow_len = BUNDLE_LEN - 2;
|
||||||
|
+
|
||||||
|
+ /* Store the whole bundle, except for the initial skipped bytes by the slot
|
||||||
|
+ number interpreted as bytes offset in PLACED_ADDRESS. */
|
||||||
|
+ memcpy (bp_tgt->shadow_contents, bundle + slotnum, bp_tgt->shadow_len);
|
||||||
|
+
|
||||||
|
replace_slotN_contents (bundle, IA64_BREAKPOINT, slotnum);
|
||||||
|
if (val == 0)
|
||||||
|
- target_write_memory (addr, bundle, BUNDLE_LEN);
|
||||||
|
+ target_write_memory (addr + slotnum, bundle + slotnum, bp_tgt->shadow_len);
|
||||||
|
|
||||||
|
+ do_cleanups (cleanup);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -593,9 +618,9 @@ ia64_memory_remove_breakpoint (struct gd
|
||||||
|
struct bp_target_info *bp_tgt)
|
||||||
|
{
|
||||||
|
CORE_ADDR addr = bp_tgt->placed_address;
|
||||||
|
- char bundle[BUNDLE_LEN];
|
||||||
|
+ char bundle_mem[BUNDLE_LEN], bundle_saved[BUNDLE_LEN];
|
||||||
|
int slotnum = (addr & 0x0f) / SLOT_MULTIPLIER;
|
||||||
|
- long long instr;
|
||||||
|
+ long long instr_breakpoint, instr_saved;
|
||||||
|
int val;
|
||||||
|
int template;
|
||||||
|
struct cleanup *cleanup;
|
||||||
|
@@ -604,23 +629,39 @@ ia64_memory_remove_breakpoint (struct gd
|
||||||
|
|
||||||
|
/* Disable the automatic memory restoration from breakpoints while
|
||||||
|
we read our instruction bundle. Otherwise, the general restoration
|
||||||
|
- mechanism kicks in and ends up corrupting our bundle, because it
|
||||||
|
- is not aware of the concept of instruction bundles. */
|
||||||
|
+ mechanism kicks in and we would possibly remove parts of the adjacent
|
||||||
|
+ placed breakpoints. It is due to our SHADOW_CONTENTS overlapping the real
|
||||||
|
+ breakpoint instruction bits region. */
|
||||||
|
cleanup = make_show_memory_breakpoints_cleanup (1);
|
||||||
|
- val = target_read_memory (addr, bundle, BUNDLE_LEN);
|
||||||
|
+ val = target_read_memory (addr, bundle_mem, BUNDLE_LEN);
|
||||||
|
|
||||||
|
/* Check for L type instruction in 2nd slot, if present then
|
||||||
|
bump up the slot number to the 3rd slot */
|
||||||
|
- template = extract_bit_field (bundle, 0, 5);
|
||||||
|
+ template = extract_bit_field (bundle_mem, 0, 5);
|
||||||
|
if (slotnum == 1 && template_encoding_table[template][1] == L)
|
||||||
|
{
|
||||||
|
slotnum = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
- memcpy (&instr, bp_tgt->shadow_contents, sizeof instr);
|
||||||
|
- replace_slotN_contents (bundle, instr, slotnum);
|
||||||
|
+ gdb_assert (bp_tgt->placed_size == BUNDLE_LEN - 2);
|
||||||
|
+ gdb_assert (bp_tgt->placed_size == bp_tgt->shadow_len);
|
||||||
|
+
|
||||||
|
+ instr_breakpoint = slotN_contents (bundle_mem, slotnum);
|
||||||
|
+ if (instr_breakpoint != IA64_BREAKPOINT)
|
||||||
|
+ warning (_("Breakpoint removal cannot find the placed breakpoint at %s"),
|
||||||
|
+ paddr_nz (bp_tgt->placed_address));
|
||||||
|
+
|
||||||
|
+ /* Extract the original saved instruction from SLOTNUM normalizing its
|
||||||
|
+ bit-shift for INSTR_SAVED. */
|
||||||
|
+ memcpy (bundle_saved, bundle_mem, BUNDLE_LEN);
|
||||||
|
+ memcpy (bundle_saved + slotnum, bp_tgt->shadow_contents, bp_tgt->shadow_len);
|
||||||
|
+ instr_saved = slotN_contents (bundle_saved, slotnum);
|
||||||
|
+
|
||||||
|
+ /* In BUNDLE_MEM be careful to modify only the bits belonging to SLOTNUM and
|
||||||
|
+ never any other possibly also stored in SHADOW_CONTENTS. */
|
||||||
|
+ replace_slotN_contents (bundle_mem, instr_saved, slotnum);
|
||||||
|
if (val == 0)
|
||||||
|
- target_write_memory (addr, bundle, BUNDLE_LEN);
|
||||||
|
+ target_write_memory (addr, bundle_mem, BUNDLE_LEN);
|
||||||
|
|
||||||
|
do_cleanups (cleanup);
|
||||||
|
return val;
|
||||||
|
@@ -631,12 +672,18 @@ ia64_memory_remove_breakpoint (struct gd
|
||||||
|
const unsigned char *
|
||||||
|
ia64_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
|
||||||
|
{
|
||||||
|
- static unsigned char breakpoint[] =
|
||||||
|
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
- *lenptr = sizeof (breakpoint);
|
||||||
|
-#if 0
|
||||||
|
- *pcptr &= ~0x0f;
|
||||||
|
+ static unsigned char breakpoint[BUNDLE_LEN];
|
||||||
|
+ int slotnum = (int) (*pcptr & 0x0f) / SLOT_MULTIPLIER;
|
||||||
|
+
|
||||||
|
+ if (slotnum > 2)
|
||||||
|
+ error (_("Can't insert breakpoint for slot numbers greater than 2."));
|
||||||
|
+
|
||||||
|
+#if BREAKPOINT_MAX < BUNDLE_LEN
|
||||||
|
+# error "BREAKPOINT_MAX < BUNDLE_LEN"
|
||||||
|
#endif
|
||||||
|
+
|
||||||
|
+ *lenptr = BUNDLE_LEN - 2;
|
||||||
|
+
|
||||||
|
return breakpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||||
|
+++ ./gdb/testsuite/gdb.base/breakpoint-shadow.c 28 Oct 2008 10:28:41 -0000
|
||||||
|
@@ -0,0 +1,27 @@
|
||||||
|
+/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
+
|
||||||
|
+ Copyright 2008 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+ This program is free software; you can redistribute it and/or modify
|
||||||
|
+ it under the terms of the GNU General Public License as published by
|
||||||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||||||
|
+ (at your option) any later version.
|
||||||
|
+
|
||||||
|
+ This program is distributed in the hope that it will be useful,
|
||||||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+ You should have received a copy of the GNU General Public License
|
||||||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main (void)
|
||||||
|
+{
|
||||||
|
+ volatile int i;
|
||||||
|
+
|
||||||
|
+ i = 1; /* break-first */
|
||||||
|
+ i = 2; /* break-second */
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||||
|
+++ ./gdb/testsuite/gdb.base/breakpoint-shadow.exp 28 Oct 2008 10:28:41 -0000
|
||||||
|
@@ -0,0 +1,65 @@
|
||||||
|
+# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+set testfile breakpoint-shadow
|
||||||
|
+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}
|
||||||
|
+
|
||||||
|
+# We need to start the inferior to place the breakpoints in the memory at all.
|
||||||
|
+if { [gdb_start_cmd] < 0 } {
|
||||||
|
+ untested start
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+gdb_test "" "main \\(\\) at .*" "start"
|
||||||
|
+
|
||||||
|
+# The default "auto" mode removes all the breakpoints when we stop (and not
|
||||||
|
+# running the nonstop mode). We would not be able to test the shadow.
|
||||||
|
+#RHEL-5:
|
||||||
|
+#gdb_test "set breakpoint always-inserted on"
|
||||||
|
+#gdb_test "show breakpoint always-inserted" "Always inserted breakpoint mode is on."
|
||||||
|
+
|
||||||
|
+set match "\nDump of assembler code for function main:\r\n(.*)End of assembler dump.\r\n$gdb_prompt $"
|
||||||
|
+
|
||||||
|
+set test "disassembly without breakpoints"
|
||||||
|
+gdb_test_multiple "disass main" $test {
|
||||||
|
+ -re $match {
|
||||||
|
+ set orig $expect_out(1,string)
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+gdb_test "b [gdb_get_line_number "break-first"]" "Breakpoint \[0-9\] at .*" "First breakpoint placed"
|
||||||
|
+gdb_test "b [gdb_get_line_number "break-second"]" "Breakpoint \[0-9\] at .*" "Second breakpoint placed"
|
||||||
|
+
|
||||||
|
+set test "disassembly with breakpoints"
|
||||||
|
+gdb_test_multiple "disass main" $test {
|
||||||
|
+ -re $match {
|
||||||
|
+ set got $expect_out(1,string)
|
||||||
|
+ if [string equal -nocase $orig $got] {
|
||||||
|
+ pass $test
|
||||||
|
+ } else {
|
||||||
|
+ fail $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
@ -624,7 +624,7 @@ Index: gdb-6.8/gdb/dwarf2loc.c
|
|||||||
|
|
||||||
#include "elf/dwarf2.h"
|
#include "elf/dwarf2.h"
|
||||||
#include "dwarf2expr.h"
|
#include "dwarf2expr.h"
|
||||||
@@ -145,14 +146,19 @@ dwarf_expr_frame_base (void *baton, gdb_
|
@@ -145,7 +146,10 @@ dwarf_expr_frame_base (void *baton, gdb_
|
||||||
struct symbol *framefunc;
|
struct symbol *framefunc;
|
||||||
struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
|
struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
|
||||||
|
|
||||||
@ -636,16 +636,6 @@ Index: gdb-6.8/gdb/dwarf2loc.c
|
|||||||
|
|
||||||
/* If we found a frame-relative symbol then it was certainly within
|
/* 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,
|
some function associated with a frame. If we can't find the frame,
|
||||||
something has gone wrong. */
|
|
||||||
gdb_assert (framefunc != NULL);
|
|
||||||
|
|
||||||
- if (SYMBOL_OPS (framefunc) == &dwarf2_loclist_funcs)
|
|
||||||
+ if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
|
|
||||||
+ *start = NULL;
|
|
||||||
+ else if (SYMBOL_OPS (framefunc) == &dwarf2_loclist_funcs)
|
|
||||||
{
|
|
||||||
struct dwarf2_loclist_baton *symbaton;
|
|
||||||
struct frame_info *frame = debaton->frame;
|
|
||||||
Index: gdb-6.8/gdb/dwarf2read.c
|
Index: gdb-6.8/gdb/dwarf2read.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- gdb-6.8.orig/gdb/dwarf2read.c 2008-07-14 10:28:30.000000000 +0200
|
--- gdb-6.8.orig/gdb/dwarf2read.c 2008-07-14 10:28:30.000000000 +0200
|
||||||
|
File diff suppressed because it is too large
Load Diff
21
gdb.spec
21
gdb.spec
@ -192,9 +192,6 @@ Patch178: gdb-6.3-catch-debug-registers-error-20060527.patch
|
|||||||
# ia32el.
|
# ia32el.
|
||||||
Patch179: gdb-6.3-ia32el-fix-waitpid-20060615.patch
|
Patch179: gdb-6.3-ia32el-fix-waitpid-20060615.patch
|
||||||
|
|
||||||
# Testcase for corrupted or missing location list information (BZ 196439).
|
|
||||||
Patch187: gdb-6.5-bz196439-valgrind-memcheck-compat-test.patch
|
|
||||||
|
|
||||||
# Fix debuginfo addresses resolving for --emit-relocs Linux kernels (BZ 203661).
|
# Fix debuginfo addresses resolving for --emit-relocs Linux kernels (BZ 203661).
|
||||||
Patch188: gdb-6.5-bz203661-emit-relocs.patch
|
Patch188: gdb-6.5-bz203661-emit-relocs.patch
|
||||||
|
|
||||||
@ -342,8 +339,8 @@ Patch304: gdb-6.7-kernel-headers-compat.patch
|
|||||||
|
|
||||||
# Fix/implement the Fortran dynamic arrays support (BZ 377541).
|
# Fix/implement the Fortran dynamic arrays support (BZ 377541).
|
||||||
# Fix the variable-length-arrays support (BZ 468266, feature BZ 377541).
|
# Fix the variable-length-arrays support (BZ 468266, feature BZ 377541).
|
||||||
Patch339: gdb-6.8-bz377541-vla-bound-undefined.patch
|
Patch345: gdb-6.8-bz377541-vla-bound-undefined.patch
|
||||||
Patch340: gdb-6.8-bz377541-vla-loc-kind.patch
|
Patch346: gdb-6.8-bz377541-vla-loc-kind.patch
|
||||||
Patch305: gdb-6.8-bz377541-vla.patch
|
Patch305: gdb-6.8-bz377541-vla.patch
|
||||||
|
|
||||||
# Backport fix of a segfault + PIE regression since 6.7.1 on PIE executables.
|
# Backport fix of a segfault + PIE regression since 6.7.1 on PIE executables.
|
||||||
@ -419,8 +416,11 @@ Patch337: gdb-6.8-attach-signalled-detach-stopped.patch
|
|||||||
# Fix occasional crash on a removed watchpoint.
|
# Fix occasional crash on a removed watchpoint.
|
||||||
Patch338: gdb-6.8-breakpoint-gone.patch
|
Patch338: gdb-6.8-breakpoint-gone.patch
|
||||||
|
|
||||||
|
# Fix occasional stepping lockup on many threads, seen on ia64.
|
||||||
|
Patch342: gdb-6.8-ia64-breakpoint-restoration.patch
|
||||||
|
|
||||||
# Test the watchpoints conditionals works.
|
# Test the watchpoints conditionals works.
|
||||||
Patch343: gdb-6.8-watchpoint-cond-test.patch
|
Patch343: gdb-6.8-watchpoint-conditionals-test.patch
|
||||||
|
|
||||||
BuildRequires: ncurses-devel glibc-devel gcc make gzip texinfo dejagnu gettext
|
BuildRequires: ncurses-devel glibc-devel gcc make gzip texinfo dejagnu gettext
|
||||||
BuildRequires: flex bison sharutils expat-devel
|
BuildRequires: flex bison sharutils expat-devel
|
||||||
@ -545,7 +545,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||||||
%patch177 -p1
|
%patch177 -p1
|
||||||
%patch178 -p1
|
%patch178 -p1
|
||||||
%patch179 -p1
|
%patch179 -p1
|
||||||
%patch187 -p1
|
|
||||||
%patch188 -p1
|
%patch188 -p1
|
||||||
%patch190 -p1
|
%patch190 -p1
|
||||||
%patch194 -p1
|
%patch194 -p1
|
||||||
@ -595,8 +594,8 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||||||
%patch298 -p1
|
%patch298 -p1
|
||||||
%patch301 -p1
|
%patch301 -p1
|
||||||
%patch304 -p1
|
%patch304 -p1
|
||||||
%patch339 -p1
|
%patch345 -p1
|
||||||
%patch340 -p1
|
%patch346 -p1
|
||||||
%patch305 -p1
|
%patch305 -p1
|
||||||
%patch306 -p1
|
%patch306 -p1
|
||||||
%patch309 -p1
|
%patch309 -p1
|
||||||
@ -624,6 +623,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||||||
%patch336 -p1
|
%patch336 -p1
|
||||||
%patch337 -p1
|
%patch337 -p1
|
||||||
%patch338 -p1
|
%patch338 -p1
|
||||||
|
%patch342 -p1
|
||||||
%patch343 -p1
|
%patch343 -p1
|
||||||
%patch124 -p1
|
%patch124 -p1
|
||||||
|
|
||||||
@ -889,7 +889,10 @@ fi
|
|||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Tue Nov 4 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8-26
|
* Tue Nov 4 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8-26
|
||||||
|
- Fix more the variable-length-arrays support (BZ 468266, feature BZ 377541).
|
||||||
- Fix the watchpoints conditionals.
|
- Fix the watchpoints conditionals.
|
||||||
|
- Fix on PPC spurious SIGTRAPs on active watchpoints.
|
||||||
|
- Fix occasional stepping lockup on many threads, seen on ia64.
|
||||||
|
|
||||||
* Mon Nov 3 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8-25
|
* Mon Nov 3 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8-25
|
||||||
- Fix the variable-length-arrays support (BZ 468266, feature BZ 377541).
|
- Fix the variable-length-arrays support (BZ 468266, feature BZ 377541).
|
||||||
|
Loading…
Reference in New Issue
Block a user