This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] PR symtab/13277: Resolving opaque structures in ICC generated binaries.


ICC does not set DW_AT_declaration on opaque structure declarations, so gdb will show such structures as "<no data fields>" unless executing code within the compilation unit which contains the complete declaration.

However, ICC does set DW_AT_byte_size to zero on opaque declarations.

This patch adds a check for DW_AT_byte_size == 0 with producer == ICC to allow gdb to resolve opaque structures in binaries which were built with ICC.

See http://sourceware.org/bugzilla/show_bug.cgi?id=13277 for more details, including an example.

Changelog:

2011-10-16 John Steele Scott <toojays@toojays.net>

    PR symtab/13277: Resolving opaque structures in ICC generated binaries.
    * symtab.c (producer_is_icc): New function.
    * symtab.h (producer_is_icc): Declare.
    * dwarf2read.c (read_structure_type): Set TYPE_STUB on structures
    with a byte size of zero, if the binary was produced by ICC.

--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -7636,6 +7636,11 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
     /* RealView does not output the required DW_AT_declaration
        on incomplete types.  */
     TYPE_STUB (type) = 1;
+  else if (attr != NULL&&  die->child == NULL&&  TYPE_LENGTH (type) == 0
+	&&  producer_is_icc (cu->producer))
+    /* ICC does not output the required DW_AT_declaration
+       on incomplete types, but gives them a size of zero.  */
+    TYPE_STUB (type) = 1;

   /* We need to add the type field to the die immediately so we don't
      infinitely recurse when dealing with pointers to the structure
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 9447bd9..ffaa035 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4806,6 +4806,20 @@ producer_is_realview (const char *producer)
   return 0;
 }

+int
+producer_is_icc (const char *producer)
+{
+  static const char *const icc_ident = "Intel(R) C Intel(R) 64 Compiler XE";
+
+  if (producer == NULL)
+    return 0;
+
+  if (strncmp (producer, icc_ident, strlen (icc_ident)) == 0)
+    return 1;
+
+  return 0;
+}
+
 void
 _initialize_symtab (void)
 {
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 90a6fe4..987f199 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1302,6 +1302,10 @@ extern struct symtabs_and_lines expand_line_sal (struct symtab_and_line sal);
    compiler (armcc).  */
 int producer_is_realview (const char *producer);

+/* Return 1 if the supplied producer string matches the Intel C/C++
+   compiler (icc).  */
+int producer_is_icc (const char *producer);
+
 void fixup_section (struct general_symbol_info *ginfo,
 		    CORE_ADDR addr, struct objfile *objfile);




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]