aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2008-01-04 20:45:05 +0000
committerJoel Brobecker <brobecker@gnat.com>2008-01-04 20:45:05 +0000
commit727e3d2e5ca581e75f2d8707c28c5cbd7ee34bb0 (patch)
treead508980930ee4377049060846486a8520f65205
parentecc7085baf3e1b677cbcaa84989cd3a48f13542d (diff)
downloadgdb-727e3d2e5ca581e75f2d8707c28c5cbd7ee34bb0.zip
gdb-727e3d2e5ca581e75f2d8707c28c5cbd7ee34bb0.tar.gz
gdb-727e3d2e5ca581e75f2d8707c28c5cbd7ee34bb0.tar.bz2
* ada-lang.c (decode_packed_array_type): Avoid a seg fault
when the type is an anonymous pointer type. (ada_check_typedef): Avoid a seg fault when the type is null. * ada-typeprint.c (print_array_type): Add support for pointer to packed arrays.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/ada-lang.c17
-rw-r--r--gdb/ada-typeprint.c17
3 files changed, 36 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ccc112f..699a553 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2008-01-04 Jerome Guitton <guitton@adacore.com>
+
+ * ada-lang.c (decode_packed_array_type): Avoid a seg fault
+ when the type is an anonymous pointer type.
+ (ada_check_typedef): Avoid a seg fault when the type is null.
+ * ada-typeprint.c (print_array_type): Add support for pointer
+ to packed arrays.
+
2008-01-04 Paul N. Hilfinger <hilfinger@adacore.com>
* ada-exp.y: Allow '{type} ADDRESS' notation on left of assignment.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 134244f..198ef62 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -1809,13 +1809,21 @@ decode_packed_array_type (struct type *type)
{
struct symbol *sym;
struct block **blocks;
- const char *raw_name = ada_type_name (ada_check_typedef (type));
- char *name = (char *) alloca (strlen (raw_name) + 1);
- char *tail = strstr (raw_name, "___XP");
+ char *raw_name = ada_type_name (ada_check_typedef (type));
+ char *name;
+ char *tail;
struct type *shadow_type;
long bits;
int i, n;
+ if (!raw_name)
+ raw_name = ada_type_name (desc_base_type (type));
+
+ if (!raw_name)
+ return NULL;
+
+ name = (char *) alloca (strlen (raw_name) + 1);
+ tail = strstr (raw_name, "___XP");
type = desc_base_type (type);
memcpy (name, raw_name, tail - raw_name);
@@ -7269,6 +7277,9 @@ static_unwrap_type (struct type *type)
struct type *
ada_check_typedef (struct type *type)
{
+ if (type == NULL)
+ return NULL;
+
CHECK_TYPEDEF (type);
if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM
|| !TYPE_STUB (type)
diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c
index 7bfb001..4b1f9ff 100644
--- a/gdb/ada-typeprint.c
+++ b/gdb/ada-typeprint.c
@@ -366,6 +366,9 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
int bitsize;
int n_indices;
+ if (ada_is_packed_array_type (type))
+ type = ada_coerce_to_simple_array_type (type);
+
bitsize = 0;
fprintf_filtered (stream, "array (");
@@ -374,8 +377,6 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
fprintf_filtered (stream, "...");
else
{
- if (ada_is_packed_array_type (type))
- type = ada_coerce_to_simple_array_type (type);
if (type == NULL)
{
fprintf_filtered (stream, _("<undecipherable array type>"));
@@ -782,7 +783,17 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream,
if (ada_is_aligner_type (type))
ada_print_type (ada_aligned_type (type), "", stream, show, level);
else if (ada_is_packed_array_type (type))
- print_array_type (type, stream, show, level);
+ {
+ if (TYPE_CODE (type) == TYPE_CODE_PTR)
+ {
+ fprintf_filtered (stream, "access ");
+ print_array_type (TYPE_TARGET_TYPE (type), stream, show, level);
+ }
+ else
+ {
+ print_array_type (type, stream, show, level);
+ }
+ }
else
switch (TYPE_CODE (type))
{