> > May I apply the patch I posted? It boostrapped/regtested fine on > > x86-64/Linux. > > Yes.
Thanks. Unfortunately, while this was the last identified problem on x86, another issue is visible on x86-64 as a miscompilation of XML/Ada at -O0. Reduced testcase attached: gnat.dg/pack18.adb gnat.dg/pack18_pkg.ads The executable segfaults because it attempts a read at 0x2000000000000000. The scenario is a follows: Rec is packed record so its fields are bit fields, N being at bit offset 129. The representative is at offset 0. get_bit_range is invoked on N with a bitpos of 1, because there is variable offset and its DECL_FIELD_OFFFSET is added to it instead of bitpos. Hence bitpos - bitoffset is (unsigned HOST_WIDE_INT) -128. This value enters unchanged the new code in store_bit_field and the division: offset = bitregion_start / BITS_PER_UNIT; yields the problematic big number. It would therefore appear that bitstart and bitend need to be signed offsets, at least until they are adjusted by store_bit_field. -- Eric Botcazou
-- { dg-do run } with Pack18_Pkg; use Pack18_Pkg; procedure Pack18 is use Pack18_Pkg.Attributes_Tables; Table : Instance; begin Init (Table); Set_Last (Table, 1); Table.Table (Last (Table)).N := 0; end;
with GNAT.Dynamic_Tables; package Pack18_Pkg is type String_Access is access String; type Rec is record S : String_Access; B : Boolean; N : Natural; end record; pragma Pack (Rec); package Attributes_Tables is new GNAT.Dynamic_Tables (Table_Component_Type => Rec, Table_Index_Type => Natural, Table_Low_Bound => 1, Table_Initial => 200, Table_Increment => 200); end Pack18_Pkg;