This is the mail archive of the gdb-patches@sources.redhat.com 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]

[RFC] Add a little IBM XL C++ specific code in dwarf2read.c, to setTYPE_VPTR_FIELDNO and TYPE_VPTR_BASETYPE of a virtual class correctly


Daniel, 

As we discussed in a previous thread before, gdb will drop into SEGV
fault when handling the debug-info of a virtual class which has no
DW_AT_containing_type attribute.  ARM's RVCT compiler will generate 
this kind of debuginfo and prone to trigger SEGV error, which you 
fixed in a big un-cleanuped patch.  IBM's XL compiler will also 
generate this kind of debuginfo and prone to SEGV error too, on 
which I posted a small patch based on yours.  

I see that you are still too busy to look into this.  But maybe we
could handle this somewhat easily.  My thought is to begin with 
eliminating the SEGV error first, which only need a small fix.  Then
we could go on with other parts.  So I post the following IBM XLC++ 
specific patch, wishing that we could make some progress on this. 
What is your point on this idea?  If you think it is ok, I could also
add ARM specific code into this patch.  Please review and comment. 
Thanks a lot!

<2005-05-31>  Wu Zhou  <woodzltc@cn.ibm.com>

	* dwarf2read.c (read_structure_type): Add a little IBM XL C++
	specific code to set TYPE_VPTR_FIELDNO and TYPE_VPTR_BASETYPE
	of a virtual class if a field named "__vfp" is found.  


Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.181
diff -c -p -r1.181 dwarf2read.c
*** dwarf2read.c	9 Mar 2005 06:03:14 -0000	1.181
--- dwarf2read.c	30 May 2005 14:22:29 -0000
*************** read_structure_type (struct die_info *di
*** 3864,3869 ****
--- 3864,3891 ----
  		  TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (t);
  		}
  	    }
+ 	  else if (cu->producer
+ 		   && strncmp (cu->producer,
+ 			       "IBM(R) XL C/C++ Advanced Edition", 32) == 0)
+ 	    {
+ 	      /* The IBM XLC compiler does not provide direct indication
+ 	         of the containing type, but the vtable pointer is
+ 	         always named __vfp.  */
+ 
+ 	      int i;
+ 
+ 	      for (i = TYPE_NFIELDS (type) - 1;
+ 		   i >= TYPE_N_BASECLASSES (type);
+ 		   --i)
+ 		{
+ 		  if (strcmp (TYPE_FIELD_NAME (type, i), "__vfp") == 0)
+ 		    {
+ 		      TYPE_VPTR_FIELDNO (type) = i;
+ 		      TYPE_VPTR_BASETYPE (type) = type;
+ 		      break;
+ 		    }
+ 		}
+ 	    }
  	}
  
        do_cleanups (back_to);


Cheers
- Wu Zhou	  


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