[Ada] Unnesting: do not set size of access subprograms
[gcc.git] / gcc / ada / layout.adb
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT COMPILER COMPONENTS --
4 -- --
5 -- L A Y O U T --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 2001-2018, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
20 -- --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
23 -- --
24 ------------------------------------------------------------------------------
25
26 with Atree; use Atree;
27 with Debug; use Debug;
28 with Einfo; use Einfo;
29 with Errout; use Errout;
30 with Opt; use Opt;
31 with Sem_Aux; use Sem_Aux;
32 with Sem_Ch13; use Sem_Ch13;
33 with Sem_Eval; use Sem_Eval;
34 with Sem_Util; use Sem_Util;
35 with Sinfo; use Sinfo;
36 with Snames; use Snames;
37 with Ttypes; use Ttypes;
38 with Uintp; use Uintp;
39
40 package body Layout is
41
42 ------------------------
43 -- Local Declarations --
44 ------------------------
45
46 SSU : constant Int := Ttypes.System_Storage_Unit;
47 -- Short hand for System_Storage_Unit
48
49 -----------------------
50 -- Local Subprograms --
51 -----------------------
52
53 procedure Compute_Size_Depends_On_Discriminant (E : Entity_Id);
54 -- Given an array type or an array subtype E, compute whether its size
55 -- depends on the value of one or more discriminants and set the flag
56 -- Size_Depends_On_Discriminant accordingly. This need not be called
57 -- in front end layout mode since it does the computation on its own.
58
59 procedure Set_Composite_Alignment (E : Entity_Id);
60 -- This procedure is called for record types and subtypes, and also for
61 -- atomic array types and subtypes. If no alignment is set, and the size
62 -- is 2 or 4 (or 8 if the word size is 8), then the alignment is set to
63 -- match the size.
64
65 ----------------------------
66 -- Adjust_Esize_Alignment --
67 ----------------------------
68
69 procedure Adjust_Esize_Alignment (E : Entity_Id) is
70 Abits : Int;
71 Esize_Set : Boolean;
72
73 begin
74 -- Nothing to do if size unknown
75
76 if Unknown_Esize (E) then
77 return;
78 end if;
79
80 -- Determine if size is constrained by an attribute definition clause
81 -- which must be obeyed. If so, we cannot increase the size in this
82 -- routine.
83
84 -- For a type, the issue is whether an object size clause has been set.
85 -- A normal size clause constrains only the value size (RM_Size)
86
87 if Is_Type (E) then
88 Esize_Set := Has_Object_Size_Clause (E);
89
90 -- For an object, the issue is whether a size clause is present
91
92 else
93 Esize_Set := Has_Size_Clause (E);
94 end if;
95
96 -- If size is known it must be a multiple of the storage unit size
97
98 if Esize (E) mod SSU /= 0 then
99
100 -- If not, and size specified, then give error
101
102 if Esize_Set then
103 Error_Msg_NE
104 ("size for& not a multiple of storage unit size",
105 Size_Clause (E), E);
106 return;
107
108 -- Otherwise bump up size to a storage unit boundary
109
110 else
111 Set_Esize (E, (Esize (E) + SSU - 1) / SSU * SSU);
112 end if;
113 end if;
114
115 -- Now we have the size set, it must be a multiple of the alignment
116 -- nothing more we can do here if the alignment is unknown here.
117
118 if Unknown_Alignment (E) then
119 return;
120 end if;
121
122 -- At this point both the Esize and Alignment are known, so we need
123 -- to make sure they are consistent.
124
125 Abits := UI_To_Int (Alignment (E)) * SSU;
126
127 if Esize (E) mod Abits = 0 then
128 return;
129 end if;
130
131 -- Here we have a situation where the Esize is not a multiple of the
132 -- alignment. We must either increase Esize or reduce the alignment to
133 -- correct this situation.
134
135 -- The case in which we can decrease the alignment is where the
136 -- alignment was not set by an alignment clause, and the type in
137 -- question is a discrete type, where it is definitely safe to reduce
138 -- the alignment. For example:
139
140 -- t : integer range 1 .. 2;
141 -- for t'size use 8;
142
143 -- In this situation, the initial alignment of t is 4, copied from
144 -- the Integer base type, but it is safe to reduce it to 1 at this
145 -- stage, since we will only be loading a single storage unit.
146
147 if Is_Discrete_Type (Etype (E)) and then not Has_Alignment_Clause (E)
148 then
149 loop
150 Abits := Abits / 2;
151 exit when Esize (E) mod Abits = 0;
152 end loop;
153
154 Init_Alignment (E, Abits / SSU);
155 return;
156 end if;
157
158 -- Now the only possible approach left is to increase the Esize but we
159 -- can't do that if the size was set by a specific clause.
160
161 if Esize_Set then
162 Error_Msg_NE
163 ("size for& is not a multiple of alignment",
164 Size_Clause (E), E);
165
166 -- Otherwise we can indeed increase the size to a multiple of alignment
167
168 else
169 Set_Esize (E, ((Esize (E) + (Abits - 1)) / Abits) * Abits);
170 end if;
171 end Adjust_Esize_Alignment;
172
173 ------------------------------------------
174 -- Compute_Size_Depends_On_Discriminant --
175 ------------------------------------------
176
177 procedure Compute_Size_Depends_On_Discriminant (E : Entity_Id) is
178 Indx : Node_Id;
179 Ityp : Entity_Id;
180 Lo : Node_Id;
181 Hi : Node_Id;
182 Res : Boolean := False;
183
184 begin
185 -- Loop to process array indexes
186
187 Indx := First_Index (E);
188 while Present (Indx) loop
189 Ityp := Etype (Indx);
190
191 -- If an index of the array is a generic formal type then there is
192 -- no point in determining a size for the array type.
193
194 if Is_Generic_Type (Ityp) then
195 return;
196 end if;
197
198 Lo := Type_Low_Bound (Ityp);
199 Hi := Type_High_Bound (Ityp);
200
201 if (Nkind (Lo) = N_Identifier
202 and then Ekind (Entity (Lo)) = E_Discriminant)
203 or else
204 (Nkind (Hi) = N_Identifier
205 and then Ekind (Entity (Hi)) = E_Discriminant)
206 then
207 Res := True;
208 end if;
209
210 Next_Index (Indx);
211 end loop;
212
213 if Res then
214 Set_Size_Depends_On_Discriminant (E);
215 end if;
216 end Compute_Size_Depends_On_Discriminant;
217
218 -------------------
219 -- Layout_Object --
220 -------------------
221
222 procedure Layout_Object (E : Entity_Id) is
223 pragma Unreferenced (E);
224 begin
225 -- Nothing to do for now, assume backend does the layout
226
227 return;
228 end Layout_Object;
229
230 -----------------
231 -- Layout_Type --
232 -----------------
233
234 procedure Layout_Type (E : Entity_Id) is
235 Desig_Type : Entity_Id;
236
237 begin
238 -- For string literal types, for now, kill the size always, this is
239 -- because gigi does not like or need the size to be set ???
240
241 if Ekind (E) = E_String_Literal_Subtype then
242 Set_Esize (E, Uint_0);
243 Set_RM_Size (E, Uint_0);
244 return;
245 end if;
246
247 -- For access types, set size/alignment. This is system address size,
248 -- except for fat pointers (unconstrained array access types), where the
249 -- size is two times the address size, to accommodate the two pointers
250 -- that are required for a fat pointer (data and template). Note that
251 -- E_Access_Protected_Subprogram_Type is not an access type for this
252 -- purpose since it is not a pointer but is equivalent to a record. For
253 -- access subtypes, copy the size from the base type since Gigi
254 -- represents them the same way.
255
256 if Is_Access_Type (E) then
257 Desig_Type := Underlying_Type (Designated_Type (E));
258
259 -- If we only have a limited view of the type, see whether the
260 -- non-limited view is available.
261
262 if From_Limited_With (Designated_Type (E))
263 and then Ekind (Designated_Type (E)) = E_Incomplete_Type
264 and then Present (Non_Limited_View (Designated_Type (E)))
265 then
266 Desig_Type := Non_Limited_View (Designated_Type (E));
267 end if;
268
269 -- If Esize already set (e.g. by a size clause), then nothing further
270 -- to be done here.
271
272 if Known_Esize (E) then
273 null;
274
275 -- Access to subprogram is a strange beast, and we let the backend
276 -- figure out what is needed (it may be some kind of fat pointer,
277 -- including the static link for example.
278
279 elsif Is_Access_Protected_Subprogram_Type (E) then
280 null;
281
282 -- For access subtypes, copy the size information from base type
283
284 elsif Ekind (E) = E_Access_Subtype then
285 Set_Size_Info (E, Base_Type (E));
286 Set_RM_Size (E, RM_Size (Base_Type (E)));
287
288 -- For other access types, we use either address size, or, if a fat
289 -- pointer is used (pointer-to-unconstrained array case), twice the
290 -- address size to accommodate a fat pointer.
291
292 elsif Present (Desig_Type)
293 and then Is_Array_Type (Desig_Type)
294 and then not Is_Constrained (Desig_Type)
295 and then not Has_Completion_In_Body (Desig_Type)
296
297 -- Debug Flag -gnatd6 says make all pointers to unconstrained thin
298
299 and then not Debug_Flag_6
300 then
301 Init_Size (E, 2 * System_Address_Size);
302
303 -- Check for bad convention set
304
305 if Warn_On_Export_Import
306 and then
307 (Convention (E) = Convention_C
308 or else
309 Convention (E) = Convention_CPP)
310 then
311 Error_Msg_N
312 ("?x?this access type does not correspond to C pointer", E);
313 end if;
314
315 -- If the designated type is a limited view it is unanalyzed. We can
316 -- examine the declaration itself to determine whether it will need a
317 -- fat pointer.
318
319 elsif Present (Desig_Type)
320 and then Present (Parent (Desig_Type))
321 and then Nkind (Parent (Desig_Type)) = N_Full_Type_Declaration
322 and then Nkind (Type_Definition (Parent (Desig_Type))) =
323 N_Unconstrained_Array_Definition
324 and then not Debug_Flag_6
325 then
326 Init_Size (E, 2 * System_Address_Size);
327
328 -- If unnesting subprograms, subprogram access types contain the
329 -- address of both the subprogram and an activation record. But
330 -- if we set that, we'll get a warning on different unchecked
331 -- conversion sizes in the RTS. So leave unset ub that case.
332
333 elsif Unnest_Subprogram_Mode
334 and then Is_Access_Subprogram_Type (E)
335 then
336 -- Init_Size (E, 2 * System_Address_Size);
337 null;
338
339 -- Normal case of thin pointer
340
341 else
342 Init_Size (E, System_Address_Size);
343 end if;
344
345 Set_Elem_Alignment (E);
346
347 -- Scalar types: set size and alignment
348
349 elsif Is_Scalar_Type (E) then
350
351 -- For discrete types, the RM_Size and Esize must be set already,
352 -- since this is part of the earlier processing and the front end is
353 -- always required to lay out the sizes of such types (since they are
354 -- available as static attributes). All we do is to check that this
355 -- rule is indeed obeyed.
356
357 if Is_Discrete_Type (E) then
358
359 -- If the RM_Size is not set, then here is where we set it
360
361 -- Note: an RM_Size of zero looks like not set here, but this
362 -- is a rare case, and we can simply reset it without any harm.
363
364 if not Known_RM_Size (E) then
365 Set_Discrete_RM_Size (E);
366 end if;
367
368 -- If Esize for a discrete type is not set then set it
369
370 if not Known_Esize (E) then
371 declare
372 S : Int := 8;
373
374 begin
375 loop
376 -- If size is big enough, set it and exit
377
378 if S >= RM_Size (E) then
379 Init_Esize (E, S);
380 exit;
381
382 -- If the RM_Size is greater than 64 (happens only when
383 -- strange values are specified by the user, then Esize
384 -- is simply a copy of RM_Size, it will be further
385 -- refined later on)
386
387 elsif S = 64 then
388 Set_Esize (E, RM_Size (E));
389 exit;
390
391 -- Otherwise double possible size and keep trying
392
393 else
394 S := S * 2;
395 end if;
396 end loop;
397 end;
398 end if;
399
400 -- For non-discrete scalar types, if the RM_Size is not set, then set
401 -- it now to a copy of the Esize if the Esize is set.
402
403 else
404 if Known_Esize (E) and then Unknown_RM_Size (E) then
405 Set_RM_Size (E, Esize (E));
406 end if;
407 end if;
408
409 Set_Elem_Alignment (E);
410
411 -- Non-elementary (composite) types
412
413 else
414 -- For packed arrays, take size and alignment values from the packed
415 -- array type if a packed array type has been created and the fields
416 -- are not currently set.
417
418 if Is_Array_Type (E)
419 and then Present (Packed_Array_Impl_Type (E))
420 then
421 declare
422 PAT : constant Entity_Id := Packed_Array_Impl_Type (E);
423
424 begin
425 if Unknown_Esize (E) then
426 Set_Esize (E, Esize (PAT));
427 end if;
428
429 if Unknown_RM_Size (E) then
430 Set_RM_Size (E, RM_Size (PAT));
431 end if;
432
433 if Unknown_Alignment (E) then
434 Set_Alignment (E, Alignment (PAT));
435 end if;
436 end;
437 end if;
438
439 -- If Esize is set, and RM_Size is not, RM_Size is copied from Esize.
440 -- At least for now this seems reasonable, and is in any case needed
441 -- for compatibility with old versions of gigi.
442
443 if Known_Esize (E) and then Unknown_RM_Size (E) then
444 Set_RM_Size (E, Esize (E));
445 end if;
446
447 -- For array base types, set component size if object size of the
448 -- component type is known and is a small power of 2 (8, 16, 32, 64),
449 -- since this is what will always be used.
450
451 if Ekind (E) = E_Array_Type and then Unknown_Component_Size (E) then
452 declare
453 CT : constant Entity_Id := Component_Type (E);
454
455 begin
456 -- For some reason, access types can cause trouble, So let's
457 -- just do this for scalar types ???
458
459 if Present (CT)
460 and then Is_Scalar_Type (CT)
461 and then Known_Static_Esize (CT)
462 then
463 declare
464 S : constant Uint := Esize (CT);
465 begin
466 if Addressable (S) then
467 Set_Component_Size (E, S);
468 end if;
469 end;
470 end if;
471 end;
472 end if;
473 end if;
474
475 -- Even if the backend performs the layout, we still do a little in
476 -- the front end
477
478 -- Processing for record types
479
480 if Is_Record_Type (E) then
481
482 -- Special remaining processing for record types with a known
483 -- size of 16, 32, or 64 bits whose alignment is not yet set.
484 -- For these types, we set a corresponding alignment matching
485 -- the size if possible, or as large as possible if not.
486
487 if Convention (E) = Convention_Ada and then not Debug_Flag_Q then
488 Set_Composite_Alignment (E);
489 end if;
490
491 -- Processing for array types
492
493 elsif Is_Array_Type (E) then
494
495 -- For arrays that are required to be atomic/VFA, we do the same
496 -- processing as described above for short records, since we
497 -- really need to have the alignment set for the whole array.
498
499 if Is_Atomic_Or_VFA (E) and then not Debug_Flag_Q then
500 Set_Composite_Alignment (E);
501 end if;
502
503 -- For unpacked array types, set an alignment of 1 if we know
504 -- that the component alignment is not greater than 1. The reason
505 -- we do this is to avoid unnecessary copying of slices of such
506 -- arrays when passed to subprogram parameters (see special test
507 -- in Exp_Ch6.Expand_Actuals).
508
509 if not Is_Packed (E) and then Unknown_Alignment (E) then
510 if Known_Static_Component_Size (E)
511 and then Component_Size (E) = 1
512 then
513 Set_Alignment (E, Uint_1);
514 end if;
515 end if;
516
517 -- We need to know whether the size depends on the value of one
518 -- or more discriminants to select the return mechanism. Skip if
519 -- errors are present, to prevent cascaded messages.
520
521 if Serious_Errors_Detected = 0 then
522 Compute_Size_Depends_On_Discriminant (E);
523 end if;
524 end if;
525
526 -- Final step is to check that Esize and RM_Size are compatible
527
528 if Known_Static_Esize (E) and then Known_Static_RM_Size (E) then
529 if Esize (E) < RM_Size (E) then
530
531 -- Esize is less than RM_Size. That's not good. First we test
532 -- whether this was set deliberately with an Object_Size clause
533 -- and if so, object to the clause.
534
535 if Has_Object_Size_Clause (E) then
536 Error_Msg_Uint_1 := RM_Size (E);
537 Error_Msg_F
538 ("object size is too small, minimum allowed is ^",
539 Expression (Get_Attribute_Definition_Clause
540 (E, Attribute_Object_Size)));
541 end if;
542
543 -- Adjust Esize up to RM_Size value
544
545 declare
546 Size : constant Uint := RM_Size (E);
547
548 begin
549 Set_Esize (E, RM_Size (E));
550
551 -- For scalar types, increase Object_Size to power of 2, but
552 -- not less than a storage unit in any case (i.e., normally
553 -- this means it will be storage-unit addressable).
554
555 if Is_Scalar_Type (E) then
556 if Size <= SSU then
557 Init_Esize (E, SSU);
558 elsif Size <= 16 then
559 Init_Esize (E, 16);
560 elsif Size <= 32 then
561 Init_Esize (E, 32);
562 else
563 Set_Esize (E, (Size + 63) / 64 * 64);
564 end if;
565
566 -- Finally, make sure that alignment is consistent with
567 -- the newly assigned size.
568
569 while Alignment (E) * SSU < Esize (E)
570 and then Alignment (E) < Maximum_Alignment
571 loop
572 Set_Alignment (E, 2 * Alignment (E));
573 end loop;
574 end if;
575 end;
576 end if;
577 end if;
578 end Layout_Type;
579
580 -----------------------------
581 -- Set_Composite_Alignment --
582 -----------------------------
583
584 procedure Set_Composite_Alignment (E : Entity_Id) is
585 Siz : Uint;
586 Align : Nat;
587
588 begin
589 -- If alignment is already set, then nothing to do
590
591 if Known_Alignment (E) then
592 return;
593 end if;
594
595 -- Alignment is not known, see if we can set it, taking into account
596 -- the setting of the Optimize_Alignment mode.
597
598 -- If Optimize_Alignment is set to Space, then we try to give packed
599 -- records an aligmment of 1, unless there is some reason we can't.
600
601 if Optimize_Alignment_Space (E)
602 and then Is_Record_Type (E)
603 and then Is_Packed (E)
604 then
605 -- No effect for record with atomic/VFA components
606
607 if Is_Atomic_Or_VFA (E) then
608 Error_Msg_N ("Optimize_Alignment has no effect for &??", E);
609
610 if Is_Atomic (E) then
611 Error_Msg_N
612 ("\pragma ignored for atomic record??", E);
613 else
614 Error_Msg_N
615 ("\pragma ignored for bolatile full access record??", E);
616 end if;
617
618 return;
619 end if;
620
621 -- No effect if independent components
622
623 if Has_Independent_Components (E) then
624 Error_Msg_N ("Optimize_Alignment has no effect for &??", E);
625 Error_Msg_N
626 ("\pragma ignored for record with independent components??", E);
627 return;
628 end if;
629
630 -- No effect if any component is atomic/VFA or is a by-reference type
631
632 declare
633 Ent : Entity_Id;
634
635 begin
636 Ent := First_Component_Or_Discriminant (E);
637 while Present (Ent) loop
638 if Is_By_Reference_Type (Etype (Ent))
639 or else Is_Atomic_Or_VFA (Etype (Ent))
640 or else Is_Atomic_Or_VFA (Ent)
641 then
642 Error_Msg_N ("Optimize_Alignment has no effect for &??", E);
643
644 if Is_Atomic (Etype (Ent)) or else Is_Atomic (Ent) then
645 Error_Msg_N
646 ("\pragma is ignored if atomic "
647 & "components present??", E);
648 else
649 Error_Msg_N
650 ("\pragma is ignored if bolatile full access "
651 & "components present??", E);
652 end if;
653
654 return;
655 else
656 Next_Component_Or_Discriminant (Ent);
657 end if;
658 end loop;
659 end;
660
661 -- Optimize_Alignment has no effect on variable length record
662
663 if not Size_Known_At_Compile_Time (E) then
664 Error_Msg_N ("Optimize_Alignment has no effect for &??", E);
665 Error_Msg_N ("\pragma is ignored for variable length record??", E);
666 return;
667 end if;
668
669 -- All tests passed, we can set alignment to 1
670
671 Align := 1;
672
673 -- Not a record, or not packed
674
675 else
676 -- The only other cases we worry about here are where the size is
677 -- statically known at compile time.
678
679 if Known_Static_Esize (E) then
680 Siz := Esize (E);
681 elsif Unknown_Esize (E) and then Known_Static_RM_Size (E) then
682 Siz := RM_Size (E);
683 else
684 return;
685 end if;
686
687 -- Size is known, alignment is not set
688
689 -- Reset alignment to match size if the known size is exactly 2, 4,
690 -- or 8 storage units.
691
692 if Siz = 2 * SSU then
693 Align := 2;
694 elsif Siz = 4 * SSU then
695 Align := 4;
696 elsif Siz = 8 * SSU then
697 Align := 8;
698
699 -- If Optimize_Alignment is set to Space, then make sure the
700 -- alignment matches the size, for example, if the size is 17
701 -- bytes then we want an alignment of 1 for the type.
702
703 elsif Optimize_Alignment_Space (E) then
704 if Siz mod (8 * SSU) = 0 then
705 Align := 8;
706 elsif Siz mod (4 * SSU) = 0 then
707 Align := 4;
708 elsif Siz mod (2 * SSU) = 0 then
709 Align := 2;
710 else
711 Align := 1;
712 end if;
713
714 -- If Optimize_Alignment is set to Time, then we reset for odd
715 -- "in between sizes", for example a 17 bit record is given an
716 -- alignment of 4.
717
718 elsif Optimize_Alignment_Time (E)
719 and then Siz > SSU
720 and then Siz <= 8 * SSU
721 then
722 if Siz <= 2 * SSU then
723 Align := 2;
724 elsif Siz <= 4 * SSU then
725 Align := 4;
726 else -- Siz <= 8 * SSU then
727 Align := 8;
728 end if;
729
730 -- No special alignment fiddling needed
731
732 else
733 return;
734 end if;
735 end if;
736
737 -- Here we have Set Align to the proposed improved value. Make sure the
738 -- value set does not exceed Maximum_Alignment for the target.
739
740 if Align > Maximum_Alignment then
741 Align := Maximum_Alignment;
742 end if;
743
744 -- Further processing for record types only to reduce the alignment
745 -- set by the above processing in some specific cases. We do not
746 -- do this for atomic/VFA records, since we need max alignment there,
747
748 if Is_Record_Type (E) and then not Is_Atomic_Or_VFA (E) then
749
750 -- For records, there is generally no point in setting alignment
751 -- higher than word size since we cannot do better than move by
752 -- words in any case. Omit this if we are optimizing for time,
753 -- since conceivably we may be able to do better.
754
755 if Align > System_Word_Size / SSU
756 and then not Optimize_Alignment_Time (E)
757 then
758 Align := System_Word_Size / SSU;
759 end if;
760
761 -- Check components. If any component requires a higher alignment,
762 -- then we set that higher alignment in any case. Don't do this if
763 -- we have Optimize_Alignment set to Space. Note that that covers
764 -- the case of packed records, where we already set alignment to 1.
765
766 if not Optimize_Alignment_Space (E) then
767 declare
768 Comp : Entity_Id;
769
770 begin
771 Comp := First_Component (E);
772 while Present (Comp) loop
773 if Known_Alignment (Etype (Comp)) then
774 declare
775 Calign : constant Uint := Alignment (Etype (Comp));
776
777 begin
778 -- The cases to process are when the alignment of the
779 -- component type is larger than the alignment we have
780 -- so far, and either there is no component clause for
781 -- the component, or the length set by the component
782 -- clause matches the length of the component type.
783
784 if Calign > Align
785 and then
786 (Unknown_Esize (Comp)
787 or else (Known_Static_Esize (Comp)
788 and then
789 Esize (Comp) = Calign * SSU))
790 then
791 Align := UI_To_Int (Calign);
792 end if;
793 end;
794 end if;
795
796 Next_Component (Comp);
797 end loop;
798 end;
799 end if;
800 end if;
801
802 -- Set chosen alignment, and increase Esize if necessary to match the
803 -- chosen alignment.
804
805 Set_Alignment (E, UI_From_Int (Align));
806
807 if Known_Static_Esize (E)
808 and then Esize (E) < Align * SSU
809 then
810 Set_Esize (E, UI_From_Int (Align * SSU));
811 end if;
812 end Set_Composite_Alignment;
813
814 --------------------------
815 -- Set_Discrete_RM_Size --
816 --------------------------
817
818 procedure Set_Discrete_RM_Size (Def_Id : Entity_Id) is
819 FST : constant Entity_Id := First_Subtype (Def_Id);
820
821 begin
822 -- All discrete types except for the base types in standard are
823 -- constrained, so indicate this by setting Is_Constrained.
824
825 Set_Is_Constrained (Def_Id);
826
827 -- Set generic types to have an unknown size, since the representation
828 -- of a generic type is irrelevant, in view of the fact that they have
829 -- nothing to do with code.
830
831 if Is_Generic_Type (Root_Type (FST)) then
832 Set_RM_Size (Def_Id, Uint_0);
833
834 -- If the subtype statically matches the first subtype, then it is
835 -- required to have exactly the same layout. This is required by
836 -- aliasing considerations.
837
838 elsif Def_Id /= FST and then
839 Subtypes_Statically_Match (Def_Id, FST)
840 then
841 Set_RM_Size (Def_Id, RM_Size (FST));
842 Set_Size_Info (Def_Id, FST);
843
844 -- In all other cases the RM_Size is set to the minimum size. Note that
845 -- this routine is never called for subtypes for which the RM_Size is
846 -- set explicitly by an attribute clause.
847
848 else
849 Set_RM_Size (Def_Id, UI_From_Int (Minimum_Size (Def_Id)));
850 end if;
851 end Set_Discrete_RM_Size;
852
853 ------------------------
854 -- Set_Elem_Alignment --
855 ------------------------
856
857 procedure Set_Elem_Alignment (E : Entity_Id; Align : Nat := 0) is
858 begin
859 -- Do not set alignment for packed array types, this is handled in the
860 -- backend.
861
862 if Is_Packed_Array_Impl_Type (E) then
863 return;
864
865 -- If there is an alignment clause, then we respect it
866
867 elsif Has_Alignment_Clause (E) then
868 return;
869
870 -- If the size is not set, then don't attempt to set the alignment. This
871 -- happens in the backend layout case for access-to-subprogram types.
872
873 elsif not Known_Static_Esize (E) then
874 return;
875
876 -- For access types, do not set the alignment if the size is less than
877 -- the allowed minimum size. This avoids cascaded error messages.
878
879 elsif Is_Access_Type (E) and then Esize (E) < System_Address_Size then
880 return;
881 end if;
882
883 -- We attempt to set the alignment in all the other cases
884
885 declare
886 S : Int;
887 A : Nat;
888 M : Nat;
889
890 begin
891 -- The given Esize may be larger that int'last because of a previous
892 -- error, and the call to UI_To_Int will fail, so use default.
893
894 if Esize (E) / SSU > Ttypes.Maximum_Alignment then
895 S := Ttypes.Maximum_Alignment;
896
897 -- If this is an access type and the target doesn't have strict
898 -- alignment, then cap the alignment to that of a regular access
899 -- type. This will avoid giving fat pointers twice the usual
900 -- alignment for no practical benefit since the misalignment doesn't
901 -- really matter.
902
903 elsif Is_Access_Type (E)
904 and then not Target_Strict_Alignment
905 then
906 S := System_Address_Size / SSU;
907
908 else
909 S := UI_To_Int (Esize (E)) / SSU;
910 end if;
911
912 -- If the default alignment of "double" floating-point types is
913 -- specifically capped, enforce the cap.
914
915 if Ttypes.Target_Double_Float_Alignment > 0
916 and then S = 8
917 and then Is_Floating_Point_Type (E)
918 then
919 M := Ttypes.Target_Double_Float_Alignment;
920
921 -- If the default alignment of "double" or larger scalar types is
922 -- specifically capped, enforce the cap.
923
924 elsif Ttypes.Target_Double_Scalar_Alignment > 0
925 and then S >= 8
926 and then Is_Scalar_Type (E)
927 then
928 M := Ttypes.Target_Double_Scalar_Alignment;
929
930 -- Otherwise enforce the overall alignment cap
931
932 else
933 M := Ttypes.Maximum_Alignment;
934 end if;
935
936 -- We calculate the alignment as the largest power-of-two multiple
937 -- of System.Storage_Unit that does not exceed the object size of
938 -- the type and the maximum allowed alignment, if none was specified.
939 -- Otherwise we only cap it to the maximum allowed alignment.
940
941 if Align = 0 then
942 A := 1;
943 while 2 * A <= S and then 2 * A <= M loop
944 A := 2 * A;
945 end loop;
946 else
947 A := Nat'Min (Align, M);
948 end if;
949
950 -- If alignment is currently not set, then we can safely set it to
951 -- this new calculated value.
952
953 if Unknown_Alignment (E) then
954 Init_Alignment (E, A);
955
956 -- Cases where we have inherited an alignment
957
958 -- For constructed types, always reset the alignment, these are
959 -- generally invisible to the user anyway, and that way we are
960 -- sure that no constructed types have weird alignments.
961
962 elsif not Comes_From_Source (E) then
963 Init_Alignment (E, A);
964
965 -- If this inherited alignment is the same as the one we computed,
966 -- then obviously everything is fine, and we do not need to reset it.
967
968 elsif Alignment (E) = A then
969 null;
970
971 else
972 -- Now we come to the difficult cases of subtypes for which we
973 -- have inherited an alignment different from the computed one.
974 -- We resort to the presence of alignment and size clauses to
975 -- guide our choices. Note that they can generally be present
976 -- only on the first subtype (except for Object_Size) and that
977 -- we need to look at the Rep_Item chain to correctly handle
978 -- derived types.
979
980 declare
981 FST : constant Entity_Id := First_Subtype (E);
982
983 function Has_Attribute_Clause
984 (E : Entity_Id;
985 Id : Attribute_Id) return Boolean;
986 -- Wrapper around Get_Attribute_Definition_Clause which tests
987 -- for the presence of the specified attribute clause.
988
989 --------------------------
990 -- Has_Attribute_Clause --
991 --------------------------
992
993 function Has_Attribute_Clause
994 (E : Entity_Id;
995 Id : Attribute_Id) return Boolean is
996 begin
997 return Present (Get_Attribute_Definition_Clause (E, Id));
998 end Has_Attribute_Clause;
999
1000 begin
1001 -- If the alignment comes from a clause, then we respect it.
1002 -- Consider for example:
1003
1004 -- type R is new Character;
1005 -- for R'Alignment use 1;
1006 -- for R'Size use 16;
1007 -- subtype S is R;
1008
1009 -- Here R has a specified size of 16 and a specified alignment
1010 -- of 1, and it seems right for S to inherit both values.
1011
1012 if Has_Attribute_Clause (FST, Attribute_Alignment) then
1013 null;
1014
1015 -- Now we come to the cases where we have inherited alignment
1016 -- and size, and overridden the size but not the alignment.
1017
1018 elsif Has_Attribute_Clause (FST, Attribute_Size)
1019 or else Has_Attribute_Clause (FST, Attribute_Object_Size)
1020 or else Has_Attribute_Clause (E, Attribute_Object_Size)
1021 then
1022 -- This is tricky, it might be thought that we should try to
1023 -- inherit the alignment, since that's what the RM implies,
1024 -- but that leads to complex rules and oddities. Consider
1025 -- for example:
1026
1027 -- type R is new Character;
1028 -- for R'Size use 16;
1029
1030 -- It seems quite bogus in this case to inherit an alignment
1031 -- of 1 from the parent type Character. Furthermore, if that
1032 -- is what the programmer really wanted for some odd reason,
1033 -- then he could specify the alignment directly.
1034
1035 -- Moreover we really don't want to inherit the alignment in
1036 -- the case of a specified Object_Size for a subtype, since
1037 -- there would be no way of overriding to give a reasonable
1038 -- value (as we don't have an Object_Alignment attribute).
1039 -- Consider for example:
1040
1041 -- subtype R is Character;
1042 -- for R'Object_Size use 16;
1043
1044 -- If we inherit the alignment of 1, then it will be very
1045 -- inefficient for the subtype and this cannot be fixed.
1046
1047 -- So we make the decision that if Size (or Object_Size) is
1048 -- given and the alignment is not specified with a clause,
1049 -- we reset the alignment to the appropriate value for the
1050 -- specified size. This is a nice simple rule to implement
1051 -- and document.
1052
1053 -- There is a theoretical glitch, which is that a confirming
1054 -- size clause could now change the alignment, which, if we
1055 -- really think that confirming rep clauses should have no
1056 -- effect, could be seen as a no-no. However that's already
1057 -- implemented by Alignment_Check_For_Size_Change so we do
1058 -- not change the philosophy here.
1059
1060 -- Historical note: in versions prior to Nov 6th, 2011, an
1061 -- odd distinction was made between inherited alignments
1062 -- larger than the computed alignment (where the larger
1063 -- alignment was inherited) and inherited alignments smaller
1064 -- than the computed alignment (where the smaller alignment
1065 -- was overridden). This was a dubious fix to get around an
1066 -- ACATS problem which seems to have disappeared anyway, and
1067 -- in any case, this peculiarity was never documented.
1068
1069 Init_Alignment (E, A);
1070
1071 -- If no Size (or Object_Size) was specified, then we have
1072 -- inherited the object size, so we should also inherit the
1073 -- alignment and not modify it.
1074
1075 else
1076 null;
1077 end if;
1078 end;
1079 end if;
1080 end;
1081 end Set_Elem_Alignment;
1082
1083 end Layout;