mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-16 04:20:26 +08:00
bindgen.adb (Gen_Output_File_Ada): Generate pragma No_Run_Time when needed.
2007-04-20 Arnaud Charlet <charlet@adacore.com> Vincent Celier <celier@adacore.com> Robert Dewar <dewar@adacore.com> * bindgen.adb (Gen_Output_File_Ada): Generate pragma No_Run_Time when needed. (Gen_Output_File_Ada, Gen_Output_File_C): Never use __attribute ((destructor)) for adafinal, even when switch -a is used. Do not issue pragma Linker_Destructor for adafinal when switch -a is used. (Gen_Object_Files_Options): Add formatting of Linker Options, when Output_Linker_Option_List is set. Suppress this formatting when Zero_Formatting is set. Add case for CLI_Target. (System_Restrictions_Used): New flag, used to avoid generating with of System_Restrictions and initialization of the data unless there is some use of System.Restrictions in the partition. (Check_System_Restrictions_Used): New procedure * s-stalib.adb: Remove with of System.Restrictions. No longer needed since we only with this unit in the binder file if it is used elsewhere in the partition. From-SVN: r125386
This commit is contained in:
parent
b51711b545
commit
6644b368be
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-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- --
|
||||
@ -40,7 +40,8 @@ with Table; use Table;
|
||||
with Targparm; use Targparm;
|
||||
with Types; use Types;
|
||||
|
||||
with GNAT.OS_Lib; use GNAT.OS_Lib;
|
||||
with System.OS_Lib; use System.OS_Lib;
|
||||
|
||||
with GNAT.Heap_Sort_A; use GNAT.Heap_Sort_A;
|
||||
|
||||
package body Bindgen is
|
||||
@ -62,6 +63,14 @@ package body Bindgen is
|
||||
Num_Elab_Calls : Nat := 0;
|
||||
-- Number of generated calls to elaboration routines
|
||||
|
||||
System_Restrictions_Used : Boolean;
|
||||
-- Flag indicating whether the unit System.Restrictions is in the closure
|
||||
-- of the partition. This is set by Check_System_Restrictions_Used, and
|
||||
-- is used to determine whether or not to initialize the restrictions
|
||||
-- information in the body of the binder generated file (we do not want
|
||||
-- to do this unconditionally, since it drags in the System.Restrictions
|
||||
-- unit unconditionally, which is unpleasand, especially for ZFP etc.)
|
||||
|
||||
----------------------------------
|
||||
-- Interface_State Pragma Table --
|
||||
----------------------------------
|
||||
@ -206,6 +215,10 @@ package body Bindgen is
|
||||
procedure WBI (Info : String) renames Osint.B.Write_Binder_Info;
|
||||
-- Convenient shorthand used throughout
|
||||
|
||||
procedure Check_System_Restrictions_Used;
|
||||
-- Sets flag System_Restrictions_Used (Set to True if and only if the unit
|
||||
-- System.Restrictions is present in the partition, otherwise False).
|
||||
|
||||
procedure Gen_Adainit_Ada;
|
||||
-- Generates the Adainit procedure (Ada code case)
|
||||
|
||||
@ -341,6 +354,22 @@ package body Bindgen is
|
||||
-- First writes its argument (using Set_String (S)), then writes out the
|
||||
-- contents of statement buffer up to Last, and reset Last to 0
|
||||
|
||||
------------------------------------
|
||||
-- Check_System_Restrictions_Used --
|
||||
------------------------------------
|
||||
|
||||
procedure Check_System_Restrictions_Used is
|
||||
begin
|
||||
for J in Units.First .. Units.Last loop
|
||||
if Get_Name_String (Units.Table (J).Sfile) = "s-restri.ads" then
|
||||
System_Restrictions_Used := True;
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
System_Restrictions_Used := False;
|
||||
end Check_System_Restrictions_Used;
|
||||
|
||||
----------------------
|
||||
-- Gen_Adafinal_Ada --
|
||||
----------------------
|
||||
@ -354,7 +383,7 @@ package body Bindgen is
|
||||
-- If compiling for the JVM, we directly call Adafinal because
|
||||
-- we don't import it via Do_Finalize (see Gen_Output_File_Ada).
|
||||
|
||||
if Hostparm.Java_VM then
|
||||
if VM_Target /= No_VM then
|
||||
WBI (" System.Standard_Library.Adafinal;");
|
||||
|
||||
-- If there is no finalization, there is nothing to do
|
||||
@ -416,7 +445,14 @@ package body Bindgen is
|
||||
Set_String (" ");
|
||||
Set_String ("E");
|
||||
Set_Unit_Number (Unum);
|
||||
Set_String (" : Boolean; pragma Import (Ada, ");
|
||||
|
||||
case VM_Target is
|
||||
when No_VM | JVM_Target =>
|
||||
Set_String (" : Boolean; pragma Import (Ada, ");
|
||||
when CLI_Target =>
|
||||
Set_String (" : Boolean; pragma Import (CIL, ");
|
||||
end case;
|
||||
|
||||
Set_String ("E");
|
||||
Set_Unit_Number (Unum);
|
||||
Set_String (", """);
|
||||
@ -426,16 +462,22 @@ package body Bindgen is
|
||||
-- that includes the class name (using '$' separators
|
||||
-- in the case of a child unit name).
|
||||
|
||||
if Hostparm.Java_VM then
|
||||
if VM_Target /= No_VM then
|
||||
for J in 1 .. Name_Len - 2 loop
|
||||
if Name_Buffer (J) /= '.' then
|
||||
if VM_Target = CLI_Target
|
||||
or else Name_Buffer (J) /= '.'
|
||||
then
|
||||
Set_Char (Name_Buffer (J));
|
||||
else
|
||||
Set_String ("$");
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
Set_String (".");
|
||||
if VM_Target /= CLI_Target or else U.Unit_Kind = 's' then
|
||||
Set_String (".");
|
||||
else
|
||||
Set_String ("_pkg.");
|
||||
end if;
|
||||
|
||||
-- If the unit name is very long, then split the
|
||||
-- Import link name across lines using "&" (occurs
|
||||
@ -828,8 +870,6 @@ package body Bindgen is
|
||||
Set_String ("';");
|
||||
Write_Statement_Buffer;
|
||||
|
||||
-- Generate definition for restrictions string
|
||||
|
||||
Gen_Restrictions_C;
|
||||
|
||||
WBI (" extern const void *__gl_interrupt_states;");
|
||||
@ -1007,13 +1047,29 @@ package body Bindgen is
|
||||
Set_String (" ");
|
||||
Get_Decoded_Name_String_With_Brackets (U.Uname);
|
||||
|
||||
if Name_Buffer (Name_Len) = 's' then
|
||||
Name_Buffer (Name_Len - 1 .. Name_Len + 8) := "'elab_spec";
|
||||
if VM_Target = CLI_Target and then U.Unit_Kind /= 's' then
|
||||
if Name_Buffer (Name_Len) = 's' then
|
||||
Name_Buffer (Name_Len - 1 .. Name_Len + 12) :=
|
||||
"_pkg'elab_spec";
|
||||
else
|
||||
Name_Buffer (Name_Len - 1 .. Name_Len + 12) :=
|
||||
"_pkg'elab_body";
|
||||
end if;
|
||||
|
||||
Name_Len := Name_Len + 12;
|
||||
|
||||
else
|
||||
Name_Buffer (Name_Len - 1 .. Name_Len + 8) := "'elab_body";
|
||||
if Name_Buffer (Name_Len) = 's' then
|
||||
Name_Buffer (Name_Len - 1 .. Name_Len + 8) :=
|
||||
"'elab_spec";
|
||||
else
|
||||
Name_Buffer (Name_Len - 1 .. Name_Len + 8) :=
|
||||
"'elab_body";
|
||||
end if;
|
||||
|
||||
Name_Len := Name_Len + 8;
|
||||
end if;
|
||||
|
||||
Name_Len := Name_Len + 8;
|
||||
Set_Casing (U.Icasing);
|
||||
Set_Name_Buffer;
|
||||
Set_Char (';');
|
||||
@ -1395,7 +1451,6 @@ package body Bindgen is
|
||||
end if;
|
||||
|
||||
if not Cumulative_Restrictions.Set (No_Finalization) then
|
||||
|
||||
if not No_Main_Subprogram
|
||||
and then Bind_Main_Program
|
||||
and then not Suppress_Standard_Library_On_Target
|
||||
@ -1425,10 +1480,10 @@ package body Bindgen is
|
||||
-- If compiling for the JVM, we directly call Adafinal because
|
||||
-- we don't import it via Do_Finalize (see Gen_Output_File_Ada).
|
||||
|
||||
if Hostparm.Java_VM then
|
||||
WBI (" System.Standard_Library.Adafinal;");
|
||||
else
|
||||
if VM_Target = No_VM then
|
||||
WBI (" Do_Finalize;");
|
||||
else
|
||||
WBI (" System.Standard_Library.Adafinal;");
|
||||
end if;
|
||||
end if;
|
||||
|
||||
@ -1666,6 +1721,9 @@ package body Bindgen is
|
||||
-- in the Linker_Options table of where the first entry from an
|
||||
-- internal file appears.
|
||||
|
||||
Linker_Option_List_Started : Boolean := False;
|
||||
-- Set to True when "LINKER OPTION LIST" is displayed
|
||||
|
||||
procedure Write_Linker_Option;
|
||||
-- Write binder info linker option
|
||||
|
||||
@ -1694,12 +1752,24 @@ package body Bindgen is
|
||||
-- Process section if non-null
|
||||
|
||||
if Stop > Start then
|
||||
if Output_Linker_Option_List then
|
||||
Write_Str (Name_Buffer (Start .. Stop - 1));
|
||||
Write_Eol;
|
||||
if Output_Linker_Option_List then
|
||||
if not Zero_Formatting then
|
||||
if not Linker_Option_List_Started then
|
||||
Linker_Option_List_Started := True;
|
||||
Write_Eol;
|
||||
Write_Str (" LINKER OPTION LIST");
|
||||
Write_Eol;
|
||||
Write_Eol;
|
||||
end if;
|
||||
|
||||
Write_Str (" ");
|
||||
end if;
|
||||
Write_Info_Ada_C
|
||||
(" -- ", "", Name_Buffer (Start .. Stop - 1));
|
||||
|
||||
Write_Str (Name_Buffer (Start .. Stop - 1));
|
||||
Write_Eol;
|
||||
end if;
|
||||
Write_Info_Ada_C
|
||||
(" -- ", "", Name_Buffer (Start .. Stop - 1));
|
||||
end if;
|
||||
|
||||
Start := Stop + 1;
|
||||
@ -1728,7 +1798,8 @@ package body Bindgen is
|
||||
-- exists, then use it.
|
||||
|
||||
if not Hostparm.Exclude_Missing_Objects
|
||||
or else GNAT.OS_Lib.Is_Regular_File (Name_Buffer (1 .. Name_Len))
|
||||
or else
|
||||
System.OS_Lib.Is_Regular_File (Name_Buffer (1 .. Name_Len))
|
||||
then
|
||||
Write_Info_Ada_C (" -- ", "", Name_Buffer (1 .. Name_Len));
|
||||
|
||||
@ -1887,6 +1958,10 @@ package body Bindgen is
|
||||
Write_Linker_Option;
|
||||
end loop;
|
||||
|
||||
if Output_Linker_Option_List and then not Zero_Formatting then
|
||||
Write_Eol;
|
||||
end if;
|
||||
|
||||
if Ada_Bind_File then
|
||||
WBI ("-- END Object file/option list ");
|
||||
else
|
||||
@ -1908,11 +1983,11 @@ package body Bindgen is
|
||||
|
||||
Set_PSD_Pragma_Table;
|
||||
|
||||
-- Override Ada_Bind_File and Bind_Main_Program for Java since
|
||||
-- Override Ada_Bind_File and Bind_Main_Program for VMs since
|
||||
-- JGNAT only supports Ada code, and the main program is already
|
||||
-- generated by the compiler.
|
||||
|
||||
if Hostparm.Java_VM then
|
||||
if VM_Target /= No_VM then
|
||||
Ada_Bind_File := True;
|
||||
Bind_Main_Program := False;
|
||||
end if;
|
||||
@ -1935,12 +2010,13 @@ package body Bindgen is
|
||||
|
||||
-- Generate output file in appropriate language
|
||||
|
||||
Check_System_Restrictions_Used;
|
||||
|
||||
if Ada_Bind_File then
|
||||
Gen_Output_File_Ada (Filename);
|
||||
else
|
||||
Gen_Output_File_C (Filename);
|
||||
end if;
|
||||
|
||||
end Gen_Output_File;
|
||||
|
||||
-------------------------
|
||||
@ -1978,6 +2054,18 @@ package body Bindgen is
|
||||
WBI ("pragma Restrictions (No_Exception_Handlers);");
|
||||
end if;
|
||||
|
||||
-- Same processing for Restrictions (No_Exception_Propagation)
|
||||
|
||||
if Cumulative_Restrictions.Set (No_Exception_Propagation) then
|
||||
WBI ("pragma Restrictions (No_Exception_Propagation);");
|
||||
end if;
|
||||
|
||||
-- Same processing for pragma No_Run_Time
|
||||
|
||||
if No_Run_Time_Mode then
|
||||
WBI ("pragma No_Run_Time;");
|
||||
end if;
|
||||
|
||||
-- Generate with of System so we can reference System.Address
|
||||
|
||||
WBI ("with System;");
|
||||
@ -2001,7 +2089,7 @@ package body Bindgen is
|
||||
-- Import C doesn't have the same semantics for JGNAT, we use
|
||||
-- standard Ada.
|
||||
|
||||
if Hostparm.Java_VM then
|
||||
if VM_Target /= No_VM then
|
||||
WBI ("with System.Standard_Library;");
|
||||
end if;
|
||||
end if;
|
||||
@ -2079,16 +2167,18 @@ package body Bindgen is
|
||||
WBI (" procedure " & Ada_Final_Name.all & ";");
|
||||
WBI (" pragma Export (C, " & Ada_Final_Name.all & ", """ &
|
||||
Ada_Final_Name.all & """);");
|
||||
|
||||
if Use_Pragma_Linker_Constructor then
|
||||
WBI (" pragma Linker_Destructor (" & Ada_Final_Name.all & ");");
|
||||
end if;
|
||||
|
||||
WBI ("");
|
||||
WBI (" procedure " & Ada_Init_Name.all & ";");
|
||||
WBI (" pragma Export (C, " & Ada_Init_Name.all & ", """ &
|
||||
Ada_Init_Name.all & """);");
|
||||
|
||||
-- If -a has been specified use pragma Linker_Constructor for the init
|
||||
-- procedure. No need to use a similar pragma for the final procedure as
|
||||
-- global finalization will occur when the executable finishes execution
|
||||
-- and for plugins (shared stand-alone libraries that can be
|
||||
-- "unloaded"), finalization should not occur automatically, otherwise
|
||||
-- the main executable may not continue to work properly.
|
||||
|
||||
if Use_Pragma_Linker_Constructor then
|
||||
WBI (" pragma Linker_Constructor (" & Ada_Init_Name.all & ");");
|
||||
end if;
|
||||
@ -2191,7 +2281,9 @@ package body Bindgen is
|
||||
-- Generate with of System.Restrictions to initialize
|
||||
-- Run_Time_Restrictions.
|
||||
|
||||
if not Suppress_Standard_Library_On_Target then
|
||||
if System_Restrictions_Used
|
||||
and not Suppress_Standard_Library_On_Target
|
||||
then
|
||||
WBI ("");
|
||||
WBI ("with System.Restrictions;");
|
||||
end if;
|
||||
@ -2207,7 +2299,7 @@ package body Bindgen is
|
||||
-- In the Java case, pragma Import C cannot be used, so the
|
||||
-- standard Ada constructs will be used instead.
|
||||
|
||||
if not Hostparm.Java_VM then
|
||||
if VM_Target = No_VM then
|
||||
WBI ("");
|
||||
WBI (" procedure Do_Finalize;");
|
||||
WBI
|
||||
@ -2288,14 +2380,20 @@ package body Bindgen is
|
||||
|
||||
Resolve_Binder_Options;
|
||||
|
||||
WBI ("extern void " & Ada_Final_Name.all & " (void);");
|
||||
|
||||
-- If -a has been specified use __attribute__((constructor)) for the
|
||||
-- init procedure. No need to use a similar featute for the final
|
||||
-- procedure as global finalization will occur when the executable
|
||||
-- finishes execution and for plugins (shared stand-alone libraries that
|
||||
-- can be "unloaded"), finalization should not occur automatically,
|
||||
-- otherwise the main executable may not continue to work properly.
|
||||
|
||||
if Use_Pragma_Linker_Constructor then
|
||||
WBI ("extern void " & Ada_Final_Name.all &
|
||||
" (void) __attribute__((destructor));");
|
||||
WBI ("extern void " & Ada_Init_Name.all &
|
||||
" (void) __attribute__((constructor));");
|
||||
|
||||
else
|
||||
WBI ("extern void " & Ada_Final_Name.all & " (void);");
|
||||
WBI ("extern void " & Ada_Init_Name.all & " (void);");
|
||||
end if;
|
||||
|
||||
@ -2470,8 +2568,11 @@ package body Bindgen is
|
||||
|
||||
procedure Gen_Restrictions_Ada is
|
||||
Count : Integer;
|
||||
|
||||
begin
|
||||
if Suppress_Standard_Library_On_Target then
|
||||
if Suppress_Standard_Library_On_Target
|
||||
or not System_Restrictions_Used
|
||||
then
|
||||
return;
|
||||
end if;
|
||||
|
||||
@ -2569,7 +2670,9 @@ package body Bindgen is
|
||||
|
||||
procedure Gen_Restrictions_C is
|
||||
begin
|
||||
if Suppress_Standard_Library_On_Target then
|
||||
if Suppress_Standard_Library_On_Target
|
||||
or not System_Restrictions_Used
|
||||
then
|
||||
return;
|
||||
end if;
|
||||
|
||||
@ -2827,7 +2930,8 @@ package body Bindgen is
|
||||
-- The main program generated by JGNAT expects a package called
|
||||
-- ada_<main procedure>.
|
||||
|
||||
if Hostparm.Java_VM then
|
||||
if VM_Target /= No_VM then
|
||||
|
||||
-- Get main program name
|
||||
|
||||
Get_Name_String (Units.Table (First_Unit_Entry).Uname);
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1995-2006 Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1995-2006, 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- --
|
||||
@ -56,9 +56,6 @@ with System.Memory;
|
||||
-- must always be present in a build, even if no unit has a direct with
|
||||
-- of this unit.
|
||||
|
||||
with System.Restrictions;
|
||||
-- Referenced directly from the binder generated file.
|
||||
|
||||
pragma Warnings (On);
|
||||
|
||||
package body System.Standard_Library is
|
||||
|
Loading…
x
Reference in New Issue
Block a user