[vla] Fix VLA arrays displayed in `bt full' (BZ 738482).

Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
This commit is contained in:
Jan Kratochvil 2011-09-26 22:59:43 +02:00
parent f999815e29
commit b37d386529
4 changed files with 642 additions and 1 deletions

View File

@ -0,0 +1,110 @@
http://sourceware.org/ml/gdb-patches/2011-09/msg00450.html
Subject: [patch 1/2] Code cleanup: Unify dwarf2_per_cu_addr_size, dwarf2_per_cu_offset_size
Hi,
this is more rather for patch 2/2, it has positive LoC change but still
I would find it applicable even on its own.
No functionality change intended.
Thanks,
Jan
gdb/
2011-09-26 Jan Kratochvil <jan.kratochvil@redhat.com>
Code cleanup.
* dwarf2read.c (per_cu_header_read_in): New function.
(dwarf2_per_cu_addr_size, dwarf2_per_cu_offset_size): Use it, with new
variables cu_header_local and cu_headerp.
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -15187,26 +15187,42 @@ dwarf2_per_cu_objfile (struct dwarf2_per_cu_data *per_cu)
return objfile;
}
+/* Return comp_unit_head for PER_CU, either already available in PER_CU->CU
+ (CU_HEADERP is unused in such case) or prepare a temporary copy at
+ CU_HEADERP first. */
+
+static const struct comp_unit_head *
+per_cu_header_read_in (struct comp_unit_head *cu_headerp,
+ struct dwarf2_per_cu_data *per_cu)
+{
+ struct objfile *objfile;
+ struct dwarf2_per_objfile *per_objfile;
+ gdb_byte *info_ptr;
+
+ if (per_cu->cu)
+ return &per_cu->cu->header;
+
+ objfile = per_cu->objfile;
+ per_objfile = objfile_data (objfile, dwarf2_objfile_data_key);
+ info_ptr = per_objfile->info.buffer + per_cu->offset;
+
+ memset (cu_headerp, 0, sizeof (*cu_headerp));
+ read_comp_unit_head (cu_headerp, info_ptr, objfile->obfd);
+
+ return cu_headerp;
+}
+
/* Return the address size given in the compilation unit header for CU. */
CORE_ADDR
dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *per_cu)
{
- if (per_cu->cu)
- return per_cu->cu->header.addr_size;
- else
- {
- /* If the CU is not currently read in, we re-read its header. */
- struct objfile *objfile = per_cu->objfile;
- struct dwarf2_per_objfile *per_objfile
- = objfile_data (objfile, dwarf2_objfile_data_key);
- gdb_byte *info_ptr = per_objfile->info.buffer + per_cu->offset;
- struct comp_unit_head cu_header;
+ struct comp_unit_head cu_header_local;
+ const struct comp_unit_head *cu_headerp;
- memset (&cu_header, 0, sizeof cu_header);
- read_comp_unit_head (&cu_header, info_ptr, objfile->obfd);
- return cu_header.addr_size;
- }
+ cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
+
+ return cu_headerp->addr_size;
}
/* Return the offset size given in the compilation unit header for CU. */
@@ -15214,21 +15230,12 @@ dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *per_cu)
int
dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *per_cu)
{
- if (per_cu->cu)
- return per_cu->cu->header.offset_size;
- else
- {
- /* If the CU is not currently read in, we re-read its header. */
- struct objfile *objfile = per_cu->objfile;
- struct dwarf2_per_objfile *per_objfile
- = objfile_data (objfile, dwarf2_objfile_data_key);
- gdb_byte *info_ptr = per_objfile->info.buffer + per_cu->offset;
- struct comp_unit_head cu_header;
+ struct comp_unit_head cu_header_local;
+ const struct comp_unit_head *cu_headerp;
- memset (&cu_header, 0, sizeof cu_header);
- read_comp_unit_head (&cu_header, info_ptr, objfile->obfd);
- return cu_header.offset_size;
- }
+ cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
+
+ return cu_headerp->offset_size;
}
/* Return the text offset of the CU. The returned offset comes from

View File

@ -0,0 +1,426 @@
http://sourceware.org/ml/gdb-patches/2011-09/msg00451.html
Subject: [patch 2/2] Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches
Hi,
on 64-bit targets DWARF-3+ is used DW_OP_GNU_implicit_pointer does not work.
DWARF-2 says:
This type of reference (DW_FORM_ref_addr) is the size of an address on
the target architecture;
DWARF-3 says:
1.5.1 Upward Compatibility
References that use the attribute form DW_FORM_ref_addr are specified
to be four bytes in the DWARF 32-bit format and eight bytes in the
DWARF 64-bit format, while DWARF Version 2 specifies that such
references have the same size as an address on the target system (see
Sections 7.4 and 7.5.4).
(DW_FORM_ref_addr)
In the 32-bit DWARF format, this offset is a 4-byte unsigned value; in
the 64-bit DWARF format, it is an 8-byte unsigned value (see Section
7.4).
GDB currently parsed DW_OP_GNU_implicit_pointer the DWARF-2 way, being
incompatible with DWARF-3+.
I think DW_OP_GNU_implicit_pointer does not make sense to be used from
.debug_frame (DWARF-5 is not yet released to say more) so for .debug_frame its
use is just not permitted (the code would be more complicated otherwise).
No regressions on {x86_64,x86_64-m32,i686}-fedora16pre-linux-gnu.
Thanks,
Jan
gdb/
2011-09-26 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
* dwarf2-frame.c (execute_stack_op): Initialize ctx->ref_addr_size.
* dwarf2expr.c (execute_stack_op) <DW_OP_GNU_implicit_pointer>: Use
ctx->ref_addr_size. Handle its invalid value.
* dwarf2expr.h (struct dwarf_expr_context): New field ref_addr_size.
* dwarf2loc.c (dwarf2_evaluate_loc_desc_full)
(dwarf2_loc_desc_needs_frame): Initialize ctx->ref_addr_size.
* dwarf2loc.h (dwarf2_per_cu_ref_addr_size): New declaration.
* dwarf2read.c (decode_locdesc): Initialize ctx->ref_addr_size.
(dwarf2_per_cu_ref_addr_size): New function.
gdb/testsuite/
2011-09-26 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
* gdb.dwarf2/implptr-64bit.S: New file.
* gdb.dwarf2/implptr-64bit.exp: New file.
Index: gdb-7.3/gdb/dwarf2-frame.c
===================================================================
--- gdb-7.3.orig/gdb/dwarf2-frame.c 2011-03-18 19:52:30.000000000 +0100
+++ gdb-7.3/gdb/dwarf2-frame.c 2011-09-26 22:38:52.000000000 +0200
@@ -397,6 +397,7 @@ execute_stack_op (const gdb_byte *exp, U
ctx->gdbarch = get_frame_arch (this_frame);
ctx->addr_size = addr_size;
+ ctx->ref_addr_size = -1;
ctx->offset = offset;
ctx->baton = this_frame;
ctx->read_reg = read_reg;
Index: gdb-7.3/gdb/dwarf2expr.c
===================================================================
--- gdb-7.3.orig/gdb/dwarf2expr.c 2011-09-26 22:38:34.000000000 +0200
+++ gdb-7.3/gdb/dwarf2expr.c 2011-09-26 22:38:52.000000000 +0200
@@ -539,10 +539,14 @@ execute_stack_op (struct dwarf_expr_cont
ULONGEST die;
LONGEST len;
+ if (ctx->ref_addr_size == -1)
+ error (_("DWARF-2 expression error: DW_OP_GNU_implicit_pointer "
+ "is not allowed in frame context"));
+
/* The referred-to DIE. */
- ctx->len = extract_unsigned_integer (op_ptr, ctx->addr_size,
+ ctx->len = extract_unsigned_integer (op_ptr, ctx->ref_addr_size,
byte_order);
- op_ptr += ctx->addr_size;
+ op_ptr += ctx->ref_addr_size;
/* The byte offset into the data. */
op_ptr = read_sleb128 (op_ptr, op_end, &len);
Index: gdb-7.3/gdb/dwarf2expr.h
===================================================================
--- gdb-7.3.orig/gdb/dwarf2expr.h 2011-09-26 22:38:34.000000000 +0200
+++ gdb-7.3/gdb/dwarf2expr.h 2011-09-26 22:38:52.000000000 +0200
@@ -78,6 +78,10 @@ struct dwarf_expr_context
/* Target address size in bytes. */
int addr_size;
+ /* DW_FORM_ref_addr size in bytes. If -1 DWARF is executed from a frame
+ context and operations depending on DW_FORM_ref_addr are not allowed. */
+ int ref_addr_size;
+
/* Offset used to relocate DW_OP_addr argument. */
CORE_ADDR offset;
Index: gdb-7.3/gdb/dwarf2loc.c
===================================================================
--- gdb-7.3.orig/gdb/dwarf2loc.c 2011-09-26 22:38:34.000000000 +0200
+++ gdb-7.3/gdb/dwarf2loc.c 2011-09-26 22:39:12.000000000 +0200
@@ -372,6 +372,7 @@ dwarf_expr_prep_ctx (struct frame_info *
ctx->gdbarch = get_objfile_arch (objfile);
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
+ ctx->ref_addr_size = dwarf2_per_cu_ref_addr_size (per_cu);
ctx->offset = dwarf2_per_cu_text_offset (per_cu);
ctx->baton = &baton;
ctx->read_reg = dwarf_expr_read_reg;
@@ -1507,6 +1508,7 @@ dwarf2_loc_desc_needs_frame (const gdb_b
ctx->gdbarch = get_objfile_arch (objfile);
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
+ ctx->ref_addr_size = dwarf2_per_cu_ref_addr_size (per_cu);
ctx->offset = dwarf2_per_cu_text_offset (per_cu);
ctx->baton = &baton;
ctx->read_reg = needs_frame_read_reg;
Index: gdb-7.3/gdb/dwarf2loc.h
===================================================================
--- gdb-7.3.orig/gdb/dwarf2loc.h 2011-09-26 22:38:34.000000000 +0200
+++ gdb-7.3/gdb/dwarf2loc.h 2011-09-26 22:38:52.000000000 +0200
@@ -39,6 +39,10 @@ struct objfile *dwarf2_per_cu_objfile (s
/* Return the address size given in the compilation unit header for CU. */
CORE_ADDR dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *cu);
+/* Return the DW_FORM_ref_addr size given in the compilation unit header for
+ CU. */
+int dwarf2_per_cu_ref_addr_size (struct dwarf2_per_cu_data *cu);
+
/* Return the offset size given in the compilation unit header for CU. */
int dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *cu);
Index: gdb-7.3/gdb/dwarf2read.c
===================================================================
--- gdb-7.3.orig/gdb/dwarf2read.c 2011-09-26 22:38:38.000000000 +0200
+++ gdb-7.3/gdb/dwarf2read.c 2011-09-26 22:38:52.000000000 +0200
@@ -15277,6 +15277,22 @@ dwarf2_per_cu_offset_size (struct dwarf2
return cu_headerp->offset_size;
}
+/* See its dwarf2loc.h declaration. */
+
+int
+dwarf2_per_cu_ref_addr_size (struct dwarf2_per_cu_data *per_cu)
+{
+ struct comp_unit_head cu_header_local;
+ const struct comp_unit_head *cu_headerp;
+
+ cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
+
+ if (cu_headerp->version == 2)
+ return cu_headerp->addr_size;
+ else
+ return cu_headerp->offset_size;
+}
+
/* Return the text offset of the CU. The returned offset comes from
this CU's objfile. If this objfile came from a separate debuginfo
file, then the offset may be different from the corresponding
Index: gdb-7.3/gdb/testsuite/gdb.dwarf2/implptr-64bit.S
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.3/gdb/testsuite/gdb.dwarf2/implptr-64bit.S 2011-09-26 22:38:52.000000000 +0200
@@ -0,0 +1,197 @@
+/* Copyright 2010, 2011 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/>. */
+
+ .section .debug_info
+d:
+ /* Length of Compilation Unit Info */
+#if OFFSET_SIZE == 4
+# define OFFSET .4byte
+ .4byte debug_end - 1f
+#elif OFFSET_SIZE == 8
+# define OFFSET .8byte
+ .4byte 0xffffffff
+ .8byte debug_end - 1f
+#else
+# error
+#endif
+#if ADDR_SIZE == 4
+# define ADDR .4byte
+#elif ADDR_SIZE == 8
+# define ADDR .8byte
+#else
+# error
+#endif
+#if REF_ADDR_SIZE == 4
+# define REF_ADDR .4byte
+#elif REF_ADDR_SIZE == 8
+# define REF_ADDR .8byte
+#else
+# error
+#endif
+1:
+ .2byte DWARF_VERSION /* DWARF version number */
+ OFFSET .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+ .byte ADDR_SIZE /* Pointer Size (in bytes) */
+
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
+ .ascii "GNU C 4.4.3\0" /* DW_AT_producer */
+ .byte 0x1 /* DW_AT_language */
+ .ascii "1.c\0" /* DW_AT_name */
+
+.Ltype_int:
+ .uleb128 0x7 /* DW_TAG_base_type */
+ .byte 0x4 /* DW_AT_byte_size */
+ .byte 0x5 /* DW_AT_encoding */
+ .ascii "int\0" /* DW_AT_name */
+
+.Ltype_struct:
+ .uleb128 0x2 /* DW_TAG_structure_type */
+ .ascii "s\0" /* DW_AT_name */
+ .byte 4 /* DW_AT_byte_size */
+
+ .uleb128 0x3 /* DW_TAG_member */
+ .ascii "f\0" /* DW_AT_name */
+ .4byte .Ltype_int - d /* DW_AT_type */
+ .byte 0 /* DW_AT_data_member_location */
+
+ .byte 0x0 /* end of children of DW_TAG_structure_type */
+
+ .uleb128 6 /* Abbrev: DW_TAG_subprogram */
+ .ascii "main\0" /* DW_AT_name */
+ ADDR main /* DW_AT_low_pc */
+ ADDR main + 0x100 /* DW_AT_high_pc */
+ .4byte .Ltype_int - d /* DW_AT_type */
+ .byte 1 /* DW_AT_external */
+
+.Ltype_structptr:
+ .uleb128 0x5 /* DW_TAG_pointer_type */
+ .byte ADDR_SIZE /* DW_AT_byte_size */
+ .4byte .Ltype_struct - d /* DW_AT_type */
+
+.Lvar_out:
+ .uleb128 0x4 /* (DW_TAG_variable) */
+ .ascii "v\0" /* DW_AT_name */
+ .byte 2f - 1f /* DW_AT_location: DW_FORM_block1 */
+1:
+ .byte 0x9e /* DW_OP_implicit_value */
+ .uleb128 2f - 3f
+3:
+ .byte 1, 1, 1, 1
+2:
+ .4byte .Ltype_struct - d /* DW_AT_type */
+
+ .uleb128 0x4 /* (DW_TAG_variable) */
+ .ascii "p\0" /* DW_AT_name */
+ .byte 2f - 1f /* DW_AT_location: DW_FORM_block1 */
+1:
+ .byte 0xf2 /* DW_OP_GNU_implicit_pointer */
+ REF_ADDR .Lvar_out - d /* referenced DIE */
+ .sleb128 0 /* offset */
+2:
+ .4byte .Ltype_structptr - d /* DW_AT_type */
+
+ .byte 0x0 /* end of children of main */
+
+ .byte 0x0 /* end of children of CU */
+debug_end:
+
+ .section .debug_abbrev
+.Ldebug_abbrev0:
+
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0x0
+ .byte 0x0
+
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x13 /* (TAG: DW_TAG_structure_type) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x3 /* (abbrev code) */
+ .uleb128 0xd /* (TAG: DW_TAG_member) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x38 /* (DW_AT_data_member_location) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x4 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0x0 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x02 /* (DW_AT_location) */
+ .uleb128 0xa /* (DW_FORM_block1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0x0
+ .byte 0x0
+
+ .uleb128 0x5 /* (abbrev code) */
+ .uleb128 0xf /* (TAG: DW_TAG_pointer_type) */
+ .byte 0x0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0x0
+ .byte 0x0
+
+ .uleb128 6 /* Abbrev code */
+ .uleb128 0x2e /* DW_TAG_subprogram */
+ .byte 1 /* has_children */
+ .uleb128 0x3 /* DW_AT_name */
+ .uleb128 0x8 /* DW_FORM_string */
+ .uleb128 0x11 /* DW_AT_low_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x12 /* DW_AT_high_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x49 /* DW_AT_type */
+ .uleb128 0x13 /* DW_FORM_ref4 */
+ .uleb128 0x3f /* DW_AT_external */
+ .uleb128 0xc /* DW_FORM_flag */
+ .byte 0x0 /* Terminator */
+ .byte 0x0 /* Terminator */
+
+ .uleb128 0x7 /* (abbrev code) */
+ .uleb128 0x24 /* (TAG: DW_TAG_base_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3e /* (DW_AT_encoding) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0
+ .byte 0
+
+ .byte 0x0
Index: gdb-7.3/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.3/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp 2011-09-26 22:38:52.000000000 +0200
@@ -0,0 +1,51 @@
+# Copyright 2011 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/>.
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+set testfile "implptr-64bit"
+set srcfile ${testfile}.S
+set mainfile main.c
+
+proc test { dwarf_version offset_size addr_size ref_addr_size } {
+ global testfile srcfile mainfile
+
+ set opts {}
+ foreach n { dwarf_version offset_size addr_size ref_addr_size } {
+ lappend opts "additional_flags=-D[string toupper $n]=[expr "\$$n"]"
+ }
+
+ set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}"
+ set executable ${testfile}-${name}
+ if [prepare_for_testing ${testfile}.exp $executable "${srcfile} ${mainfile}" $opts] {
+ return -1
+ }
+
+ if ![runto_main] {
+ return -1
+ }
+
+ gdb_test "p/x p->f" " = 0x1010101" $name
+}
+
+# DWARF_VERSION OFFSET_SIZE ADDR_SIZE REF_ADDR_SIZE
+test 2 8 4 4
+test 2 4 8 8
+test 3 8 4 8
+test 3 4 8 4

91
gdb-vla-frame-set.patch Normal file
View File

@ -0,0 +1,91 @@
commit 51dab9e418741ac7065cd5a6ec9b57285e90227c
https://bugzilla.redhat.com/show_bug.cgi?id=738482
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -1981,6 +1981,10 @@ print_variable_and_value (const char *name, struct symbol *var,
struct value_print_options opts;
val = read_var_value (var, frame);
+
+ make_cleanup_restore_selected_frame ();
+ select_frame (frame);
+
get_user_print_options (&opts);
common_val_print (val, stream, indent, &opts, current_language);
}
--- /dev/null
+++ b/gdb/testsuite/gdb.base/vla-frame.c
@@ -0,0 +1,31 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011 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/>. */
+
+#include <string.h>
+
+int
+main (int argc, char **argv)
+{
+ char s[2 + argc];
+ void (*f) (char *) = 0;
+
+ memset (s, 0, sizeof (s));
+ s[0] = 'X';
+
+ f (s);
+ return 0;
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.base/vla-frame.exp
@@ -0,0 +1,38 @@
+# Copyright 2011 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 vla-frame
+set executable ${testfile}
+
+if { [prepare_for_testing ${testfile}.exp ${executable}] } {
+ return -1
+}
+
+if ![runto_main] {
+ return -1
+}
+
+set test "continue"
+gdb_test_multiple $test $test {
+ -re "Continuing\\.\r\n\r\nProgram received signal SIGSEGV, Segmentation fault\\.\r\n0x0+ in \\?\\? \\(\\)\r\n$gdb_prompt $" {
+ pass $test
+ }
+ -re "\r\n$gdb_prompt $" {
+ untested ${testfile}.exp
+ return
+ }
+}
+
+gdb_test "bt full" "\r\n +s = \"X\\\\000\"\r\n.*"

View File

@ -27,7 +27,7 @@ Version: 7.3
# 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: 43%{?_with_upstream:.upstream}%{?dist}
Release: 44%{?_with_upstream:.upstream}%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
Group: Development/Debuggers
@ -566,6 +566,13 @@ Patch593: gdb-bz701131-readline62-3of3.patch
# [stap] Fix double free.
Patch594: gdb-stap-double-free.patch
# [vla] Fix VLA arrays displayed in `bt full' (BZ 738482).
Patch629: gdb-vla-frame-set.patch
# Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
Patch630: gdb-implptr-64bit-1of2.patch
Patch631: gdb-implptr-64bit-2of2.patch
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
# --without-system-readline
# Requires: readline%{?_isa}
@ -843,6 +850,9 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
%patch592 -p1
%patch593 -p1
%patch594 -p1
%patch629 -p1
%patch630 -p1
%patch631 -p1
%patch393 -p1
%patch335 -p1
@ -1265,6 +1275,10 @@ fi
%{_infodir}/gdb.info*
%changelog
* Mon Sep 26 2011 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.3-44.fc15
- [vla] Fix VLA arrays displayed in `bt full' (BZ 738482).
- Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
* Tue Aug 16 2011 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.3-43.fc15
- Fix sleb128 reading (BZ 720332).