treat Ada DW_TAG_unspecified_type DIEs as stub types
authorJoel Brobecker <brobecker@adacore.com>
Tue, 2 Jan 2018 03:41:36 +0000 (22:41 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 2 Jan 2018 03:41:36 +0000 (22:41 -0500)
Consider the gdb.ada/taft_type.exp testcase, which exercises
the situation where a variable is defined using a type which
is a pointer to an incomplete type, with the actual type
definition being provided by another unit. Up to now, the
strategy used by GNAT when generating the DWARF debugging info
was to produce a incomplete DW_TAG_enumeration_type DIE with
a DW_AT_declaration flag attached to it:

        .uleb128 0x4    # (DIE (0x3e) DW_TAG_enumeration_type)
        .long   .LASF4  # DW_AT_name: "pck__empty"
                        # DW_AT_declaration

However, a more standard way for the compiler to describe
this kind of type is to use the DW_TAG_unspecified_type tag.
When the compiler is enhanced to do so, we'll need to treat
such types as stubs -- we only do so with types from Ada units,
however, as the meaning of this TAG is intentionally left
permissive and language-specific by the DWARF standard.

Without this patch, running the testcase above with an enhanced
compiler now yields:

    (gdb) print w.e.all
    Attempt to dereference a generic pointer.
    FAIL: gdb.ada/taft_type.exp: print w.e.all

gdb/ChangeLog:

* dwarf2read.c (read_unspecified_type): Treat
        DW_TAG_enumeration_type DIEs from Ada units as stubs.

Tested on x86_64-linux, fixes the FAIL in gdb.ada/taft_type.exp above.

gdb/ChangeLog
gdb/dwarf2read.c

index 9eaa15fe3d3a62b0061ebcfa4e47e9e4977c1faa..3199eaacc9781b7c114ee309f692776fabb76b0e 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-02  Joel Brobecker  <brobecker@adacore.com>
+
+       * dwarf2read.c (read_unspecified_type): Treat
+       DW_TAG_enumeration_type DIEs from Ada units as stubs.
+
 2018-01-01  Joel Brobecker  <brobecker@adacore.com>
 
        Update copyright year range in all GDB files.
index b4f5cd1e3c94e4090582216d78f8cddcfda3a419..4dbd5c35d7b8728c0a66f6bf618bb3333b4eade2 100644 (file)
@@ -17693,11 +17693,16 @@ read_unspecified_type (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct type *type;
 
-  /* For now, we only support the C meaning of an unspecified type: void.  */
-
   type = init_type (cu->objfile, TYPE_CODE_VOID, 0, NULL);
   TYPE_NAME (type) = dwarf2_name (die, cu);
 
+  /* In Ada, an unspecified type is typically used when the description
+     of the type is defered to a different unit.  When encountering
+     such a type, we treat it as a stub, and try to resolve it later on,
+     when needed.  */
+  if (cu->language == language_ada)
+    TYPE_STUB (type) = 1;
+
   return set_die_type (die, type, cu);
 }