From a26ee14525abd4a544ad039787cf53d9a7811f9e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 7 Jul 2016 13:12:55 +0000 Subject: 2016-07-07 Eric Botcazou * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Remove redundant test, adjust comments and formatting. * sem_prag.adb (Inlining_Not_Possible): Do not test Front_End_Inlining here but... (Make_Inline): ...here before calling Inlining_Not_Possible instead. (Set_Inline_Flags): Remove useless test. (Analyze_Pragma) : Add comment about -gnatn switch. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@238113 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 10 ++++++++++ gcc/ada/sem_ch6.adb | 11 +++++------ gcc/ada/sem_prag.adb | 42 +++++++++++++++++++++++++++--------------- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d4e6482fe6e..711d888c6bd 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,13 @@ +2016-07-07 Eric Botcazou + + * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Remove redundant test, + adjust comments and formatting. + * sem_prag.adb (Inlining_Not_Possible): Do not test Front_End_Inlining + here but... + (Make_Inline): ...here before calling Inlining_Not_Possible instead. + (Set_Inline_Flags): Remove useless test. + (Analyze_Pragma) : Add comment about -gnatn switch. + 2016-07-07 Ed Schonberg * sem_prag.ads, sem_prag.adb (Build_Classwide_Expression): Include diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index dcec1e33d57..4544e0b7861 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -3731,7 +3731,7 @@ package body Sem_Ch6 is return; end if; - -- Handle front-end inlining + -- Handle inlining -- Note: Normally we don't do any inlining if expansion is off, since -- we won't generate code in any case. An exception arises in GNATprove @@ -3748,15 +3748,14 @@ package body Sem_Ch6 is if not Back_End_Inlining then if (Has_Pragma_Inline_Always (Spec_Id) - and then not Opt.Disable_FE_Inline_Always) - or else - (Has_Pragma_Inline (Spec_Id) and then Front_End_Inlining - and then not Opt.Disable_FE_Inline) + and then not Opt.Disable_FE_Inline_Always) + or else (Front_End_Inlining + and then not Opt.Disable_FE_Inline) then Build_Body_To_Inline (N, Spec_Id); end if; - -- New implementation (relying on backend inlining) + -- New implementation (relying on back-end inlining) else if Has_Pragma_Inline_Always (Spec_Id) diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 6e86b1cc936..bcdef91f143 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -3932,7 +3932,7 @@ package body Sem_Prag is -- Enabled: inlining is requested/required for the subprogram procedure Process_Inline (Status : Inline_Status); - -- Common processing for Inline, Inline_Always and No_Inline. Parameter + -- Common processing for No_Inline, Inline and Inline_Always. Parameter -- indicates the inline status specified by the pragma. procedure Process_Interface_Name @@ -8791,21 +8791,20 @@ package body Sem_Prag is -- processing the arguments of the pragma. procedure Make_Inline (Subp : Entity_Id); - -- Subp is the defining unit name of the subprogram declaration. Set - -- the flag, as well as the flag in the corresponding body, if there - -- is one present. + -- Subp is the defining unit name of the subprogram declaration. If + -- the pragma is valid, call Set_Inline_Flags on Subp, as well as on + -- the corresponding body, if there is one present. procedure Set_Inline_Flags (Subp : Entity_Id); - -- Sets Is_Inlined and Has_Pragma_Inline flags for Subp and also - -- Has_Pragma_Inline_Always for the Inline_Always case. + -- Set Has_Pragma_{No_Inline,Inline,Inline_Always} flag on Subp. + -- Also set or clear Is_Inlined flag on Subp depending on Status. function Inlining_Not_Possible (Subp : Entity_Id) return Boolean; -- Returns True if it can be determined at this stage that inlining -- is not possible, for example if the body is available and contains -- exception handlers, we prevent inlining, since otherwise we can -- get undefined symbols at link time. This function also emits a - -- warning if front-end inlining is enabled and the pragma appears - -- too late. + -- warning if the pragma appears too late. -- -- ??? is business with link symbols still valid, or does it relate -- to front end ZCX which is being phased out ??? @@ -8827,9 +8826,7 @@ package body Sem_Prag is elsif Nkind (Decl) = N_Subprogram_Declaration and then Present (Corresponding_Body (Decl)) then - if Front_End_Inlining - and then Analyzed (Corresponding_Body (Decl)) - then + if Analyzed (Corresponding_Body (Decl)) then Error_Msg_N ("pragma appears too late, ignored??", N); return True; @@ -8879,6 +8876,7 @@ package body Sem_Prag is -- If inlining is not possible, for now do not treat as an error elsif Status /= Suppressed + and then Front_End_Inlining and then Inlining_Not_Possible (Subp) then Applies := True; @@ -9048,9 +9046,7 @@ package body Sem_Prag is end if; end if; - if not Has_Pragma_Inline (Subp) then - Set_Has_Pragma_Inline (Subp); - end if; + Set_Has_Pragma_Inline (Subp); end if; -- Then adjust the Is_Inlined flag. It can never be set if the @@ -16398,7 +16394,23 @@ package body Sem_Prag is if not GNATprove_Mode then - -- Inline status is Enabled if inlining option is active + -- Inline status is Enabled if option -gnatn is specified. + -- However this status determines only the value of the + -- Is_Inlined flag on the subprogram and does not prevent + -- the pragma itself from being recorded for later use, + -- in particular for a later modification of Is_Inlined + -- independently of the -gnatn option. + + -- In other words, if -gnatn is specified for a unit, then + -- all Inline pragmas processed for the compilation of this + -- unit, including those in the spec of other units, are + -- activated, so subprograms will be inlined across units. + + -- If -gnatn is not specified, no Inline pragma is activated + -- here, which means that subprograms will not be inlined + -- across units. The Is_Inlined flag will nevertheless be + -- set later when bodies are analyzed, so subprograms will + -- be inlined within the unit. if Inline_Active then Process_Inline (Enabled); -- cgit v1.2.3