Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFC] Dont skip DW_TAG_member in load_partial_dies()
@ 2005-02-16  0:17 Manoj Iyer
  2005-02-16  1:09 ` Daniel Jacobowitz
  0 siblings, 1 reply; 11+ messages in thread
From: Manoj Iyer @ 2005-02-16  0:17 UTC (permalink / raw)
  To: gdb-patches


GDB prints internal error with C++ application produced by XLC.


=============== Test Case ========================
/* This testcase written by Lu Yang <luyang@ca.ibm.com> */

template<class T> class X;
template <class T>
class Y {
      friend class X<T>;
public:
      T f();
};

template <class T>
class X {
public:
      friend inline T Y<T>::f();
      static T a;
};

template <class T> inline T Y<T>::f() {return X<T>::a;}

template<> int X<int>::a =5;

int main() {

     Y<int> obj;
     if (obj.f() == 5)
         return 55;
     else
         return 66;
}

====================== End Test Case =====================

When the above testcase is compiled -m64 by XLC, GDB generates an internal
error:

"internal-error: could not find partial DIE in cache"

GCC creates a DWARF TAG for "a" as DW_TAG_variable and XLC creates
DW_TAG_member. GDB throws away TAGS that it find as uninteresting. In this
case DW_TAG_member. (this is in dwarf2read.c function:
load_partial_dies(). )

GCC created DWARF information
-------------------------------
 <2><102>: Abbrev Number: 13 (DW_TAG_variable)
     DW_AT_name        : a
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 13
     DW_AT_MIPS_linkage_name: _ZN1XIiE1aE
     DW_AT_type        : <d5>
     DW_AT_external    : 1
     DW_AT_declaration : 1

XLC created DWARF information
------------------------------
 <2><96>: Abbrev Number: 5 (DW_TAG_member)
     DW_AT_name        : a
     DW_AT_accessibility: 1     (public)
     DW_AT_declaration : 1
     DW_AT_type        : <78>


GCC in this case is producing wrong information. According to DWARF
spec:

" If the variable entry represents the defining declaration for a C++
static data member of a structure, class or union, the entry has a
DW_AT_specification attribute, whose value is a reference to the debugging
information entry representing the declaration of this data member. The
referenced entry has the tag DW_TAG_member and will be a child of some
class, structure or union type entry. "

So I think GDB needs to handle the DW_TAG_member and not skip it, when
dealing with  C++.

Here is a patch to GDB that will fix this problem

================ Patch to gdb ==================
2005-02-15  Manoj Iyer  <manjo@austin.ibm.com>

        * dwarf2read.c (load_partial_dies): Save DIE with tag
        DW_TAG_member, generated by XLC when compiling C++ application.

diff -Naur ./old/src/gdb/dwarf2read.c ./new/src/gdb/dwarf2read.c
--- ./old/src/gdb/dwarf2read.c  2005-02-15 11:13:05.000000000 -0600
+++ ./new/src/gdb/dwarf2read.c  2005-02-22 10:24:08.000000000 -0600
@@ -5167,7 +5167,8 @@
          && abbrev->tag != DW_TAG_enumerator
          && abbrev->tag != DW_TAG_subprogram
          && abbrev->tag != DW_TAG_variable
-         && abbrev->tag != DW_TAG_namespace)
+         && abbrev->tag != DW_TAG_namespace
+         && abbrev->tag != DW_TAG_member)
        {
          /* Otherwise we skip to the next sibling, if any.  */
          info_ptr = skip_one_die (info_ptr + bytes_read, abbrev, cu);

========================= END PATCH ======================


ok to commit?

Thanks
-----
manjo
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Cogito ergo sum                                                          +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2005-03-02 18:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-02-16  0:17 [RFC] Dont skip DW_TAG_member in load_partial_dies() Manoj Iyer
2005-02-16  1:09 ` Daniel Jacobowitz
2005-02-16  2:18   ` Joel Brobecker
2005-02-16  3:24     ` Daniel Jacobowitz
2005-02-16 22:50       ` Joel Brobecker
2005-02-17 14:30         ` Daniel Jacobowitz
2005-02-17 17:43           ` Joel Brobecker
2005-02-17  0:38       ` Manoj Iyer
2005-02-17 14:06         ` Daniel Jacobowitz
2005-02-16 13:46   ` Manoj Iyer
2005-03-02 18:32   ` Manoj Iyer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox