[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 4 Aug 2011 13:54:52 +0000 (15:54 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 4 Aug 2011 13:54:52 +0000 (15:54 +0200)
2011-08-04  Yannick Moy  <moy@adacore.com>

* sem_prag.adb (Check_Arg_Is_String_Literal): remove useless procedure
(Analyze_Pragma): allow static string expression for name of Test_Case,
instead of simply string literals.
* sem_util.adb (Get_Name_From_Test_Case_Pragma): adapt to static string
expressions.

2011-08-04  Vincent Celier  <celier@adacore.com>

* makeutl.adb (Complete_Mains.Find_File_Add_Extension): Use canonical
case suffixes to find truncated main sources.

2011-08-04  Tristan Gingold  <gingold@adacore.com>

* impunit.adb (Non_Imp_File_Names_95): Add g-tastus.
s-stusta.adb (Compute_All_Task): Use Put_Line instead of Put.
(Compute_Current_Task): Ditto.

2011-08-04  Tristan Gingold  <gingold@adacore.com>

* gnat_ugn.texi: Mention GNAT.Task_Stack_Usage.

2011-08-04  Yannick Moy  <moy@adacore.com>

* lib-xref-alfa.adb (Is_Global_Constant): new function that detects
library-level constant.
(Add_ALFA_Xrefs): ignore global constants in ALFA xref.
* sem_res.adb (Resolve_Actuals): do not add cross-reference to Formal
used as selector of parameter association, in ALFA mode.

From-SVN: r177389

gcc/ada/ChangeLog
gcc/ada/gnat_ugn.texi
gcc/ada/impunit.adb
gcc/ada/lib-xref-alfa.adb
gcc/ada/makeutl.adb
gcc/ada/s-stusta.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_res.adb
gcc/ada/sem_util.adb

index 5089441c14e44df9ddafd73c375ece8888142fb8..01ac7c31ccb334e0c499ca26f165687caa32d963 100644 (file)
@@ -1,3 +1,34 @@
+2011-08-04  Yannick Moy  <moy@adacore.com>
+
+       * sem_prag.adb (Check_Arg_Is_String_Literal): remove useless procedure
+       (Analyze_Pragma): allow static string expression for name of Test_Case,
+       instead of simply string literals.
+       * sem_util.adb (Get_Name_From_Test_Case_Pragma): adapt to static string
+       expressions.
+
+2011-08-04  Vincent Celier  <celier@adacore.com>
+
+       * makeutl.adb (Complete_Mains.Find_File_Add_Extension): Use canonical
+       case suffixes to find truncated main sources.
+
+2011-08-04  Tristan Gingold  <gingold@adacore.com>
+
+       * impunit.adb (Non_Imp_File_Names_95): Add g-tastus.
+       s-stusta.adb (Compute_All_Task): Use Put_Line instead of Put.
+       (Compute_Current_Task): Ditto.
+
+2011-08-04  Tristan Gingold  <gingold@adacore.com>
+
+       * gnat_ugn.texi: Mention GNAT.Task_Stack_Usage.
+
+2011-08-04  Yannick Moy  <moy@adacore.com>
+
+       * lib-xref-alfa.adb (Is_Global_Constant): new function that detects
+       library-level constant.
+       (Add_ALFA_Xrefs): ignore global constants in ALFA xref.
+       * sem_res.adb (Resolve_Actuals): do not add cross-reference to Formal
+       used as selector of parameter association, in ALFA mode.
+
 2011-08-04  Robert Dewar  <dewar@adacore.com>
 
        * exp_ch5.adb, exp_ch7.adb, exp_util.adb, bindgen.adb, sem_prag.adb,
index ee2c381314e3da90760422accab4209b45076a0f..d45a6fc3aa3130834ad4a5fe3e07e0df8ba53325 100644 (file)
@@ -17285,6 +17285,9 @@ much has actually been used.
 The environment task stack, e.g., the stack that contains the main unit, is
 only processed when the environment variable GNAT_STACK_LIMIT is set.
 
+@noident
+The package @code{GNAT.Task_Stack_Usage} provides facilities to get
+stack usage reports at run-time. See its body for the details.
 
 @c *********************************
 @c *            GNATCHECK          *
index 65e18428cd8860b4e36e2ffe8d1fff6b19ac2e5a..e58b345d72a4c26b8d7edca23d1175ca5cfe2c77 100644 (file)
@@ -295,6 +295,7 @@ package body Impunit is
      "g-ssvety",    -- GNAT.SSE.Vector_Types
      "g-table ",    -- GNAT.Table
      "g-tasloc",    -- GNAT.Task_Lock
+     "g-tastus",    -- GNAT.Task_Stack_Usage
      "g-thread",    -- GNAT.Threads
      "g-timsta",    -- GNAT.Time_Stamp
      "g-traceb",    -- GNAT.Traceback
index 77da460df3f7c23406951db250f7bee30d07af6b..0e0a4ff2973f53a3db83e9c44cf98425e84e6211 100644 (file)
@@ -524,6 +524,10 @@ package body ALFA is
          function Is_ALFA_Scope (E : Entity_Id) return Boolean;
          --  Return whether the entity or reference scope is adequate
 
+         function Is_Global_Constant (E : Entity_Id) return Boolean;
+         --  Return True if E is a global constant for which we should ignore
+         --  reads in ALFA.
+
          -------------------
          -- Is_ALFA_Scope --
          -------------------
@@ -536,6 +540,16 @@ package body ALFA is
               and then Get_Scope_Num (E) /= No_Scope;
          end Is_ALFA_Scope;
 
+         ------------------------
+         -- Is_Global_Constant --
+         ------------------------
+
+         function Is_Global_Constant (E : Entity_Id) return Boolean is
+         begin
+            return Ekind (E) in E_Constant
+              and then Ekind_In (Scope (E), E_Package, E_Package_Body);
+         end Is_Global_Constant;
+
          --  Start of processing for Eliminate_Before_Sort
       begin
 
@@ -547,6 +561,7 @@ package body ALFA is
               and then ALFA_References (Xrefs.Table (Rnums (J)).Typ)
               and then Is_ALFA_Scope (Xrefs.Table (Rnums (J)).Ent_Scope)
               and then Is_ALFA_Scope (Xrefs.Table (Rnums (J)).Ref_Scope)
+              and then not Is_Global_Constant (Xrefs.Table (Rnums (J)).Ent)
             then
                Nrefs         := Nrefs + 1;
                Rnums (Nrefs) := Rnums (J);
index 0be182e74139163ea4db2ae1dd2a7e8774e43286..f091690eb1f436e63a2d002740dcb4f8afb93a14 100644 (file)
@@ -1368,9 +1368,16 @@ package body Makeutl is
                      Suffix :=
                        Source.Language.Config.Naming_Data.Body_Suffix;
 
-                     exit when Suffix /= No_File and then
-                       Name_Buffer (Base_Main'Length + 1 .. Name_Len) =
-                       Get_Name_String (Suffix);
+                     if Suffix /= No_File then
+                        declare
+                           Suffix_Str : String := Get_Name_String (Suffix);
+                        begin
+                           Canonical_Case_File_Name (Suffix_Str);
+                           exit when
+                             Name_Buffer (Base_Main'Length + 1 .. Name_Len) =
+                             Suffix_Str;
+                        end;
+                     end if;
                   end if;
 
                elsif Source.Kind = Spec then
@@ -1385,12 +1392,18 @@ package body Makeutl is
                      Suffix :=
                        Source.Language.Config.Naming_Data.Spec_Suffix;
 
-                     if Suffix /= No_File
-                       and then
-                         Name_Buffer (Base_Main'Length + 1 .. Name_Len) =
-                         Get_Name_String (Suffix)
-                     then
-                        Spec_Source := Source;
+                     if Suffix /= No_File then
+                        declare
+                           Suffix_Str : String := Get_Name_String (Suffix);
+                        begin
+                           Canonical_Case_File_Name (Suffix_Str);
+
+                           if Name_Buffer (Base_Main'Length + 1 .. Name_Len) =
+                             Suffix_Str
+                           then
+                              Spec_Source := Source;
+                           end if;
+                        end;
                      end if;
                   end if;
                end if;
index 8961759ce103184ac7245d32287b827346169019..f899266218eb62072c9a038a43f02352c16890f5 100644 (file)
@@ -92,7 +92,7 @@ package body System.Stack_Usage.Tasking is
       use type System.Tasking.Task_Id;
    begin
       if not System.Stack_Usage.Is_Enabled then
-         Put ("Stack Usage not enabled: bind with -uNNN switch");
+         Put_Line ("Stack Usage not enabled: bind with -uNNN switch");
       else
 
          --  Loop over all tasks
@@ -118,7 +118,7 @@ package body System.Stack_Usage.Tasking is
    procedure Compute_Current_Task is
    begin
       if not System.Stack_Usage.Is_Enabled then
-         Put ("Stack Usage not enabled: bind with -uNNN switch");
+         Put_Line ("Stack Usage not enabled: bind with -uNNN switch");
       else
 
          --  The current task
index a0b56a98c9830a24c84cb854d45e93b09e32169b..8c95ada1cc44fbe68d15b728740b98a8e5e043b8 100644 (file)
@@ -335,10 +335,6 @@ package body Sem_Prag is
       --  Check the specified argument Arg to make sure that it is an integer
       --  literal. If not give error and raise Pragma_Exit.
 
-      procedure Check_Arg_Is_String_Literal (Arg : Node_Id);
-      --  Check the specified argument Arg to make sure that it is a string
-      --  literal. If not give error and raise Pragma_Exit.
-
       procedure Check_Arg_Is_Library_Level_Local_Name (Arg : Node_Id);
       --  Check the specified argument Arg to make sure that it has the proper
       --  syntactic form for a local name and meets the semantic requirements
@@ -426,9 +422,9 @@ package body Sem_Prag is
       --  Checks that the given argument has an identifier, and if so, requires
       --  it to match one of the given identifier names. If there is no
       --  identifier, or a non-matching identifier, then an error message is
-      --  given and Pragma_Exit is raised. ??? why is this needed, why isnt
-      --  Check_Arg_Is_One_Of good enough. At the very least explain this
-      --  odd apparent redundancy
+      --  given and Pragma_Exit is raised. This checks the optional identifier
+      --  of a pragma argument, not the argument itself like
+      --  Check_Arg_Is_One_Of does.
 
       procedure Check_In_Main_Program;
       --  Common checks for pragmas that appear within a main program
@@ -901,19 +897,6 @@ package body Sem_Prag is
          end if;
       end Check_Arg_Is_Integer_Literal;
 
-      ---------------------------------
-      -- Check_Arg_Is_String_Literal --
-      ---------------------------------
-
-      procedure Check_Arg_Is_String_Literal (Arg : Node_Id) is
-         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
-      begin
-         if Nkind (Argx) /= N_String_Literal then
-            Error_Pragma_Arg
-              ("argument for pragma% must be string literal", Argx);
-         end if;
-      end Check_Arg_Is_String_Literal;
-
       -------------------------------------------
       -- Check_Arg_Is_Library_Level_Local_Name --
       -------------------------------------------
@@ -13264,17 +13247,12 @@ package body Sem_Prag is
          -- Test_Case --
          ---------------
 
-         --  pragma Test_Case ([Name     =>] String_EXPRESSION
+         --  pragma Test_Case ([Name     =>] static_string_EXPRESSION
          --                   ,[Mode     =>] (Normal | Robustness)
          --                  [, Requires =>  Boolean_EXPRESSION]
          --                  [, Ensures  =>  Boolean_EXPRESSION]);
 
-         --  ??? Why is Name not static_string_EXPRESSION??? Seems very
-         --  weird to require it to be a string literal, and if we DO want
-         --  that restriction the grammar should make this clear.
-
          when Pragma_Test_Case => Test_Case : declare
-
          begin
             GNAT_Pragma;
             Check_At_Least_N_Arguments (3);
@@ -13283,7 +13261,7 @@ package body Sem_Prag is
               ((Name_Name, Name_Mode, Name_Requires, Name_Ensures));
 
             Check_Optional_Identifier (Arg1, Name_Name);
-            Check_Arg_Is_String_Literal (Arg1);
+            Check_Arg_Is_Static_Expression (Arg1, Standard_String);
             Check_Optional_Identifier (Arg2, Name_Mode);
             Check_Arg_Is_One_Of (Arg2, Name_Normal, Name_Robustness);
 
@@ -13291,9 +13269,6 @@ package body Sem_Prag is
                Check_Identifier (Arg3, Name_Requires);
                Check_Identifier (Arg4, Name_Ensures);
             else
-               --  ??? why not Check_Arg_Is_One_Of, very odd!!! At the very
-               --  least needs an explanation!
-
                Check_Identifier_Is_One_Of (Arg3, Name_Requires, Name_Ensures);
             end if;
 
index c79672f885304a6e1077e712899141eac7a03852..f383809bf3d1b3faa4bfdd2bb0dd046a9b200887 100644 (file)
@@ -3971,9 +3971,14 @@ package body Sem_Res is
             Eval_Actual (A);
 
             --  If it is a named association, treat the selector_name as a
-            --  proper identifier, and mark the corresponding entity.
+            --  proper identifier, and mark the corresponding entity. Ignore
+            --  this reference in ALFA mode, as it refers to an entity not in
+            --  scope at the point of reference, so the reference should be
+            --  ignored for computing effects of subprograms.
 
-            if Nkind (Parent (A)) = N_Parameter_Association then
+            if Nkind (Parent (A)) = N_Parameter_Association
+              and then not ALFA_Mode
+            then
                Set_Entity (Selector_Name (Parent (A)), F);
                Generate_Reference (F, Selector_Name (Parent (A)));
                Set_Etype (Selector_Name (Parent (A)), F_Typ);
index b7e3f21ff76c67f3f9a5b07e8e6c7e7c4cf105f0..0c36811ec5bdfa9cec2f8dfcb7d95c02ac4d84bc 100644 (file)
@@ -4336,9 +4336,10 @@ package body Sem_Util is
    ------------------------------------
 
    function Get_Name_From_Test_Case_Pragma (N : Node_Id) return String_Id is
+      Arg : constant Node_Id :=
+              Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
    begin
-      return
-        Strval (Get_Pragma_Arg (First (Pragma_Argument_Associations (N))));
+      return Strval (Expr_Value_S (Arg));
    end Get_Name_From_Test_Case_Pragma;
 
    -------------------