[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 25 Apr 2017 08:29:46 +0000 (10:29 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 25 Apr 2017 08:29:46 +0000 (10:29 +0200)
2017-04-25  Javier Miranda  <miranda@adacore.com>

* exp_ch3.adb (Build_Initialization_Call): Handle
subtypes of private types when searching for the underlying full
view of a private type.

2017-04-25  Javier Miranda  <miranda@adacore.com>

* sem_res.adb (Set_Mixed_Mode_Operand): A universal
real conditional expression can appear in a fixed-type context
and must be resolved with that context to facilitate the code
generation to the backend.

2017-04-25  Ed Schonberg  <schonberg@adacore.com>

* einfo.adb, einfo.ads (Body_Needed_For_Inlining): New flag,
to indicate whether during inline processing, when some unit U1
appears in the context of a unit U2 compiled for instantiation
or inlining purposes, the body of U1 needs to be compiled as well.
* sem_prag.adb (Process_Inline): Set Body_Needed_For_Inlining if
context is a package declaration.
* sem_ch12.adb (Analyze_Generic_Subprogram_Declaration,
Analyze_Generic_Package_Declaration): ditto.
* inline.adb (Analyze_Inlined_Bodies): Check
Body_Needed_For_Inlining.

2017-04-25  Ed Schonberg  <schonberg@adacore.com>

* par.adb (Current_Assign_Node): Global variable use to record
the presence of a target_name in the right hand side of the
assignment being parsed.
* par-ch4.adb (P_Name): If the name is a target_name, mark the
enclosing assignment node accordingly.
* par-ch5.adb (P_Assignment_Statement): Set Current_Assign_Node
appropriately.
* sem_ch5.adb (Analyze_Assignment): Disable expansion before
analyzing RHS if the statement has target_names.
* sem_aggr.adb (Resolve_Iterated_Component_Association): Handle
properly choices that are subtype marks.
* exp_ch5.adb: Code cleanup.

2017-04-25  Bob Duff  <duff@adacore.com>

* s-memory.adb: Add a comment regarding efficiency.
* atree.adb: Fix the assertion, and combine 2 assertions into one,
"the source has an extension if and only if the destination does."
* sem_ch3.adb, sem_ch13.adb: Address ??? comments.

2017-04-25  Arnaud Charlet  <charlet@adacore.com trojanek>

* a-tasatt.adb (Set_Value): Fix handling of 32bits -> 64bits
conversion.

2017-04-25  Doug Rupp  <rupp@adacore.com>

* init.c (__gnat_error_handler) [vxworks]: Turn on sigtramp
handling for ppc64-vx7.
* sigtramp-vxworks-target.inc
[SIGTRAMP_BODY]: Add section for ppc64-vx7.

From-SVN: r247146

21 files changed:
gcc/ada/ChangeLog
gcc/ada/a-tasatt.adb
gcc/ada/atree.adb
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/exp_ch3.adb
gcc/ada/exp_ch5.adb
gcc/ada/init.c
gcc/ada/inline.adb
gcc/ada/par-ch4.adb
gcc/ada/par-ch5.adb
gcc/ada/par.adb
gcc/ada/s-memory.adb
gcc/ada/sem_aggr.adb
gcc/ada/sem_ch12.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch5.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_res.adb
gcc/ada/sigtramp-vxworks-target.inc

index d74dfff..ee46f95 100644 (file)
@@ -1,3 +1,63 @@
+2017-04-25  Javier Miranda  <miranda@adacore.com>
+
+       * exp_ch3.adb (Build_Initialization_Call): Handle
+       subtypes of private types when searching for the underlying full
+       view of a private type.
+
+2017-04-25  Javier Miranda  <miranda@adacore.com>
+
+       * sem_res.adb (Set_Mixed_Mode_Operand): A universal
+       real conditional expression can appear in a fixed-type context
+       and must be resolved with that context to facilitate the code
+       generation to the backend.
+
+2017-04-25  Ed Schonberg  <schonberg@adacore.com>
+
+       * einfo.adb, einfo.ads (Body_Needed_For_Inlining): New flag,
+       to indicate whether during inline processing, when some unit U1
+       appears in the context of a unit U2 compiled for instantiation
+       or inlining purposes, the body of U1 needs to be compiled as well.
+       * sem_prag.adb (Process_Inline): Set Body_Needed_For_Inlining if
+       context is a package declaration.
+       * sem_ch12.adb (Analyze_Generic_Subprogram_Declaration,
+       Analyze_Generic_Package_Declaration): ditto.
+       * inline.adb (Analyze_Inlined_Bodies): Check
+       Body_Needed_For_Inlining.
+
+2017-04-25  Ed Schonberg  <schonberg@adacore.com>
+
+       * par.adb (Current_Assign_Node): Global variable use to record
+       the presence of a target_name in the right hand side of the
+       assignment being parsed.
+       * par-ch4.adb (P_Name): If the name is a target_name, mark the
+       enclosing assignment node accordingly.
+       * par-ch5.adb (P_Assignment_Statement): Set Current_Assign_Node
+       appropriately.
+       * sem_ch5.adb (Analyze_Assignment): Disable expansion before
+       analyzing RHS if the statement has target_names.
+       * sem_aggr.adb (Resolve_Iterated_Component_Association): Handle
+       properly choices that are subtype marks.
+       * exp_ch5.adb: Code cleanup.
+
+2017-04-25  Bob Duff  <duff@adacore.com>
+
+       * s-memory.adb: Add a comment regarding efficiency.
+       * atree.adb: Fix the assertion, and combine 2 assertions into one,
+       "the source has an extension if and only if the destination does."
+       * sem_ch3.adb, sem_ch13.adb: Address ??? comments.
+
+2017-04-25  Arnaud Charlet  <charlet@adacore.com trojanek>
+
+       * a-tasatt.adb (Set_Value): Fix handling of 32bits -> 64bits
+       conversion.
+
+2017-04-25  Doug Rupp  <rupp@adacore.com>
+
+       * init.c (__gnat_error_handler) [vxworks]: Turn on sigtramp
+       handling for ppc64-vx7.
+       * sigtramp-vxworks-target.inc
+       [SIGTRAMP_BODY]: Add section for ppc64-vx7.
+
 2017-04-25  Arnaud Charlet  <charlet@adacore.com>
 
        * ada_get_targ.adb: New file.
index 1eb7d59..703d140 100644 (file)
@@ -302,7 +302,11 @@ package body Ada.Task_Attributes is
 
          --  No finalization needed, simply set to Val
 
-         TT.Attributes (Index) := To_Address (Val);
+         if Attribute'Size = Integer'Size then
+            TT.Attributes (Index) := Atomic_Address (To_Int (Val));
+         else
+            TT.Attributes (Index) := To_Address (Val);
+         end if;
 
       else
          Self_Id := STPO.Self;
index 29251c2..9137602 100644 (file)
@@ -767,16 +767,12 @@ package body Atree is
       --  Deal with copying extension nodes if present. No need to copy flags
       --  table entries, since they are always zero for extending components.
 
-      if Has_Extension (Source) then
-         pragma Assert (Has_Extension (Destination));
+      pragma Assert (Has_Extension (Source) = Has_Extension (Destination));
 
+      if Has_Extension (Source) then
          for J in 1 .. Num_Extension_Nodes loop
             Nodes.Table (Destination + J) := Nodes.Table (Source + J);
          end loop;
-
-      else
-         pragma Assert (not Has_Extension (Source));
-         null;
       end if;
    end Copy_Node;
 
index e97d147..e01abdd 100644 (file)
@@ -615,10 +615,9 @@ package body Einfo is
    --    Has_Partial_Visible_Refinement  Flag296
    --    Is_Entry_Wrapper                Flag297
    --    Is_Underlying_Full_View         Flag298
+   --    Body_Needed_For_Inlining        Flag299
 
-   --    (unused)                        Flag299
    --    (unused)                        Flag300
-
    --    (unused)                        Flag301
    --    (unused)                        Flag302
    --    (unused)                        Flag303
@@ -829,6 +828,12 @@ package body Einfo is
       return Node19 (Id);
    end Body_Entity;
 
+   function Body_Needed_For_Inlining (Id : E) return B is
+   begin
+      pragma Assert (Ekind (Id) = E_Package);
+      return Flag299 (Id);
+   end Body_Needed_For_Inlining;
+
    function Body_Needed_For_SAL (Id : E) return B is
    begin
       pragma Assert
@@ -3861,6 +3866,12 @@ package body Einfo is
       Set_Node19 (Id, V);
    end Set_Body_Entity;
 
+   procedure Set_Body_Needed_For_Inlining (Id : E; V : B := True) is
+   begin
+      pragma Assert (Ekind (Id) = E_Package);
+      Set_Flag299 (Id, V);
+   end Set_Body_Needed_For_Inlining;
+
    procedure Set_Body_Needed_For_SAL (Id : E; V : B := True) is
    begin
       pragma Assert
@@ -9252,6 +9263,7 @@ package body Einfo is
 
       W ("Address_Taken",                   Flag104 (Id));
       W ("Body_Needed_For_SAL",             Flag40  (Id));
+      W ("Body_Needed_For_Inlining",        Flag299 (Id));
       W ("C_Pass_By_Copy",                  Flag125 (Id));
       W ("Can_Never_Be_Null",               Flag38  (Id));
       W ("Checks_May_Be_Suppressed",        Flag31  (Id));
index 5a762ab..a08d5d2 100644 (file)
@@ -529,6 +529,14 @@ package Einfo is
 --       units. Indicates that the source for the body must be included
 --       when the unit is part of a standalone library.
 
+--    Body_Needed_For_Inlining (Flag299)
+--       Defined in package entities that are compilation units. Used to
+--       determine whether the body unit needs to be compiled when the
+--       package declaration appears in the list of units to inline. A body
+--       is needed for inline processing if the unit declaration contains
+--       functions that carry pragma Inline or Inline_Always, or if it
+--       contains a generic unit that requires a body.
+--
 --    Body_References (Elist16)
 --       Defined in abstract state entities. Contains an element list of
 --       references (identifiers) that appear in a package body whose spec
@@ -6238,6 +6246,7 @@ package Einfo is
    --    SPARK_Pragma                        (Node40)
    --    SPARK_Aux_Pragma                    (Node41)
    --    Delay_Subprogram_Descriptors        (Flag50)
+   --    Body_Needed_For_Inlining            (Flag299)
    --    Body_Needed_For_SAL                 (Flag40)
    --    Contains_Ignored_Ghost_Code         (Flag279)
    --    Discard_Names                       (Flag88)
@@ -6880,6 +6889,7 @@ package Einfo is
    function Block_Node                          (Id : E) return N;
    function Body_Entity                         (Id : E) return E;
    function Body_Needed_For_SAL                 (Id : E) return B;
+   function Body_Needed_For_Inlining            (Id : E) return B;
    function Body_References                     (Id : E) return L;
    function C_Pass_By_Copy                      (Id : E) return B;
    function Can_Never_Be_Null                   (Id : E) return B;
@@ -7563,6 +7573,7 @@ package Einfo is
    procedure Set_BIP_Initialization_Call         (Id : E; V : N);
    procedure Set_Block_Node                      (Id : E; V : N);
    procedure Set_Body_Entity                     (Id : E; V : E);
+   procedure Set_Body_Needed_For_Inlining        (Id : E; V : B := True);
    procedure Set_Body_Needed_For_SAL             (Id : E; V : B := True);
    procedure Set_Body_References                 (Id : E; V : L);
    procedure Set_C_Pass_By_Copy                  (Id : E; V : B := True);
@@ -8365,6 +8376,7 @@ package Einfo is
    pragma Inline (BIP_Initialization_Call);
    pragma Inline (Block_Node);
    pragma Inline (Body_Entity);
+   pragma Inline (Body_Needed_For_Inlining);
    pragma Inline (Body_Needed_For_SAL);
    pragma Inline (Body_References);
    pragma Inline (C_Pass_By_Copy);
@@ -8886,6 +8898,7 @@ package Einfo is
    pragma Inline (Set_BIP_Initialization_Call);
    pragma Inline (Set_Block_Node);
    pragma Inline (Set_Body_Entity);
+   pragma Inline (Set_Body_Needed_For_Inlining);
    pragma Inline (Set_Body_Needed_For_SAL);
    pragma Inline (Set_Body_References);
    pragma Inline (Set_C_Pass_By_Copy);
index 788cf7f..2033179 100644 (file)
@@ -1451,6 +1451,12 @@ package body Exp_Ch3 is
             elsif Is_Generic_Actual_Type (Full_Type) then
                Full_Type := Base_Type (Full_Type);
 
+            elsif Ekind (Full_Type) = E_Private_Subtype
+              and then (not Has_Discriminants (Full_Type)
+                         or else No (Discriminant_Constraint (Full_Type)))
+            then
+               Full_Type := Etype (Full_Type);
+
             --  The loop has recovered the [underlying] full view, stop the
             --  traversal.
 
index 6a808a3..cd555b4 100644 (file)
@@ -1638,6 +1638,14 @@ package body Exp_Ch5 is
       begin
          if Nkind (N) = N_Target_Name then
             Rewrite (N, New_Occurrence_Of (Ent, Sloc (N)));
+
+         --  The expression will be reanalyzed when the enclosing assignment
+         --  is reanalyzed, so reset the entity, which may be a temporary
+         --  created during analysis, e.g. a loop variable for an iterated
+         --  component association.
+
+         elsif Is_Entity_Name (N) then
+            Set_Entity (N, Empty);
          end if;
 
          Set_Analyzed (N, False);
index 07155f0..e180f3c 100644 (file)
@@ -2005,7 +2005,7 @@ __gnat_error_handler (int sig, siginfo_t *si, void *sc)
   sigdelset (&mask, sig);
   sigprocmask (SIG_SETMASK, &mask, NULL);
 
-#if defined (__ARMEL__) || (defined (__PPC__) && !defined (__PPC64__)) || defined (__i386__) || defined (__x86_64__)
+#if defined (__ARMEL__) || defined (__PPC__) || defined (__i386__) || defined (__x86_64__)
   /* On certain targets, kernel mode, we process signals through a Call Frame
      Info trampoline, voiding the need for myriads of fallback_frame_state
      variants in the ZCX runtime.  We have no simple way to distinguish ZCX
index 78d921a..c20a2df 100644 (file)
@@ -744,14 +744,18 @@ package body Inline is
                Comp_Unit := Parent (Comp_Unit);
             end loop;
 
-            --  Load the body, unless it is the main unit, or is an instance
-            --  whose body has already been analyzed.
+            --  Load the body if it exists and contains inlineable entities,
+            --  unless it is the main unit, or is an instance whose body has
+            --  already been analyzed.
 
             if Present (Comp_Unit)
               and then Comp_Unit /= Cunit (Main_Unit)
               and then Body_Required (Comp_Unit)
               and then (Nkind (Unit (Comp_Unit)) /= N_Package_Declaration
-                         or else No (Corresponding_Body (Unit (Comp_Unit))))
+                         or else
+                          (No (Corresponding_Body (Unit (Comp_Unit)))
+                             and then Body_Needed_For_Inlining
+                               (Defining_Entity (Unit (Comp_Unit)))))
             then
                declare
                   Bname : constant Unit_Name_Type :=
index 4e6c8a7..d500e58 100644 (file)
@@ -235,6 +235,10 @@ package body Ch4 is
 
       if Token = Tok_At_Sign then
          Scan_Reserved_Identifier (Force_Msg => False);
+
+         if Present (Current_Assign_Node) then
+            Set_Has_Target_Names (Current_Assign_Node);
+         end if;
       end if;
 
       Name_Node := Token_Node;
index 5d8b45c..2d975ef 100644 (file)
@@ -1067,9 +1067,11 @@ package body Ch5 is
 
    begin
       Assign_Node := New_Node (N_Assignment_Statement, Prev_Token_Ptr);
+      Current_Assign_Node := Assign_Node;
       Set_Name (Assign_Node, LHS);
       Set_Expression (Assign_Node, P_Expression_No_Right_Paren);
       TF_Semicolon;
+      Current_Assign_Node := Empty;
       return Assign_Node;
    end P_Assignment_Statement;
 
index d3c069a..6c39e33 100644 (file)
@@ -595,6 +595,12 @@ function Par (Configuration_Pragmas : Boolean) return List_Id is
    --  this may not be worth the effort. Also we could deal with the same
    --  situation for EXIT with a label, but for now don't bother with that.
 
+   Current_Assign_Node : Node_Id := Empty;
+   --  This is the node of the current assignment statement being compiled.
+   --  It is used to record the presence of target_names on its RHS. This
+   --  context-dependent trick simplifies the analysis of such nodes, where
+   --  the RHS must first be analyzed with expansion disabled.
+
    ---------------------------------
    -- Parsing Routines by Chapter --
    ---------------------------------
index f419b47..870b68a 100644 (file)
@@ -73,6 +73,8 @@ package body System.Memory is
       --  return Null_Address, and then we can check for that special value.
       --  However, that doesn't work on VxWorks, because malloc(size_t'Last)
       --  prints an unwanted warning message before returning Null_Address.
+      --  Note that the branch is correctly predicted on modern hardware, so
+      --  there is negligible overhead.
 
       if Size = size_t'Last then
          raise Storage_Error with "object too large";
index efa5d60..223a59f 100644 (file)
@@ -1664,7 +1664,19 @@ package body Sem_Aggr is
                Others_Present := True;
 
             else
-               Analyze_And_Resolve (Choice, Index_Typ);
+               Analyze (Choice);
+
+               --  Choice can be a subtype name, a range, or an expression.
+
+               if Is_Entity_Name (Choice)
+                 and then Is_Type (Entity (Choice))
+                 and then Base_Type (Entity (Choice)) = Base_Type (Index_Typ)
+               then
+                  null;
+
+               else
+                  Analyze_And_Resolve (Choice, Index_Typ);
+               end if;
             end if;
 
             Next (Choice);
@@ -1681,6 +1693,8 @@ package body Sem_Aggr is
          --  Decorate the index variable in the current scope. The association
          --  may have several choices, each one leading to a loop, so we create
          --  this variable only once to prevent homonyms in this scope.
+         --  The expression has to be analyzed once the index variable is
+         --  directly visible.
 
          if No (Scope (Id)) then
             Enter_Name (Id);
index c435336..bc82410 100644 (file)
@@ -3374,6 +3374,14 @@ package body Sem_Ch12 is
       End_Package_Scope (Id);
       Exit_Generic_Scope (Id);
 
+      --  If the generic appears within a package unit, the body of that unit
+      --  has to be present for instantiation and inlining.
+
+      if Nkind (Unit (Cunit (Current_Sem_Unit))) = N_Package_Declaration then
+         Set_Body_Needed_For_Inlining
+           (Defining_Entity (Unit (Cunit (Current_Sem_Unit))));
+      end if;
+
       if Nkind (Parent (N)) /= N_Compilation_Unit then
          Move_Freeze_Nodes (Id, N, Visible_Declarations (Specification (N)));
          Move_Freeze_Nodes (Id, N, Private_Declarations (Specification (N)));
@@ -3552,6 +3560,16 @@ package body Sem_Ch12 is
          Set_Body_Required (Parent (N), Unit_Requires_Body (Id));
       end if;
 
+      --  If the generic appears within a package unit, the body of that unit
+      --  has to be present for instantiation and inlining.
+
+      if Nkind (Unit (Cunit (Current_Sem_Unit))) = N_Package_Declaration
+        and then Unit_Requires_Body (Id)
+      then
+         Set_Body_Needed_For_Inlining
+           (Defining_Entity (Unit (Cunit (Current_Sem_Unit))));
+      end if;
+
       Set_Categorization_From_Pragmas (N);
       Validate_Categorization_Dependency (N, Id);
 
@@ -3724,6 +3742,8 @@ package body Sem_Ch12 is
       --  Turn off style checking in instances. If the check is enabled on the
       --  generic unit, a warning in an instance would just be noise. If not
       --  enabled on the generic, then a warning in an instance is just wrong.
+      --  This must be done after analyzing the actuals, which do come from
+      --  source and are subject to style checking.
 
       Style_Check := False;
 
index e796ab3..ce47fd8 100644 (file)
@@ -12754,7 +12754,7 @@ package body Sem_Ch13 is
          elsif Nkind (N) = N_Identifier and then Chars (N) /= Chars (E) then
             Find_Direct_Name (N);
 
-            if True or else not ASIS_Mode then -- ????
+            if not ASIS_Mode then
                Set_Entity (N, Empty);
             end if;
 
index cc06b92..ed385dd 100644 (file)
@@ -2574,7 +2574,7 @@ package body Sem_Ch3 is
                --  rejected. Pending notification we restrict this call to
                --  ASIS mode.
 
-               if False and then ASIS_Mode then -- ????
+               if ASIS_Mode then
                   Resolve_Aspects;
                end if;
 
index c5f4732..8babb8a 100644 (file)
@@ -300,6 +300,10 @@ package body Sem_Ch5 is
       --  Ghost entity. Set the mode now to ensure that any nodes generated
       --  during analysis and expansion are properly marked as Ghost.
 
+      if Has_Target_Names (N) then
+         Expander_Mode_Save_And_Set (False);
+      end if;
+
       Mark_And_Set_Ghost_Assignment (N, Mode);
       Analyze (Rhs);
 
@@ -3546,15 +3550,6 @@ package body Sem_Ch5 is
       else
          Set_Has_Target_Names (Parent (Current_LHS));
          Set_Etype (N, Etype (Current_LHS));
-
-         --  Disable expansion for the rest of the analysis of the current
-         --  right-hand side. The enclosing assignment statement will be
-         --  rewritten during expansion, together with occurrences of the
-         --  target name.
-
-         if Expander_Active then
-            Expander_Mode_Save_And_Set (False);
-         end if;
       end if;
    end Analyze_Target_Name;
 
index 3889d00..e9c9419 100644 (file)
@@ -9112,6 +9112,17 @@ package body Sem_Prag is
 
             Next (Assoc);
          end loop;
+
+         --  If the context is a package declaration, the pragma indicates
+         --  that inlining will require the presence of the corresponding
+         --  body. (this may be further refined).
+
+         if not In_Instance
+           and then Nkind (Unit (Cunit (Current_Sem_Unit)))
+                      = N_Package_Declaration
+         then
+            Set_Body_Needed_For_Inlining (Cunit_Entity (Current_Sem_Unit));
+         end if;
       end Process_Inline;
 
       ----------------------------
index 3d6c395..337b122 100644 (file)
@@ -5353,6 +5353,16 @@ package body Sem_Res is
                Resolve (Op2, T2);
             end;
 
+         --  A universal real conditional expression can appear in a fixed-type
+         --  context and must be resolved with that context to facilitate the
+         --  code generation to the backend.
+
+         elsif Nkind_In (N, N_Case_Expression, N_If_Expression)
+           and then Etype (N) = Universal_Real
+           and then Is_Fixed_Point_Type (B_Typ)
+         then
+            Resolve (N, B_Typ);
+
          else
             Resolve (N);
          end if;
index 722dd31..8eacfd8 100644 (file)
@@ -274,6 +274,7 @@ TCR(".cfi_return_column " S(REGNO_PC))
 /* Trampoline body block
    ---------------------  */
 
+#if !defined (__PPC64__)
 #define SIGTRAMP_BODY \
 CR("") \
 TCR("# Allocate frame and save the non-volatile") \
@@ -298,6 +299,37 @@ TCR("mtlr %r0")            \
 TCR("")                        \
 TCR("addi %r1,%r1,16") \
 TCR("blr")
+#else
+#define SIGTRAMP_BODY \
+CR("") \
+TCR("0:") \
+TCR("addis 2,12,.TOC.-0@ha") \
+TCR("addi 2,2,.TOC.-0@l") \
+TCR("# Allocate frame and save the non-volatile") \
+TCR("# registers we're going to modify") \
+TCR("mflr %r0")        \
+TCR("std %r0,16(%r1)") \
+TCR("stdu %r1,-32(%r1)")  \
+TCR("std %r2,24(%r1)") \
+TCR("std %r" S(CFA_REG) ",8(%r1)")     \
+TCR("")                        \
+TCR("# Setup CFA_REG = context, which we'll retrieve as our CFA value") \
+TCR("mr %r" S(CFA_REG) ", %r7") \
+TCR("")                        \
+TCR("# Call the real handler. The signo, siginfo and sigcontext") \
+TCR("# arguments are the same as those we received in r3, r4 and r5") \
+TCR("mr %r12,%r6") \
+TCR("mtctr %r6") \
+TCR("bctrl")   \
+TCR("")                \
+TCR("# Restore our callee-saved items, release our frame and return") \
+TCR("ld %r" S(CFA_REG) ",8(%r1)")      \
+TCR("ld %r2,24(%r1)")  \
+TCR("addi %r1,%r1,32")  \
+TCR("ld %r0,16(%r1)")  \
+TCR("mtlr %r0")                \
+TCR("blr")
+#endif
 
 #elif defined (__ARMEL__)