2005-11-03 Wu Zhou <woodzltc@cn.ibm.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 4 Nov 2005 02:50:30 +0000 (02:50 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 4 Nov 2005 02:50:30 +0000 (02:50 +0000)
        Checked in by Elena Zannoni  <ezannoni@redhat.com>

       * dwarf2read.c (read_structure_type): Add 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.

gdb/ChangeLog
gdb/dwarf2read.c

index 12a67ff4c09f7f6e684efef6a9db96b58fd1035c..9be144f6e9fbeb996c1f324681f59eec44e37dbf 100644 (file)
@@ -1,3 +1,11 @@
+2005-11-03  Wu Zhou  <woodzltc@cn.ibm.com>
+
+        Checked in by Elena Zannoni  <ezannoni@redhat.com>
+
+       * dwarf2read.c (read_structure_type): Add 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. 
+
 2005-11-03  Jim Blandy  <jimb@redhat.com>
 
         Checked in by Elena Zannoni  <ezannoni@redhat.com>     
index e7a423f0da1b09775b0a0da0f53e7f34f5806615..0a59a8cc1ff4fd543b62980990d30a06c41c5a21 100644 (file)
@@ -3855,6 +3855,28 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
                  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);