OSDN Git Service

PR 33870
[pf3gnuchains/gcc-fork.git] / gcc / ada / mlib-tgt-vms-alpha.adb
index bf96371..7839389 100644 (file)
@@ -2,23 +2,22 @@
 --                                                                          --
 --                         GNAT COMPILER COMPONENTS                         --
 --                                                                          --
---                             M L I B . T G T                              --
+--                    M L I B . T G T . S P E C I F I C                     --
 --                           (Alpha VMS Version)                            --
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 2003-2004, Free Software Foundation, Inc.         --
+--          Copyright (C) 2003-2007, 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- --
--- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
--- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license.          --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
 
 with Ada.Characters.Handling; use Ada.Characters.Handling;
 
-with GNAT.Directory_Operations;  use GNAT.Directory_Operations;
-with GNAT.OS_Lib;                use GNAT.OS_Lib;
-
 with MLib.Fil;
 with MLib.Utl;
-with Namet;             use Namet;
-with Opt;               use Opt;
-with Output;            use Output;
-with Prj.Com;
-with System;            use System;
-with System.Case_Util;  use System.Case_Util;
 
-package body MLib.Tgt is
+with MLib.Tgt.VMS;
+pragma Warnings (Off, MLib.Tgt.VMS);
+--  MLib.Tgt.VMS is with'ed only for elaboration purposes
+
+with Opt;      use Opt;
+with Output;   use Output;
+
+with GNAT.Directory_Operations; use GNAT.Directory_Operations;
+
+with System;           use System;
+with System.Case_Util; use System.Case_Util;
+with System.CRTL;      use System.CRTL;
+
+package body MLib.Tgt.Specific is
+
+   --  Non default subprogram. See comment in mlib-tgt.ads.
+
+   procedure Build_Dynamic_Library
+     (Ofiles       : Argument_List;
+      Options      : Argument_List;
+      Interfaces   : Argument_List;
+      Lib_Filename : String;
+      Lib_Dir      : String;
+      Symbol_Data  : Symbol_Record;
+      Driver_Name  : Name_Id := No_Name;
+      Lib_Version  : String  := "";
+      Auto_Init    : Boolean := False);
 
-   use GNAT;
+   --  Local variables
 
    Empty_Argument_List : aliased Argument_List := (1 .. 0 => null);
    Additional_Objects  : Argument_List_Access := Empty_Argument_List'Access;
    --  Used to add the generated auto-init object files for auto-initializing
    --  stand-alone libraries.
 
-   Macro_Name   : constant String := "mcr gnu:[bin]gcc -c -x assembler";
+   Macro_Name : constant String := "mcr gnu:[bin]gcc -c -x assembler";
    --  The name of the command to invoke the macro-assembler
 
    VMS_Options : Argument_List := (1 .. 1 => null);
@@ -66,66 +82,8 @@ package body MLib.Tgt is
 
    Shared_Libgcc : aliased String := "-shared-libgcc";
 
