From: Pascal Obry <o...@adacore.com>

The code has been simplified to use a single way to create a DLL.
The relocation support is based on whether the base address for the
DLL is passed to the final linker step or not.

gcc/ada/ChangeLog:

        * mdll.adb: Use the same procedure to create relocatable or non
        relocatable DLL. The only difference is wether the base address is
        passed to the final linker. If no base-address is given the DLL is
        relocatable.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/mdll.adb | 173 ++++++-----------------------------------------
 1 file changed, 21 insertions(+), 152 deletions(-)

diff --git a/gcc/ada/mdll.adb b/gcc/ada/mdll.adb
index ac4af8363aa..745854304f0 100644
--- a/gcc/ada/mdll.adb
+++ b/gcc/ada/mdll.adb
@@ -77,7 +77,10 @@ package body MDLL is
       Bas_Opt  : aliased String := "-Wl,--base-file," & Bas_File;
       Lib_Opt  : aliased String := "-mdll";
       Out_Opt  : aliased String := "-o";
-      Adr_Opt  : aliased String := "-Wl,--image-base=" & Lib_Address;
+      Adr_Opt  : aliased String :=
+                   (if Relocatable
+                    then ""
+                    else "-Wl,--image-base=" & Lib_Address);
       Map_Opt  : aliased String := "-Wl,-Map," & Lib_Filename & ".map";
 
       L_Afiles : Argument_List := Afiles;
@@ -86,25 +89,19 @@ package body MDLL is
 
       All_Options : constant Argument_List := Options & Largs_Options;
 
