OSDN Git Service

2011-08-05 Yannick Moy <moy@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / exp_prag.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             E X P _ P R A G                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2011, 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 Casing;   use Casing;
28 with Debug;    use Debug;
29 with Einfo;    use Einfo;
30 with Errout;   use Errout;
31 with Exp_Ch11; use Exp_Ch11;
32 with Exp_Util; use Exp_Util;
33 with Expander; use Expander;
34 with Namet;    use Namet;
35 with Nlists;   use Nlists;
36 with Nmake;    use Nmake;
37 with Opt;      use Opt;
38 with Restrict; use Restrict;
39 with Rident;   use Rident;
40 with Rtsfind;  use Rtsfind;
41 with Sem;      use Sem;
42 with Sem_Res;  use Sem_Res;
43 with Sem_Util; use Sem_Util;
44 with Sinfo;    use Sinfo;
45 with Sinput;   use Sinput;
46 with Snames;   use Snames;
47 with Stringt;  use Stringt;
48 with Stand;    use Stand;
49 with Targparm; use Targparm;
50 with Tbuild;   use Tbuild;
51 with Uintp;    use Uintp;
52
53 package body Exp_Prag is
54
55    -----------------------
56    -- Local Subprograms --
57    -----------------------
58
59    function Arg1 (N : Node_Id) return Node_Id;
60    function Arg2 (N : Node_Id) return Node_Id;
61    function Arg3 (N : Node_Id) return Node_Id;
62    --  Obtain specified pragma argument expression
63
64    procedure Expand_Pragma_Abort_Defer             (N : Node_Id);
65    procedure Expand_Pragma_Check                   (N : Node_Id);
66    procedure Expand_Pragma_Common_Object           (N : Node_Id);
67    procedure Expand_Pragma_Import_Or_Interface     (N : Node_Id);
68    procedure Expand_Pragma_Import_Export_Exception (N : Node_Id);
69    procedure Expand_Pragma_Inspection_Point        (N : Node_Id);
70    procedure Expand_Pragma_Interrupt_Priority      (N : Node_Id);
71    procedure Expand_Pragma_Psect_Object            (N : Node_Id);
72    procedure Expand_Pragma_Relative_Deadline       (N : Node_Id);
73
74    ----------
75    -- Arg1 --
76    ----------
77
78    function Arg1 (N : Node_Id) return Node_Id is
79       Arg : constant Node_Id := First (Pragma_Argument_Associations (N));
80    begin
81       if Present (Arg)
82         and then Nkind (Arg) = N_Pragma_Argument_Association
83       then
84          return Expression (Arg);
85       else
86          return Arg;
87       end if;
88    end Arg1;
89
90    ----------
91    -- Arg2 --
92    ----------
93
94    function Arg2 (N : Node_Id) return Node_Id is
95       Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N));
96
97    begin
98       if No (Arg1) then
99          return Empty;
100
101       else
102          declare
103             Arg : constant Node_Id := Next (Arg1);
104          begin
105             if Present (Arg)
106               and then Nkind (Arg) = N_Pragma_Argument_Association
107             then
108                return Expression (Arg);
109             else
110                return Arg;
111             end if;
112          end;
113       end if;
114    end Arg2;
115
116    ----------
117    -- Arg3 --
118    ----------
119
120    function Arg3 (N : Node_Id) return Node_Id is
121       Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N));
122
123    begin
124       if No (Arg1) then
125          return Empty;
126
127       else
128          declare
129             Arg : Node_Id := Next (Arg1);
130          begin
131             if No (Arg) then
132                return Empty;
133
134             else
135                Next (Arg);
136
137                if Present (Arg)
138                  and then Nkind (Arg) = N_Pragma_Argument_Association
139                then
140                   return Expression (Arg);
141                else
142                   return Arg;
143                end if;
144             end if;
145          end;
146       end if;
147    end Arg3;
148
149    ---------------------
150    -- Expand_N_Pragma --
151    ---------------------
152
153    procedure Expand_N_Pragma (N : Node_Id) is
154       Pname : constant Name_Id := Pragma_Name (N);
155
156    begin
157       --  Note: we may have a pragma whose Pragma_Identifier field is not a
158       --  recognized pragma, and we must ignore it at this stage.
159
160       if Is_Pragma_Name (Pname) then
161          case Get_Pragma_Id (Pname) is
162
163             --  Pragmas requiring special expander action
164
165             when Pragma_Abort_Defer =>
166                Expand_Pragma_Abort_Defer (N);
167
168             when Pragma_Check =>
169                Expand_Pragma_Check (N);
170
171             when Pragma_Common_Object =>
172                Expand_Pragma_Common_Object (N);
173
174             when Pragma_Export_Exception =>
175                Expand_Pragma_Import_Export_Exception (N);
176
177             when Pragma_Import =>
178                Expand_Pragma_Import_Or_Interface (N);
179
180             when Pragma_Import_Exception =>
181                Expand_Pragma_Import_Export_Exception (N);
182
183             when Pragma_Inspection_Point =>
184                Expand_Pragma_Inspection_Point (N);
185
186             when Pragma_Interface =>
187                Expand_Pragma_Import_Or_Interface (N);
188
189             when Pragma_Interrupt_Priority =>
190                Expand_Pragma_Interrupt_Priority (N);
191
192             when Pragma_Psect_Object =>
193                Expand_Pragma_Psect_Object (N);
194
195             when Pragma_Relative_Deadline =>
196                Expand_Pragma_Relative_Deadline (N);
197
198             --  All other pragmas need no expander action
199
200             when others => null;
201          end case;
202       end if;
203
204    end Expand_N_Pragma;
205
206    -------------------------------
207    -- Expand_Pragma_Abort_Defer --
208    -------------------------------
209
210    --  An Abort_Defer pragma appears as the first statement in a handled
211    --  statement sequence (right after the begin). It defers aborts for
212    --  the entire statement sequence, but not for any declarations or
213    --  handlers (if any) associated with this statement sequence.
214
215    --  The transformation is to transform
216
217    --    pragma Abort_Defer;
218    --    statements;
219
220    --  into
221
222    --    begin
223    --       Abort_Defer.all;
224    --       statements
225    --    exception
226    --       when all others =>
227    --          Abort_Undefer.all;
228    --          raise;
229    --    at end
230    --       Abort_Undefer_Direct;
231    --    end;
232
233    procedure Expand_Pragma_Abort_Defer (N : Node_Id) is
234       Loc  : constant Source_Ptr := Sloc (N);
235       Stm  : Node_Id;
236       Stms : List_Id;
237       HSS  : Node_Id;
238       Blk  : constant Entity_Id :=
239         New_Internal_Entity (E_Block, Current_Scope, Sloc (N), 'B');
240
241    begin
242       Stms := New_List (Build_Runtime_Call (Loc, RE_Abort_Defer));
243
244       loop
245          Stm := Remove_Next (N);
246          exit when No (Stm);
247          Append (Stm, Stms);
248       end loop;
249
250       HSS :=
251         Make_Handled_Sequence_Of_Statements (Loc,
252           Statements => Stms,
253           At_End_Proc =>
254             New_Occurrence_Of (RTE (RE_Abort_Undefer_Direct), Loc));
255
256       Rewrite (N,
257         Make_Block_Statement (Loc,
258           Handled_Statement_Sequence => HSS));
259
260       Set_Scope (Blk, Current_Scope);
261       Set_Etype (Blk, Standard_Void_Type);
262       Set_Identifier (N, New_Occurrence_Of (Blk, Sloc (N)));
263       Expand_At_End_Handler (HSS, Blk);
264       Analyze (N);
265    end Expand_Pragma_Abort_Defer;
266
267    --------------------------
268    -- Expand_Pragma_Check --
269    --------------------------
270
271    procedure Expand_Pragma_Check (N : Node_Id) is
272       Cond : constant Node_Id    := Arg2 (N);
273       Loc  : constant Source_Ptr := Sloc (Cond);
274       Nam  : constant Name_Id    := Chars (Arg1 (N));
275       Msg  : Node_Id;
276
277    begin
278       --  We already know that this check is enabled, because otherwise the
279       --  semantic pass dealt with rewriting the assertion (see Sem_Prag)
280
281       --  Since this check is enabled, we rewrite the pragma into a
282       --  corresponding if statement, and then analyze the statement
283
284       --  The normal case expansion transforms:
285
286       --    pragma Check (name, condition [,message]);
287
288       --  into
289
290       --    if not condition then
291       --       System.Assertions.Raise_Assert_Failure (Str);
292       --    end if;
293
294       --  where Str is the message if one is present, or the default of
295       --  name failed at file:line if no message is given (the "name failed
296       --  at" is omitted for name = Assertion, since it is redundant, given
297       --  that the name of the exception is Assert_Failure.)
298
299       --  An alternative expansion is used when the No_Exception_Propagation
300       --  restriction is active and there is a local Assert_Failure handler.
301       --  This is not a common combination of circumstances, but it occurs in
302       --  the context of Aunit and the zero footprint profile. In this case we
303       --  generate:
304
305       --    if not condition then
306       --       raise Assert_Failure;
307       --    end if;
308
309       --  This will then be transformed into a goto, and the local handler will
310       --  be able to handle the assert error (which would not be the case if a
311       --  call is made to the Raise_Assert_Failure procedure).
312
313       --  We also generate the direct raise if the Suppress_Exception_Locations
314       --  is active, since we don't want to generate messages in this case.
315
316       --  Note that the reason we do not always generate a direct raise is that
317       --  the form in which the procedure is called allows for more efficient
318       --  breakpointing of assertion errors.
319
320       --  Generate the appropriate if statement. Note that we consider this to
321       --  be an explicit conditional in the source, not an implicit if, so we
322       --  do not call Make_Implicit_If_Statement.
323
324       --  In formal verification mode, we keep the pragma check in the code,
325       --  and its enclosed expression is not expanded. This requires that no
326       --  transient scope is introduced for pragma check in this mode in
327       --  Exp_Ch7.Establish_Transient_Scope.
328
329       if ALFA_Mode then
330          return;
331       end if;
332
333       --  Case where we generate a direct raise
334
335       if ((Debug_Flag_Dot_G
336            or else Restriction_Active (No_Exception_Propagation))
337           and then Present (Find_Local_Handler (RTE (RE_Assert_Failure), N)))
338         or else (Opt.Exception_Locations_Suppressed and then No (Arg3 (N)))
339       then
340          Rewrite (N,
341            Make_If_Statement (Loc,
342              Condition =>
343                Make_Op_Not (Loc,
344                  Right_Opnd => Cond),
345              Then_Statements => New_List (
346                Make_Raise_Statement (Loc,
347                  Name =>
348                    New_Reference_To (RTE (RE_Assert_Failure), Loc)))));
349
350       --  Case where we call the procedure
351
352       else
353          --  If we have a message given, use it
354
355          if Present (Arg3 (N)) then
356             Msg := Get_Pragma_Arg (Arg3 (N));
357
358          --  Here we have no string, so prepare one
359
360          else
361             declare
362                Msg_Loc : constant String := Build_Location_String (Loc);
363
364             begin
365                Name_Len := 0;
366
367                --  For Assert, we just use the location
368
369                if Nam = Name_Assertion then
370                   null;
371
372                --  For predicate, we generate the string "predicate failed
373                --  at yyy". We prefer all lower case for predicate.
374
375                elsif Nam = Name_Predicate then
376                   Add_Str_To_Name_Buffer ("predicate failed at ");
377
378                --  For special case of Precondition/Postcondition the string is
379                --  "failed xx from yy" where xx is precondition/postcondition
380                --  in all lower case. The reason for this different wording is
381                --  that the failure is not at the point of occurrence of the
382                --  pragma, unlike the other Check cases.
383
384                elsif Nam = Name_Precondition
385                        or else
386                      Nam = Name_Postcondition
387                then
388                   Get_Name_String (Nam);
389                   Insert_Str_In_Name_Buffer ("failed ", 1);
390                   Add_Str_To_Name_Buffer (" from ");
391
392                --  For all other checks, the string is "xxx failed at yyy"
393                --  where xxx is the check name with current source file casing.
394
395                else
396                   Get_Name_String (Nam);
397                   Set_Casing (Identifier_Casing (Current_Source_File));
398                   Add_Str_To_Name_Buffer (" failed at ");
399                end if;
400
401                --  In all cases, add location string
402
403                Add_Str_To_Name_Buffer (Msg_Loc);
404
405                --  Build the message
406
407                Msg := Make_String_Literal (Loc, Name_Buffer (1 .. Name_Len));
408             end;
409          end if;
410
411          --  Now rewrite as an if statement
412
413          Rewrite (N,
414            Make_If_Statement (Loc,
415              Condition =>
416                Make_Op_Not (Loc,
417                  Right_Opnd => Cond),
418              Then_Statements => New_List (
419                Make_Procedure_Call_Statement (Loc,
420                  Name =>
421                    New_Reference_To (RTE (RE_Raise_Assert_Failure), Loc),
422                  Parameter_Associations => New_List (Relocate_Node (Msg))))));
423       end if;
424
425       Analyze (N);
426
427       --  If new condition is always false, give a warning
428
429       if Warn_On_Assertion_Failure
430         and then Nkind (N) = N_Procedure_Call_Statement
431         and then Is_RTE (Entity (Name (N)), RE_Raise_Assert_Failure)
432       then
433          --  If original condition was a Standard.False, we assume that this is
434          --  indeed intended to raise assert error and no warning is required.
435
436          if Is_Entity_Name (Original_Node (Cond))
437            and then Entity (Original_Node (Cond)) = Standard_False
438          then
439             return;
440          elsif Nam = Name_Assertion then
441             Error_Msg_N ("?assertion will fail at run time", N);
442          else
443             Error_Msg_N ("?check will fail at run time", N);
444          end if;
445       end if;
446    end Expand_Pragma_Check;
447
448    ---------------------------------
449    -- Expand_Pragma_Common_Object --
450    ---------------------------------
451
452    --  Use a machine attribute to replicate semantic effect in DEC Ada
453
454    --    pragma Machine_Attribute (intern_name, "common_object", extern_name);
455
456    --  For now we do nothing with the size attribute ???
457
458    --  Note: Psect_Object shares this processing
459
460    procedure Expand_Pragma_Common_Object (N : Node_Id) is
461       Loc : constant Source_Ptr := Sloc (N);
462
463       Internal : constant Node_Id := Arg1 (N);
464       External : constant Node_Id := Arg2 (N);
465
466       Psect : Node_Id;
467       --  Psect value upper cased as string literal
468
469       Iloc : constant Source_Ptr := Sloc (Internal);
470       Eloc : constant Source_Ptr := Sloc (External);
471       Ploc : Source_Ptr;
472
473    begin
474       --  Acquire Psect value and fold to upper case
475
476       if Present (External) then
477          if Nkind (External) = N_String_Literal then
478             String_To_Name_Buffer (Strval (External));
479          else
480             Get_Name_String (Chars (External));
481          end if;
482
483          Set_All_Upper_Case;
484
485          Psect :=
486            Make_String_Literal (Eloc,
487              Strval => String_From_Name_Buffer);
488
489       else
490          Get_Name_String (Chars (Internal));
491          Set_All_Upper_Case;
492          Psect :=
493            Make_String_Literal (Iloc,
494              Strval => String_From_Name_Buffer);
495       end if;
496
497       Ploc := Sloc (Psect);
498
499       --  Insert the pragma
500
501       Insert_After_And_Analyze (N,
502          Make_Pragma (Loc,
503            Chars => Name_Machine_Attribute,
504            Pragma_Argument_Associations => New_List (
505              Make_Pragma_Argument_Association (Iloc,
506                Expression => New_Copy_Tree (Internal)),
507              Make_Pragma_Argument_Association (Eloc,
508                Expression =>
509                  Make_String_Literal (Sloc => Ploc,
510                    Strval => "common_object")),
511              Make_Pragma_Argument_Association (Ploc,
512                Expression => New_Copy_Tree (Psect)))));
513
514    end Expand_Pragma_Common_Object;
515
516    ---------------------------------------
517    -- Expand_Pragma_Import_Or_Interface --
518    ---------------------------------------
519
520    --  When applied to a variable, the default initialization must not be
521    --  done. As it is already done when the pragma is found, we just get rid
522    --  of the call the initialization procedure which followed the object
523    --  declaration. The call is inserted after the declaration, but validity
524    --  checks may also have been inserted and the initialization call does
525    --  not necessarily appear immediately after the object declaration.
526
527    --  We can't use the freezing mechanism for this purpose, since we
528    --  have to elaborate the initialization expression when it is first
529    --  seen (i.e. this elaboration cannot be deferred to the freeze point).
530
531    procedure Expand_Pragma_Import_Or_Interface (N : Node_Id) is
532       Def_Id    : constant Entity_Id := Entity (Arg2 (N));
533       Init_Call : Node_Id;
534
535    begin
536       if Ekind (Def_Id) = E_Variable then
537
538          --  Find generated initialization call for object, if any
539
540          Init_Call := Find_Init_Call (Def_Id, Rep_Clause => N);
541          if Present (Init_Call) then
542             Remove (Init_Call);
543          end if;
544
545          --  Any default initialization expression should be removed
546          --  (e.g., null defaults for access objects, zero initialization
547          --  of packed bit arrays). Imported objects aren't allowed to
548          --  have explicit initialization, so the expression must have
549          --  been generated by the compiler.
550
551          if No (Init_Call) and then Present (Expression (Parent (Def_Id))) then
552             Set_Expression (Parent (Def_Id), Empty);
553          end if;
554       end if;
555    end Expand_Pragma_Import_Or_Interface;
556
557    -------------------------------------------
558    -- Expand_Pragma_Import_Export_Exception --
559    -------------------------------------------
560
561    --  For a VMS exception fix up the language field with "VMS"
562    --  instead of "Ada" (gigi needs this), create a constant that will be the
563    --  value of the VMS condition code and stuff the Interface_Name field
564    --  with the unexpanded name of the exception (if not already set).
565    --  For a Ada exception, just stuff the Interface_Name field
566    --  with the unexpanded name of the exception (if not already set).
567
568    procedure Expand_Pragma_Import_Export_Exception (N : Node_Id) is
569    begin
570       --  This pragma is only effective on OpenVMS systems, it was ignored
571       --  on non-VMS systems, and we need to ignore it here as well.
572
573       if not OpenVMS_On_Target then
574          return;
575       end if;
576
577       declare
578          Id     : constant Entity_Id := Entity (Arg1 (N));
579          Call   : constant Node_Id := Register_Exception_Call (Id);
580          Loc    : constant Source_Ptr := Sloc (N);
581
582       begin
583          if Present (Call) then
584             declare
585                Excep_Internal : constant Node_Id := Make_Temporary (Loc, 'V');
586                Export_Pragma  : Node_Id;
587                Excep_Alias    : Node_Id;
588                Excep_Object   : Node_Id;
589                Excep_Image    : String_Id;
590                Exdata         : List_Id;
591                Lang_Char      : Node_Id;
592                Code           : Node_Id;
593
594             begin
595                if Present (Interface_Name (Id)) then
596                   Excep_Image := Strval (Interface_Name (Id));
597                else
598                   Get_Name_String (Chars (Id));
599                   Set_All_Upper_Case;
600                   Excep_Image := String_From_Name_Buffer;
601                end if;
602
603                Exdata := Component_Associations (Expression (Parent (Id)));
604
605                if Is_VMS_Exception (Id) then
606                   Lang_Char := Next (First (Exdata));
607
608                   --  Change the one-character language designator to 'V'
609
610                   Rewrite (Expression (Lang_Char),
611                     Make_Character_Literal (Loc,
612                       Chars => Name_uV,
613                       Char_Literal_Value =>
614                         UI_From_Int (Character'Pos ('V'))));
615                   Analyze (Expression (Lang_Char));
616
617                   if Exception_Code (Id) /= No_Uint then
618                      Code :=
619                        Make_Integer_Literal (Loc,
620                          Intval => Exception_Code (Id));
621
622                      Excep_Object :=
623                        Make_Object_Declaration (Loc,
624                          Defining_Identifier => Excep_Internal,
625                          Object_Definition   =>
626                            New_Reference_To (RTE (RE_Exception_Code), Loc));
627
628                      Insert_Action (N, Excep_Object);
629                      Analyze (Excep_Object);
630
631                      Start_String;
632                      Store_String_Int
633                        (UI_To_Int (Exception_Code (Id)) / 8 * 8);
634
635                      Excep_Alias :=
636                        Make_Pragma
637                          (Loc,
638                           Name_Linker_Alias,
639                           New_List
640                             (Make_Pragma_Argument_Association
641                                (Sloc => Loc,
642                                 Expression =>
643                                   New_Reference_To (Excep_Internal, Loc)),
644
645                              Make_Pragma_Argument_Association
646                                (Sloc => Loc,
647                                 Expression =>
648                                   Make_String_Literal
649                                     (Sloc => Loc,
650                                      Strval => End_String))));
651
652                      Insert_Action (N, Excep_Alias);
653                      Analyze (Excep_Alias);
654
655                      Export_Pragma :=
656                        Make_Pragma
657                          (Loc,
658                           Name_Export,
659                           New_List
660                             (Make_Pragma_Argument_Association (Loc,
661                                Expression => Make_Identifier (Loc, Name_C)),
662
663                              Make_Pragma_Argument_Association (Loc,
664                                Expression =>
665                                  New_Reference_To (Excep_Internal, Loc)),
666
667                              Make_Pragma_Argument_Association (Loc,
668                                Expression =>
669                                  Make_String_Literal (Loc, Excep_Image)),
670
671                              Make_Pragma_Argument_Association (Loc,
672                                 Expression =>
673                                   Make_String_Literal (Loc, Excep_Image))));
674
675                      Insert_Action (N, Export_Pragma);
676                      Analyze (Export_Pragma);
677
678                   else
679                      Code :=
680                         Unchecked_Convert_To (RTE (RE_Exception_Code),
681                           Make_Function_Call (Loc,
682                             Name =>
683                               New_Reference_To (RTE (RE_Import_Value), Loc),
684                             Parameter_Associations => New_List
685                               (Make_String_Literal (Loc,
686                                 Strval => Excep_Image))));
687                   end if;
688
689                   Rewrite (Call,
690                     Make_Procedure_Call_Statement (Loc,
691                       Name => New_Reference_To
692                                 (RTE (RE_Register_VMS_Exception), Loc),
693                       Parameter_Associations => New_List (
694                         Code,
695                         Unchecked_Convert_To (RTE (RE_Exception_Data_Ptr),
696                           Make_Attribute_Reference (Loc,
697                             Prefix         => New_Occurrence_Of (Id, Loc),
698                             Attribute_Name => Name_Unrestricted_Access)))));
699
700                   Analyze_And_Resolve (Code, RTE (RE_Exception_Code));
701                   Analyze (Call);
702                end if;
703
704                if No (Interface_Name (Id)) then
705                   Set_Interface_Name (Id,
706                      Make_String_Literal
707                        (Sloc => Loc,
708                         Strval => Excep_Image));
709                end if;
710             end;
711          end if;
712       end;
713    end Expand_Pragma_Import_Export_Exception;
714
715    ------------------------------------
716    -- Expand_Pragma_Inspection_Point --
717    ------------------------------------
718
719    --  If no argument is given, then we supply a default argument list that
720    --  includes all objects declared at the source level in all subprograms
721    --  that enclose the inspection point pragma.
722
723    procedure Expand_Pragma_Inspection_Point (N : Node_Id) is
724       Loc : constant Source_Ptr := Sloc (N);
725       A     : List_Id;
726       Assoc : Node_Id;
727       S     : Entity_Id;
728       E     : Entity_Id;
729
730    begin
731       if No (Pragma_Argument_Associations (N)) then
732          A := New_List;
733          S := Current_Scope;
734
735          while S /= Standard_Standard loop
736             E := First_Entity (S);
737             while Present (E) loop
738                if Comes_From_Source (E)
739                  and then Is_Object (E)
740                  and then not Is_Entry_Formal (E)
741                  and then Ekind (E) /= E_Component
742                  and then Ekind (E) /= E_Discriminant
743                  and then Ekind (E) /= E_Generic_In_Parameter
744                  and then Ekind (E) /= E_Generic_In_Out_Parameter
745                then
746                   Append_To (A,
747                     Make_Pragma_Argument_Association (Loc,
748                       Expression => New_Occurrence_Of (E, Loc)));
749                end if;
750
751                Next_Entity (E);
752             end loop;
753
754             S := Scope (S);
755          end loop;
756
757          Set_Pragma_Argument_Associations (N, A);
758       end if;
759
760       --  Expand the arguments of the pragma. Expanding an entity reference
761       --  is a noop, except in a protected operation, where a reference may
762       --  have to be transformed into a reference to the corresponding prival.
763       --  Are there other pragmas that may require this ???
764
765       Assoc := First (Pragma_Argument_Associations (N));
766
767       while Present (Assoc) loop
768          Expand (Expression (Assoc));
769          Next (Assoc);
770       end loop;
771    end Expand_Pragma_Inspection_Point;
772
773    --------------------------------------
774    -- Expand_Pragma_Interrupt_Priority --
775    --------------------------------------
776
777    --  Supply default argument if none exists (System.Interrupt_Priority'Last)
778
779    procedure Expand_Pragma_Interrupt_Priority (N : Node_Id) is
780       Loc : constant Source_Ptr := Sloc (N);
781
782    begin
783       if No (Pragma_Argument_Associations (N)) then
784          Set_Pragma_Argument_Associations (N, New_List (
785            Make_Pragma_Argument_Association (Loc,
786              Expression =>
787                Make_Attribute_Reference (Loc,
788                  Prefix =>
789                    New_Occurrence_Of (RTE (RE_Interrupt_Priority), Loc),
790                  Attribute_Name => Name_Last))));
791       end if;
792    end Expand_Pragma_Interrupt_Priority;
793
794    --------------------------------
795    -- Expand_Pragma_Psect_Object --
796    --------------------------------
797
798    --  Convert to Common_Object, and expand the resulting pragma
799
800    procedure Expand_Pragma_Psect_Object (N : Node_Id)
801      renames Expand_Pragma_Common_Object;
802
803    -------------------------------------
804    -- Expand_Pragma_Relative_Deadline --
805    -------------------------------------
806
807    procedure Expand_Pragma_Relative_Deadline (N : Node_Id) is
808       P    : constant Node_Id    := Parent (N);
809       Loc  : constant Source_Ptr := Sloc (N);
810
811    begin
812       --  Expand the pragma only in the case of the main subprogram. For tasks
813       --  the expansion is done in exp_ch9. Generate a call to Set_Deadline
814       --  at Clock plus the relative deadline specified in the pragma. Time
815       --  values are translated into Duration to allow for non-private
816       --  addition operation.
817
818       if Nkind (P) = N_Subprogram_Body then
819          Rewrite
820            (N,
821             Make_Procedure_Call_Statement (Loc,
822               Name => New_Reference_To (RTE (RE_Set_Deadline), Loc),
823               Parameter_Associations => New_List (
824                 Unchecked_Convert_To (RTE (RO_RT_Time),
825                   Make_Op_Add (Loc,
826                     Left_Opnd  =>
827                       Make_Function_Call (Loc,
828                         New_Reference_To (RTE (RO_RT_To_Duration), Loc),
829                         New_List (Make_Function_Call (Loc,
830                           New_Reference_To (RTE (RE_Clock), Loc)))),
831                     Right_Opnd  =>
832                       Unchecked_Convert_To (Standard_Duration, Arg1 (N)))))));
833
834          Analyze (N);
835       end if;
836    end Expand_Pragma_Relative_Deadline;
837
838 end Exp_Prag;