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;

Reply via email to