Hi,
this fixes the following ICE in decode_addr_const:
+===========================GNAT BUG DETECTED==============================+
| 8.0.0 20170704 (experimental) [trunk revision 249942] (x86_64-suse-linux)
GCC error:|
| in decode_addr_const, at varasm.c:2880
stemming from a CONSTRUCTOR containing absolute addresses hidden behind a
COMPONENT_REF or similar references.
Fixed by adding support for INDIRECT_REF <INTEGER_CST> to decode_addr_const.
Tested on x86_64-suse-linux, OK for the mainline?
2017-07-07 Eric Botcazou <ebotca...@adacore.com>
* varasm.c (decode_addr_const): Deal with INDIRECT_REF <INTEGER_CST>.
2017-07-07 Eric Botcazou <ebotca...@adacore.com>
* gnat.dg/aggr22.ad[sb]: New test.
--
Eric Botcazou
Index: varasm.c
===================================================================
--- varasm.c (revision 249942)
+++ varasm.c (working copy)
@@ -2876,6 +2876,13 @@ decode_addr_const (tree exp, struct addr
x = output_constant_def (target, 1);
break;
+ case INDIRECT_REF:
+ /* This deals with absolute addresses. */
+ offset += tree_to_shwi (TREE_OPERAND (target, 0));
+ x = gen_rtx_MEM (QImode,
+ gen_rtx_SYMBOL_REF (Pmode, "origin of addresses"));
+ break;
+
default:
gcc_unreachable ();
}
-- { dg-do compile }
package body Aggr22 is
type Ptr is access all Integer;
type Arr is array (Positive range <>) of Ptr;
procedure Proc is
A : Arr (1 .. 33);
begin
A := (1 => null, 2 .. 32 => My_Rec.I'Access, 33 => null);
end;
end Aggr22;
with System;
package Aggr22 is
type Rec is record
C : Character;
I : aliased Integer;
end record;
My_Rec : aliased Rec;
pragma Import (Ada, My_Rec);
for My_Rec'Address use System'To_Address (16#40086000#);
procedure Proc;
end Aggr22;