http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52857
Bug #: 52857
Summary: [x32] DW_OP_GNU_regval_type doesn't handle
ARG_POINTER_REGNUM properly with -maddress-mode=long
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: debug
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected]
Created attachment 27081
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27081
A testcase
On Linux/x86-64, for the testcase, I got
# /xgcc -B./ -O -g /tmp/x.i -c -mx32 -maddress-mode=long
# readelf -w x.o
...
<37a3> DW_AT_GNU_call_site_value: 21 byte block: f5 ff ff ff ff f 25 f4 25
8 80 ff ff ff ff ff ff ff 22 f7 2c (DW_OP_GNU_regval_type: 4294967295 (r-1)
<0x25>; DW_OP_GNU_const_type: <0x25> 8 byte block: 80 ff ff ff ff ff ff ff ;
DW_OP_plus; DW_OP_GNU_convert <0x2c>)
The problem is
mem_loc_result = new_loc_descr (DW_OP_GNU_regval_type,
dbx_reg_number (rtl), 0);
with
(gdb) call debug_rtx (rtl)
(reg/f:DI 16 argp)
(gdb) f 3
#3 0x0000000000709ec0 in mem_loc_descriptor (rtl=0x7ffff0e12978, mode=SImode,
mem_mode=VOIDmode, initialized=VAR_INIT_STATUS_INITIALIZED)
at /export/gnu/import/git/gcc-addr32/gcc/dwarf2out.c:11631
11631 mem_loc_result = mem_loc_descriptor (SUBREG_REG (rtl),
(gdb) call debug_rtx (rtl)
(subreg:SI (plus:DI (reg/f:DI 16 argp)
(const_int -128 [0xffffffffffffff80])) 0)
(gdb)