Variant gcc-14-16
Applies to 14.2.0, 15.3.0, 16.1.0, 16.2.0. Source flavors: linux, darwin_arm64.
+318 −9 2 files
gcc/ada/exp_ch6.adb
+38−9modified
| @@ -1828 +1828 @@package body Exp_Ch6 is | |||
| 1828 | 1828 | N_Node : Node_Id; | |
| 1829 | 1829 | E_Actual : Entity_Id; | |
| 1830 | 1830 | E_Formal : Entity_Id; | |
| 1831 | Added line. Actual_Storage_Model : Entity_Id; | ||
| 1832 | Added line. | ||
| 1833 | Added line. function Storage_Model_Of_Actual (N : Node_Id) return Entity_Id; | ||
| 1834 | Added line. -- Return the storage model of the innermost dereference underlying N, | ||
| 1835 | Added line. -- if any. Components are part of the designated object and must use | ||
| 1836 | Added line. -- the model of their nearest dereference. Conversions in a component | ||
| 1837 | Added line. -- prefix do not change that model. | ||
| 1831 | 1838 | | |
| 1832 | 1839 | procedure Add_Call_By_Copy_Code; | |
| 1833 | 1840 | -- For cases where the parameter must be passed by copy, this routine | |
| @@ -2604 +2611 @@package body Exp_Ch6 is | |||
| 2604 | 2611 | end if; | |
| 2605 | 2612 | end Make_Var; | |
| 2606 | 2613 | | |
| 2614 | Added line. ----------------------------- | ||
| 2615 | Added line. -- Storage_Model_Of_Actual -- | ||
| 2616 | Added line. ----------------------------- | ||
| 2617 | Added line. | ||
| 2618 | Added line. function Storage_Model_Of_Actual (N : Node_Id) return Entity_Id is | ||
| 2619 | Added line. Obj : Node_Id := N; | ||
| 2620 | Added line. | ||
| 2621 | Added line. begin | ||
| 2622 | Added line. while Nkind (Obj) in N_Indexed_Component | ||
| 2623 | Added line. | N_Selected_Component | ||
| 2624 | Added line. | N_Slice | ||
| 2625 | Added line. loop | ||
| 2626 | Added line. Obj := Unqual_Conv (Prefix (Obj)); | ||
| 2627 | Added line. end loop; | ||
| 2628 | Added line. | ||
| 2629 | Added line. if Nkind (Obj) = N_Explicit_Dereference | ||
| 2630 | Added line. and then | ||
| 2631 | Added line. Has_Designated_Storage_Model_Aspect (Etype (Prefix (Obj))) | ||
| 2632 | Added line. then | ||
| 2633 | Added line. return Storage_Model_Object (Etype (Prefix (Obj))); | ||
| 2634 | Added line. else | ||
| 2635 | Added line. return Empty; | ||
| 2636 | Added line. end if; | ||
| 2637 | Added line. end Storage_Model_Of_Actual; | ||
| 2638 | Added line. | ||
| 2607 | 2639 | ------------------------- | |
| 2608 | 2640 | -- Reset_Packed_Prefix -- | |
| 2609 | 2641 | ------------------------- | |
| @@ -2682 +2714 @@package body Exp_Ch6 is | |||
| 2682 | 2714 | while Present (Formal) loop | |
| 2683 | 2715 | E_Formal := Etype (Formal); | |
| 2684 | 2716 | E_Actual := Etype (Actual); | |
| 2717 | Added line. Actual_Storage_Model := Storage_Model_Of_Actual (Actual); | ||
| 2685 | 2718 | | |
| 2686 | 2719 | -- Handle formals whose type comes from the limited view | |
| 2687 | 2720 | | |
| @@ -2804 +2837 @@package body Exp_Ch6 is | |||
| 2804 | 2837 | | |
| 2805 | 2838 | -- If the actual has a nonnative storage model, we need a copy | |
| 2806 | 2839 | | |
| 2807 | Removed line. elsif Nkind (Actual) = N_Explicit_Dereference | ||
| 2808 | Removed line. and then | ||
| 2809 | Removed line. Has_Designated_Storage_Model_Aspect (Etype (Prefix (Actual))) | ||
| 2840 | Added line. elsif Present (Actual_Storage_Model) | ||
| 2810 | 2841 | and then | |
| 2811 | 2842 | (Present (Storage_Model_Copy_To | |
| 2812 | Removed line. (Storage_Model_Object (Etype (Prefix (Actual))))) | ||
| 2843 | Added line. (Actual_Storage_Model)) | ||
| 2813 | 2844 | or else | |
| 2814 | 2845 | (Ekind (Formal) = E_In_Out_Parameter | |
| 2815 | 2846 | and then | |
| 2816 | 2847 | Present (Storage_Model_Copy_From | |
| 2817 | Removed line. (Storage_Model_Object (Etype (Prefix (Actual))))))) | ||
| 2848 | Added line. (Actual_Storage_Model)))) | ||
| 2818 | 2849 | then | |
| 2819 | 2850 | Add_Simple_Call_By_Copy_Code (Force => True); | |
| 2820 | 2851 | | |
| @@ -2970 +3001 @@package body Exp_Ch6 is | |||
| 2970 | 3001 | | |
| 2971 | 3002 | -- If the actual has a nonnative storage model, we need a copy | |
| 2972 | 3003 | | |
| 2973 | Removed line. elsif Nkind (Actual) = N_Explicit_Dereference | ||
| 2974 | Removed line. and then | ||
| 2975 | Removed line. Has_Designated_Storage_Model_Aspect (Etype (Prefix (Actual))) | ||
| 3004 | Added line. elsif Present (Actual_Storage_Model) | ||
| 2976 | 3005 | and then | |
| 2977 | 3006 | Present (Storage_Model_Copy_From | |
| 2978 | Removed line. (Storage_Model_Object (Etype (Prefix (Actual))))) | ||
| 3007 | Added line. (Actual_Storage_Model)) | ||
| 2979 | 3008 | then | |
| 2980 | 3009 | Add_Simple_Call_By_Copy_Code (Force => True); | |
| 2981 | 3010 | | |
gcc/testsuite/gnat.dg/storage_model_actuals.adb
+280−0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. -- { dg-do run } | ||
| 2 | Added line. -- { dg-options "-gnatX0 -gnata" } | ||
| 3 | Added line. | ||
| 4 | Added line. with Ada.Text_IO; use Ada.Text_IO; | ||
| 5 | Added line. with Interfaces; use Interfaces; | ||
| 6 | Added line. with Interfaces.C; | ||
| 7 | Added line. with System; | ||
| 8 | Added line. with System.Storage_Elements; use System.Storage_Elements; | ||
| 9 | Added line. | ||
| 10 | Added line. procedure Storage_Model_Actuals is | ||
| 11 | Added line. type Shared_Address is mod 2 ** 64; | ||
| 12 | Added line. Null_Shared_Address : constant Shared_Address := 0; | ||
| 13 | Added line. | ||
| 14 | Added line. type Byte_Array is array (Storage_Offset range 0 .. 8_191) | ||
| 15 | Added line. of aliased Unsigned_8; | ||
| 16 | Added line. | ||
| 17 | Added line. type Shared_Model is limited record | ||
| 18 | Added line. Bytes : Byte_Array := (others => 0); | ||
| 19 | Added line. Next : Storage_Offset := 8; | ||
| 20 | Added line. Reads : Natural := 0; | ||
| 21 | Added line. Writes : Natural := 0; | ||
| 22 | Added line. Read_Bytes : Storage_Count := 0; | ||
| 23 | Added line. Write_Bytes : Storage_Count := 0; | ||
| 24 | Added line. end record | ||
| 25 | Added line. with Storage_Model_Type => | ||
| 26 | Added line. (Address_Type => Shared_Address, | ||
| 27 | Added line. Allocate => Allocate, | ||
| 28 | Added line. Deallocate => Deallocate, | ||
| 29 | Added line. Copy_To => Copy_To, | ||
| 30 | Added line. Copy_From => Copy_From, | ||
| 31 | Added line. Storage_Size => Storage_Size, | ||
| 32 | Added line. Null_Address => Null_Shared_Address); | ||
| 33 | Added line. | ||
| 34 | Added line. procedure Allocate | ||
| 35 | Added line. (Model : in out Shared_Model; | ||
| 36 | Added line. Storage_Address : out Shared_Address; | ||
| 37 | Added line. Size : Storage_Count; | ||
| 38 | Added line. Alignment : Storage_Count); | ||
| 39 | Added line. | ||
| 40 | Added line. procedure Deallocate | ||
| 41 | Added line. (Model : in out Shared_Model; | ||
| 42 | Added line. Storage_Address : Shared_Address; | ||
| 43 | Added line. Size : Storage_Count; | ||
| 44 | Added line. Alignment : Storage_Count); | ||
| 45 | Added line. | ||
| 46 | Added line. procedure Copy_To | ||
| 47 | Added line. (Model : in out Shared_Model; | ||
| 48 | Added line. Target : Shared_Address; | ||
| 49 | Added line. Source : System.Address; | ||
| 50 | Added line. Size : Storage_Count); | ||
| 51 | Added line. | ||
| 52 | Added line. procedure Copy_From | ||
| 53 | Added line. (Model : in out Shared_Model; | ||
| 54 | Added line. Target : System.Address; | ||
| 55 | Added line. Source : Shared_Address; | ||
| 56 | Added line. Size : Storage_Count); | ||
| 57 | Added line. | ||
| 58 | Added line. function Storage_Size (Model : Shared_Model) return Storage_Count; | ||
| 59 | Added line. | ||
| 60 | Added line. function C_Memcpy | ||
| 61 | Added line. (Destination : System.Address; | ||
| 62 | Added line. Source : System.Address; | ||
| 63 | Added line. Size : Interfaces.C.size_t) return System.Address | ||
| 64 | Added line. with Import, Convention => C, External_Name => "memcpy"; | ||
| 65 | Added line. | ||
| 66 | Added line. procedure Allocate | ||
| 67 | Added line. (Model : in out Shared_Model; | ||
| 68 | Added line. Storage_Address : out Shared_Address; | ||
| 69 | Added line. Size : Storage_Count; | ||
| 70 | Added line. Alignment : Storage_Count) | ||
| 71 | Added line. is | ||
| 72 | Added line. Aligned : constant Storage_Offset := | ||
| 73 | Added line. ((Model.Next + Storage_Offset (Alignment) - 1) | ||
| 74 | Added line. / Storage_Offset (Alignment)) * Storage_Offset (Alignment); | ||
| 75 | Added line. begin | ||
| 76 | Added line. Storage_Address := Shared_Address (Aligned); | ||
| 77 | Added line. Model.Next := Aligned + Storage_Offset (Size); | ||
| 78 | Added line. end Allocate; | ||
| 79 | Added line. | ||
| 80 | Added line. procedure Deallocate | ||
| 81 | Added line. (Model : in out Shared_Model; | ||
| 82 | Added line. Storage_Address : Shared_Address; | ||
| 83 | Added line. Size : Storage_Count; | ||
| 84 | Added line. Alignment : Storage_Count) | ||
| 85 | Added line. is | ||
| 86 | Added line. pragma Unreferenced (Model, Storage_Address, Size, Alignment); | ||
| 87 | Added line. begin | ||
| 88 | Added line. null; | ||
| 89 | Added line. end Deallocate; | ||
| 90 | Added line. | ||
| 91 | Added line. procedure Copy_To | ||
| 92 | Added line. (Model : in out Shared_Model; | ||
| 93 | Added line. Target : Shared_Address; | ||
| 94 | Added line. Source : System.Address; | ||
| 95 | Added line. Size : Storage_Count) | ||
| 96 | Added line. is | ||
| 97 | Added line. Ignored : System.Address; | ||
| 98 | Added line. begin | ||
| 99 | Added line. Model.Writes := Model.Writes + 1; | ||
| 100 | Added line. Model.Write_Bytes := Model.Write_Bytes + Size; | ||
| 101 | Added line. Ignored := C_Memcpy | ||
| 102 | Added line. (Model.Bytes (0)'Address + Storage_Offset (Target), | ||
| 103 | Added line. Source, | ||
| 104 | Added line. Interfaces.C.size_t (Size)); | ||
| 105 | Added line. end Copy_To; | ||
| 106 | Added line. | ||
| 107 | Added line. procedure Copy_From | ||
| 108 | Added line. (Model : in out Shared_Model; | ||
| 109 | Added line. Target : System.Address; | ||
| 110 | Added line. Source : Shared_Address; | ||
| 111 | Added line. Size : Storage_Count) | ||
| 112 | Added line. is | ||
| 113 | Added line. Ignored : System.Address; | ||
| 114 | Added line. begin | ||
| 115 | Added line. Model.Reads := Model.Reads + 1; | ||
| 116 | Added line. Model.Read_Bytes := Model.Read_Bytes + Size; | ||
| 117 | Added line. Put_Line | ||
| 118 | Added line. ("Copy_From source=" & Shared_Address'Image (Source) | ||
| 119 | Added line. & " size=" & Storage_Count'Image (Size)); | ||
| 120 | Added line. Flush; | ||
| 121 | Added line. Ignored := C_Memcpy | ||
| 122 | Added line. (Target, | ||
| 123 | Added line. Model.Bytes (0)'Address + Storage_Offset (Source), | ||
| 124 | Added line. Interfaces.C.size_t (Size)); | ||
| 125 | Added line. end Copy_From; | ||
| 126 | Added line. | ||
| 127 | Added line. function Storage_Size (Model : Shared_Model) return Storage_Count is | ||
| 128 | Added line. begin | ||
| 129 | Added line. return Storage_Count (Model.Bytes'Length) - Storage_Count (Model.Next); | ||
| 130 | Added line. end Storage_Size; | ||
| 131 | Added line. | ||
| 132 | Added line. Arena : Shared_Model; | ||
| 133 | Added line. | ||
| 134 | Added line. type Node; | ||
| 135 | Added line. type Node_Pointer is access Node | ||
| 136 | Added line. with Designated_Storage_Model => Arena; | ||
| 137 | Added line. type Node is record | ||
| 138 | Added line. Value : Integer; | ||
| 139 | Added line. Next : Node_Pointer; | ||
| 140 | Added line. end record; | ||
| 141 | Added line. | ||
| 142 | Added line. type Integer_Array is array (Positive range <>) of Integer; | ||
| 143 | Added line. subtype Three_Integers is Integer_Array (1 .. 3); | ||
| 144 | Added line. type Array_Pointer is access Three_Integers | ||
| 145 | Added line. with Designated_Storage_Model => Arena; | ||
| 146 | Added line. | ||
| 147 | Added line. P : Node_Pointer := new Node'(Value => 10, Next => null); | ||
| 148 | Added line. Q : Node_Pointer := new Node'(Value => 20, Next => null); | ||
| 149 | Added line. A : Array_Pointer := new Three_Integers'(1, 2, 3); | ||
| 150 | Added line. | ||
| 151 | Added line. procedure Consume_Integer (Item, Expected : Integer) is | ||
| 152 | Added line. begin | ||
| 153 | Added line. pragma Assert (Item = Expected); | ||
| 154 | Added line. end Consume_Integer; | ||
| 155 | Added line. | ||
| 156 | Added line. procedure Increment_Integer (Item : in out Integer) is | ||
| 157 | Added line. begin | ||
| 158 | Added line. Item := Item + 1; | ||
| 159 | Added line. end Increment_Integer; | ||
| 160 | Added line. | ||
| 161 | Added line. procedure Consume_Node (Item : Node; Expected : Integer) is | ||
| 162 | Added line. begin | ||
| 163 | Added line. pragma Assert (Item.Value = Expected); | ||
| 164 | Added line. end Consume_Node; | ||
| 165 | Added line. | ||
| 166 | Added line. procedure Increment_Node (Item : in out Node) is | ||
| 167 | Added line. begin | ||
| 168 | Added line. Item.Value := Item.Value + 1; | ||
| 169 | Added line. end Increment_Node; | ||
| 170 | Added line. | ||
| 171 | Added line. procedure Assert_Read (Before : Natural) is | ||
| 172 | Added line. begin | ||
| 173 | Added line. pragma Assert (Arena.Reads > Before); | ||
| 174 | Added line. end Assert_Read; | ||
| 175 | Added line. | ||
| 176 | Added line. procedure Assert_Write (Before : Natural) is | ||
| 177 | Added line. begin | ||
| 178 | Added line. pragma Assert (Arena.Writes > Before); | ||
| 179 | Added line. end Assert_Write; | ||
| 180 | Added line. | ||
| 181 | Added line. Before_Reads : Natural; | ||
| 182 | Added line. Before_Writes : Natural; | ||
| 183 | Added line. Got : Integer; | ||
| 184 | Added line. begin | ||
| 185 | Added line. -- Whole designated object as an IN actual. | ||
| 186 | Added line. Put_Line ("STEP whole-in"); | ||
| 187 | Added line. Flush; | ||
| 188 | Added line. Before_Reads := Arena.Reads; | ||
| 189 | Added line. Consume_Node (P.all, 10); | ||
| 190 | Added line. Assert_Read (Before_Reads); | ||
| 191 | Added line. | ||
| 192 | Added line. -- Explicit and implicit selected-component IN actuals. | ||
| 193 | Added line. Put_Line ("STEP selected-in"); | ||
| 194 | Added line. Flush; | ||
| 195 | Added line. Before_Reads := Arena.Reads; | ||
| 196 | Added line. Consume_Integer (P.all.Value, 10); | ||
| 197 | Added line. Assert_Read (Before_Reads); | ||
| 198 | Added line. | ||
| 199 | Added line. Put_Line ("STEP implicit-selected-in"); | ||
| 200 | Added line. Flush; | ||
| 201 | Added line. | ||
| 202 | Added line. Before_Reads := Arena.Reads; | ||
| 203 | Added line. Consume_Integer (P.Value, 10); | ||
| 204 | Added line. Assert_Read (Before_Reads); | ||
| 205 | Added line. | ||
| 206 | Added line. -- Nested selected component, rooted at two model access values. | ||
| 207 | Added line. Put_Line ("STEP nested-in"); | ||
| 208 | Added line. Flush; | ||
| 209 | Added line. P.Next := Q; | ||
| 210 | Added line. Before_Reads := Arena.Reads; | ||
| 211 | Added line. Consume_Integer (P.Next.Value, 20); | ||
| 212 | Added line. Assert_Read (Before_Reads); | ||
| 213 | Added line. | ||
| 214 | Added line. -- Indexed component rooted at a model access value. | ||
| 215 | Added line. Put_Line ("STEP indexed-in"); | ||
| 216 | Added line. Flush; | ||
| 217 | Added line. Before_Reads := Arena.Reads; | ||
| 218 | Added line. Consume_Integer (A.all (2), 2); | ||
| 219 | Added line. Assert_Read (Before_Reads); | ||
| 220 | Added line. | ||
| 221 | Added line. Before_Reads := Arena.Reads; | ||
| 222 | Added line. Consume_Integer (A (3), 3); | ||
| 223 | Added line. Assert_Read (Before_Reads); | ||
| 224 | Added line. | ||
| 225 | Added line. -- Scalar IN OUT host copy and copyback. | ||
| 226 | Added line. Put_Line ("STEP scalar-in-out"); | ||
| 227 | Added line. Flush; | ||
| 228 | Added line. Before_Reads := Arena.Reads; | ||
| 229 | Added line. Before_Writes := Arena.Writes; | ||
| 230 | Added line. Increment_Integer (P.Value); | ||
| 231 | Added line. Assert_Read (Before_Reads); | ||
| 232 | Added line. Assert_Write (Before_Writes); | ||
| 233 | Added line. Got := P.Value; | ||
| 234 | Added line. pragma Assert (Got = 11); | ||
| 235 | Added line. | ||
| 236 | Added line. -- Whole-record IN OUT host copy and copyback. | ||
| 237 | Added line. Put_Line ("STEP whole-in-out"); | ||
| 238 | Added line. Flush; | ||
| 239 | Added line. Before_Reads := Arena.Reads; | ||
| 240 | Added line. Before_Writes := Arena.Writes; | ||
| 241 | Added line. Increment_Node (P.all); | ||
| 242 | Added line. Assert_Read (Before_Reads); | ||
| 243 | Added line. Assert_Write (Before_Writes); | ||
| 244 | Added line. Got := P.Value; | ||
| 245 | Added line. pragma Assert (Got = 12); | ||
| 246 | Added line. | ||
| 247 | Added line. -- Assignment reads and writes retain normal source syntax. | ||
| 248 | Added line. Put_Line ("STEP assignments"); | ||
| 249 | Added line. Flush; | ||
| 250 | Added line. Before_Reads := Arena.Reads; | ||
| 251 | Added line. Got := P.Value; | ||
| 252 | Added line. Assert_Read (Before_Reads); | ||
| 253 | Added line. pragma Assert (Got = 12); | ||
| 254 | Added line. | ||
| 255 | Added line. Before_Writes := Arena.Writes; | ||
| 256 | Added line. P.Value := 30; | ||
| 257 | Added line. Assert_Write (Before_Writes); | ||
| 258 | Added line. Got := P.Value; | ||
| 259 | Added line. pragma Assert (Got = 30); | ||
| 260 | Added line. | ||
| 261 | Added line. Before_Writes := Arena.Writes; | ||
| 262 | Added line. A (2) := 40; | ||
| 263 | Added line. Assert_Write (Before_Writes); | ||
| 264 | Added line. Got := A (2); | ||
| 265 | Added line. pragma Assert (Got = 40); | ||
| 266 | Added line. | ||
| 267 | Added line. -- Access-value null and equality do not dereference the offset. | ||
| 268 | Added line. Put_Line ("STEP access-values"); | ||
| 269 | Added line. Flush; | ||
| 270 | Added line. pragma Assert (P /= null); | ||
| 271 | Added line. pragma Assert (Q /= null); | ||
| 272 | Added line. pragma Assert (P = P); | ||
| 273 | Added line. pragma Assert (P /= Q); | ||
| 274 | Added line. | ||
| 275 | Added line. Put_Line | ||
| 276 | Added line. ("PASS reads=" & Natural'Image (Arena.Reads) | ||
| 277 | Added line. & " writes=" & Natural'Image (Arena.Writes) | ||
| 278 | Added line. & " read_bytes=" & Storage_Count'Image (Arena.Read_Bytes) | ||
| 279 | Added line. & " write_bytes=" & Storage_Count'Image (Arena.Write_Bytes)); | ||
| 280 | Added line. end Storage_Model_Actuals; | ||
| 281 | | ||