3326303 [PR gdb/19893] Fix handling of synthetic C++ references

Authored and Committed by Martin Galvan 8 years ago
    [PR gdb/19893] Fix handling of synthetic C++ references
    
    https://sourceware.org/bugzilla/show_bug.cgi?id=19893
    
    I've traced the main source of the problem to pieced_value_funcs.coerce_ref not being
    implemented. Since gdb always assumes references are implemented as pointers, this
    causes it to think that it's dealing with a NULL pointer, thus breaking any operations
    involving synthetic references.
    
    What I did here was implementing pieced_value_funcs.coerce_ref using some of the synthetic
    pointer handling code from indirect_pieced_value, as Pedro suggested. I also made a few
    adjustments to the reference printing code so that it correctly shows either the address
    of the referenced value or (if it's non-addressable) the "<synthetic pointer>" string.
    
    I also wrote some unit tests based on Dwarf::assemble; these took a while to make
    because in most cases I needed a synthetic reference to a physical variable. Additionally,
    I started working on a unit test for classes that have a vtable, but ran into a few issues
    so that'll probably go in a future patch. One thing that should definitely be fixed is that
    proc function_range (called for MACRO_AT_func) will always try to compile/link using gcc
    with the default options instead of g++, thus breaking C++ compilations that require e.g. libstdc++.
    
    gdb/ChangeLog:
    
    	* dwarf2loc.c (coerce_pieced_ref, indirect_synthetic_pointer,
    	fetch_const_value_from_synthetic_pointer): New functions.
    	(indirect_pieced_value): Move lower half to indirect_synthetic_pointer.
    	(pieced_value_funcs): Implement coerce_ref.
    	* valops.c (value_addr): Call coerce_ref for synthetic references.
    	* valprint.c (valprint_check_validity): Return true for synthetic
    	references.  Also, don't show "<synthetic pointer>" if they reference
    	addressable values.
    	(generic_val_print_ref): Handle synthetic references.  Also move some
    	code to print_ref_address.
    	(print_ref_address, get_value_addr_contents): New functions.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.dwarf2/implref.exp: Rename to...
    	* gdb.dwarf2/implref-const.exp: ...this.  Also add more test statements.
    	* gdb.dwarf2/implref-array.c: New file.
    	* gdb.dwarf2/implref-array.exp: Likewise.
    	* gdb.dwarf2/implref-global.c: Likewise.
    	* gdb.dwarf2/implref-global.exp: Likewise.
    	* gdb.dwarf2/implref-struct.c: Likewise.
    	* gdb.dwarf2/implref-struct.exp: Likewise.
    
        
file modified
+15 -0
file modified
+93 -35
file modified
+12 -0
gdb/testsuite/gdb.dwarf2/implref-const.exp gdb/testsuite/gdb.dwarf2/implref.exp
file renamed
+37 -16
file modified
+21 -15
file modified
+94 -27