-      procedure Build_Reloc_DLL;
+      procedure Build_DLL;
       --  Build a relocatable DLL with only objects file specified. This uses
       --  the well known five step build (see GNAT User's Guide).
 
-      procedure Ada_Build_Reloc_DLL;
+      procedure Ada_Build_DLL;
       --  Build a relocatable DLL with Ada code. This uses the well known five
       --  step build (see GNAT User's Guide).
 
-      procedure Build_Non_Reloc_DLL;
-      --  Build a non relocatable DLL containing no Ada code
+      ---------------
+      -- Build_DLL --
+      ---------------
 
-      procedure Ada_Build_Non_Reloc_DLL;
-      --  Build a non relocatable DLL with Ada code
-
-      ---------------------
-      -- Build_Reloc_DLL --
-      ---------------------
-
-      procedure Build_Reloc_DLL is
+      procedure Build_DLL is
 
          Objects_Exp_File : constant OS_Lib.Argument_List :=
                               Exp_File'Unchecked_Access & Ofiles;
@@ -185,13 +182,13 @@ package body MDLL is
             OS_Lib.Delete_File (Bas_File, Success);
             OS_Lib.Delete_File (Jnk_File, Success);
             raise;
-      end Build_Reloc_DLL;
+      end Build_DLL;
 
-      -------------------------
-      -- Ada_Build_Reloc_DLL --
-      -------------------------
+      -------------------
+      -- Ada_Build_DLL --
+      -------------------
 
-      procedure Ada_Build_Reloc_DLL is
+      procedure Ada_Build_DLL is
          Success : Boolean;
          pragma Warnings (Off, Success);
 
@@ -290,125 +287,7 @@ package body MDLL is
             OS_Lib.Delete_File (Bas_File, Success);
             OS_Lib.Delete_File (Jnk_File, Success);
             raise;
-      end Ada_Build_Reloc_DLL;
-
-      -------------------------
-      -- Build_Non_Reloc_DLL --
-      -------------------------
-
-      procedure Build_Non_Reloc_DLL is
-         Success : Boolean;
-         pragma Warnings (Off, Success);
-
-      begin
-         if not Quiet then
-            Text_IO.Put_Line ("building non relocatable DLL...");
-            Text_IO.Put ("make " & Dll_File &
-                         " using address " & Lib_Address);
-
-            if Build_Import then
-               Text_IO.Put_Line (" and " & Lib_File);
-            else
-               Text_IO.New_Line;
-            end if;
-         end if;
-
-         --  Build exp table and the lib .a file
-
-         Utl.Dlltool (Def_File, Dll_File, Lib_File,
-                      Exp_Table    => Exp_File,
-                      Build_Import => Build_Import);
-
-         --  Build the DLL
-
-         declare
-            Params      : constant OS_Lib.Argument_List :=
-                            Map_Opt'Unchecked_Access &
-                            Adr_Opt'Unchecked_Access & All_Options;
-            First_Param : Positive := Params'First + 1;
-
-         begin
-            if Map_File then
-               First_Param := Params'First;
-            end if;
-
-            Utl.Gcc
-              (Output_File => Dll_File,
-               Files       => Exp_File'Unchecked_Access & Ofiles,
-               Options     => Params (First_Param .. Params'Last),
-               Build_Lib   => True);
-         end;
-
-         OS_Lib.Delete_File (Exp_File, Success);
-
-      exception
-         when others =>
-            OS_Lib.Delete_File (Exp_File, Success);
-            raise;
-      end Build_Non_Reloc_DLL;
-
-      -----------------------------
-      -- Ada_Build_Non_Reloc_DLL --
-      -----------------------------
-
-      --  Build a non relocatable DLL with Ada code
-
-      procedure Ada_Build_Non_Reloc_DLL is
-         Success : Boolean;
-         pragma Warnings (Off, Success);
-
-      begin
-         if not Quiet then
-            Text_IO.Put_Line ("building non relocatable DLL...");
-            Text_IO.Put ("make " & Dll_File &
-                         " using address " & Lib_Address);
-
-            if Build_Import then
-               Text_IO.Put_Line (" and " & Lib_File);
-            else
-               Text_IO.New_Line;
-            end if;
-         end if;
-
-         --  Build exp table and the lib .a file
-
-         Utl.Dlltool (Def_File, Dll_File, Lib_File,
-                      Exp_Table    => Exp_File,
-                      Build_Import => Build_Import);
-
-         --  Build the DLL
-
-         Utl.Gnatbind (L_Afiles, Options & Bargs_Options);
-
-         declare
-            Params      : constant OS_Lib.Argument_List :=
-                            Map_Opt'Unchecked_Access &
-                            Out_Opt'Unchecked_Access &
-                            Dll_File'Unchecked_Access &
-                            Lib_Opt'Unchecked_Access &
-                            Exp_File'Unchecked_Access &
-                            Adr_Opt'Unchecked_Access &
-                            Ofiles &
-                            All_Options;
-            First_Param : Positive := Params'First + 1;
-
-         begin
-            if Map_File then
-               First_Param := Params'First;
-            end if;
-
-            Utl.Gnatlink
-              (L_Afiles (L_Afiles'Last).all,
-               Params (First_Param .. Params'Last));
-         end;
-
-         OS_Lib.Delete_File (Exp_File, Success);
-
-      exception
-         when others =>
-            OS_Lib.Delete_File (Exp_File, Success);
-            raise;
-      end Ada_Build_Non_Reloc_DLL;
+      end Ada_Build_DLL;
 
    --  Start of processing for Build_Dynamic_Library
 
@@ -432,21 +311,11 @@ package body MDLL is
          end;
       end if;
 
-      case Relocatable is
-         when True =>
-            if L_Afiles'Length = 0 then
-               Build_Reloc_DLL;
-            else
-               Ada_Build_Reloc_DLL;
-            end if;
-
-         when False =>
-            if L_Afiles'Length = 0 then
-               Build_Non_Reloc_DLL;
-            else
-               Ada_Build_Non_Reloc_DLL;
-            end if;
-      end case;
+      if L_Afiles'Length = 0 then
+          Build_DLL;
+      else
+         Ada_Build_DLL;
+      end if;
    end Build_Dynamic_Library;
 
    --------------------------
-- 
2.43.0

Reply via email to