-   No_Shared_Libgcc_Switch : aliased Argument_List := (1 .. 0 => null);
-   Shared_Libgcc_Switch    : aliased Argument_List :=
-                               (1 => Shared_Libgcc'Access);
-   Link_With_Shared_Libgcc : Argument_List_Access :=
-                               No_Shared_Libgcc_Switch'Access;
-
-   ------------------------------
-   -- Target dependent section --
-   ------------------------------
-
-   function Popen (Command, Mode : System.Address) return System.Address;
-   pragma Import (C, Popen);
-
-   function Pclose (File : System.Address) return Integer;
-   pragma Import (C, Pclose);
-
-   ---------------------
-   -- Archive_Builder --
-   ---------------------
-
-   function Archive_Builder return String is
-   begin
-      return "ar";
-   end Archive_Builder;
-
-   -----------------------------
-   -- Archive_Builder_Options --
-   -----------------------------
-
-   function Archive_Builder_Options return String_List_Access is
-   begin
-      return new String_List'(1 => new String'("cr"));
-   end Archive_Builder_Options;
-
-   -----------------
-   -- Archive_Ext --
-   -----------------
-
-   function Archive_Ext return String is
-   begin
-      return "olb";
-   end Archive_Ext;
-
-   ---------------------
-   -- Archive_Indexer --
-   ---------------------
-
-   function Archive_Indexer return String is
-   begin
-      return "ranlib";
-   end Archive_Indexer;
-
-   -----------------------------
-   -- Archive_Indexer_Options --
-   -----------------------------
-
-   function Archive_Indexer_Options return String_List_Access is
-   begin
-      return new String_List (1 .. 0);
-   end Archive_Indexer_Options;
+   Shared_Libgcc_Switch : constant Argument_List :=
+                            (1 => Shared_Libgcc'Access);
 
    ---------------------------
    -- Build_Dynamic_Library --
@@ -133,10 +91,7 @@ package body MLib.Tgt is
 
    procedure Build_Dynamic_Library
      (Ofiles       : Argument_List;
-      Foreign      : Argument_List;
-      Afiles       : Argument_List;
       Options      : Argument_List;
-      Options_2    : Argument_List;
       Interfaces   : Argument_List;
       Lib_Filename : String;
       Lib_Dir      : String;
@@ -145,8 +100,6 @@ package body MLib.Tgt is
       Lib_Version  : String  := "";
       Auto_Init    : Boolean := False)
    is
-      pragma Unreferenced (Foreign);
-      pragma Unreferenced (Afiles);
 
       Lib_File : constant String :=
                    Lib_Dir & Directory_Separator & "lib" &
@@ -168,8 +121,10 @@ package body MLib.Tgt is
       --  Returns Symbol_File, if not empty. Otherwise, returns "symvec.opt"
 
       function Version_String return String;
-      --  Returns Lib_Version if not empty, otherwise returns "1".
-      --  Fails gnatmake if Lib_Version is not the image of a positive number.
+      --  Returns Lib_Version if not empty and if Symbol_Data.Symbol_Policy is
+      --  not Autonomous, otherwise returns "". When Symbol_Data.Symbol_Policy
+      --  is Autonomous, fails gnatmake if Lib_Version is not the image of a
+      --  positive number.
 
       ------------------
       -- Is_Interface --
@@ -186,7 +141,7 @@ package body MLib.Tgt is
             return True;
 
          elsif ALI'Length > 2 and then
-               ALI (ALI'First .. ALI'First + 1) = "b$"
+               ALI (ALI'First .. ALI'First + 2) = "b__"
          then
             return True;
 
@@ -207,7 +162,7 @@ package body MLib.Tgt is
 
       function Option_File_Name return String is
       begin
-         if Symbol_Data.Symbol_File = No_Name then
+         if Symbol_Data.Symbol_File = No_Path then
             return "symvec.opt";
          else
             Get_Name_String (Symbol_Data.Symbol_File);
@@ -222,9 +177,12 @@ package body MLib.Tgt is
 
       function Version_String return String is
          Version : Integer := 0;
+
       begin
-         if Lib_Version = "" then
-            return "1";
+         if Lib_Version = ""
+           or else Symbol_Data.Symbol_Policy /= Autonomous
+         then
+            return "";
 
          else
             begin
@@ -245,6 +203,10 @@ package body MLib.Tgt is
          end if;
       end Version_String;
 
+      ---------------------
+      -- Local Variables --
+      ---------------------
+
       Opt_File_Name  : constant String := Option_File_Name;
       Version        : constant String := Version_String;
       For_Linker_Opt : String_Access;
@@ -252,14 +214,6 @@ package body MLib.Tgt is
    --  Start of processing for Build_Dynamic_Library
 
    begin
-      --  Invoke gcc with -shared-libgcc, but only for GCC 3 or higher
-
-      if GCC_Version >= 3 then
-         Link_With_Shared_Libgcc := Shared_Libgcc_Switch'Access;
-      else
-         Link_With_Shared_Libgcc := No_Shared_Libgcc_Switch'Access;
-      end if;
-
       --  If option file name does not ends with ".opt", append "/OPTIONS"
       --  to its specification for the VMS linker.
 
@@ -282,7 +236,7 @@ package body MLib.Tgt is
       --  "gnatsym" is necessary for building the option file
 
       if Gnatsym_Path = null then
-         Gnatsym_Path := OS_Lib.Locate_Exec_On_Path (Gnatsym_Name);
+         Gnatsym_Path := Locate_Exec_On_Path (Gnatsym_Name);
 
          if Gnatsym_Path = null then
             Fail (Gnatsym_Name, " not found in path");
@@ -294,7 +248,7 @@ package body MLib.Tgt is
 
       if Auto_Init then
          declare
-            Macro_File_Name : constant String := Lib_Filename & "$init.asm";
+            Macro_File_Name : constant String := Lib_Filename & "__init.asm";
             Macro_File      : File_Descriptor;
             Init_Proc       : String := Lib_Filename & "INIT";
             Popen_Result    : System.Address;
@@ -302,12 +256,12 @@ package body MLib.Tgt is
             Len             : Natural;
             OK              : Boolean := True;
 
-            Command  : constant String :=
+            command  : constant String :=
                          Macro_Name & " " & Macro_File_Name & ASCII.NUL;
             --  The command to invoke the assembler on the generated auto-init
             --  assembly file.
 
-            Mode : constant String := "r" & ASCII.NUL;
+            mode : constant String := "r" & ASCII.NUL;
             --  The mode for the invocation of Popen
 
          begin
@@ -365,8 +319,8 @@ package body MLib.Tgt is
                Write_Line ("""");
             end if;
 
-            Popen_Result := Popen (Command (Command'First)'Address,
-                                   Mode (Mode'First)'Address);
+            Popen_Result := popen (command (command'First)'Address,
+                                   mode (mode'First)'Address);
 
             if Popen_Result = Null_Address then
                Fail ("assembly of auto-init assembly file """,
@@ -375,7 +329,7 @@ package body MLib.Tgt is
 
             --  Wait for the end of execution of the macro-assembler
 
-            Pclose_Result := Pclose (Popen_Result);
+            Pclose_Result := pclose (Popen_Result);
 
             if Pclose_Result < 0 then
                Fail ("assembly of auto init assembly file """,
@@ -387,7 +341,7 @@ package body MLib.Tgt is
 
             Additional_Objects :=
               new Argument_List'
-                (1 => new String'(Lib_Filename & "$init.obj"));
+                (1 => new String'(Lib_Filename & "__init.obj"));
          end;
       end if;
 
@@ -423,7 +377,7 @@ package body MLib.Tgt is
 
       --  Reference Symbol File
 
-      if Symbol_Data.Reference /= No_Name then
+      if Symbol_Data.Reference /= No_Path then
          Last_Argument := Last_Argument + 1;
          Arguments (Last_Argument) := new String'("-r");
          Last_Argument := Last_Argument + 1;
@@ -448,6 +402,11 @@ package body MLib.Tgt is
          when Restricted =>
             Last_Argument := Last_Argument + 1;
             Arguments (Last_Argument) := new String'("-R");
+
+         when Direct =>
+            Last_Argument := Last_Argument + 1;
+            Arguments (Last_Argument) := new String'("-D");
+
       end case;
 
       --  Add each relevant object file
@@ -507,9 +466,9 @@ package body MLib.Tgt is
         (Output_File => Lib_File,
          Objects     => Ofiles & Additional_Objects.all,
          Options     => VMS_Options,
-         Options_2   => Link_With_Shared_Libgcc.all &
+         Options_2   => Shared_Libgcc_Switch &
                         Opts (Opts'First .. Last_Opt) &
-                        Opts2 (Opts2'First .. Last_Opt2) & Options_2,
+                        Opts2 (Opts2'First .. Last_Opt2),
          Driver_Name => Driver_Name);
 
       --  The auto-init object file need to be deleted, so that it will not
@@ -520,7 +479,7 @@ package body MLib.Tgt is
       if Auto_Init then
          declare
             Auto_Init_Object_File_Name : constant String :=
-                                           Lib_Filename & "$init.obj";
+                                           Lib_Filename & "__init.obj";
             Disregard : Boolean;
 
          begin
@@ -535,170 +494,8 @@ package body MLib.Tgt is
       end if;
    end Build_Dynamic_Library;
 
-   -------------
-   -- DLL_Ext --
-   -------------
-
-   function DLL_Ext return String is
-   begin
-      return "exe";
-   end DLL_Ext;
-
-   --------------------
-   -- Dynamic_Option --
-   --------------------
-
-   function Dynamic_Option return String is
-   begin
-      return "-shared";
-   end Dynamic_Option;
-
-   -------------------
-   -- Is_Object_Ext --
-   -------------------
-
-   function Is_Object_Ext (Ext : String) return Boolean is
-   begin
-      return Ext = ".obj";
-   end Is_Object_Ext;
-
-   --------------
-   -- Is_C_Ext --
-   --------------
-
-   function Is_C_Ext (Ext : String) return Boolean is
-   begin
-      return Ext = ".c";
-   end Is_C_Ext;
-
-   --------------------
-   -- Is_Archive_Ext --
-   --------------------
-
-   function Is_Archive_Ext (Ext : String) return Boolean is
-   begin
-      return Ext = ".olb" or else Ext = ".exe";
-   end Is_Archive_Ext;
-
-   -------------
-   -- Libgnat --
-   -------------
-
-   function Libgnat return String is
-      Libgnat_A : constant String := "libgnat.a";
-      Libgnat_Olb : constant String := "libgnat.olb";
-
-   begin
-      Name_Len := Libgnat_A'Length;
-      Name_Buffer (1 .. Name_Len) := Libgnat_A;
-
-      if Osint.Find_File (Name_Enter, Osint.Library) /= No_File then
-         return Libgnat_A;
-
-      else
-         return Libgnat_Olb;
-      end if;
-   end Libgnat;
-
-   ------------------------
-   -- Library_Exists_For --
-   ------------------------
-
-   function Library_Exists_For (Project : Project_Id) return Boolean is
-   begin
-      if not Projects.Table (Project).Library then
-         Fail ("INTERNAL ERROR: Library_Exists_For called " &
-               "for non library project");
-         return False;
-
-      else
-         declare
-            Lib_Dir : constant String :=
-              Get_Name_String (Projects.Table (Project).Library_Dir);
-            Lib_Name : constant String :=
-              Get_Name_String (Projects.Table (Project).Library_Name);
-
-         begin
-            if Projects.Table (Project).Library_Kind = Static then
-               return Is_Regular_File
-                 (Lib_Dir & Directory_Separator & "lib" &
-                  Fil.Ext_To (Lib_Name, Archive_Ext));
-
-            else
-               return Is_Regular_File
-                 (Lib_Dir & Directory_Separator & "lib" &
-                  Fil.Ext_To (Lib_Name, DLL_Ext));
-            end if;
-         end;
-      end if;
-   end Library_Exists_For;
-
-   ---------------------------
-   -- Library_File_Name_For --
-   ---------------------------
-
-   function Library_File_Name_For (Project : Project_Id) return Name_Id is
-   begin
-      if not Projects.Table (Project).Library then
-         Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
-                       "for non library project");
-         return No_Name;
-
-      else
-         declare
-            Lib_Name : constant String :=
-              Get_Name_String (Projects.Table (Project).Library_Name);
-
-         begin
-            Name_Len := 3;
-            Name_Buffer (1 .. Name_Len) := "lib";
-
-            if Projects.Table (Project).Library_Kind = Static then
-               Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, Archive_Ext));
-
-            else
-               Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, DLL_Ext));
-            end if;
-
-            return Name_Find;
-         end;
-      end if;
-   end Library_File_Name_For;
-
-   ----------------
-   -- Object_Ext --
-   ----------------
-
-   function Object_Ext return String is
-   begin
-      return "obj";
-   end Object_Ext;
-
-   ----------------
-   -- PIC_Option --
-   ----------------
-
-   function PIC_Option return String is
-   begin
-      return "";
-   end PIC_Option;
-
-   -----------------------------------------------
-   -- Standalone_Library_Auto_Init_Is_Supported --
-   -----------------------------------------------
-
-   function Standalone_Library_Auto_Init_Is_Supported return Boolean is
-   begin
-      return True;
-   end Standalone_Library_Auto_Init_Is_Supported;
-
-   ---------------------------
-   -- Support_For_Libraries --
-   ---------------------------
-
-   function Support_For_Libraries return Library_Support is
-   begin
-      return Full;
-   end Support_For_Libraries;
+--  Package initialization
 
-end MLib.Tgt;
+begin
+   Build_Dynamic_Library_Ptr    := Build_Dynamic_Library'Access;
+end MLib.Tgt.Specific;