[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 4 Aug 2011 13:45:00 +0000 (15:45 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 4 Aug 2011 13:45:00 +0000 (15:45 +0200)
2011-08-04  Javier Miranda  <miranda@adacore.com>

* exp_ch7.adb (Expand_N_Package_Body, Expand_N_Package_Declaration):
Remove code which takes care of building TSDs.
* rtsfind.ads (RE_Check_Interface_Conversion): New entity.
* exp_ch4.adb (Apply_Accessibility_Check): Add support for generating
the accessibility check in VM targets.
* exp_disp.adb (Make_VM_TSD): Spec moved to exp_disp.ads
(Building_Static_DT): Now returns false for VM targets.
(Build_VM_TSDs): Removed.
(Expand_Interface_Conversion): Generate missing runtime check for
conversions to interface types whose target type is unknown at compile
time.
(Make_VM_TSD): Add missing code to disable the generation of calls to
Check_TSD if the tagged type is not defined at library level, or not
has a representation clause specifying its external tag, or -gnatdQ is
active.
* exp_disp.ads (Build_VM_TSDs): Removed.
(Make_VM_TSDs): Spec relocated from exp_disp.adb
* sem_disp.adb (Check_Dispatching_Operation): No code required to
register primitives in the dispatch tables in VM targets.
* exp_ch3.adb (Expand_N_Object_Declaration): Remove wrong expansion of
initialization of class-wide interface objects in VM targets.
(Expand_Freeze_Record_Type): For VM targets call Make_VM_TSD (instead
of Make_DT).

2011-08-04  Jerome Lambourg  <lambourg@adacore.com>

* gnatlink.adb (Gnatlink): Correct missleading error message displayed
when dotnet-ld cannot be found.

2011-08-04  Arnaud Charlet  <charlet@adacore.com>

* bindgen.adb: Simplify significantly generation of binder body file in
CodePeer mode.
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Prevent assert failure
when compiling binder generated file in CodePeer mode (xxx'Elab_Spec
not expanded).

From-SVN: r177387

12 files changed:
gcc/ada/ChangeLog
gcc/ada/bindgen.adb
gcc/ada/exp_ch3.adb
gcc/ada/exp_ch4.adb
gcc/ada/exp_ch6.adb
gcc/ada/exp_ch7.adb
gcc/ada/exp_disp.adb
gcc/ada/exp_disp.ads
gcc/ada/gnatlink.adb
gcc/ada/rtsfind.ads
gcc/ada/sem_ch6.adb
gcc/ada/sem_disp.adb

index ec696b94f1be86467a400c76716cd9cccdccd500..9e1dd4078a07ac3d0dc4b21f2940df65d90fa728 100644 (file)
@@ -1,3 +1,42 @@
+2011-08-04  Javier Miranda  <miranda@adacore.com>
+
+       * exp_ch7.adb (Expand_N_Package_Body, Expand_N_Package_Declaration):
+       Remove code which takes care of building TSDs.
+       * rtsfind.ads (RE_Check_Interface_Conversion): New entity.
+       * exp_ch4.adb (Apply_Accessibility_Check): Add support for generating
+       the accessibility check in VM targets.
+       * exp_disp.adb (Make_VM_TSD): Spec moved to exp_disp.ads
+       (Building_Static_DT): Now returns false for VM targets.
+       (Build_VM_TSDs): Removed.
+       (Expand_Interface_Conversion): Generate missing runtime check for
+       conversions to interface types whose target type is unknown at compile
+       time.
+       (Make_VM_TSD): Add missing code to disable the generation of calls to
+       Check_TSD if the tagged type is not defined at library level, or not
+       has a representation clause specifying its external tag, or -gnatdQ is
+       active.
+       * exp_disp.ads (Build_VM_TSDs): Removed.
+       (Make_VM_TSDs): Spec relocated from exp_disp.adb
+       * sem_disp.adb (Check_Dispatching_Operation): No code required to
+       register primitives in the dispatch tables in VM targets.
+       * exp_ch3.adb (Expand_N_Object_Declaration): Remove wrong expansion of
+       initialization of class-wide interface objects in VM targets.
+       (Expand_Freeze_Record_Type): For VM targets call Make_VM_TSD (instead
+       of Make_DT).
+
+2011-08-04  Jerome Lambourg  <lambourg@adacore.com>
+
+       * gnatlink.adb (Gnatlink): Correct missleading error message displayed
+       when dotnet-ld cannot be found.
+
+2011-08-04  Arnaud Charlet  <charlet@adacore.com>
+
+       * bindgen.adb: Simplify significantly generation of binder body file in
+       CodePeer mode.
+       * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Prevent assert failure
+       when compiling binder generated file in CodePeer mode (xxx'Elab_Spec
+       not expanded).
+
 2011-08-04  Yannick Moy  <moy@adacore.com>
 
        * sem_prag.adb, sem.ads: Code cleanup.
index f2714cdd895883357206bcf80fc3dfb993e9933c..47e1d1b7f8ff4d9f4fef9081b2c3f67275325a92 100644 (file)
@@ -435,7 +435,10 @@ package body Bindgen is
    begin
       WBI ("   procedure " & Ada_Final_Name.all & " is");
 
-      if VM_Target = No_VM and then Bind_Main_Program then
+      if VM_Target = No_VM
+        and Bind_Main_Program
+        and not CodePeer_Mode
+      then
          WBI ("      procedure s_stalib_adafinal;");
          Set_String ("      pragma Import (C, s_stalib_adafinal, ");
          Set_String ("""system__standard_library__adafinal"");");
@@ -443,15 +446,18 @@ package body Bindgen is
       end if;
 
       WBI ("   begin");
-      WBI ("      if not Is_Elaborated then");
-      WBI ("         return;");
-      WBI ("      end if;");
-      WBI ("      Is_Elaborated := False;");
+
+      if not CodePeer_Mode then
+         WBI ("      if not Is_Elaborated then");
+         WBI ("         return;");
+         WBI ("      end if;");
+         WBI ("      Is_Elaborated := False;");
+      end if;
 
       --  On non-virtual machine targets, finalization is done differently
       --  depending on whether this is the main program or a library.
 
-      if VM_Target = No_VM then
+      if VM_Target = No_VM and then not CodePeer_Mode then
          if Bind_Main_Program then
             WBI ("      s_stalib_adafinal;");
          elsif Lib_Final_Built then
@@ -462,6 +468,7 @@ package body Bindgen is
 
       --  Pragma Import C cannot be used on virtual machine targets, therefore
       --  call the runtime finalization routine directly.
+      --  Similarly in CodePeer mode, where imported functions are ignored.
 
       else
          WBI ("      System.Standard_Library.Adafinal;");
@@ -516,6 +523,7 @@ package body Bindgen is
 
       if not Suppress_Standard_Library_On_Target
         and then VM_Target = No_VM
+        and then not CodePeer_Mode
         and then not Configurable_Run_Time_On_Target
       then
          WBI ("   type No_Param_Proc is access procedure;");
@@ -524,11 +532,17 @@ package body Bindgen is
 
       WBI ("   procedure " & Ada_Init_Name.all & " is");
 
+      --  In CodePeer mode, simplify adainit procedure by only calling
+      --  elaboration procedures.
+
+      if CodePeer_Mode then
+         WBI ("   begin");
+
       --  If the standard library is suppressed, then the only global variables
       --  that might be needed (by the Ravenscar profile) are the priority and
       --  the processor for the environment task.
 
-      if Suppress_Standard_Library_On_Target then
+      elsif Suppress_Standard_Library_On_Target then
          if Main_Priority /= No_Main_Priority then
             WBI ("      Main_Priority : Integer;");
             WBI ("      pragma Import (C, Main_Priority," &
@@ -717,7 +731,6 @@ package body Bindgen is
          end if;
 
          WBI ("   begin");
-
          WBI ("      if Is_Elaborated then");
          WBI ("         return;");
          WBI ("      end if;");
@@ -904,12 +917,17 @@ package body Bindgen is
          WBI ("      Initialize_Stack_Limit;");
       end if;
 
+      --  On CodePeer, the finalization of library objects is not relevant
+
+      if CodePeer_Mode then
+         null;
+
       --  On virtual machine targets, or on non-virtual machine ones if this
       --  is the main program case, attach finalize_library to the soft link.
       --  Do it only when not using a restricted run time, in which case tasks
       --  are non-terminating, so we do not want library-level finalization.
 
-      if (VM_Target /= No_VM or else Bind_Main_Program)
+      elsif (VM_Target /= No_VM or else Bind_Main_Program)
         and then not Configurable_Run_Time_On_Target
         and then not Suppress_Standard_Library_On_Target
       then
@@ -942,7 +960,10 @@ package body Bindgen is
 
       --  Generate elaboration calls
 
-      WBI ("");
+      if not CodePeer_Mode then
+         WBI ("");
+      end if;
+
       Gen_Elab_Calls_Ada;
 
       --  Case of main program is CIL function or procedure
@@ -1257,6 +1278,10 @@ package body Bindgen is
 
    procedure Gen_Elab_Externals_Ada is
    begin
+      if CodePeer_Mode then
+         return;
+      end if;
+
       for E in Elab_Order.First .. Elab_Order.Last loop
          declare
             Unum : constant Unit_Id := Elab_Order.Table (E);
@@ -1380,6 +1405,7 @@ package body Bindgen is
    ------------------------
 
    procedure Gen_Elab_Calls_Ada is
+      Check_Elab_Flag : Boolean;
    begin
       for E in Elab_Order.First .. Elab_Order.Last loop
          declare
@@ -1420,6 +1446,7 @@ package body Bindgen is
 
                if U.Utype = Is_Body
                  and then Units.Table (Unum_Spec).Set_Elab_Entity
+                 and then not CodePeer_Mode
                then
                   Set_String ("      E");
                   Set_Unit_Number (Unum_Spec);
@@ -1449,10 +1476,13 @@ package body Bindgen is
             --  elaboration subprogram is needed by CodePeer.
 
             elsif U.Unit_Kind /= 's' or else not CodePeer_Mode then
-               if Force_Checking_Of_Elaboration_Flags
-                 or Interface_Library_Unit
-                 or not Bind_Main_Program
-               then
+               Check_Elab_Flag :=
+                 not CodePeer_Mode
+                 and then (Force_Checking_Of_Elaboration_Flags
+                            or Interface_Library_Unit
+                            or not Bind_Main_Program);
+
+               if Check_Elab_Flag then
                   Set_String ("      if E");
                   Set_Unit_Number (Unum_Spec);
                   Set_String (" = 0 then");
@@ -1491,14 +1521,13 @@ package body Bindgen is
                Set_Char (';');
                Write_Statement_Buffer;
 
-               if Force_Checking_Of_Elaboration_Flags
-                 or Interface_Library_Unit
-                 or not Bind_Main_Program
-               then
+               if Check_Elab_Flag then
                   WBI ("      end if;");
                end if;
 
-               if U.Utype /= Is_Spec then
+               if U.Utype /= Is_Spec
+                 and then not CodePeer_Mode
+               then
                   Set_String ("      E");
                   Set_Unit_Number (Unum_Spec);
                   Set_String (" := E");
@@ -1717,6 +1746,10 @@ package body Bindgen is
    --  Start of processing for Gen_Finalize_Library_Ada
 
    begin
+      if CodePeer_Mode then
+         return;
+      end if;
+
       for E in reverse Elab_Order.First .. Elab_Order.Last loop
          Unum := Elab_Order.Table (E);
          U    := Units.Table (Unum);
@@ -2211,7 +2244,9 @@ package body Bindgen is
 
       --  Initialize and Finalize
 
-      if not Cumulative_Restrictions.Set (No_Finalization) then
+      if not CodePeer_Mode
+        and then not Cumulative_Restrictions.Set (No_Finalization)
+      then
          WBI ("      procedure Initialize (Addr : System.Address);");
          WBI ("      pragma Import (C, Initialize, ""__gnat_initialize"");");
          WBI ("");
@@ -2238,44 +2273,50 @@ package body Bindgen is
       --  Deal with declarations for main program case
 
       if not No_Main_Subprogram then
+         if CodePeer_Mode then
+            if ALIs.Table (ALIs.First).Main_Program = Func then
+               WBI ("      Result : Integer;");
+            end if;
+         else
+            --  To call the main program, we declare it using a pragma Import
+            --  Ada with the right link name.
 
-         --  To call the main program, we declare it using a pragma Import
-         --  Ada with the right link name.
-
-         --  It might seem more obvious to "with" the main program, and call
-         --  it in the normal Ada manner. We do not do this for three reasons:
-
-         --    1. It is more efficient not to recompile the main program
-         --    2. We are not entitled to assume the source is accessible
-         --    3. We don't know what options to use to compile it
+            --  It might seem more obvious to "with" the main program, and call
+            --  it in the normal Ada manner. We do not do this for three
+            --  reasons:
 
-         --  It is really reason 3 that is most critical (indeed we used
-         --  to generate the "with", but several regression tests failed).
+            --    1. It is more efficient not to recompile the main program
+            --    2. We are not entitled to assume the source is accessible
+            --    3. We don't know what options to use to compile it
 
-         WBI ("");
+            --  It is really reason 3 that is most critical (indeed we used
+            --  to generate the "with", but several regression tests failed).
 
-         if ALIs.Table (ALIs.First).Main_Program = Func then
-            WBI ("      Result : Integer;");
             WBI ("");
-            WBI ("      function Ada_Main_Program return Integer;");
 
-         else
-            WBI ("      procedure Ada_Main_Program;");
-         end if;
+            if ALIs.Table (ALIs.First).Main_Program = Func then
+               WBI ("      Result : Integer;");
+               WBI ("");
+               WBI ("      function Ada_Main_Program return Integer;");
 
-         Set_String ("      pragma Import (Ada, Ada_Main_Program, """);
-         Get_Name_String (Units.Table (First_Unit_Entry).Uname);
-         Set_Main_Program_Name;
-         Set_String (""");");
+            else
+               WBI ("      procedure Ada_Main_Program;");
+            end if;
 
-         Write_Statement_Buffer;
-         WBI ("");
+            Set_String ("      pragma Import (Ada, Ada_Main_Program, """);
+            Get_Name_String (Units.Table (First_Unit_Entry).Uname);
+            Set_Main_Program_Name;
+            Set_String (""");");
 
-         if Bind_Main_Program
-           and then not Suppress_Standard_Library_On_Target
-         then
-            WBI ("      SEH : aliased array (1 .. 2) of Integer;");
+            Write_Statement_Buffer;
             WBI ("");
+
+            if Bind_Main_Program
+              and then not Suppress_Standard_Library_On_Target
+            then
+               WBI ("      SEH : aliased array (1 .. 2) of Integer;");
+               WBI ("");
+            end if;
          end if;
       end if;
 
@@ -2289,7 +2330,7 @@ package body Bindgen is
       --  with a pragma Volatile in order to tell the compiler to preserve
       --  this variable at any level of optimization.
 
-      if Bind_Main_Program then
+      if Bind_Main_Program and then not CodePeer_Mode then
          WBI
            ("      Ensure_Reference : aliased System.Address := " &
             "Ada_Main_Program_Name'Address;");
@@ -2301,7 +2342,10 @@ package body Bindgen is
 
       --  Acquire command line arguments if present on target
 
-      if Command_Line_Args_On_Target then
+      if CodePeer_Mode then
+         null;
+
+      elsif Command_Line_Args_On_Target then
          WBI ("      gnat_argc := argc;");
          WBI ("      gnat_argv := argv;");
          WBI ("      gnat_envp := envp;");
@@ -2339,7 +2383,9 @@ package body Bindgen is
          Write_Statement_Buffer;
       end if;
 
-      if not Cumulative_Restrictions.Set (No_Finalization) then
+      if not Cumulative_Restrictions.Set (No_Finalization)
+        and then not CodePeer_Mode
+      then
          if not No_Main_Subprogram
            and then Bind_Main_Program
            and then not Suppress_Standard_Library_On_Target
@@ -2383,7 +2429,9 @@ package body Bindgen is
 
       --  Finalize is only called if we have a run time
 
-      if not Cumulative_Restrictions.Set (No_Finalization) then
+      if not Cumulative_Restrictions.Set (No_Finalization)
+        and then not CodePeer_Mode
+      then
          WBI ("      Finalize;");
       end if;
 
@@ -2986,13 +3034,16 @@ package body Bindgen is
       Resolve_Binder_Options;
 
       --  Usually, adafinal is called using a pragma Import C. Since Import C
-      --  doesn't have the same semantics for JGNAT, we use standard Ada.
+      --  doesn't have the same semantics for VMs or CodePeer, use standard
+      --  Ada.
 
-      if VM_Target /= No_VM
-        and then not Suppress_Standard_Library_On_Target
-      then
-         WBI ("with System.Soft_Links;");
-         WBI ("with System.Standard_Library;");
+      if not Suppress_Standard_Library_On_Target then
+         if CodePeer_Mode then
+            WBI ("with System.Standard_Library;");
+         elsif VM_Target /= No_VM then
+            WBI ("with System.Soft_Links;");
+            WBI ("with System.Standard_Library;");
+         end if;
       end if;
 
       WBI ("package " & Ada_Main & " is");
@@ -3212,38 +3263,41 @@ package body Bindgen is
 
       Gen_Elab_Externals_Ada;
 
-      if not Suppress_Standard_Library_On_Target then
+      if not CodePeer_Mode then
+         if not Suppress_Standard_Library_On_Target then
 
-         --  Generate Priority_Specific_Dispatching pragma string
+            --  Generate Priority_Specific_Dispatching pragma string
 
-         Set_String
-           ("   Local_Priority_Specific_Dispatching : constant String := """);
+            Set_String
+              ("   Local_Priority_Specific_Dispatching : " &
+               "constant String := """);
 
-         for J in 0 .. PSD_Pragma_Settings.Last loop
-            Set_Char (PSD_Pragma_Settings.Table (J));
-         end loop;
+            for J in 0 .. PSD_Pragma_Settings.Last loop
+               Set_Char (PSD_Pragma_Settings.Table (J));
+            end loop;
 
-         Set_String (""";");
-         Write_Statement_Buffer;
+            Set_String (""";");
+            Write_Statement_Buffer;
 
-         --  Generate Interrupt_State pragma string
+            --  Generate Interrupt_State pragma string
 
-         Set_String ("   Local_Interrupt_States : constant String := """);
+            Set_String ("   Local_Interrupt_States : constant String := """);
 
-         for J in 0 .. IS_Pragma_Settings.Last loop
-            Set_Char (IS_Pragma_Settings.Table (J));
-         end loop;
+            for J in 0 .. IS_Pragma_Settings.Last loop
+               Set_Char (IS_Pragma_Settings.Table (J));
+            end loop;
 
-         Set_String (""";");
-         Write_Statement_Buffer;
-         WBI ("");
-      end if;
+            Set_String (""";");
+            Write_Statement_Buffer;
+            WBI ("");
+         end if;
 
-      --  The B.1 (39) implementation advice says that the adainit/adafinal
-      --  routines should be idempotent. Generate a flag to ensure that.
+         --  The B.1 (39) implementation advice says that the adainit/adafinal
+         --  routines should be idempotent. Generate a flag to ensure that.
 
-      WBI ("   Is_Elaborated : Boolean := False;");
-      WBI ("");
+         WBI ("   Is_Elaborated : Boolean := False;");
+         WBI ("");
+      end if;
 
       --  Generate the adafinal routine unless there is no finalization to do
 
index a5038a992a6b827f5647f4de48e0083b9097657b..eafb238a6ed225d03a04f8bb583c292ed63dbb3a 100644 (file)
@@ -5022,27 +5022,6 @@ package body Exp_Ch3 is
                   Set_Homonym (Defining_Identifier (N), Homonym (Def_Id));
                   Exchange_Entities (Defining_Identifier (N), Def_Id);
                end;
-
-            --  Handle initialization of class-wide interface object in VM
-            --  targets
-
-            elsif not Tagged_Type_Expansion then
-
-               --  Replace
-               --     CW : I'Class := Obj;
-               --  by
-               --     CW : I'Class;
-               --     CW := I'Class (Obj); [1]
-
-               --  The assignment [1] is later expanded in a dispatching
-               --  call to _assign
-
-               Set_Expression (N, Empty);
-
-               Insert_Action (N,
-                 Make_Assignment_Statement (Loc,
-                   Name       => New_Reference_To (Def_Id, Loc),
-                   Expression => Convert_To (Typ, Relocate_Node (Expr))));
             end if;
 
             return;
@@ -6170,6 +6149,9 @@ package body Exp_Ch3 is
                if not Building_Static_DT (Def_Id) then
                   Append_Freeze_Actions (Def_Id, Make_DT (Def_Id));
                end if;
+
+            elsif VM_Target /= No_VM then
+               Append_Freeze_Actions (Def_Id, Make_VM_TSD (Def_Id));
             end if;
 
             --  If the type has unknown discriminants, propagate dispatching
index d99157ab4d08213aa7a7c6266d9c3bd1a537a45a..d2852e3dd807819dc0ee3b29b6a96bd1c698eea5 100644 (file)
@@ -629,14 +629,10 @@ package body Exp_Ch4 is
         (Ref            : Node_Id;
          Built_In_Place : Boolean := False)
       is
-         Ref_Node : Node_Id;
+         New_Node : Node_Id;
 
       begin
-         --  Note: we skip the accessibility check for the VM case, since
-         --  there does not seem to be any practical way of implementing it.
-
          if Ada_Version >= Ada_2005
-           and then Tagged_Type_Expansion
            and then Is_Class_Wide_Type (DesigT)
            and then not Scope_Suppress (Accessibility_Check)
            and then
@@ -652,20 +648,37 @@ package body Exp_Ch4 is
             --  address of the allocated object.
 
             if Built_In_Place then
-               Ref_Node := New_Copy (Ref);
+               New_Node := New_Copy (Ref);
             else
-               Ref_Node := New_Reference_To (Ref, Loc);
+               New_Node := New_Reference_To (Ref, Loc);
+            end if;
+
+            New_Node :=
+              Make_Attribute_Reference (Loc,
+                Prefix         => New_Node,
+                Attribute_Name => Name_Tag);
+
+            if Tagged_Type_Expansion then
+               New_Node :=
+                 Build_Get_Access_Level (Loc, New_Node);
+
+            elsif VM_Target /= No_VM then
+               New_Node :=
+                 Make_Function_Call (Loc,
+                   Name => New_Reference_To (RTE (RE_Get_Access_Level), Loc),
+                   Parameter_Associations => New_List (New_Node));
+
+            --  Cannot generate the runtime check
+
+            else
+               return;
             end if;
 
             Insert_Action (N,
               Make_Raise_Program_Error (Loc,
                 Condition =>
                   Make_Op_Gt (Loc,
-                    Left_Opnd  =>
-                      Build_Get_Access_Level (Loc,
-                        Make_Attribute_Reference (Loc,
-                          Prefix         => Ref_Node,
-                          Attribute_Name => Name_Tag)),
+                    Left_Opnd  => New_Node,
                     Right_Opnd =>
                       Make_Integer_Literal (Loc, Type_Access_Level (PtrT))),
                 Reason => PE_Accessibility_Check_Failed));
@@ -2594,6 +2607,8 @@ package body Exp_Ch4 is
       Clen     : Node_Id;
       Set      : Boolean;
 
+   --  Start of processing for Expand_Concatenate
+
    begin
       --  Choose an appropriate computational type
 
index dfa5b3f96437729c90e555c2c6bb5c6da1f68708..cb6a6543ca4f47afea1b9756ad5fe93ef5bcd0f4 100644 (file)
@@ -5382,21 +5382,6 @@ package body Exp_Ch6 is
    --  Start of processing for Expand_N_Subprogram_Body
 
    begin
-      --  If this is the main compilation unit, and we are generating code for
-      --  VM targets, we now generate the Type Specific Data record of all the
-      --  enclosing tagged type declarations.
-
-      --  If the runtime package Ada_Tags has not been loaded then this
-      --  subprogram does not have tagged type declarations and there is no
-      --  need to search for tagged types to generate their TSDs.
-
-      if not Tagged_Type_Expansion
-        and then Unit (Cunit (Main_Unit)) = N
-        and then RTU_Loaded (Ada_Tags)
-      then
-         Build_VM_TSDs (N);
-      end if;
-
       --  Set L to either the list of declarations if present, or to the list
       --  of statements if no declarations are present. This is used to insert
       --  new stuff at the start.
index 452b9e5b2e4154a77332c3824cafca7fad661358..c31682caec7717e1a21e272d16ddb0f0b3488b48 100644 (file)
@@ -1261,7 +1261,7 @@ package body Exp_Ch7 is
       --  objects that need finalization. When flag Preprocess is set, the
       --  routine will simply count the total number of controlled objects in
       --  Decls. Flag Top_Level denotes whether the processing is done for
-      --  objects in nested package decparations or instances.
+      --  objects in nested package declarations or instances.
 
       procedure Process_Object_Declaration
         (Decl         : Node_Id;
@@ -3810,24 +3810,10 @@ package body Exp_Ch7 is
 
          --  Build dispatch tables of library level tagged types
 
-         if Is_Library_Level_Entity (Spec_Ent) then
-            if Tagged_Type_Expansion then
-               Build_Static_Dispatch_Tables (N);
-
-            --  In VM targets there is no need to build dispatch tables but
-            --  we must generate the corresponding Type Specific Data record.
-
-            elsif Unit (Cunit (Main_Unit)) = N then
-
-               --  If the runtime package Ada_Tags has not been loaded then
-               --  this package does not have tagged type declarations and
-               --  there is no need to search for tagged types to generate
-               --  their TSDs.
-
-               if RTU_Loaded (Ada_Tags) then
-                  Build_VM_TSDs (N);
-               end if;
-            end if;
+         if Tagged_Type_Expansion
+           and then Is_Library_Level_Entity (Spec_Ent)
+         then
+            Build_Static_Dispatch_Tables (N);
          end if;
 
          Build_Task_Activation_Call (N);
@@ -3948,42 +3934,12 @@ package body Exp_Ch7 is
 
       --  Build dispatch tables of library level tagged types
 
-      if Is_Compilation_Unit (Id)
-        or else (Is_Generic_Instance (Id)
-                  and then Is_Library_Level_Entity (Id))
+      if Tagged_Type_Expansion
+        and then (Is_Compilation_Unit (Id)
+                    or else (Is_Generic_Instance (Id)
+                               and then Is_Library_Level_Entity (Id)))
       then
-         if Tagged_Type_Expansion then
-            Build_Static_Dispatch_Tables (N);
-
-         --  In VM targets there is no need to build dispatch tables, but we
-         --  must generate the corresponding Type Specific Data record.
-
-         elsif Unit (Cunit (Main_Unit)) = N then
-
-            --  If the runtime package Ada_Tags has not been loaded then
-            --  this package does not have tagged types and there is no need
-            --  to search for tagged types to generate their TSDs.
-
-            if RTU_Loaded (Ada_Tags) then
-
-               --  Enter the scope of the package because the new declarations
-               --  are appended at the end of the package and must be analyzed
-               --  in that context.
-
-               Push_Scope (Id);
-
-               if Is_Generic_Instance (Main_Unit_Entity) then
-                  if Package_Instantiation (Main_Unit_Entity) = N then
-                     Build_VM_TSDs (N);
-                  end if;
-
-               else
-                  Build_VM_TSDs (N);
-               end if;
-
-               Pop_Scope;
-            end if;
-         end if;
+         Build_Static_Dispatch_Tables (N);
       end if;
 
       --  Note: it is not necessary to worry about generating a subprogram
index 4df6eff602163e6266c7860d4771d6f6f110f675..a9ae2c55172aea039d9d63a74e67e0e81a5d1797 100644 (file)
@@ -61,6 +61,7 @@ with Snames;   use Snames;
 with Stand;    use Stand;
 with Stringt;  use Stringt;
 with SCIL_LL;  use SCIL_LL;
+with Targparm; use Targparm;
 with Tbuild;   use Tbuild;
 with Uintp;    use Uintp;
 
@@ -82,10 +83,6 @@ package body Exp_Disp is
    --  Returns true if Prim is not a predefined dispatching primitive but it is
    --  an alias of a predefined dispatching primitive (i.e. through a renaming)
 
-   function Make_VM_TSD (Typ : Entity_Id) return List_Id;
-   --  Build the Type Specific Data record associated with tagged type Typ.
-   --  Invoked only when generating code for VM targets.
-
    function New_Value (From : Node_Id) return Node_Id;
    --  From is the original Expression. New_Value is equivalent to a call
    --  to Duplicate_Subexpr with an explicit dereference when From is an
@@ -298,6 +295,7 @@ package body Exp_Disp is
 
       return Static_Dispatch_Tables
         and then Is_Library_Level_Tagged_Type (Typ)
+        and then VM_Target = No_VM
 
          --  If the type is derived from a CPP class we cannot statically
          --  build the dispatch tables because we must inherit primitives
@@ -468,156 +466,6 @@ package body Exp_Disp is
       end if;
    end Build_Static_Dispatch_Tables;
 
-   -------------------
-   -- Build_VM_TSDs --
-   -------------------
-
-   procedure Build_VM_TSDs (N : Entity_Id) is
-      Target_List : List_Id := No_List;
-
-      procedure Build_TSDs (List : List_Id);
-      --  Build the static dispatch table of tagged types found in the list of
-      --  declarations. Add the generated nodes to the end of Target_List.
-
-      procedure Build_Package_TSDs (N : Node_Id);
-      --  Build static dispatch tables associated with package declaration N
-
-      ---------------------------
-      -- Build_Dispatch_Tables --
-      ---------------------------
-
-      procedure Build_TSDs (List : List_Id) is
-         D : Node_Id;
-
-      begin
-         D := First (List);
-         while Present (D) loop
-
-            --  Handle nested packages and package bodies recursively. The
-            --  generated code is placed on the Target_List established for
-            --  the enclosing compilation unit.
-
-            if Nkind (D) = N_Package_Declaration then
-               Build_Package_TSDs (D);
-
-            elsif Nkind_In (D, N_Package_Body,
-                               N_Subprogram_Body)
-            then
-               Build_TSDs (Declarations (D));
-
-            elsif Nkind (D) = N_Package_Body_Stub
-              and then Present (Library_Unit (D))
-            then
-               Build_TSDs
-                 (Declarations (Proper_Body (Unit (Library_Unit (D)))));
-
-            --  Handle full type declarations and derivations of library
-            --  level tagged types
-
-            elsif Nkind_In (D, N_Full_Type_Declaration,
-                               N_Derived_Type_Definition)
-              and then Ekind (Defining_Entity (D)) /= E_Record_Subtype
-              and then Is_Tagged_Type (Defining_Entity (D))
-              and then not Is_Private_Type (Defining_Entity (D))
-            then
-               --  Do not generate TSDs for the internal types created for
-               --  a type extension with unknown discriminants. The needed
-               --  information is shared with the source type.
-               --  See Expand_N_Record_Extension.
-
-               if Is_Underlying_Record_View (Defining_Entity (D))
-                 or else
-                  (not Comes_From_Source (Defining_Entity (D))
-                     and then
-                       Has_Unknown_Discriminants (Etype (Defining_Entity (D)))
-                     and then
-                       not Comes_From_Source
-                             (First_Subtype (Defining_Entity (D))))
-               then
-                  null;
-
-               else
-                  if No (Target_List) then
-                     Target_List := New_List;
-                  end if;
-
-                  Append_List_To (Target_List,
-                    Make_VM_TSD (Defining_Entity (D)));
-               end if;
-            end if;
-
-            Next (D);
-         end loop;
-      end Build_TSDs;
-
-      ------------------------
-      -- Build_Package_TSDs --
-      ------------------------
-
-      procedure Build_Package_TSDs (N : Node_Id) is
-         Spec       : constant Node_Id := Specification (N);
-         Vis_Decls  : constant List_Id := Visible_Declarations (Spec);
-         Priv_Decls : constant List_Id := Private_Declarations (Spec);
-
-      begin
-         if Present (Priv_Decls) then
-            Build_TSDs (Vis_Decls);
-            Build_TSDs (Priv_Decls);
-
-         elsif Present (Vis_Decls) then
-            Build_TSDs (Vis_Decls);
-         end if;
-      end Build_Package_TSDs;
-
-   --  Start of processing for Build_VM_TSDs
-
-   begin
-      if not Expander_Active
-        or else No_Run_Time_Mode
-        or else Tagged_Type_Expansion
-        or else not RTE_Available (RE_Type_Specific_Data)
-      then
-         return;
-      end if;
-
-      if Nkind (N) = N_Package_Declaration then
-         declare
-            Spec       : constant Node_Id := Specification (N);
-            Vis_Decls  : constant List_Id := Visible_Declarations (Spec);
-            Priv_Decls : constant List_Id := Private_Declarations (Spec);
-
-         begin
-            Build_Package_TSDs (N);
-
-            if Present (Target_List) then
-               Analyze_List (Target_List);
-
-               if Present (Priv_Decls)
-                 and then Is_Non_Empty_List (Priv_Decls)
-               then
-                  Append_List (Target_List, Priv_Decls);
-               else
-                  Append_List (Target_List, Vis_Decls);
-               end if;
-            end if;
-         end;
-
-      elsif Nkind_In (N, N_Package_Body, N_Subprogram_Body) then
-         if Is_Non_Empty_List (Declarations (N)) then
-            Build_TSDs (Declarations (N));
-
-            if Nkind (N) = N_Subprogram_Body then
-               Build_TSDs (Statements (Handled_Statement_Sequence (N)));
-            end if;
-
-            if Present (Target_List) then
-               Analyze_List (Target_List);
-               Append_List  (Target_List, Declarations (N));
-            end if;
-         end if;
-      end if;
-   end Build_VM_TSDs;
-
    ------------------------------
    -- Convert_Tag_To_Interface --
    ------------------------------
@@ -1278,11 +1126,37 @@ package body Exp_Disp is
                   and then Is_Interface (Iface_Typ)));
 
       if not Tagged_Type_Expansion then
+         if VM_Target /= No_VM then
+            if Is_Access_Type (Operand_Typ) then
+               Operand_Typ := Designated_Type (Operand_Typ);
+            end if;
 
-         --  For VM, just do a conversion ???
+            if Is_Class_Wide_Type (Operand_Typ) then
+               Operand_Typ := Root_Type (Operand_Typ);
+            end if;
+
+            if not Is_Static
+              and then Operand_Typ /= Iface_Typ
+            then
+               Insert_Action (N,
+                 Make_Procedure_Call_Statement (Loc,
+                   Name => New_Occurrence_Of
+                            (RTE (RE_Check_Interface_Conversion), Loc),
+                   Parameter_Associations => New_List (
+                     Make_Attribute_Reference (Loc,
+                       Prefix => Duplicate_Subexpr (Expression (N)),
+                       Attribute_Name => Name_Tag),
+                     Make_Attribute_Reference (Loc,
+                       Prefix         => New_Reference_To (Iface_Typ, Loc),
+                       Attribute_Name => Name_Tag))));
+            end if;
+
+            --  Just do a conversion ???
+
+            Rewrite (N, Unchecked_Convert_To (Etype (N), N));
+            Analyze (N);
+         end if;
 
-         Rewrite (N, Unchecked_Convert_To (Etype (N), N));
-         Analyze (N);
          return;
       end if;
 
@@ -6764,13 +6638,20 @@ package body Exp_Disp is
       --     Check_TSD
       --       (TSD => TSD'Unrestricted_Access);
 
-      Append_To (Result,
-        Make_Procedure_Call_Statement (Loc,
-          Name => New_Reference_To (RTE (RE_Check_TSD), Loc),
-          Parameter_Associations => New_List (
-            Make_Attribute_Reference (Loc,
-              Prefix => New_Reference_To (TSD, Loc),
-              Attribute_Name => Name_Unrestricted_Access))));
+      if Ada_Version >= Ada_2005
+        and then Is_Library_Level_Entity (Typ)
+        and then Has_External_Tag_Rep_Clause (Typ)
+        and then RTE_Available (RE_Check_TSD)
+        and then not Debug_Flag_QQ
+      then
+         Append_To (Result,
+           Make_Procedure_Call_Statement (Loc,
+             Name => New_Reference_To (RTE (RE_Check_TSD), Loc),
+             Parameter_Associations => New_List (
+               Make_Attribute_Reference (Loc,
+                 Prefix => New_Reference_To (TSD, Loc),
+                 Attribute_Name => Name_Unrestricted_Access))));
+      end if;
 
       --  Generate:
       --     Register_TSD (TSD'Unrestricted_Access);
@@ -7653,6 +7534,7 @@ package body Exp_Disp is
 
    begin
       pragma Assert (not Restriction_Active (No_Dispatching_Calls));
+      pragma Assert (VM_Target = No_VM);
 
       --  Do not register in the dispatch table eliminated primitives
 
index 82a9d9abc15df7a6277b6718b056ed4800fd2792..306cec228efb921f1ee0966305c7b6d94343ad02 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, 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,11 +186,6 @@ package Exp_Disp is
    --  bodies they are added to the end of the list of declarations of the
    --  package body.
 
-   procedure Build_VM_TSDs (N : Entity_Id);
-   --  N is a library level package declaration, a library level package body
-   --  or a library level subprogram body. Build the runtime Type Specific
-   --  Data record of all the tagged types declared inside N.
-
    function Convert_Tag_To_Interface
      (Typ : Entity_Id; Expr : Node_Id) return Node_Id;
    pragma Inline (Convert_Tag_To_Interface);
@@ -353,6 +348,10 @@ package Exp_Disp is
    --  tagged types this routine imports the forward declaration of the tag
    --  entity, that will be declared and exported by Make_DT.
 
+   function Make_VM_TSD (Typ : Entity_Id) return List_Id;
+   --  Build the Type Specific Data record associated with tagged type Typ.
+   --  Invoked only when generating code for VM targets.
+
    function Register_Primitive
      (Loc     : Source_Ptr;
       Prim    : Entity_Id) return List_Id;
index c2e2de74f49d1ea82b0dfb4b0326acbe4992a86e..946c7b5417735f02dc46506e63e9b906b0f776aa 100644 (file)
@@ -1717,7 +1717,7 @@ begin
          Linker_Path := System.OS_Lib.Locate_Exec_On_Path ("dotnet-ld");
 
          if Linker_Path = null then
-            Exit_With_Error ("Couldn't locate ilasm");
+            Exit_With_Error ("Couldn't locate dotnet-ld");
          end if;
 
       elsif RTX_RTSS_Kernel_Module_On_Target then
index 1d545dfe596b3fd1b6c4761c52928e54ef32b906..d60de40b6439b1a806d8f420623dcd0f7ec98944 100644 (file)
@@ -561,6 +561,7 @@ package Rtsfind is
      RE_Address_Array,                   -- Ada.Tags
      RE_Addr_Ptr,                        -- Ada.Tags
      RE_Base_Address,                    -- Ada.Tags
+     RE_Check_Interface_Conversion,      -- Ada.Tags
      RE_Check_TSD,                       -- Ada.Tags
      RE_Cstring_Ptr,                     -- Ada.Tags
      RE_Descendant_Tag,                  -- Ada.Tags
@@ -1743,6 +1744,7 @@ package Rtsfind is
      RE_Address_Array                    => Ada_Tags,
      RE_Addr_Ptr                         => Ada_Tags,
      RE_Base_Address                     => Ada_Tags,
+     RE_Check_Interface_Conversion       => Ada_Tags,
      RE_Check_TSD                        => Ada_Tags,
      RE_Cstring_Ptr                      => Ada_Tags,
      RE_Descendant_Tag                   => Ada_Tags,
index 98b6d91c4ffa9ac76195c909e06e43f19fb17b48..986a1e867f2ec45ea3fc7ed29e832fc980f0b41a 100644 (file)
@@ -2849,7 +2849,8 @@ package body Sem_Ch6 is
                      --  raises an exception, but in any case it is not coming
                      --  back here, so turn on the flag.
 
-                     if Ekind (Ent) = E_Procedure
+                     if Present (Ent)
+                       and then Ekind (Ent) = E_Procedure
                        and then No_Return (Ent)
                      then
                         Set_Trivial_Subprogram (Stm);
index b58f8c0e1a7914c4617f23d31e6ffad6d54229c9..66fcb07e0aba07b7de86768b434d60f75de96a29 100644 (file)
@@ -49,6 +49,7 @@ with Sem_Type; use Sem_Type;
 with Sem_Util; use Sem_Util;
 with Snames;   use Snames;
 with Sinfo;    use Sinfo;
+with Targparm; use Targparm;
 with Tbuild;   use Tbuild;
 with Uintp;    use Uintp;
 
@@ -1028,6 +1029,12 @@ package body Sem_Disp is
                                     " the type!", Subp);
                               end if;
 
+                           --  No code required to register primitives in VM
+                           --  targets
+
+                           elsif VM_Target /= No_VM then
+                              null;
+
                            else
                               Insert_Actions_After (Subp_Body,
                                 Register_Primitive (Sloc (Subp_Body),
@@ -1158,10 +1165,13 @@ package body Sem_Disp is
                   while Present (Elmt) loop
                      Prim := Node (Elmt);
 
+                     --  No code required to register primitives in VM targets
+
                      if Present (Alias (Prim))
                        and then Present (Interface_Alias (Prim))
                        and then Alias (Prim) = Subp
                        and then not Building_Static_DT (Tagged_Type)
+                       and then VM_Target = No_VM
                      then
                         Insert_Actions_After (Subp_Body,
                           Register_Primitive (Sloc (Subp_Body), Prim => Prim));