------- Comment #2 from jakub at gcc dot gnu dot org  2010-05-13 21:48 -------
If I understand it well, we should:
--- dwarf2out.c 2010-05-13 23:36:24.000000000 +0200
+++ dwarf2out.c    2010-05-13 23:55:07.422464196 +0200     
@@ -17094,10 +17094,19 @@ add_pure_or_virtual_attribute (dw_die_re
       add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);

       if (host_integerp (DECL_VINDEX (func_decl), 0))
-       add_AT_loc (die, DW_AT_vtable_elem_location,
-                   new_loc_descr (DW_OP_constu,
-                                  tree_low_cst (DECL_VINDEX (func_decl), 0),
-                                  0));
+       {
+         dw_loc_descr_ref loc;
+         HOST_WIDE_INT offset 
+           = tree_low_cst (DECL_VINDEX (func_decl), 0)
+             * (POINTER_SIZE / BITS_PER_UNIT);
+         if (DWARF2_ADDR_SIZE == (POINTER_SIZE / BITS_PER_UNIT))
+           loc = new_loc_descr (DW_OP_deref, 0, 0);
+         else
+           loc = new_loc_descr (DW_OP_deref_size,
+                                POINTER_SIZE / BITS_PER_UNIT, 0);
+         add_loc_descr (&loc, new_loc_descr (DW_OP_plus_uconst, offset, 0));
+         add_AT_loc (die, DW_AT_vtable_elem_location, loc);
+       }

       /* GNU extension: Record what type this method came from originally.
        * */
       if (debug_info_level > DINFO_LEVEL_TERSE

The consumers should be pushing address of object, so we need to dereference
its first pointer to get at vtable + 8 resp. 16 and DECL_VINDEX is number of
pointers after that spot (seems to be the case even on ia64).

The problem is that gdb won't grok that, so we have a chicken-and-egg issue.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44126

Reply via email to