This is the mail archive of the gdb-patches@sourceware.org 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]

Re: [rfa] frame address size incorrect if address size != ptr size


Corinna Vinschen wrote:

> Index: dwarf2-frame.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v
> retrieving revision 1.114
> diff -u -p -r1.114 dwarf2-frame.c
> --- dwarf2-frame.c	7 Jul 2010 17:26:38 -0000	1.114
> +++ dwarf2-frame.c	5 Aug 2010 15:25:27 -0000
> @@ -1732,13 +1732,6 @@ decode_frame_entry_1 (struct comp_unit *
>           depends on the target address size.  */
>        cie->encoding = DW_EH_PE_absptr;
>  
> -      /* The target address size.  For .eh_frame FDEs this is considered
> -	 equal to the size of a target pointer.  For .dwarf_frame FDEs, 
> -	 this is supposed to be the target address size from the associated
> -	 CU header.  FIXME: We do not have a good way to determine the 
> -	 latter.  Always use the target pointer size for now.  */
> -      cie->addr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
> -
>        /* We'll determine the final value later, but we need to
>  	 initialize it conservatively.  */
>        cie->signal_frame = 0;
> @@ -1779,7 +1772,7 @@ decode_frame_entry_1 (struct comp_unit *
>  	}
>        else
>  	{
> -	  cie->addr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
> +	  cie->addr_size = gdbarch_dwarf2_addr_size (gdbarch);
>  	  cie->segment_size = 0;
>  	}

Ah, wait a minute -- now we're missing the distinction between .eh_frame
and .debug_frame again.  For .eh_frame, FDE encodings needs to keep using
ptr_bit as discussed earlier, even on targets that do define a non-default
gdbarch_dwarf2_addr_size.  Sorry for not noticing earlier.

In fact, this means we might as well fix the inconsistent use between
addr_size as input to read_encoded_value (which needs to be ptr_size
on .eh_frame and addr_size on .debug_frame), and addr_size as input
to execute_stack_op (which needs to be addr_size always).

Could you add a second variable ptr_size to struct dwarf2_cie, and
initialize it (after the addr_size initialization) along the lines of:

  if (eh_frame_p)
    cie->ptr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
  else
    cie->ptr_size = cie->addr_size;

and then change all calls to read_encoded_value throughout dwarf2-frame.c
to pass cie->ptr_size instead of cie->addr_size.

It would then be interesting to see whether *both* .debug_frame and
.eh_frame work on xstormy16 ... you might be able to try the latter
by building with -fasynchronous-unwind-tables.

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


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