This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

[Ada] Volatile component not treated as such


This patch corrects an issue where attributes applied to records were not
propagated to components within the records - causing incorrect code to be
generated by the backend. Additionally, this ticket fixes another issue with
pragma Volatile_Full_Access that allowed the attribute to be applied to a type
with aliased components.

------------
-- Source --
------------

--  p.ads

with System; use System;

package P is
   type Int8_t is mod 2**8;
   type Rec is record
     A,B,C,D : aliased Int8_t;
   end record;
   type VFA_Rec is new Rec with Volatile_Full_Access; --  ERROR

   R : Rec with Volatile_Full_Access; --  ERROR

   type Arr is array (1 .. 4) of aliased Int8_t;
   type VFA_Arr is new Arr with Volatile_Full_Access; --  ERROR

   A : Arr with Volatile_Full_Access; --  ERROR

   type Priv_VFA_Rec is private
     with Volatile_Full_Access; --  ERROR

   type Priv_Ind_Rec is private
     with Independent; --  ERROR

   type Priv_Vol_Rec is private
     with Volatile; --  ERROR

   type Priv_Atomic_Rec is private
     with Atomic; --  ERROR

   type Aliased_Rec is tagged  record
      X : aliased Integer;
   end record with Volatile_Full_Access; --  OK

   type Atomic_And_VFA_Int is new Integer
     with Atomic, Volatile_Full_Access; --  ERROR

   type Atomic_And_VFA_Rec is record
      X : Integer with Atomic;
   end record with Volatile_Full_Access; --  ERROR

   type Atomic_T is tagged record
      X : Integer with Atomic; --  OK
   end record;

   type Atomic_And_VFA_T is new Atomic_T with record
      Y : Integer;
   end record with Volatile_Full_Access; --  ERROR

   type Aliased_And_VFA_T is new Aliased_Rec with record
      Y : Integer;
   end record with Volatile_Full_Access; --  ERROR

   Aliased_And_VFA_Obj   : aliased Integer with Volatile_Full_Access; --  ERROR
   Atomic_And_VFA_Obj    : Integer with Atomic, Volatile_Full_Access; --  ERROR
   Aliased_And_VFA_Obj_B : Aliased_Rec with Volatile_Full_Access;     --  ERROR
   Atomic_And_VFA_Obj_B  : Atomic_T with Volatile_Full_Access;        --  ERROR

private
   type Priv_VFA_Rec is record
      X : Integer;
   end record;

   type Priv_Ind_Rec is record
      X : Integer;
   end record;

   type Priv_Vol_Rec is record
      X : Integer;
   end record;

   type Priv_Atomic_Rec is record
      X : Integer;
   end record;
end;

--  p2.adb

with System;

procedure P2 is

   type Type1_T is record
      Field_1 : Integer;
      Field_2 : Integer;
      Field_3 : Integer;
      Field_4 : Short_Integer;
   end record;

   for Type1_T use record
      Field_1 at 0 range 0 .. 31;
      Field_2 at 4 range 0 .. 31;
      Field_3 at 8 range 0 .. 31;
      Field_4 at 12 range 0 .. 15;
   end record;
   for Type1_T'Size use (14) * System.Storage_Unit;
   pragma Volatile(Type1_T);

   type Type2_T is record
      Type1   : Type1_T;
      Field_1 : Integer;
      Field_2 : Integer;
      Field_3 : Integer;
      Field_4 : Short_Integer;
   end record;

   for Type2_T use record
      Type1   at 0 range 0 .. 111;
      Field_1 at 14 range 0 .. 31;
      Field_2 at 18 range 0 .. 31;
      Field_3 at 22 range 0 .. 31;
      Field_4 at 26 range 0 .. 15;
   end record;
   for Type2_T'Size use (28) * System.Storage_Unit;
   pragma Volatile(Type2_T); --  ERROR

   Type1 : Type1_T := (0,0,0,0);

   Type2 : Type2_T:= ((0,0,0,0),0,0,0,0);
begin
   Type1.Field_1 :=  Type1.Field_1 +1;

   Type2.Field_1 := Type2.Field_1 +1;
end;

----------------------------
-- Compilation and output --
----------------------------

& gcc -c p.ads
& gnatmake -q p2.adb
p.ads:8:33: cannot apply Volatile_Full_Access (aliased component present)
p.ads:10:17: cannot apply Volatile_Full_Access (aliased component present)
p.ads:13:33: cannot apply Volatile_Full_Access (aliased component present)
p.ads:15:17: cannot apply Volatile_Full_Access (aliased component present)
p.ads:18:11: representation item must be after full type declaration
p.ads:21:11: representation item must be after full type declaration
p.ads:24:11: representation item must be after full type declaration
p.ads:27:11: representation item must be after full type declaration
p.ads:31:20: cannot apply Volatile_Full_Access (aliased component present)
p.ads:34:19: cannot have Volatile_Full_Access and Atomic for same entity
p.ads:38:20: cannot have Volatile_Full_Access and Atomic for same entity
p.ads:46:20: cannot have Volatile_Full_Access and Atomic for same entity
p.ads:50:20: cannot apply Volatile_Full_Access (aliased component present)
p.ads:53:49: cannot have Volatile_Full_Access and Atomic for same entity
p.ads:54:45: cannot apply Volatile_Full_Access (aliased component present)
p.ads:55:42: cannot have Volatile_Full_Access and Atomic for same entity
p2.adb:30:31: size of volatile field "Type1" must be at least 128 bits
p2.adb:31:27: position of volatile field "Field_1" must be multiple of 32 bits
p2.adb:32:27: position of volatile field "Field_2" must be multiple of 32 bits
p2.adb:33:27: position of volatile field "Field_3" must be multiple of 32 bits
p2.adb:36:30: size for "Type2_T" too small, minimum allowed is 448
gnatmake: "p2.adb" compilation error

Tested on x86_64-pc-linux-gnu, committed on trunk

2017-09-06  Justin Squirek  <squirek@adacore.com>

	* sem_prag.adb (Check_VFA_Conflicts): Created
	to group all Volatile_Full_Access checks relating to other
	representation pragmas (Mark_Component_Or_Object): Created
	to centeralize the flagging of attributes for the record type
	component case, a pragma applied individually to a component, and
	the object case.
	(Process_Atomic_Independent_Shared_Volatile):
	Add propagation of certain pragmas to record components and move
	evaluation of VFA checks

Attachment: difs
Description: Text document


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