Improve Ada dynamic range type handling.
authorJoel Brobecker <brobecker@adacore.com>
Sat, 19 Apr 2014 16:55:14 +0000 (09:55 -0700)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 28 Apr 2014 19:44:48 +0000 (15:44 -0400)
Consider the following declaration in Ada...

   type Array_Type is array (L .. U) of Natural;

... where L and U are parameters of the function where the declaration
above was made. At the moment, GDB relies on descriptive types in order
to properly decode the array bounds. For instance, if L was 5, and U
was 10, we would see the following:

    (gdb) ptype array_type
    type = array (5 .. 10) of natural
    (gdb) maintenance set ada ignore-descriptive-types
    (gdb) ptype array_type
    type = array (1 .. 28544912) of natural

This patch enhances ada_discrete_type_{high,low}_bound to resolve
any dynamicity.  This is sufficient to fix the case of the upper bound.
For the lower bound, the dwarf2read module does not handle dynamic
lower bounds yet, but once it does, the lower bound should be correctly
handled as well [1].

gdb/ChangeLog:

        * ada-lang.c (ada_discrete_type_high_bound): Resolve the type's
        dynamic bounds before computing its upper bound.
        (ada_discrete_type_low_bound): Same as above with the lower bound.

[1]: The reason why we do not enhance dwarf2read to handle dynamic
lower bounds ahead of this patch is because it unveils some latent
issues such as this one.

gdb/ChangeLog
gdb/ada-lang.c

index e1dda4c3a717ab112fef1a7c99a8bf6547b01b98..6c811ea0adc2d45c1d732cfcb79b29f58b0fa860 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-28  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_discrete_type_high_bound): Resolve the type's
+       dynamic bounds before computing its upper bound.
+       (ada_discrete_type_low_bound): Same as above with the lower bound.
+
 2014-04-28  Joel Brobecker  <brobecker@adacore.com>
 
        * dwarf2read.c (is_dynamic_type): Return true for dynamic
index 0acc1b527f5de9683ae3231cd9001852aa1feed7..38972c6704d538c78ccb14ae78aa6877abb3d546 100644 (file)
@@ -793,6 +793,7 @@ min_of_type (struct type *t)
 LONGEST
 ada_discrete_type_high_bound (struct type *type)
 {
+  type = resolve_dynamic_type (type, 0);
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_RANGE:
@@ -813,6 +814,7 @@ ada_discrete_type_high_bound (struct type *type)
 LONGEST
 ada_discrete_type_low_bound (struct type *type)
 {
+  type = resolve_dynamic_type (type, 0);
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_RANGE: