- Archer update to the snapshot: 30c13da4efe18f43ee34aa4b29bc86e1a53de548

- Archer backport: 30c13da4efe18f43ee34aa4b29bc86e1a53de548
- Fix dereferencing unbound C arrays (BZ 505163).
This commit is contained in:
Jan Kratochvil 2009-06-11 21:52:56 +00:00
parent 6fcb74ef6e
commit 859e1355cf
2 changed files with 71 additions and 40 deletions

View File

@ -2,7 +2,7 @@ http://sourceware.org/gdb/wiki/ProjectArcher
http://sourceware.org/gdb/wiki/ArcherBranchManagement http://sourceware.org/gdb/wiki/ArcherBranchManagement
GIT snapshot: GIT snapshot:
commit 000db8b7bfef8581ef099ccca8689cfddfea1be8 commit 30c13da4efe18f43ee34aa4b29bc86e1a53de548
branch `archer' - the merge of branches: branch `archer' - the merge of branches:
archer-jankratochvil-merge-expr archer-jankratochvil-merge-expr
@ -20139,7 +20139,7 @@ index 3a405a8..a2e2636 100644
once for each known thread. */ once for each known thread. */
typedef int (*thread_callback_func) (struct thread_info *, void *); typedef int (*thread_callback_func) (struct thread_info *, void *);
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 8102321..012485c 100644 index 8102321..9899727 100644
--- a/gdb/gdbtypes.c --- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c
@@ -38,6 +38,8 @@ @@ -38,6 +38,8 @@
@ -20345,17 +20345,7 @@ index 8102321..012485c 100644
if (low_bound >= 0) if (low_bound >= 0)
TYPE_UNSIGNED (result_type) = 1; TYPE_UNSIGNED (result_type) = 1;
@@ -727,6 +769,9 @@ get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp) @@ -805,30 +847,56 @@ create_array_type (struct type *result_type,
switch (TYPE_CODE (type))
{
case TYPE_CODE_RANGE:
+ if (TYPE_RANGE_UPPER_BOUND_IS_UNDEFINED (type)
+ || TYPE_RANGE_LOWER_BOUND_IS_UNDEFINED (type))
+ return -1;
*lowp = TYPE_LOW_BOUND (type);
*highp = TYPE_HIGH_BOUND (type);
return 1;
@@ -805,30 +850,56 @@ create_array_type (struct type *result_type,
if (result_type == NULL) if (result_type == NULL)
{ {
@ -20426,7 +20416,7 @@ index 8102321..012485c 100644
return (result_type); return (result_type);
} }
@@ -865,7 +936,12 @@ create_set_type (struct type *result_type, struct type *domain_type) @@ -865,7 +933,12 @@ create_set_type (struct type *result_type, struct type *domain_type)
{ {
if (result_type == NULL) if (result_type == NULL)
{ {
@ -20440,7 +20430,7 @@ index 8102321..012485c 100644
} }
TYPE_CODE (result_type) = TYPE_CODE_SET; TYPE_CODE (result_type) = TYPE_CODE_SET;
TYPE_NFIELDS (result_type) = 1; TYPE_NFIELDS (result_type) = 1;
@@ -1368,6 +1444,84 @@ stub_noname_complaint (void) @@ -1368,6 +1441,84 @@ stub_noname_complaint (void)
complaint (&symfile_complaints, _("stub type has NULL name")); complaint (&symfile_complaints, _("stub type has NULL name"));
} }
@ -20525,7 +20515,7 @@ index 8102321..012485c 100644
/* Added by Bryan Boreham, Kewill, Sun Sep 17 18:07:17 1989. /* Added by Bryan Boreham, Kewill, Sun Sep 17 18:07:17 1989.
If this is a stubbed struct (i.e. declared as struct foo *), see if If this is a stubbed struct (i.e. declared as struct foo *), see if
@@ -1384,7 +1538,8 @@ stub_noname_complaint (void) @@ -1384,7 +1535,8 @@ stub_noname_complaint (void)
/* Find the real type of TYPE. This function returns the real type, /* Find the real type of TYPE. This function returns the real type,
after removing all layers of typedefs and completing opaque or stub after removing all layers of typedefs and completing opaque or stub
types. Completion changes the TYPE argument, but stripping of types. Completion changes the TYPE argument, but stripping of
@ -20535,7 +20525,7 @@ index 8102321..012485c 100644
struct type * struct type *
check_typedef (struct type *type) check_typedef (struct type *type)
@@ -1420,7 +1575,7 @@ check_typedef (struct type *type) @@ -1420,7 +1572,7 @@ check_typedef (struct type *type)
if (sym) if (sym)
TYPE_TARGET_TYPE (type) = SYMBOL_TYPE (sym); TYPE_TARGET_TYPE (type) = SYMBOL_TYPE (sym);
else /* TYPE_CODE_UNDEF */ else /* TYPE_CODE_UNDEF */
@ -20544,7 +20534,7 @@ index 8102321..012485c 100644
} }
type = TYPE_TARGET_TYPE (type); type = TYPE_TARGET_TYPE (type);
} }
@@ -1494,34 +1649,37 @@ check_typedef (struct type *type) @@ -1494,34 +1646,37 @@ check_typedef (struct type *type)
} }
} }
@ -20600,7 +20590,7 @@ index 8102321..012485c 100644
TYPE_TARGET_STUB (type) = 0; TYPE_TARGET_STUB (type) = 0;
} }
else if (TYPE_CODE (type) == TYPE_CODE_RANGE) else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
@@ -1529,9 +1687,12 @@ check_typedef (struct type *type) @@ -1529,9 +1684,12 @@ check_typedef (struct type *type)
TYPE_LENGTH (type) = TYPE_LENGTH (target_type); TYPE_LENGTH (type) = TYPE_LENGTH (target_type);
TYPE_TARGET_STUB (type) = 0; TYPE_TARGET_STUB (type) = 0;
} }
@ -20613,7 +20603,7 @@ index 8102321..012485c 100644
return type; return type;
} }
@@ -1753,7 +1914,7 @@ init_type (enum type_code code, int length, int flags, @@ -1753,7 +1911,7 @@ init_type (enum type_code code, int length, int flags,
{ {
struct type *type; struct type *type;
@ -20622,7 +20612,7 @@ index 8102321..012485c 100644
TYPE_CODE (type) = code; TYPE_CODE (type) = code;
TYPE_LENGTH (type) = length; TYPE_LENGTH (type) = length;
@@ -1783,15 +1944,24 @@ init_type (enum type_code code, int length, int flags, @@ -1783,15 +1941,24 @@ init_type (enum type_code code, int length, int flags,
if (flags & TYPE_FLAG_FIXED_INSTANCE) if (flags & TYPE_FLAG_FIXED_INSTANCE)
TYPE_FIXED_INSTANCE (type) = 1; TYPE_FIXED_INSTANCE (type) = 1;
@ -20656,7 +20646,7 @@ index 8102321..012485c 100644
/* C++ fancies. */ /* C++ fancies. */
@@ -1803,6 +1973,10 @@ init_type (enum type_code code, int length, int flags, @@ -1803,6 +1970,10 @@ init_type (enum type_code code, int length, int flags,
{ {
INIT_CPLUS_SPECIFIC (type); INIT_CPLUS_SPECIFIC (type);
} }
@ -20667,7 +20657,7 @@ index 8102321..012485c 100644
return (type); return (type);
} }
@@ -2916,33 +3090,47 @@ type_pair_eq (const void *item_lhs, const void *item_rhs) @@ -2916,33 +3087,47 @@ type_pair_eq (const void *item_lhs, const void *item_rhs)
} }
/* Allocate the hash table used by copy_type_recursive to walk /* Allocate the hash table used by copy_type_recursive to walk
@ -20730,7 +20720,7 @@ index 8102321..012485c 100644
return type; return type;
/* This type shouldn't be pointing to any types in other objfiles; /* This type shouldn't be pointing to any types in other objfiles;
@@ -2954,11 +3142,15 @@ copy_type_recursive (struct objfile *objfile, @@ -2954,11 +3139,15 @@ copy_type_recursive (struct objfile *objfile,
if (*slot != NULL) if (*slot != NULL)
return ((struct type_pair *) *slot)->new; return ((struct type_pair *) *slot)->new;
@ -20749,7 +20739,7 @@ index 8102321..012485c 100644
stored->old = type; stored->old = type;
stored->new = new_type; stored->new = new_type;
*slot = stored; *slot = stored;
@@ -2968,6 +3160,13 @@ copy_type_recursive (struct objfile *objfile, @@ -2968,6 +3157,13 @@ copy_type_recursive (struct objfile *objfile,
*TYPE_MAIN_TYPE (new_type) = *TYPE_MAIN_TYPE (type); *TYPE_MAIN_TYPE (new_type) = *TYPE_MAIN_TYPE (type);
TYPE_OBJFILE (new_type) = NULL; TYPE_OBJFILE (new_type) = NULL;
@ -20763,7 +20753,7 @@ index 8102321..012485c 100644
if (TYPE_NAME (type)) if (TYPE_NAME (type))
TYPE_NAME (new_type) = xstrdup (TYPE_NAME (type)); TYPE_NAME (new_type) = xstrdup (TYPE_NAME (type));
if (TYPE_TAG_NAME (type)) if (TYPE_TAG_NAME (type))
@@ -2976,12 +3175,45 @@ copy_type_recursive (struct objfile *objfile, @@ -2976,12 +3172,45 @@ copy_type_recursive (struct objfile *objfile,
TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
TYPE_LENGTH (new_type) = TYPE_LENGTH (type); TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
@ -20809,7 +20799,7 @@ index 8102321..012485c 100644
TYPE_FIELDS (new_type) = XCALLOC (nfields, struct field); TYPE_FIELDS (new_type) = XCALLOC (nfields, struct field);
for (i = 0; i < nfields; i++) for (i = 0; i < nfields; i++)
{ {
@@ -2990,8 +3222,8 @@ copy_type_recursive (struct objfile *objfile, @@ -2990,8 +3219,8 @@ copy_type_recursive (struct objfile *objfile,
TYPE_FIELD_BITSIZE (new_type, i) = TYPE_FIELD_BITSIZE (type, i); TYPE_FIELD_BITSIZE (new_type, i) = TYPE_FIELD_BITSIZE (type, i);
if (TYPE_FIELD_TYPE (type, i)) if (TYPE_FIELD_TYPE (type, i))
TYPE_FIELD_TYPE (new_type, i) TYPE_FIELD_TYPE (new_type, i)
@ -20820,7 +20810,7 @@ index 8102321..012485c 100644
if (TYPE_FIELD_NAME (type, i)) if (TYPE_FIELD_NAME (type, i))
TYPE_FIELD_NAME (new_type, i) = TYPE_FIELD_NAME (new_type, i) =
xstrdup (TYPE_FIELD_NAME (type, i)); xstrdup (TYPE_FIELD_NAME (type, i));
@@ -3010,6 +3242,16 @@ copy_type_recursive (struct objfile *objfile, @@ -3010,6 +3239,16 @@ copy_type_recursive (struct objfile *objfile,
xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type, xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type,
i))); i)));
break; break;
@ -20837,7 +20827,7 @@ index 8102321..012485c 100644
default: default:
internal_error (__FILE__, __LINE__, internal_error (__FILE__, __LINE__,
_("Unexpected type field location kind: %d"), _("Unexpected type field location kind: %d"),
@@ -3018,17 +3260,32 @@ copy_type_recursive (struct objfile *objfile, @@ -3018,17 +3257,32 @@ copy_type_recursive (struct objfile *objfile,
} }
} }
@ -20876,7 +20866,7 @@ index 8102321..012485c 100644
/* Maybe copy the type_specific bits. /* Maybe copy the type_specific bits.
NOTE drow/2005-12-09: We do not copy the C++-specific bits like NOTE drow/2005-12-09: We do not copy the C++-specific bits like
@@ -3046,6 +3303,20 @@ copy_type_recursive (struct objfile *objfile, @@ -3046,6 +3300,20 @@ copy_type_recursive (struct objfile *objfile,
return new_type; return new_type;
} }
@ -20897,7 +20887,7 @@ index 8102321..012485c 100644
/* Make a copy of the given TYPE, except that the pointer & reference /* Make a copy of the given TYPE, except that the pointer & reference
types are not preserved. types are not preserved.
@@ -3059,7 +3330,7 @@ copy_type (const struct type *type) @@ -3059,7 +3327,7 @@ copy_type (const struct type *type)
gdb_assert (TYPE_OBJFILE (type) != NULL); gdb_assert (TYPE_OBJFILE (type) != NULL);
@ -20906,7 +20896,7 @@ index 8102321..012485c 100644
TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
TYPE_LENGTH (new_type) = TYPE_LENGTH (type); TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type), memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
@@ -3068,6 +3339,232 @@ copy_type (const struct type *type) @@ -3068,6 +3336,232 @@ copy_type (const struct type *type)
return new_type; return new_type;
} }
@ -21139,7 +21129,7 @@ index 8102321..012485c 100644
static struct type * static struct type *
build_flt (int bit, char *name, const struct floatformat **floatformats) build_flt (int bit, char *name, const struct floatformat **floatformats)
{ {
@@ -3105,7 +3602,7 @@ build_complex (int bit, char *name, struct type *target_type) @@ -3105,7 +3599,7 @@ build_complex (int bit, char *name, struct type *target_type)
return builtin_type_error; return builtin_type_error;
} }
t = init_type (TYPE_CODE_COMPLEX, 2 * bit / TARGET_CHAR_BIT, t = init_type (TYPE_CODE_COMPLEX, 2 * bit / TARGET_CHAR_BIT,
@ -21148,7 +21138,7 @@ index 8102321..012485c 100644
TYPE_TARGET_TYPE (t) = target_type; TYPE_TARGET_TYPE (t) = target_type;
return t; return t;
} }
@@ -3119,56 +3616,56 @@ gdbtypes_post_init (struct gdbarch *gdbarch) @@ -3119,56 +3613,56 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
builtin_type->builtin_void = builtin_type->builtin_void =
init_type (TYPE_CODE_VOID, 1, init_type (TYPE_CODE_VOID, 1,
0, 0,
@ -21217,7 +21207,7 @@ index 8102321..012485c 100644
builtin_type->builtin_float builtin_type->builtin_float
= build_flt (gdbarch_float_bit (gdbarch), "float", = build_flt (gdbarch_float_bit (gdbarch), "float",
gdbarch_float_format (gdbarch)); gdbarch_float_format (gdbarch));
@@ -3187,26 +3684,26 @@ gdbtypes_post_init (struct gdbarch *gdbarch) @@ -3187,26 +3681,26 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
builtin_type->builtin_string = builtin_type->builtin_string =
init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT, init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
0, 0,
@ -21249,7 +21239,7 @@ index 8102321..012485c 100644
/* Pointer/Address types. */ /* Pointer/Address types. */
@@ -3245,27 +3742,28 @@ gdbtypes_post_init (struct gdbarch *gdbarch) @@ -3245,27 +3739,28 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
init_type (TYPE_CODE_INT, init_type (TYPE_CODE_INT,
gdbarch_addr_bit (gdbarch) / 8, gdbarch_addr_bit (gdbarch) / 8,
TYPE_FLAG_UNSIGNED, TYPE_FLAG_UNSIGNED,
@ -21283,7 +21273,7 @@ index 8102321..012485c 100644
return builtin_type; return builtin_type;
} }
@@ -3276,6 +3774,9 @@ _initialize_gdbtypes (void) @@ -3276,6 +3771,9 @@ _initialize_gdbtypes (void)
{ {
gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init); gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init);
@ -21293,7 +21283,7 @@ index 8102321..012485c 100644
/* FIXME: The following types are architecture-neutral. However, /* FIXME: The following types are architecture-neutral. However,
they contain pointer_type and reference_type fields potentially they contain pointer_type and reference_type fields potentially
caching pointer or reference types that *are* architecture caching pointer or reference types that *are* architecture
@@ -3284,47 +3785,47 @@ _initialize_gdbtypes (void) @@ -3284,47 +3782,47 @@ _initialize_gdbtypes (void)
builtin_type_int0 = builtin_type_int0 =
init_type (TYPE_CODE_INT, 0 / 8, init_type (TYPE_CODE_INT, 0 / 8,
0, 0,
@ -21352,7 +21342,7 @@ index 8102321..012485c 100644
builtin_type_ieee_single = builtin_type_ieee_single =
build_flt (-1, "builtin_type_ieee_single", floatformats_ieee_single); build_flt (-1, "builtin_type_ieee_single", floatformats_ieee_single);
@@ -3344,15 +3845,15 @@ _initialize_gdbtypes (void) @@ -3344,15 +3842,15 @@ _initialize_gdbtypes (void)
builtin_type_void = builtin_type_void =
init_type (TYPE_CODE_VOID, 1, init_type (TYPE_CODE_VOID, 1,
0, 0,
@ -35665,6 +35655,42 @@ index 9f382db..12db521 100644
MISCELLANEOUS = coremmap.data ../foobar.baz \ MISCELLANEOUS = coremmap.data ../foobar.baz \
shr1.sl shr2.sl solib_sl.sl solib1.sl solib2.sl shr1.sl shr2.sl solib_sl.sl solib1.sl solib2.sl
diff --git a/gdb/testsuite/gdb.base/arrayidx.c b/gdb/testsuite/gdb.base/arrayidx.c
index 98d4d35..f98a656 100644
--- a/gdb/testsuite/gdb.base/arrayidx.c
+++ b/gdb/testsuite/gdb.base/arrayidx.c
@@ -17,6 +17,13 @@
int array[] = {1, 2, 3, 4};
+#ifdef __GNUC__
+struct
+ {
+ int a[0];
+ } unbound;
+#endif
+
int
main (void)
{
diff --git a/gdb/testsuite/gdb.base/arrayidx.exp b/gdb/testsuite/gdb.base/arrayidx.exp
index 71ce4aa..af0e5f8 100644
--- a/gdb/testsuite/gdb.base/arrayidx.exp
+++ b/gdb/testsuite/gdb.base/arrayidx.exp
@@ -59,4 +59,12 @@ gdb_test "print array" \
"\\{\\\[0\\\] = 1, \\\[1\\\] = 2, \\\[2\\\] = 3, \\\[3\\\] = 4\\}" \
"Print array with array-indexes on"
-
+set test "p unbound.a == &unbound.a\[0\]"
+gdb_test_multiple $test $test {
+ -re " = 1\r\n$gdb_prompt $" {
+ pass $test
+ }
+ -re "No symbol \"unbound\" in current context.\r\n$gdb_prompt $" {
+ unsupported "$test (no GCC)"
+ }
+}
diff --git a/gdb/testsuite/gdb.base/call-rt-st.exp b/gdb/testsuite/gdb.base/call-rt-st.exp diff --git a/gdb/testsuite/gdb.base/call-rt-st.exp b/gdb/testsuite/gdb.base/call-rt-st.exp
index 3359c70..f73dd7f 100644 index 3359c70..f73dd7f 100644
--- a/gdb/testsuite/gdb.base/call-rt-st.exp --- a/gdb/testsuite/gdb.base/call-rt-st.exp

View File

@ -15,7 +15,7 @@ Version: 6.8.50.20090302
# The release always contains a leading reserved number, start it at 1. # 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. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
Release: 28%{?_with_upstream:.upstream}%{?dist} Release: 29%{?_with_upstream:.upstream}%{?dist}
License: GPLv3+ License: GPLv3+
Group: Development/Debuggers Group: Development/Debuggers
@ -887,6 +887,11 @@ fi
%endif %endif
%changelog %changelog
* Thu Jun 11 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.50.20090302-29
- Archer update to the snapshot: 30c13da4efe18f43ee34aa4b29bc86e1a53de548
- Archer backport: 30c13da4efe18f43ee34aa4b29bc86e1a53de548
- Fix dereferencing unbound C arrays (BZ 505163).
* Wed Jun 10 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.50.20090302-28 * Wed Jun 10 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.50.20090302-28
- Archer update to the snapshot: 000db8b7bfef8581ef099ccca8689cfddfea1be8 - Archer update to the snapshot: 000db8b7bfef8581ef099ccca8689cfddfea1be8
- Archer backport: b8d3bea36b137effc929e02c4dadf73716cb330b - Archer backport: b8d3bea36b137effc929e02c4dadf73716cb330b