summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog18
-rw-r--r--gcc/ada/exp_ch6.adb129
-rw-r--r--gcc/ada/lib-load.adb12
-rwxr-xr-xgcc/ada/namet-sp.adb17
-rwxr-xr-xgcc/ada/namet-sp.ads3
-rw-r--r--gcc/ada/sem_ch3.adb6
-rw-r--r--gcc/ada/sem_ch4.adb8
7 files changed, 118 insertions, 75 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 7075b6f5e54..1ef52e07f47 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,21 @@
+2009-04-20 Robert Dewar <dewar@adacore.com>
+
+ * sem_ch3.adb: Minor reformatting
+
+ * lib-load.adb: Minor reformatting
+
+ * sem_ch4.adb: Minor reformatting
+
+2009-04-20 Robert Dewar <dewar@adacore.com>
+
+ * namet-sp.ads, namet-sp.adb (Is_Bad_Spelling_Of): Implement new spec
+ (equal values => False).
+
+2009-04-20 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch6.adb (Is_Null_Procedure): predicate is global, so that calls
+ to null procedures can be inlined unconditionally.
+
2009-04-20 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (call_to_gnu): When creating the copy for a
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index bae10b7e4b8..17332f26fbc 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -215,6 +215,10 @@ package body Exp_Ch6 is
-- reference to the object itself, and the call becomes a call to the
-- corresponding protected subprogram.
+ function Is_Null_Procedure (Subp : Entity_Id) return Boolean;
+ -- Predicate to recognize stubbed procedures and null procedures, which
+ -- can be inlined unconditionally in all cases.
+
----------------------------------------------
-- Add_Access_Actual_To_Build_In_Place_Call --
----------------------------------------------
@@ -2887,6 +2891,14 @@ package body Exp_Ch6 is
if Ekind (Subp) = E_Function
or else Ekind (Subp) = E_Procedure
then
+ -- A simple optimization: always replace calls to null procedures
+ -- with a null statement.
+
+ if Is_Null_Procedure (Subp) then
+ Rewrite (N, Make_Null_Statement (Loc));
+ return;
+ end if;
+
if Is_Inlined (Subp) then
Inlined_Subprogram : declare
@@ -3216,10 +3228,6 @@ package body Exp_Ch6 is
-- If the type returned by the function is unconstrained and the
-- call can be inlined, special processing is required.
- function Is_Null_Procedure return Boolean;
- -- Predicate to recognize stubbed procedures and null procedures, for
- -- which there is no need for the full inlining mechanism.
-
procedure Make_Exit_Label;
-- Build declaration for exit label to be used in Return statements
@@ -3246,50 +3254,6 @@ package body Exp_Ch6 is
function Formal_Is_Used_Once (Formal : Entity_Id) return Boolean;
-- Determine whether a formal parameter is used only once in Orig_Bod
- -----------------------
- -- Is_Null_Procedure --
- -----------------------
-
- function Is_Null_Procedure return Boolean is
- Decl : constant Node_Id := Unit_Declaration_Node (Subp);
-
- begin
- if Ekind (Subp) /= E_Procedure then
- return False;
-
- elsif Nkind (Orig_Bod) /= N_Subprogram_Body then
- return False;
-
- -- Check if this is an Ada 2005 null procedure
-
- elsif Nkind (Decl) = N_Subprogram_Declaration
- and then Null_Present (Specification (Decl))
- then
- return True;
-
- -- Check if the body contains only a null statement, followed by the
- -- return statement added during expansion.
-
- else
- declare
- Stat : constant Node_Id :=
- First
- (Statements (Handled_Statement_Sequence (Orig_Bod)));
-
- Stat2 : constant Node_Id := Next (Stat);
-
- begin
- return
- Nkind (Stat) = N_Null_Statement
- and then
- (No (Stat2)
- or else
- (Nkind (Stat2) = N_Simple_Return_Statement
- and then No (Next (Stat2))));
- end;
- end if;
- end Is_Null_Procedure;
-
---------------------
-- Make_Exit_Label --
---------------------
@@ -3611,11 +3575,11 @@ package body Exp_Ch6 is
-- Start of processing for Expand_Inlined_Call
begin
- -- Check for special case of To_Address call, and if so, just do an
- -- unchecked conversion instead of expanding the call. Not only is this
- -- more efficient, but it also avoids problem with order of elaboration
- -- when address clauses are inlined (address expression elaborated at
- -- wrong point).
+
+ -- For To_Address, just do an unchecked conversion . Not only is this
+ -- efficient, but it also avoids problem with order of elaboration
+ -- when address clauses are inlined (address expression elaborated
+ -- at the wrong point).
if Subp = RTE (RE_To_Address) then
Rewrite (N,
@@ -3623,10 +3587,6 @@ package body Exp_Ch6 is
(RTE (RE_Address),
Relocate_Node (First_Actual (N))));
return;
-
- elsif Is_Null_Procedure then
- Rewrite (N, Make_Null_Statement (Loc));
- return;
end if;
-- Check for an illegal attempt to inline a recursive procedure. If the
@@ -4930,6 +4890,61 @@ package body Exp_Ch6 is
end;
end Freeze_Subprogram;
+ -----------------------
+ -- Is_Null_Procedure --
+ -----------------------
+
+ function Is_Null_Procedure (Subp : Entity_Id) return Boolean is
+ Decl : constant Node_Id := Unit_Declaration_Node (Subp);
+
+ begin
+ if Ekind (Subp) /= E_Procedure then
+ return False;
+
+ -- Check if this is a declared null procedure
+
+ elsif Nkind (Decl) = N_Subprogram_Declaration then
+ if Null_Present (Specification (Decl)) then
+ return True;
+
+ elsif No (Body_To_Inline (Decl)) then
+ return False;
+
+ -- Check if the body contains only a null statement, followed by
+ -- the return statement added during expansion.
+
+ else
+ declare
+ Orig_Bod : constant Node_Id := Body_To_Inline (Decl);
+
+ Stat : Node_Id;
+ Stat2 : Node_Id;
+
+ begin
+ if Nkind (Orig_Bod) /= N_Subprogram_Body then
+ return False;
+ else
+ Stat :=
+ First
+ (Statements (Handled_Statement_Sequence (Orig_Bod)));
+ Stat2 := Next (Stat);
+
+ return
+ Nkind (Stat) = N_Null_Statement
+ and then
+ (No (Stat2)
+ or else
+ (Nkind (Stat2) = N_Simple_Return_Statement
+ and then No (Next (Stat2))));
+ end if;
+ end;
+ end if;
+
+ else
+ return False;
+ end if;
+ end Is_Null_Procedure;
+
-------------------------------------------
-- Make_Build_In_Place_Call_In_Allocator --
-------------------------------------------
diff --git a/gcc/ada/lib-load.adb b/gcc/ada/lib-load.adb
index 857b609b0bc..508b2e871ad 100644
--- a/gcc/ada/lib-load.adb
+++ b/gcc/ada/lib-load.adb
@@ -714,12 +714,12 @@ package body Lib.Load is
-- it may very likely be the case that there is also pragma
-- Restriction forbidding its usage. This is typically the
-- case when building a configurable run time, where the
- -- usage of certain run-time units is restricted by
- -- means of both the corresponding pragma Restriction (such
- -- as No_Calendar), and by not including the unit. Hence,
- -- we check whether this predefined unit is forbidden, so
- -- that the message about the restriction violation is
- -- generated, if needed.
+ -- usage of certain run-time units is restricted by means
+ -- of both the corresponding pragma Restriction (such as
+ -- No_Calendar), and by not including the unit. Hence, we
+ -- check whether this predefined unit is forbidden, so that
+ -- the message about the restriction violation is generated,
+ -- if needed.
Check_Restricted_Unit (Load_Name, Error_Node);
diff --git a/gcc/ada/namet-sp.adb b/gcc/ada/namet-sp.adb
index e2deda941fa..30f85f52c02 100755
--- a/gcc/ada/namet-sp.adb
+++ b/gcc/ada/namet-sp.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2009, Free Software Foundation, Inc. --
+-- Copyright (C) 2008-2009, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -186,9 +186,18 @@ package body Namet.Sp is
begin
Get_Name_String_UTF_32 (Found, FB, FBL);
Get_Name_String_UTF_32 (Expect, EB, EBL);
- return
- GNAT.UTF_32_Spelling_Checker.Is_Bad_Spelling_Of
- (FB (1 .. FBL), EB (1 .. EBL));
+
+ -- For an exact match, return False, otherwise check bad spelling. We
+ -- need this special test because the library routine returns True for
+ -- an exact match.
+
+ if FB (1 .. FBL) = EB (1 .. EBL) then
+ return False;
+ else
+ return
+ GNAT.UTF_32_Spelling_Checker.Is_Bad_Spelling_Of
+ (FB (1 .. FBL), EB (1 .. EBL));
+ end if;
end Is_Bad_Spelling_Of;
end Namet.Sp;
diff --git a/gcc/ada/namet-sp.ads b/gcc/ada/namet-sp.ads
index d1de142eacd..15d41a07b05 100755
--- a/gcc/ada/namet-sp.ads
+++ b/gcc/ada/namet-sp.ads
@@ -40,6 +40,7 @@ package Namet.Sp is
function Is_Bad_Spelling_Of (Found, Expect : Name_Id) return Boolean;
-- Compares two identifier names from the names table, and returns True if
-- Found is a plausible misspelling of Expect. This function properly deals
- -- with wide and wide wide character encodings in the input names.
+ -- with wide and wide wide character encodings in the input names. Note
+ -- that an exact match in the names results in False being returned.
end Namet.Sp;
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index 049752941d6..e80c6626a3b 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -993,9 +993,9 @@ package body Sem_Ch3 is
is
procedure Check_For_Premature_Usage (Def : Node_Id);
- -- Check that type T_Name is not used, directly or recursively,
- -- as a parameter or a return type in Def. Def is either a subtype,
- -- an access_definition, or an access_to_subprogram_definition.
+ -- Check that type T_Name is not used, directly or recursively, as a
+ -- parameter or a return type in Def. Def is either a subtype, an
+ -- access_definition, or an access_to_subprogram_definition.
-------------------------------
-- Check_For_Premature_Usage --
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index e1829054ade..e572f56905b 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -127,10 +127,10 @@ package body Sem_Ch4 is
procedure Check_Misspelled_Selector
(Prefix : Entity_Id;
Sel : Node_Id);
- -- Give possible misspelling diagnostic if Sel is likely to be
- -- a misspelling of one of the selectors of the Prefix.
- -- This is called by Analyze_Selected_Component after producing
- -- an invalid selector error message.
+ -- Give possible misspelling diagnostic if Sel is likely to be a mis-
+ -- spelling of one of the selectors of the Prefix. This is called by
+ -- Analyze_Selected_Component after producing an invalid selector error
+ -- message.
function Defined_In_Scope (T : Entity_Id; S : Entity_Id) return Boolean;
-- Verify that type T is declared in scope S. Used to find interpretations