This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: g++ 3.1 EH broken for irix6.5
"Billinghurst, David (CRTS)" <David.Billinghurst@riotinto.com> writes:
> I have just noticed around 100 failures in g++ testsuite with 3.1 on irix
> 6.5. They are runtime failures consistent with broken exception handling
> (see todays results on gcc-testresults for details).
>
> Looking back, I see that test results for:
> * 20010529 is OK
> * 20010611 have these same failures.
Can you check whether the code generated for this part of
read_encoded_value_with_base is valid for an unaligned u->ptr?
case DW_EH_PE_absptr:
result = (_Unwind_Ptr) u->ptr;
p += sizeof (void *);
break;
I'm seeing that the unaligned union isn't being treated as unaligned
anymore. The patch below seemed to be the one that changed things.
Sat Jun 2 06:53:50 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree.h (struct record_layout_info_s): New field unpadded_align.
(set_lang_adjust_rli): New declaration.
* stor-layout.c (layout_decl): If DECL is packed, but at alignment
it would have if not packed, do not downgrade DECL_ALIGN.
(lang_adjust_rli, set_lang_adjust_rli): New.
(start_record_layout): Initialize new field unpadded_align.
(debug_rli): Display it.
(place_union_field, place_field): Set it.
(layout_type, case RECORD_TYPE): Call via lang_adjust_rli if set.
* print-tree.c (print_node): Don't print "regdecl" when bit doesn't
mean that; use proper names instead.
Print DECL_NO_STATIC_CHAIN.
* except.c (expand_builtin_frob_return_addr): Add missing call
to convert_memory_address #ifdef POINTERS_EXTEND_UNSIGNED.
(expand_builtin_eh_return): Likewise.
(expand_eh_return): Clean up ptr_mode != Pmode cases.
Index: stor-layout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/stor-layout.c,v
retrieving revision 1.97
retrieving revision 1.98
diff -c -p -d -r1.97 -r1.98
*** stor-layout.c 2001/05/02 14:31:45 1.97
--- stor-layout.c 2001/06/02 11:14:06 1.98
*************** layout_decl (decl, known_align)
*** 381,387 ****
DECL_BIT_FIELD_TYPE (decl) = DECL_BIT_FIELD (decl) ? type : 0;
if (maximum_field_alignment != 0)
DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
! else if (DECL_PACKED (decl))
{
DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
DECL_USER_ALIGN (decl) = 0;
--- 381,387 ----
DECL_BIT_FIELD_TYPE (decl) = DECL_BIT_FIELD (decl) ? type : 0;
if (maximum_field_alignment != 0)
DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
! else if (DECL_PACKED (decl) && known_align % DECL_ALIGN (decl) != 0)
{
DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
DECL_USER_ALIGN (decl) = 0;