Commit c37bb106 by Arnaud Charlet

[multiple changes]

2004-05-19  Joel Brobecker  <brobecker@gnat.com>

	* exp_dbug.ads: Correct comments concerning handling of overloading,
	since we no longer use $ anymore.

2004-05-19  Sergey Rybin  <rybin@act-europe.fr>

	* sem_ch10.adb (Optional_Subunit): When loading a subunit, do not
	ignore errors if ASIS_Mode is set. This prevents creating ASIS trees
	with illegal subunits.

2004-05-19  Ed Schonberg  <schonberg@gnat.com>

	* sem_ch6.adb (Check_Following_Pragma): When compiling a subprogram
	body with front-end inlining enabled, check whether an inline pragma
	appears immediately after the body and applies to it.

	* sem_prag.adb (Cannot_Inline): Emit warning if front-end inlining is
	enabled and the pragma appears after the body of the subprogram.

From-SVN: r82026
parent 31a52b86
2004-05-19 Joel Brobecker <brobecker@gnat.com>
* exp_dbug.ads: Correct comments concerning handling of overloading,
since we no longer use $ anymore.
2004-05-19 Sergey Rybin <rybin@act-europe.fr>
* sem_ch10.adb (Optional_Subunit): When loading a subunit, do not
ignore errors if ASIS_Mode is set. This prevents creating ASIS trees
with illegal subunits.
2004-05-19 Ed Schonberg <schonberg@gnat.com>
* sem_ch6.adb (Check_Following_Pragma): When compiling a subprogram
body with front-end inlining enabled, check whether an inline pragma
appears immediately after the body and applies to it.
* sem_prag.adb (Cannot_Inline): Emit warning if front-end inlining is
enabled and the pragma appears after the body of the subprogram.
2004-05-17 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> 2004-05-17 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
Part of function-at-a-time conversion Part of function-at-a-time conversion
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1996-2003 Free Software Foundation, Inc. -- -- Copyright (C) 1996-2004 Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -99,23 +99,19 @@ package Exp_Dbug is ...@@ -99,23 +99,19 @@ package Exp_Dbug is
-- subprograms, since overloading can legitimately result in a -- subprograms, since overloading can legitimately result in a
-- case of two entities with exactly the same fully qualified names. -- case of two entities with exactly the same fully qualified names.
-- To distinguish between entries in a set of overloaded subprograms, -- To distinguish between entries in a set of overloaded subprograms,
-- the encoded names are serialized by adding one of the suffixes: -- the encoded names are serialized by adding the suffix:
-- $n (dollar sign)
-- __nn (two underscores) -- __nn (two underscores)
-- where nn is a serial number (2 for the second overloaded function, -- where nn is a serial number (2 for the second overloaded function,
-- 2 for the third, etc.). We use $ if this symbol is allowed, and -- 2 for the third, etc.). A suffix of __1 is always omitted (i.e. no
-- double underscore if it is not. In the remaining examples in this -- suffix implies the first instance).
-- section, we use a $ sign, but the $ is replaced by __ throughout
-- these examples if $ sign is not available. A suffix of $1 is
-- always omitted (i.e. no suffix implies the first instance).
-- These names are prefixed by the normal full qualification. So -- These names are prefixed by the normal full qualification. So
-- for example, the third instance of the subprogram qrs in package -- for example, the third instance of the subprogram qrs in package
-- yz would have the name: -- yz would have the name:
-- yz__qrs$3 -- yz__qrs__3
-- A more subtle case arises with entities declared within overloaded -- A more subtle case arises with entities declared within overloaded
-- subprograms. If we have two overloaded subprograms, and both declare -- subprograms. If we have two overloaded subprograms, and both declare
...@@ -128,7 +124,7 @@ package Exp_Dbug is ...@@ -128,7 +124,7 @@ package Exp_Dbug is
-- we are talking about. For this purpose, we use a more complex suffix -- we are talking about. For this purpose, we use a more complex suffix
-- which has the form: -- which has the form:
-- $nn_nn_nn ... -- __nn_nn_nn ...
-- where the nn values are the homonym numbers as needed for any of -- where the nn values are the homonym numbers as needed for any of
-- the qualifying entities, separated by a single underscore. If all -- the qualifying entities, separated by a single underscore. If all
...@@ -141,13 +137,13 @@ package Exp_Dbug is ...@@ -141,13 +137,13 @@ package Exp_Dbug is
-- procedure Tuv is ... end; -- Name is yz__qrs__tuv -- procedure Tuv is ... end; -- Name is yz__qrs__tuv
-- begin ... end Qrs; -- begin ... end Qrs;
-- procedure Qrs (X: Int) is -- Name is yz__qrs$2 -- procedure Qrs (X: Int) is -- Name is yz__qrs__2
-- procedure Tuv is ... end; -- Name is yz__qrs__tuv$2_1 -- procedure Tuv is ... end; -- Name is yz__qrs__tuv__2_1
-- procedure Tuv (X: Int) is -- Name is yz__qrs__tuv$2_2 -- procedure Tuv (X: Int) is -- Name is yz__qrs__tuv__2_2
-- begin ... end Tuv; -- begin ... end Tuv;
-- procedure Tuv (X: Float) is -- Name is yz__qrs__tuv$2_3 -- procedure Tuv (X: Float) is -- Name is yz__qrs__tuv__2_3
-- type m is new float; -- Name is yz__qrs__tuv__m$2_3 -- type m is new float; -- Name is yz__qrs__tuv__m__2_3
-- begin ... end Tuv; -- begin ... end Tuv;
-- begin ... end Qrs; -- begin ... end Qrs;
-- end Yz; -- end Yz;
......
...@@ -948,14 +948,20 @@ package body Sem_Ch10 is ...@@ -948,14 +948,20 @@ package body Sem_Ch10 is
-- Errout to ignore all errors. Note that Fatal_Error will still -- Errout to ignore all errors. Note that Fatal_Error will still
-- be set, so we will be able to check for this case below. -- be set, so we will be able to check for this case below.
Ignore_Errors_Enable := Ignore_Errors_Enable + 1; if not ASIS_Mode then
Ignore_Errors_Enable := Ignore_Errors_Enable + 1;
end if;
Unum := Unum :=
Load_Unit Load_Unit
(Load_Name => Subunit_Name, (Load_Name => Subunit_Name,
Required => False, Required => False,
Subunit => True, Subunit => True,
Error_Node => N); Error_Node => N);
Ignore_Errors_Enable := Ignore_Errors_Enable - 1;
if not ASIS_Mode then
Ignore_Errors_Enable := Ignore_Errors_Enable - 1;
end if;
-- All done if we successfully loaded the subunit -- All done if we successfully loaded the subunit
......
...@@ -790,6 +790,33 @@ package body Sem_Ch6 is ...@@ -790,6 +790,33 @@ package body Sem_Ch6 is
Missing_Ret : Boolean; Missing_Ret : Boolean;
P_Ent : Entity_Id; P_Ent : Entity_Id;
procedure Check_Following_Pragma;
-- If front-end inlining is enabled, look ahead to recognize a pragma
-- that may appear after the body.
procedure Check_Following_Pragma is
Prag : Node_Id;
begin
if Front_End_Inlining
and then Is_List_Member (N)
and then Present (Spec_Decl)
and then List_Containing (N) = List_Containing (Spec_Decl)
then
Prag := Next (N);
if Present (Prag)
and then Nkind (Prag) = N_Pragma
and then Get_Pragma_Id (Chars (Prag)) = Pragma_Inline
and then
Chars
(Expression (First (Pragma_Argument_Associations (Prag))))
= Chars (Body_Id)
then
Analyze (Prag);
end if;
end if;
end Check_Following_Pragma;
begin begin
if Debug_Flag_C then if Debug_Flag_C then
Write_Str ("==== Compiling subprogram body "); Write_Str ("==== Compiling subprogram body ");
...@@ -1141,13 +1168,15 @@ package body Sem_Ch6 is ...@@ -1141,13 +1168,15 @@ package body Sem_Ch6 is
elsif Present (Spec_Id) elsif Present (Spec_Id)
and then Expander_Active and then Expander_Active
and then (Is_Always_Inlined (Spec_Id)
or else (Has_Pragma_Inline (Spec_Id)
and then
(Front_End_Inlining
or else Configurable_Run_Time_Mode)))
then then
Build_Body_To_Inline (N, Spec_Id); Check_Following_Pragma;
if Is_Always_Inlined (Spec_Id)
or else (Has_Pragma_Inline (Spec_Id)
and then (Front_End_Inlining or else Configurable_Run_Time_Mode))
then
Build_Body_To_Inline (N, Spec_Id);
end if;
end if; end if;
-- Ada 0Y (AI-262): In library subprogram bodies, after the analysis -- Ada 0Y (AI-262): In library subprogram bodies, after the analysis
...@@ -1169,6 +1198,7 @@ package body Sem_Ch6 is ...@@ -1169,6 +1198,7 @@ package body Sem_Ch6 is
Process_End_Label (HSS, 't', Current_Scope); Process_End_Label (HSS, 't', Current_Scope);
End_Scope; End_Scope;
Check_Subprogram_Order (N); Check_Subprogram_Order (N);
Set_Analyzed (Body_Id);
-- If we have a separate spec, then the analysis of the declarations -- If we have a separate spec, then the analysis of the declarations
-- caused the entities in the body to be chained to the spec id, but -- caused the entities in the body to be chained to the spec id, but
......
...@@ -2856,15 +2856,17 @@ package body Sem_Prag is ...@@ -2856,15 +2856,17 @@ package body Sem_Prag is
procedure Set_Inline_Flags (Subp : Entity_Id); procedure Set_Inline_Flags (Subp : Entity_Id);
-- Sets Is_Inlined and Has_Pragma_Inline flags for Subp -- Sets Is_Inlined and Has_Pragma_Inline flags for Subp
function Back_End_Cannot_Inline (Subp : Entity_Id) return Boolean; function Cannot_Inline (Subp : Entity_Id) return Boolean;
-- Do not set the inline flag if body is available and contains -- Do not set the inline flag if body is available and contains
-- exception handlers, to prevent undefined symbols at link time. -- exception handlers, to prevent undefined symbols at link time.
-- Emit warning if front-end inlining is enabled and the pragma
-- appears too late.
---------------------------- -------------------
-- Back_End_Cannot_Inline -- -- Cannot_Inline --
---------------------------- -------------------
function Back_End_Cannot_Inline (Subp : Entity_Id) return Boolean is function Cannot_Inline (Subp : Entity_Id) return Boolean is
Decl : constant Node_Id := Unit_Declaration_Node (Subp); Decl : constant Node_Id := Unit_Declaration_Node (Subp);
begin begin
...@@ -2876,12 +2878,19 @@ package body Sem_Prag is ...@@ -2876,12 +2878,19 @@ package body Sem_Prag is
elsif Nkind (Decl) = N_Subprogram_Declaration elsif Nkind (Decl) = N_Subprogram_Declaration
and then Present (Corresponding_Body (Decl)) and then Present (Corresponding_Body (Decl))
then then
if Front_End_Inlining
and then Analyzed (Corresponding_Body (Decl))
then
Error_Msg_N ("pragma appears too late, ignored?", N);
return True;
-- If the subprogram is a renaming as body, the body is -- If the subprogram is a renaming as body, the body is
-- just a call to the renamed subprogram, and inlining is -- just a call to the renamed subprogram, and inlining is
-- trivially possible. -- trivially possible.
if Nkind (Unit_Declaration_Node (Corresponding_Body (Decl))) = elsif
N_Subprogram_Renaming_Declaration Nkind (Unit_Declaration_Node (Corresponding_Body (Decl)))
= N_Subprogram_Renaming_Declaration
then then
return False; return False;
...@@ -2897,7 +2906,7 @@ package body Sem_Prag is ...@@ -2897,7 +2906,7 @@ package body Sem_Prag is
return False; return False;
end if; end if;
end Back_End_Cannot_Inline; end Cannot_Inline;
----------------- -----------------
-- Make_Inline -- -- Make_Inline --
...@@ -2911,7 +2920,7 @@ package body Sem_Prag is ...@@ -2911,7 +2920,7 @@ package body Sem_Prag is
if Etype (Subp) = Any_Type then if Etype (Subp) = Any_Type then
return; return;
elsif Back_End_Cannot_Inline (Subp) then elsif Cannot_Inline (Subp) then
Applies := True; -- Do not treat as an error. Applies := True; -- Do not treat as an error.
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment