------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                              B I N D G E N                               --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 1992-2018, 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 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 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 ALI;      use ALI;
with Casing;   use Casing;
with Fname;    use Fname;
with Gnatvsn;  use Gnatvsn;
with Hostparm;
with Namet;    use Namet;
with Opt;      use Opt;
with Osint;    use Osint;
with Osint.B;  use Osint.B;
with Output;   use Output;
with Rident;   use Rident;
with Stringt;  use Stringt;
with Table;
with Targparm; use Targparm;
with Types;    use Types;

with System.OS_Lib;
with System.WCh_Con; use System.WCh_Con;

with GNAT.Heap_Sort_A; use GNAT.Heap_Sort_A;
with GNAT.HTable;

package body Bindgen is
   Statement_Buffer : String (1 .. 1000);
   --  Buffer used for constructing output statements

   Stm_Last : Natural := 0;
   --  Stm_Last location in Statement_Buffer currently set

   With_GNARL : Boolean := False;
   --  Flag which indicates whether the program uses the GNARL library
   --  (presence of the unit System.OS_Interface)

   Num_Elab_Calls : Nat := 0;
   --  Number of generated calls to elaboration routines

   Num_Primary_Stacks : Int := 0;
   --  Number of default-sized primary stacks the binder needs to allocate for
   --  task objects declared in the program.

   Num_Sec_Stacks : Int := 0;
   --  Number of default-sized primary stacks the binder needs to allocate for
   --  task objects declared in the program.

   System_Restrictions_Used : Boolean := False;
   --  Flag indicating whether the unit System.Restrictions is in the closure
   --  of the partition. This is set by Resolve_Binder_Options, 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.)

   Dispatching_Domains_Used : Boolean := False;
   --  Flag indicating whether multiprocessor dispatching domains are used in
   --  the closure of the partition. This is set by Resolve_Binder_Options, and
   --  is used to call the routine to disallow the creation of new dispatching
   --  domains just before calling the main procedure from the environment
   --  task.

   System_Secondary_Stack_Used : Boolean := False;
   --  Flag indicating whether the unit System.Secondary_Stack is in the
   --  closure of the partition. This is set by Resolve_Binder_Options, and
   --  is used to initialize the package in cases where the run-time brings
   --  in package but the secondary stack is not used.

   System_Tasking_Restricted_Stages_Used : Boolean := False;
   --  Flag indicating whether the unit System.Tasking.Restricted.Stages is in
   --  the closure of the partition. This is set by Resolve_Binder_Options,
   --  and it used to call a routine to active all the tasks at the end of
   --  the elaboration when partition elaboration policy is sequential.

   System_Interrupts_Used : Boolean := False;
   --  Flag indicating whether the unit System.Interrups is in the closure of
   --  the partition. This is set by Resolve_Binder_Options, and it used to
   --  attach interrupt handlers at the end of the elaboration when partition
   --  elaboration policy is sequential.

   System_BB_CPU_Primitives_Multiprocessors_Used : Boolean := False;
   --  Flag indicating whether unit System.BB.CPU_Primitives.Multiprocessors
   --  is in the closure of the partition. This is set by procedure
   --  Resolve_Binder_Options, and it is used to call a procedure that starts
   --  slave processors.

   System_Version_Control_Used : Boolean := False;
   --  Flag indicating whether unit System.Version_Control is in the closure.
   --  This unit is implicitly withed by the compiler when Version or
   --  Body_Version attributes are used. If the package is not in the closure,
   --  the version definitions can be removed.

   Lib_Final_Built : Boolean := False;
   --  Flag indicating whether the finalize_library rountine has been built

   Bind_Env_String_Built : Boolean := False;
   --  Flag indicating whether a bind environment string has been built

   CodePeer_Wrapper_Name : constant String := "call_main_subprogram";
   --  For CodePeer, introduce a wrapper subprogram which calls the
   --  user-defined main subprogram.

   ----------------------------------
   -- Interface_State Pragma Table --
   ----------------------------------

   --  This table assembles the interface state pragma information from
   --  all the units in the partition. Note that Bcheck has already checked
   --  that the information is consistent across units. The entries
   --  in this table are n/u/r/s for not set/user/runtime/system.

   package IS_Pragma_Settings is new Table.Table
     (Table_Component_Type => Character,
      Table_Index_Type     => Int,
      Table_Low_Bound      => 0,
      Table_Initial        => 100,
      Table_Increment      => 200,
      Table_Name           => "IS_Pragma_Settings");

   --  This table assembles the Priority_Specific_Dispatching pragma
   --  information from all the units in the partition. Note that Bcheck has
   --  already checked that the information is consistent across units.
   --  The entries in this table are the upper case first character of the
   --  policy name, e.g. 'F' for FIFO_Within_Priorities.

   package PSD_Pragma_Settings is new Table.Table
     (Table_Component_Type => Character,
      Table_Index_Type     => Int,
      Table_Low_Bound      => 0,
      Table_Initial        => 100,
      Table_Increment      => 200,
      Table_Name           => "PSD_Pragma_Settings");

   ----------------------------
   -- Bind_Environment Table --
   ----------------------------

   subtype Header_Num is Int range 0 .. 36;

   function Hash (Nam : Name_Id) return Header_Num;

   package Bind_Environment is new GNAT.HTable.Simple_HTable
     (Header_Num => Header_Num,
      Element    => Name_Id,
      No_Element => No_Name,
      Key        => Name_Id,
      Hash       => Hash,
      Equal      => "=");

   ----------------------
   -- Run-Time Globals --
   ----------------------

   --  This section documents the global variables that are set from the
   --  generated binder file.

   --     Main_Priority                 : Integer;
   --     Time_Slice_Value              : Integer;
   --     Heap_Size                     : Natural;
   --     WC_Encoding                   : Character;
   --     Locking_Policy                : Character;
   --     Queuing_Policy                : Character;
   --     Task_Dispatching_Policy       : Character;
   --     Priority_Specific_Dispatching : System.Address;
   --     Num_Specific_Dispatching      : Integer;
   --     Restrictions                  : System.Address;
   --     Interrupt_States              : System.Address;
   --     Num_Interrupt_States          : Integer;
   --     Unreserve_All_Interrupts      : Integer;
   --     Exception_Tracebacks          : Integer;
   --     Exception_Tracebacks_Symbolic : Integer;
   --     Detect_Blocking               : Integer;
   --     Default_Stack_Size            : Integer;
   --     Default_Secondary_Stack_Size  : System.Parameters.Size_Type;
   --     Leap_Seconds_Support          : Integer;
   --     Main_CPU                      : Integer;
   --     Default_Sized_SS_Pool         : System.Address;
   --     Binder_Sec_Stacks_Count       : Natural;

   --  Main_Priority is the priority value set by pragma Priority in the main
   --  program. If no such pragma is present, the value is -1.

   --  Time_Slice_Value is the time slice value set by pragma Time_Slice in the
   --  main program, or by the use of a -Tnnn parameter for the binder (if both
   --  are present, the binder value overrides). The value is in milliseconds.
   --  A value of zero indicates that time slicing should be suppressed. If no
   --  pragma is present, and no -T switch was used, the value is -1.

   --  WC_Encoding shows the wide character encoding method used for the main
   --  program. This is one of the encoding letters defined in
   --  System.WCh_Con.WC_Encoding_Letters.

   --  Locking_Policy is a space if no locking policy was specified for the
   --  partition. If a locking policy was specified, the value is the upper
   --  case first character of the locking policy name, for example, 'C' for
   --  Ceiling_Locking.

   --  Queuing_Policy is a space if no queuing policy was specified for the
   --  partition. If a queuing policy was specified, the value is the upper
   --  case first character of the queuing policy name for example, 'F' for
   --  FIFO_Queuing.

   --  Task_Dispatching_Policy is a space if no task dispatching policy was
   --  specified for the partition. If a task dispatching policy was specified,
   --  the value is the upper case first character of the policy name, e.g. 'F'
   --  for FIFO_Within_Priorities.

   --  Priority_Specific_Dispatching is the address of a string used to store
   --  the task dispatching policy specified for the different priorities in
   --  the partition. The length of this string is determined by the last
   --  priority for which such a pragma applies (the string will be a null
   --  string if no specific dispatching policies were used). If pragma were
   --  present, the entries apply to the priorities in sequence from the first
   --  priority. The value stored is the upper case first character of the
   --  policy name, or 'F' (for FIFO_Within_Priorities) as the default value
   --  for those priority ranges not specified.

   --  Num_Specific_Dispatching is length of the Priority_Specific_Dispatching
   --  string. It will be set to zero if no Priority_Specific_Dispatching
   --  pragmas are present.

   --  Restrictions is the address of a null-terminated string specifying the
   --  restrictions information for the partition. The format is identical to
   --  that of the parameter string found on R lines in ali files (see Lib.Writ
   --  spec in lib-writ.ads for full details). The difference is that in this
   --  context the values are the cumulative ones for the entire partition.

   --  Interrupt_States is the address of a string used to specify the
   --  cumulative results of Interrupt_State pragmas used in the partition.
   --  The length of this string is determined by the last interrupt for which
   --  such a pragma is given (the string will be a null string if no pragmas
   --  were used). If pragma were present the entries apply to the interrupts
   --  in sequence from the first interrupt, and are set to one of four
   --  possible settings: 'n' for not specified, 'u' for user, 'r' for run
   --  time, 's' for system, see description of Interrupt_State pragma for
   --  further details.

   --  Num_Interrupt_States is the length of the Interrupt_States string. It
   --  will be set to zero if no Interrupt_State pragmas are present.

   --  Unreserve_All_Interrupts is set to one if at least one unit in the
   --  partition had a pragma Unreserve_All_Interrupts, and zero otherwise.

   --  Exception_Tracebacks is set to one if the -Ea or -E parameter was
   --  present in the bind and to zero otherwise. Note that on some targets
   --  exception tracebacks are provided by default, so a value of zero for
   --  this parameter does not necessarily mean no trace backs are available.

   --  Exception_Tracebacks_Symbolic is set to one if the -Es parameter was
   --  present in the bind and to zero otherwise.

   --  Detect_Blocking indicates whether pragma Detect_Blocking is active or
   --  not. A value of zero indicates that the pragma is not present, while a
   --  value of 1 signals its presence in the partition.

   --  Default_Stack_Size is the default stack size used when creating an Ada
   --  task with no explicit Storage_Size clause.

   --  Default_Secondary_Stack_Size is the default secondary stack size used
   --  when creating an Ada task with no explicit Secondary_Stack_Size clause.

   --  Leap_Seconds_Support denotes whether leap seconds have been enabled or
   --  disabled. A value of zero indicates that leap seconds are turned "off",
   --  while a value of one signifies "on" status.

   --  Main_CPU is the processor set by pragma CPU in the main program. If no
   --  such pragma is present, the value is -1.

   --  Default_Sized_SS_Pool is set to the address of the default-sized
   --  secondary stacks array generated by the binder. This pool of stacks is
   --  generated when either the restriction No_Implicit_Heap_Allocations
   --  or No_Implicit_Task_Allocations is active.

   --  Binder_Sec_Stacks_Count is the number of generated secondary stacks in
   --  the Default_Sized_SS_Pool.

   procedure WBI (Info : String) renames Osint.B.Write_Binder_Info;
   --  Convenient shorthand used throughout

   -----------------------
   -- Local Subprograms --
   -----------------------

   procedure Gen_Adainit (Elab_Order : Unit_Id_Array);
   --  Generates the Adainit procedure

   procedure Gen_Adafinal;
   --  Generate the Adafinal procedure

   procedure Gen_Bind_Env_String;
   --  Generate the bind environment buffer

   procedure Gen_CodePeer_Wrapper;
   --  For CodePeer, generate wrapper which calls user-defined main subprogram

   procedure Gen_Elab_Calls (Elab_Order : Unit_Id_Array);
   --  Generate sequence of elaboration calls

   procedure Gen_Elab_Externals (Elab_Order : Unit_Id_Array);
   --  Generate sequence of external declarations for elaboration

   procedure Gen_Elab_Order (Elab_Order : Unit_Id_Array);
   --  Generate comments showing elaboration order chosen

   procedure Gen_Finalize_Library (Elab_Order : Unit_Id_Array);
   --  Generate a sequence of finalization calls to elaborated packages

   procedure Gen_Main;
   --  Generate procedure main

   procedure Gen_Object_Files_Options (Elab_Order : Unit_Id_Array);
   --  Output comments containing a list of the full names of the object
   --  files to be linked and the list of linker options supplied by
   --  Linker_Options pragmas in the source.

   procedure Gen_Output_File_Ada
     (Filename   : String;
      Elab_Order : Unit_Id_Array);
   --  Generate Ada output file

   procedure Gen_Restrictions;
   --  Generate initialization of restrictions variable

   procedure Gen_Versions;
   --  Output series of definitions for unit versions

   function Get_Ada_Main_Name return String;
   --  This function is used for the Ada main output to compute a usable name
   --  for the generated main program. The normal main program name is
   --  Ada_Main, but this won't work if the user has a unit with this name.
   --  This function tries Ada_Main first, and if there is such a clash, then
   --  it tries Ada_Name_01, Ada_Name_02 ... Ada_Name_99 in sequence.

   function Get_Main_Unit_Name (S : String) return String;
   --  Return the main unit name corresponding to S by replacing '.' with '_'

   function Get_Main_Name return String;
   --  This function is used in the main output case to compute the correct
   --  external main program. It is "main" by default, unless the flag
   --  Use_Ada_Main_Program_Name_On_Target is set, in which case it is the name
   --  of the Ada main name without the "_ada". This default can be overridden
   --  explicitly using the -Mname binder switch.

   function Get_WC_Encoding return Character;
   --  Return wide character encoding method to set as WC_Encoding in output.
   --  If -W has been used, returns the specified encoding, otherwise returns
   --  the encoding method used for the main program source. If there is no
   --  main program source (-z switch used), returns brackets ('b').

   function Has_Finalizer (Elab_Order : Unit_Id_Array) return Boolean;
   --  Determine whether the current unit has at least one library-level
   --  finalizer.

   function Lt_Linker_Option (Op1 : Natural; Op2 : Natural) return Boolean;
   --  Compare linker options, when sorting, first according to
   --  Is_Internal_File (internal files come later) and then by
   --  elaboration order position (latest to earliest).

   procedure Move_Linker_Option (From : Natural; To : Natural);
   --  Move routine for sorting linker options

   procedure Resolve_Binder_Options (Elab_Order : Unit_Id_Array);
   --  Set the value of With_GNARL

   procedure Set_Char (C : Character);
   --  Set given character in Statement_Buffer at the Stm_Last + 1 position
   --  and increment Stm_Last by one to reflect the stored character.

   procedure Set_Int (N : Int);
   --  Set given value in decimal in Statement_Buffer with no spaces starting
   --  at the Stm_Last + 1 position, and updating Stm_Last past the value. A
   --  minus sign is output for a negative value.

   procedure Set_Boolean (B : Boolean);
   --  Set given boolean value in Statement_Buffer at the Stm_Last + 1 position
   --  and update Stm_Last past the value.

   procedure Set_IS_Pragma_Table;
   --  Initializes contents of IS_Pragma_Settings table from ALI table

   procedure Set_Main_Program_Name;
   --  Given the main program name in Name_Buffer (length in Name_Len) generate
   --  the name of the routine to be used in the call. The name is generated
   --  starting at Stm_Last + 1, and Stm_Last is updated past it.

   procedure Set_Name_Buffer;
   --  Set the value stored in positions 1 .. Name_Len of the Name_Buffer

   procedure Set_PSD_Pragma_Table;
   --  Initializes contents of PSD_Pragma_Settings table from ALI table

   procedure Set_String (S : String);
   --  Sets characters of given string in Statement_Buffer, starting at the
   --  Stm_Last + 1 position, and updating last past the string value.

   procedure Set_String_Replace (S : String);
   --  Replaces the last S'Length characters in the Statement_Buffer with the
   --  characters of S. The caller must ensure that these characters do in fact
   --  exist in the Statement_Buffer.

   procedure Set_Unit_Name;
   --  Given a unit name in the Name_Buffer, copy it into Statement_Buffer,
   --  starting at the Stm_Last + 1 position and update Stm_Last past the
   --  value. Each dot (.) will be qualified into double underscores (__).

   procedure Set_Unit_Number (U : Unit_Id);
   --  Sets unit number (first unit is 1, leading zeroes output to line up all
   --  output unit numbers nicely as required by the value, and by the total
   --  number of units.

   procedure Write_Statement_Buffer;
   --  Write out contents of statement buffer up to Stm_Last, and reset
   --  Stm_Last to 0.

   procedure Write_Statement_Buffer (S : String);
   --  First writes its argument (using Set_String (S)), then writes out the
   --  contents of statement buffer up to Stm_Last, and resets Stm_Last to 0.

   procedure Write_Bind_Line (S : String);
   --  Write S (an LF-terminated string) to the binder file (for use with
   --  Set_Special_Output).

   ------------------
   -- Gen_Adafinal --
   ------------------

   procedure Gen_Adafinal is
   begin
      WBI ("   procedure " & Ada_Final_Name.all & " is");

      --  Call s_stalib_adafinal to await termination of tasks and so on. We
      --  want to do this if there is a main program, either in Ada or in some
      --  other language. (Note that Bind_Main_Program is True for Ada mains,
      --  but False for mains in other languages.) We do not want to do this if
      --  we're binding a library.

      if not Bind_For_Library and not CodePeer_Mode then
         WBI ("      procedure s_stalib_adafinal;");
         Set_String ("      pragma Import (C, s_stalib_adafinal, ");
         Set_String ("""system__standard_library__adafinal"");");
         Write_Statement_Buffer;
      end if;

      WBI ("");
      WBI ("      procedure Runtime_Finalize;");
      WBI ("      pragma Import (C, Runtime_Finalize, " &
             """__gnat_runtime_finalize"");");
      WBI ("");
      WBI ("   begin");

      if not CodePeer_Mode then
         WBI ("      if not Is_Elaborated then");
         WBI ("         return;");
         WBI ("      end if;");
         WBI ("      Is_Elaborated := False;");
      end if;

      WBI ("      Runtime_Finalize;");

      --  By default (real targets), finalization is done differently depending
      --  on whether this is the main program or a library.

      if not CodePeer_Mode then
         if not Bind_For_Library then
            WBI ("      s_stalib_adafinal;");
         elsif Lib_Final_Built then
            WBI ("      finalize_library;");
         else
            WBI ("      null;");
         end if;

      --  Pragma Import C cannot be used on virtual targets, therefore call the
      --  runtime finalization routine directly in CodePeer mode, where
      --  imported functions are ignored.

      else
         WBI ("      System.Standard_Library.Adafinal;");
      end if;

      WBI ("   end " & Ada_Final_Name.all & ";");
      WBI ("");
   end Gen_Adafinal;

   -----------------
   -- Gen_Adainit --
   -----------------

   procedure Gen_Adainit (Elab_Order : Unit_Id_Array) is
      Main_Priority : Int renames ALIs.Table (ALIs.First).Main_Priority;
      Main_CPU      : Int renames ALIs.Table (ALIs.First).Main_CPU;

   begin
      --  Declare the access-to-subprogram type used for initialization of
      --  of __gnat_finalize_library_objects. This is declared at library
      --  level for compatibility with the type used in System.Soft_Links.
      --  The import of the soft link which performs library-level object
      --  finalization does not work for CodePeer, so regular Ada is used in
      --  that case. For restricted run-time libraries (ZFP and Ravenscar)
      --  tasks are non-terminating, so we do not want finalization.

      if not Suppress_Standard_Library_On_Target
        and then not CodePeer_Mode
        and then not Configurable_Run_Time_On_Target
      then
         WBI ("   type No_Param_Proc is access procedure;");
         WBI ("");
      end if;

      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.

      elsif Suppress_Standard_Library_On_Target then
         if Main_Priority /= No_Main_Priority then
            WBI ("      Main_Priority : Integer;");
            WBI ("      pragma Import (C, Main_Priority," &
                 " ""__gl_main_priority"");");
            WBI ("");
         end if;

         if Main_CPU /= No_Main_CPU then
            WBI ("      Main_CPU : Integer;");
            WBI ("      pragma Import (C, Main_CPU," &
                 " ""__gl_main_cpu"");");
            WBI ("");
         end if;

         if System_Interrupts_Used
           and then Partition_Elaboration_Policy_Specified = 'S'
         then
            WBI ("      procedure Install_Restricted_Handlers_Sequential;");
            WBI ("      pragma Import (C," &
                 "Install_Restricted_Handlers_Sequential," &
                 " ""__gnat_attach_all_handlers"");");
            WBI ("");
         end if;

         if System_Tasking_Restricted_Stages_Used
           and then Partition_Elaboration_Policy_Specified = 'S'
         then
            WBI ("      Partition_Elaboration_Policy : Character;");
            WBI ("      pragma Import (C, Partition_Elaboration_Policy," &
                 " ""__gnat_partition_elaboration_policy"");");
            WBI ("");
            WBI ("      procedure Activate_All_Tasks_Sequential;");
            WBI ("      pragma Import (C, Activate_All_Tasks_Sequential," &
                 " ""__gnat_activate_all_tasks"");");
            WBI ("");
         end if;

         if System_BB_CPU_Primitives_Multiprocessors_Used then
            WBI ("      procedure Start_Slave_CPUs;");
            WBI ("      pragma Import (C, Start_Slave_CPUs," &
                 " ""__gnat_start_slave_cpus"");");
            WBI ("");
         end if;

         --  A restricted run-time may attempt to initialize the main task's
         --  secondary stack even if the stack is not used. Consequently,
         --  the binder needs to initialize Binder_Sec_Stacks_Count anytime
         --  System.Secondary_Stack is in the enclosure of the partition.

         if System_Secondary_Stack_Used then
            WBI ("      Binder_Sec_Stacks_Count : Natural;");
            WBI ("      pragma Import (Ada, Binder_Sec_Stacks_Count, " &
                 """__gnat_binder_ss_count"");");
            WBI ("");
         end if;

         if Sec_Stack_Used then
            WBI ("      Default_Secondary_Stack_Size : " &
                 "System.Parameters.Size_Type;");
            WBI ("      pragma Import (C, Default_Secondary_Stack_Size, " &
                 """__gnat_default_ss_size"");");

            WBI ("      Default_Sized_SS_Pool : System.Address;");
            WBI ("      pragma Import (Ada, Default_Sized_SS_Pool, " &
                 """__gnat_default_ss_pool"");");

            WBI ("");
         end if;

         WBI ("   begin");

         if Main_Priority /= No_Main_Priority then
            Set_String ("      Main_Priority := ");
            Set_Int    (Main_Priority);
            Set_Char   (';');
            Write_Statement_Buffer;
         end if;

         if Main_CPU /= No_Main_CPU then
            Set_String ("      Main_CPU := ");
            Set_Int    (Main_CPU);
            Set_Char   (';');
            Write_Statement_Buffer;
         end if;

         if System_Tasking_Restricted_Stages_Used
           and then Partition_Elaboration_Policy_Specified = 'S'
         then
            Set_String ("      Partition_Elaboration_Policy := '");
            Set_Char   (Partition_Elaboration_Policy_Specified);
            Set_String ("';");
            Write_Statement_Buffer;
         end if;

         if Main_Priority = No_Main_Priority
           and then Main_CPU = No_Main_CPU
           and then not System_Tasking_Restricted_Stages_Used
         then
            WBI ("      null;");
         end if;

         --  Generate default-sized secondary stack pool and set secondary
         --  stack globals.

         if Sec_Stack_Used then

            --  Elaborate the body of the binder to initialize the default-
            --  sized secondary stack pool.

            WBI ("");
            WBI ("      " & Get_Ada_Main_Name & "'Elab_Body;");

            --  Generate the default-sized secondary stack pool and set the
            --  related secondary stack globals.

            Set_String ("      Default_Secondary_Stack_Size := ");

            if Opt.Default_Sec_Stack_Size /= Opt.No_Stack_Size then
               Set_Int (Opt.Default_Sec_Stack_Size);
            else
               Set_String ("System.Parameters.Runtime_Default_Sec_Stack_Size");
            end if;

            Set_Char (';');
            Write_Statement_Buffer;

            Set_String ("      Binder_Sec_Stacks_Count := ");
            Set_Int (Num_Sec_Stacks);
            Set_Char (';');
            Write_Statement_Buffer;

            WBI ("      Default_Sized_SS_Pool := " &
                   "Sec_Default_Sized_Stacks'Address;");
            WBI ("");

         --  When a restricted run-time initializes the main task's secondary
         --  stack but the program does not use it, no secondary stack is
         --  generated. Binder_Sec_Stacks_Count is set to zero so the run-time
         --  is aware that the lack of pre-allocated secondary stack is
         --  expected.

         elsif System_Secondary_Stack_Used then
            WBI ("      Binder_Sec_Stacks_Count := 0;");
         end if;

      --  Normal case (standard library not suppressed). Set all global values
      --  used by the run time.

      else
         WBI ("      Main_Priority : Integer;");
         WBI ("      pragma Import (C, Main_Priority, " &
              """__gl_main_priority"");");
         WBI ("      Time_Slice_Value : Integer;");
         WBI ("      pragma Import (C, Time_Slice_Value, " &
              """__gl_time_slice_val"");");
         WBI ("      WC_Encoding : Character;");
         WBI ("      pragma Import (C, WC_Encoding, ""__gl_wc_encoding"");");
         WBI ("      Locking_Policy : Character;");
         WBI ("      pragma Import (C, Locking_Policy, " &
              """__gl_locking_policy"");");
         WBI ("      Queuing_Policy : Character;");
         WBI ("      pragma Import (C, Queuing_Policy, " &
              """__gl_queuing_policy"");");
         WBI ("      Task_Dispatching_Policy : Character;");
         WBI ("      pragma Import (C, Task_Dispatching_Policy, " &
              """__gl_task_dispatching_policy"");");
         WBI ("      Priority_Specific_Dispatching : System.Address;");
         WBI ("      pragma Import (C, Priority_Specific_Dispatching, " &
              """__gl_priority_specific_dispatching"");");
         WBI ("      Num_Specific_Dispatching : Integer;");
         WBI ("      pragma Import (C, Num_Specific_Dispatching, " &
              """__gl_num_specific_dispatching"");");
         WBI ("      Main_CPU : Integer;");
         WBI ("      pragma Import (C, Main_CPU, " &
              """__gl_main_cpu"");");

         WBI ("      Interrupt_States : System.Address;");
         WBI ("      pragma Import (C, Interrupt_States, " &
              """__gl_interrupt_states"");");
         WBI ("      Num_Interrupt_States : Integer;");
         WBI ("      pragma Import (C, Num_Interrupt_States, " &
              """__gl_num_interrupt_states"");");
         WBI ("      Unreserve_All_Interrupts : Integer;");
         WBI ("      pragma Import (C, Unreserve_All_Interrupts, " &
              """__gl_unreserve_all_interrupts"");");

         if Exception_Tracebacks or Exception_Tracebacks_Symbolic then
            WBI ("      Exception_Tracebacks : Integer;");
            WBI ("      pragma Import (C, Exception_Tracebacks, " &
                 """__gl_exception_tracebacks"");");

            if Exception_Tracebacks_Symbolic then
               WBI ("      Exception_Tracebacks_Symbolic : Integer;");
               WBI ("      pragma Import (C, Exception_Tracebacks_Symbolic, " &
                    """__gl_exception_tracebacks_symbolic"");");
            end if;
         end if;

         WBI ("      Detect_Blocking : Integer;");
         WBI ("      pragma Import (C, Detect_Blocking, " &
              """__gl_detect_blocking"");");
         WBI ("      Default_Stack_Size : Integer;");
         WBI ("      pragma Import (C, Default_Stack_Size, " &
              """__gl_default_stack_size"");");
         WBI ("      Default_Secondary_Stack_Size : " &
              "System.Parameters.Size_Type;");
         WBI ("      pragma Import (C, Default_Secondary_Stack_Size, " &
              """__gnat_default_ss_size"");");
         WBI ("      Leap_Seconds_Support : Integer;");
         WBI ("      pragma Import (C, Leap_Seconds_Support, " &
              """__gl_leap_seconds_support"");");
         WBI ("      Bind_Env_Addr : System.Address;");
         WBI ("      pragma Import (C, Bind_Env_Addr, " &
              """__gl_bind_env_addr"");");

         --  Import entry point for elaboration time signal handler
         --  installation, and indication of if it's been called previously.

         WBI ("");
         WBI ("      procedure Runtime_Initialize " &
              "(Install_Handler : Integer);");
         WBI ("      pragma Import (C, Runtime_Initialize, " &
              """__gnat_runtime_initialize"");");

         --  Import handlers attach procedure for sequential elaboration policy

         if System_Interrupts_Used
           and then Partition_Elaboration_Policy_Specified = 'S'
         then
            WBI ("      procedure Install_Restricted_Handlers_Sequential;");
            WBI ("      pragma Import (C," &
                 "Install_Restricted_Handlers_Sequential," &
                 " ""__gnat_attach_all_handlers"");");
            WBI ("");
         end if;

         --  Import task activation procedure for sequential elaboration
         --  policy.

         if System_Tasking_Restricted_Stages_Used
           and then Partition_Elaboration_Policy_Specified = 'S'
         then
            WBI ("      Partition_Elaboration_Policy : Character;");
            WBI ("      pragma Import (C, Partition_Elaboration_Policy," &
                 " ""__gnat_partition_elaboration_policy"");");
            WBI ("");
            WBI ("      procedure Activate_All_Tasks_Sequential;");
            WBI ("      pragma Import (C, Activate_All_Tasks_Sequential," &
                 " ""__gnat_activate_all_tasks"");");
         end if;

         --  Import procedure to start slave cpus for bareboard runtime

         if System_BB_CPU_Primitives_Multiprocessors_Used then
            WBI ("      procedure Start_Slave_CPUs;");
            WBI ("      pragma Import (C, Start_Slave_CPUs," &
                 " ""__gnat_start_slave_cpus"");");
         end if;

         --  For restricted run-time libraries (ZFP and Ravenscar)
         --  tasks are non-terminating, so we do not want finalization.

         if not Configurable_Run_Time_On_Target then
            WBI ("");
            WBI ("      Finalize_Library_Objects : No_Param_Proc;");
            WBI ("      pragma Import (C, Finalize_Library_Objects, " &
                 """__gnat_finalize_library_objects"");");
         end if;

         --  Initialize stack limit variable of the environment task if the
         --  stack check method is stack limit and stack check is enabled.

         if Stack_Check_Limits_On_Target
           and then (Stack_Check_Default_On_Target or Stack_Check_Switch_Set)
         then
            WBI ("");
            WBI ("      procedure Initialize_Stack_Limit;");
            WBI ("      pragma Import (C, Initialize_Stack_Limit, " &
                 """__gnat_initialize_stack_limit"");");
         end if;

         --  When dispatching domains are used then we need to signal it
         --  before calling the main procedure.

         if Dispatching_Domains_Used then
            WBI ("      procedure Freeze_Dispatching_Domains;");
            WBI ("      pragma Import");
            WBI ("        (Ada, Freeze_Dispatching_Domains, "
                 & """__gnat_freeze_dispatching_domains"");");
         end if;

         --  Secondary stack global variables

         WBI ("      Binder_Sec_Stacks_Count : Natural;");
         WBI ("      pragma Import (Ada, Binder_Sec_Stacks_Count, " &
              """__gnat_binder_ss_count"");");

         WBI ("      Default_Sized_SS_Pool : System.Address;");
         WBI ("      pragma Import (Ada, Default_Sized_SS_Pool, " &
              """__gnat_default_ss_pool"");");

         WBI ("");

         --  Start of processing for Adainit

         WBI ("   begin");
         WBI ("      if Is_Elaborated then");
         WBI ("         return;");
         WBI ("      end if;");
         WBI ("      Is_Elaborated := True;");

         --  Call System.Elaboration_Allocators.Mark_Start_Of_Elaboration if
         --  restriction No_Standard_Allocators_After_Elaboration is active.

         if Cumulative_Restrictions.Set
              (No_Standard_Allocators_After_Elaboration)
         then
            WBI ("      System.Elaboration_Allocators."
                 & "Mark_Start_Of_Elaboration;");
         end if;

         --  Generate assignments to initialize globals

         Set_String ("      Main_Priority := ");
         Set_Int    (Main_Priority);
         Set_Char   (';');
         Write_Statement_Buffer;

         Set_String ("      Time_Slice_Value := ");

         if Task_Dispatching_Policy_Specified = 'F'
           and then ALIs.Table (ALIs.First).Time_Slice_Value = -1
         then
            Set_Int (0);
         else
            Set_Int (ALIs.Table (ALIs.First).Time_Slice_Value);
         end if;

         Set_Char   (';');
         Write_Statement_Buffer;

         Set_String ("      WC_Encoding := '");
         Set_Char   (Get_WC_Encoding);

         Set_String ("';");
         Write_Statement_Buffer;

         Set_String ("      Locking_Policy := '");
         Set_Char   (Locking_Policy_Specified);
         Set_String ("';");
         Write_Statement_Buffer;

         Set_String ("      Queuing_Policy := '");
         Set_Char   (Queuing_Policy_Specified);
         Set_String ("';");
         Write_Statement_Buffer;

         Set_String ("      Task_Dispatching_Policy := '");
         Set_Char   (Task_Dispatching_Policy_Specified);
         Set_String ("';");
         Write_Statement_Buffer;

         if System_Tasking_Restricted_Stages_Used
           and then Partition_Elaboration_Policy_Specified = 'S'
         then
            Set_String ("      Partition_Elaboration_Policy := '");
            Set_Char   (Partition_Elaboration_Policy_Specified);
            Set_String ("';");
            Write_Statement_Buffer;
         end if;

         Gen_Restrictions;

         WBI ("      Priority_Specific_Dispatching :=");
         WBI ("        Local_Priority_Specific_Dispatching'Address;");

         Set_String ("      Num_Specific_Dispatching := ");
         Set_Int (PSD_Pragma_Settings.Last + 1);
         Set_Char (';');
         Write_Statement_Buffer;

         Set_String ("      Main_CPU := ");
         Set_Int    (Main_CPU);
         Set_Char   (';');
         Write_Statement_Buffer;

         WBI ("      Interrupt_States := Local_Interrupt_States'Address;");

         Set_String ("      Num_Interrupt_States := ");
         Set_Int (IS_Pragma_Settings.Last + 1);
         Set_Char (';');
         Write_Statement_Buffer;

         Set_String ("      Unreserve_All_Interrupts := ");

         if Unreserve_All_Interrupts_Specified then
            Set_String ("1");
         else
            Set_String ("0");
         end if;

         Set_Char (';');
         Write_Statement_Buffer;

         if Exception_Tracebacks or Exception_Tracebacks_Symbolic then
            WBI ("      Exception_Tracebacks := 1;");

            if Exception_Tracebacks_Symbolic then
               WBI ("      Exception_Tracebacks_Symbolic := 1;");
            end if;
         end if;

         Set_String ("      Detect_Blocking := ");

         if Detect_Blocking then
            Set_Int (1);
         else
            Set_Int (0);
         end if;

         Set_String (";");
         Write_Statement_Buffer;

         Set_String ("      Default_Stack_Size := ");
         Set_Int (Default_Stack_Size);
         Set_String (";");
         Write_Statement_Buffer;

         Set_String ("      Leap_Seconds_Support := ");

         if Leap_Seconds_Support then
            Set_Int (1);
         else
            Set_Int (0);
         end if;

         Set_String (";");
         Write_Statement_Buffer;

         if Bind_Env_String_Built then
            WBI ("      Bind_Env_Addr := Bind_Env'Address;");
         end if;

         WBI ("");

         --  Generate default-sized secondary stack pool and set secondary
         --  stack globals.

         if Sec_Stack_Used then

            --  Elaborate the body of the binder to initialize the default-
            --  sized secondary stack pool.

            WBI ("      " & Get_Ada_Main_Name & "'Elab_Body;");

            --  Generate the default-sized secondary stack pool and set the
            --  related secondary stack globals.

            Set_String ("      Default_Secondary_Stack_Size := ");

            if Opt.Default_Sec_Stack_Size /= Opt.No_Stack_Size then
               Set_Int (Opt.Default_Sec_Stack_Size);
            else
               Set_String ("System.Parameters.Runtime_Default_Sec_Stack_Size");
            end if;

            Set_Char (';');
            Write_Statement_Buffer;

            Set_String ("      Binder_Sec_Stacks_Count := ");
            Set_Int (Num_Sec_Stacks);
            Set_Char (';');
            Write_Statement_Buffer;

            Set_String ("      Default_Sized_SS_Pool := ");

            if Num_Sec_Stacks > 0 then
               Set_String ("Sec_Default_Sized_Stacks'Address;");
            else
               Set_String ("System.Null_Address;");
            end if;

            Write_Statement_Buffer;
            WBI ("");
         end if;

         --  Generate call to Runtime_Initialize

         WBI ("      Runtime_Initialize (1);");
      end if;

      --  Generate call to set Initialize_Scalar values if active

      if Initialize_Scalars_Used then
         WBI ("");
         Set_String ("      System.Scalar_Values.Initialize ('");
         Set_Char (Initialize_Scalars_Mode1);
         Set_String ("', '");
         Set_Char (Initialize_Scalars_Mode2);
         Set_String ("');");
         Write_Statement_Buffer;
      end if;

      --  Initialize stack limit variable of the environment task if the stack
      --  check method is stack limit and stack check is enabled.

      if Stack_Check_Limits_On_Target
        and then (Stack_Check_Default_On_Target or Stack_Check_Switch_Set)
      then
         WBI ("");
         WBI ("      Initialize_Stack_Limit;");
      end if;

      --  On CodePeer, the finalization of library objects is not relevant

      if CodePeer_Mode then
         null;

      --  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.

      elsif not Bind_For_Library
        and then not Configurable_Run_Time_On_Target
        and then not Suppress_Standard_Library_On_Target
      then
         WBI ("");

         if Lib_Final_Built then
            Set_String ("      Finalize_Library_Objects := ");
            Set_String ("finalize_library'access;");
         else
            Set_String ("      Finalize_Library_Objects := null;");
         end if;

         Write_Statement_Buffer;
      end if;

      --  Generate elaboration calls

      if not CodePeer_Mode then
         WBI ("");
      end if;

      Gen_Elab_Calls (Elab_Order);

      if not CodePeer_Mode then

         --  Call System.Elaboration_Allocators.Mark_Start_Of_Elaboration if
         --  restriction No_Standard_Allocators_After_Elaboration is active.

         if Cumulative_Restrictions.Set
              (No_Standard_Allocators_After_Elaboration)
         then
            WBI
              ("      System.Elaboration_Allocators.Mark_End_Of_Elaboration;");
         end if;

         --  From this point, no new dispatching domain can be created

         if Dispatching_Domains_Used then
            WBI ("      Freeze_Dispatching_Domains;");
         end if;

         --  Sequential partition elaboration policy

         if Partition_Elaboration_Policy_Specified = 'S' then
            if System_Interrupts_Used then
               WBI ("      Install_Restricted_Handlers_Sequential;");
            end if;

            if System_Tasking_Restricted_Stages_Used then
               WBI ("      Activate_All_Tasks_Sequential;");
            end if;
         end if;

         if System_BB_CPU_Primitives_Multiprocessors_Used then
            WBI ("      Start_Slave_CPUs;");
         end if;
      end if;

      WBI ("   end " & Ada_Init_Name.all & ";");
      WBI ("");
   end Gen_Adainit;

   -------------------------
   -- Gen_Bind_Env_String --
   -------------------------

   procedure Gen_Bind_Env_String is
      procedure Write_Name_With_Len (Nam : Name_Id);
      --  Write Nam as a string literal, prefixed with one
      --  character encoding Nam's length.

      -------------------------
      -- Write_Name_With_Len --
      -------------------------

      procedure Write_Name_With_Len (Nam : Name_Id) is
      begin
         Get_Name_String (Nam);

         Start_String;
         Store_String_Char (Character'Val (Name_Len));
         Store_String_Chars (Name_Buffer (1 .. Name_Len));

         Write_String_Table_Entry (End_String);
      end Write_Name_With_Len;

      --  Local variables

      Amp : Character;
      KN  : Name_Id := No_Name;
      VN  : Name_Id := No_Name;

   --  Start of processing for Gen_Bind_Env_String

   begin
      Bind_Environment.Get_First (KN, VN);

      if VN = No_Name then
         return;
      end if;

      Set_Special_Output (Write_Bind_Line'Access);

      WBI ("   Bind_Env : aliased constant String :=");
      Amp := ' ';
      while VN /= No_Name loop
         Write_Str ("     " & Amp & ' ');
         Write_Name_With_Len (KN);
         Write_Str (" & ");
         Write_Name_With_Len (VN);
         Write_Eol;

         Bind_Environment.Get_Next (KN, VN);
         Amp := '&';
      end loop;
      WBI ("     & ASCII.NUL;");

      Set_Special_Output (null);

      Bind_Env_String_Built := True;
   end Gen_Bind_Env_String;

   --------------------------
   -- Gen_CodePeer_Wrapper --
   --------------------------

   procedure Gen_CodePeer_Wrapper is
      Callee_Name : constant String := "Ada_Main_Program";

   begin
      if ALIs.Table (ALIs.First).Main_Program = Proc then
         WBI ("   procedure " & CodePeer_Wrapper_Name & " is ");
         WBI ("   begin");
         WBI ("      " & Callee_Name & ";");

      else
         WBI ("   function " & CodePeer_Wrapper_Name & " return Integer is");
         WBI ("   begin");
         WBI ("      return " & Callee_Name & ";");
      end if;

      WBI ("   end " & CodePeer_Wrapper_Name & ";");
      WBI ("");
   end Gen_CodePeer_Wrapper;

   --------------------
   -- Gen_Elab_Calls --
   --------------------

   procedure Gen_Elab_Calls (Elab_Order : Unit_Id_Array) is
      Check_Elab_Flag : Boolean;

   begin
      --  Loop through elaboration order entries

      for E in Elab_Order'Range loop
         declare
            Unum : constant Unit_Id := Elab_Order (E);
            U    : Unit_Record renames Units.Table (Unum);

            Unum_Spec : Unit_Id;
            --  This is the unit number of the spec that corresponds to
            --  this entry. It is the same as Unum except when the body
            --  and spec are different and we are currently processing
            --  the body, in which case it is the spec (Unum + 1).

         begin
            if U.Utype = Is_Body then
               Unum_Spec := Unum + 1;
            else
               Unum_Spec := Unum;
            end if;

            --  Nothing to do if predefined unit in no run time mode

            if No_Run_Time_Mode and then Is_Predefined_File_Name (U.Sfile) then
               null;

            --  Likewise if this is an interface to a stand alone library

            elsif U.SAL_Interface then
               null;

            --  Case of no elaboration code

            elsif U.No_Elab

              --  In CodePeer mode, we special case subprogram bodies which
              --  are handled in the 'else' part below, and lead to a call
              --  to <subp>'Elab_Subp_Body.

              and then (not CodePeer_Mode

                         --  Test for spec

                         or else U.Utype = Is_Spec
                         or else U.Utype = Is_Spec_Only
                         or else U.Unit_Kind /= 's')
            then
               --  In the case of a body with a separate spec, where the
               --  separate spec has an elaboration entity defined, this is
               --  where we increment the elaboration entity if one exists.

               --  Likewise for lone specs with an elaboration entity defined
               --  despite No_Elaboration_Code, e.g. when requested to preserve
               --  control flow.

               if (U.Utype = Is_Body or else U.Utype = Is_Spec_Only)
                 and then Units.Table (Unum_Spec).Set_Elab_Entity
                 and then not CodePeer_Mode
               then
                  Set_String ("      E");
                  Set_Unit_Number (Unum_Spec);
                  Set_String (" := E");
                  Set_Unit_Number (Unum_Spec);
                  Set_String (" + 1;");
                  Write_Statement_Buffer;
               end if;

            --  Here if elaboration code is present. If binding a library
            --  or if there is a non-Ada main subprogram then we generate:

            --    if uname_E = 0 then
            --       uname'elab_[spec|body];
            --    end if;
            --    uname_E := uname_E + 1;

            --  Otherwise, elaboration routines are called unconditionally:

            --    uname'elab_[spec|body];
            --    uname_E := uname_E + 1;

            --  The uname_E increment is skipped if this is a separate spec,
            --  since it will be done when we process the body.

            --  In CodePeer mode, we do not generate any reference to xxx_E
            --  variables, only calls to 'Elab* subprograms.

            else
               --  Check incompatibilities with No_Multiple_Elaboration

               if not CodePeer_Mode
                 and then Cumulative_Restrictions.Set (No_Multiple_Elaboration)
               then
                  --  Force_Checking_Of_Elaboration_Flags (-F) not allowed

                  if Force_Checking_Of_Elaboration_Flags then
                     Osint.Fail
                       ("-F (force elaboration checks) switch not allowed "
                        & "with restriction No_Multiple_Elaboration active");

                  --  Interfacing of libraries not allowed

                  elsif Interface_Library_Unit then
                     Osint.Fail
                       ("binding of interfaced libraries not allowed "
                        & "with restriction No_Multiple_Elaboration active");

                  --  Non-Ada main program not allowed

                  elsif not Bind_Main_Program then
                     Osint.Fail
                       ("non-Ada main program not allowed "
                        & "with restriction No_Multiple_Elaboration active");
                  end if;
               end if;

               --  OK, see if we need to test elaboration flag

               Check_Elab_Flag :=
                 Units.Table (Unum_Spec).Set_Elab_Entity
                   and then 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");
                  Write_Statement_Buffer;
                  Set_String ("   ");
               end if;

               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";
                  Name_Len := Name_Len + 8;

               --  Special case in CodePeer mode for subprogram bodies
               --  which correspond to CodePeer 'Elab_Subp_Body special
               --  init procedure.

               elsif U.Unit_Kind = 's' and CodePeer_Mode then
                  Name_Buffer (Name_Len - 1 .. Name_Len + 13) :=
                    "'elab_subp_body";
                  Name_Len := Name_Len + 13;

               else
                  Name_Buffer (Name_Len - 1 .. Name_Len + 8) :=
                    "'elab_body";
                  Name_Len := Name_Len + 8;
               end if;

               Set_Casing (U.Icasing);
               Set_Name_Buffer;
               Set_Char (';');
               Write_Statement_Buffer;

               if Check_Elab_Flag then
                  WBI ("      end if;");
               end if;

               if U.Utype /= Is_Spec
                 and then not CodePeer_Mode
                 and then Units.Table (Unum_Spec).Set_Elab_Entity
               then
                  Set_String ("      E");
                  Set_Unit_Number (Unum_Spec);
                  Set_String (" := E");
                  Set_Unit_Number (Unum_Spec);
                  Set_String (" + 1;");
                  Write_Statement_Buffer;
               end if;
            end if;
         end;
      end loop;
   end Gen_Elab_Calls;

   ------------------------
   -- Gen_Elab_Externals --
   ------------------------

   procedure Gen_Elab_Externals (Elab_Order : Unit_Id_Array) is
   begin
      if CodePeer_Mode then
         return;
      end if;

      for E in Elab_Order'Range loop
         declare
            Unum : constant Unit_Id := Elab_Order (E);
            U    : Unit_Record renames Units.Table (Unum);

         begin
            --  Check for Elab_Entity to be set for this unit

            if U.Set_Elab_Entity

              --  Don't generate reference for stand alone library

              and then not U.SAL_Interface

              --  Don't generate reference for predefined file in No_Run_Time
              --  mode, since we don't include the object files in this case

              and then not
                (No_Run_Time_Mode
                  and then Is_Predefined_File_Name (U.Sfile))
            then
               Get_Name_String (U.Sfile);
               Set_String ("   ");
               Set_String ("E");
               Set_Unit_Number (Unum);
               Set_String (" : Short_Integer; pragma Import (Ada, E");
               Set_Unit_Number (Unum);
               Set_String (", """);
               Get_Name_String (U.Uname);
               Set_Unit_Name;
               Set_String ("_E"");");
               Write_Statement_Buffer;
            end if;
         end;
      end loop;

      WBI ("");
   end Gen_Elab_Externals;

   --------------------
   -- Gen_Elab_Order --
   --------------------

   procedure Gen_Elab_Order (Elab_Order : Unit_Id_Array) is
   begin
      WBI ("");
      WBI ("   --  BEGIN ELABORATION ORDER");

      for J in Elab_Order'Range loop
         Set_String ("   --  ");
         Get_Name_String (Units.Table (Elab_Order (J)).Uname);
         Set_Name_Buffer;
         Write_Statement_Buffer;
      end loop;

      WBI ("   --  END ELABORATION ORDER");
   end Gen_Elab_Order;

   --------------------------
   -- Gen_Finalize_Library --
   --------------------------

   procedure Gen_Finalize_Library (Elab_Order : Unit_Id_Array) is
      procedure Gen_Header;
      --  Generate the header of the finalization routine

      ----------------
      -- Gen_Header --
      ----------------

      procedure Gen_Header is
      begin
         WBI ("   procedure finalize_library is");
         WBI ("   begin");
      end Gen_Header;

      --  Local variables

      Count : Int := 1;
      U     : Unit_Record;
      Uspec : Unit_Record;
      Unum  : Unit_Id;

   --  Start of processing for Gen_Finalize_Library

   begin
      if CodePeer_Mode then
         return;
      end if;

      for E in reverse Elab_Order'Range loop
         Unum := Elab_Order (E);
         U    := Units.Table (Unum);

         --  Dealing with package bodies is a little complicated. In such
         --  cases we must retrieve the package spec since it contains the
         --  spec of the body finalizer.

         if U.Utype = Is_Body then
            Unum  := Unum + 1;
            Uspec := Units.Table (Unum);
         else
            Uspec := U;
         end if;

         Get_Name_String (Uspec.Uname);

         --  We are only interested in non-generic packages

         if U.Unit_Kind /= 'p' or else U.Is_Generic then
            null;

         --  That aren't an interface to a stand alone library

         elsif U.SAL_Interface then
            null;

         --  Case of no finalization

         elsif not U.Has_Finalizer then

            --  The only case in which we have to do something is if this
            --  is a body, with a separate spec, where the separate spec
            --  has a finalizer. In that case, this is where we decrement
            --  the elaboration entity.

            if U.Utype = Is_Body and then Uspec.Has_Finalizer then
               if not Lib_Final_Built then
                  Gen_Header;
                  Lib_Final_Built := True;
               end if;

               Set_String ("      E");
               Set_Unit_Number (Unum);
               Set_String (" := E");
               Set_Unit_Number (Unum);
               Set_String (" - 1;");
               Write_Statement_Buffer;
            end if;

         else
            if not Lib_Final_Built then
               Gen_Header;
               Lib_Final_Built := True;
            end if;

            --  Generate:
            --    declare
            --       procedure F<Count>;

            Set_String ("      declare");
            Write_Statement_Buffer;

            Set_String ("         procedure F");
            Set_Int    (Count);
            Set_Char   (';');
            Write_Statement_Buffer;

            --  Generate:
            --    pragma Import (Ada, F<Count>,
            --                  "xx__yy__finalize_[body|spec]");

            Set_String ("         pragma Import (Ada, F");
            Set_Int (Count);
            Set_String (", """);

            --  Perform name construction

            Set_Unit_Name;
            Set_String ("__finalize_");

            --  Package spec processing

            if U.Utype = Is_Spec
              or else U.Utype = Is_Spec_Only
            then
               Set_String ("spec");

            --  Package body processing

            else
               Set_String ("body");
            end if;

            Set_String (""");");
            Write_Statement_Buffer;

            --  If binding a library or if there is a non-Ada main subprogram
            --  then we generate:

            --    begin
            --       uname_E := uname_E - 1;
            --       if uname_E = 0 then
            --          F<Count>;
            --       end if;
            --    end;

            --  Otherwise, finalization routines are called unconditionally:

            --    begin
            --       uname_E := uname_E - 1;
            --       F<Count>;
            --    end;

            --  The uname_E decrement is skipped if this is a separate spec,
            --  since it will be done when we process the body.

            WBI ("      begin");

            if U.Utype /= Is_Spec then
               Set_String ("         E");
               Set_Unit_Number (Unum);
               Set_String (" := E");
               Set_Unit_Number (Unum);
               Set_String (" - 1;");
               Write_Statement_Buffer;
            end if;

            if Interface_Library_Unit or not Bind_Main_Program then
               Set_String ("         if E");
               Set_Unit_Number (Unum);
               Set_String (" = 0 then");
               Write_Statement_Buffer;
               Set_String ("   ");
            end if;

            Set_String ("         F");
            Set_Int    (Count);
            Set_Char   (';');
            Write_Statement_Buffer;

            if Interface_Library_Unit or not Bind_Main_Program then
               WBI ("         end if;");
            end if;

            WBI ("      end;");

            Count := Count + 1;
         end if;
      end loop;

      if Lib_Final_Built then

         --  It is possible that the finalization of a library-level object
         --  raised an exception. In that case import the actual exception
         --  and the routine necessary to raise it.

         WBI ("      declare");
         WBI ("         procedure Reraise_Library_Exception_If_Any;");

         Set_String ("            pragma Import (Ada, ");
         Set_String ("Reraise_Library_Exception_If_Any, ");
         Set_String ("""__gnat_reraise_library_exception_if_any"");");
         Write_Statement_Buffer;

         WBI ("      begin");
         WBI ("         Reraise_Library_Exception_If_Any;");
         WBI ("      end;");
         WBI ("   end finalize_library;");
         WBI ("");
      end if;
   end Gen_Finalize_Library;

   --------------
   -- Gen_Main --
   --------------

   procedure Gen_Main is
   begin
      if not No_Main_Subprogram then

         --  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 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 ("   function Ada_Main_Program return Integer;");
         else
            WBI ("   procedure Ada_Main_Program;");
         end if;

         Set_String ("   pragma Import (Ada, Ada_Main_Program, """);
         Get_Name_String (Units.Table (First_Unit_Entry).Uname);
         Set_Main_Program_Name;
         Set_String (""");");

         Write_Statement_Buffer;
         WBI ("");

         --  For CodePeer, declare a wrapper for the user-defined main program

         if CodePeer_Mode then
            Gen_CodePeer_Wrapper;
         end if;
      end if;

      if Exit_Status_Supported_On_Target then
         Set_String ("   function ");
      else
         Set_String ("   procedure ");
      end if;

      Set_String (Get_Main_Name);

      if Command_Line_Args_On_Target then
         Write_Statement_Buffer;
         WBI ("     (argc : Integer;");
         WBI ("      argv : System.Address;");
         WBI ("      envp : System.Address)");

         if Exit_Status_Supported_On_Target then
            WBI ("      return Integer");
         end if;

         WBI ("   is");

      else
         if Exit_Status_Supported_On_Target then
            Set_String (" return Integer is");
         else
            Set_String (" is");
         end if;

         Write_Statement_Buffer;
      end if;

      if Opt.Default_Exit_Status /= 0
        and then Bind_Main_Program
        and then not Configurable_Run_Time_Mode
      then
         WBI ("      procedure Set_Exit_Status (Status : Integer);");
         WBI ("      pragma Import (C, Set_Exit_Status, " &
                     """__gnat_set_exit_status"");");
         WBI ("");
      end if;

      --  Initialize and Finalize

      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 ("");
         WBI ("      procedure Finalize;");
         WBI ("      pragma Import (C, Finalize, ""__gnat_finalize"");");
      end if;

      --  If we want to analyze the stack, we must import corresponding symbols

      if Dynamic_Stack_Measurement then
         WBI ("");
         WBI ("      procedure Output_Results;");
         WBI ("      pragma Import (C, Output_Results, " &
              """__gnat_stack_usage_output_results"");");

         WBI ("");
         WBI ("      " &
              "procedure Initialize_Stack_Analysis (Buffer_Size : Natural);");
         WBI ("      pragma Import (C, Initialize_Stack_Analysis, " &
              """__gnat_stack_usage_initialize"");");
      end if;

      --  Deal with declarations for main program case

      if not No_Main_Subprogram then
         if ALIs.Table (ALIs.First).Main_Program = Func then
            WBI ("      Result : Integer;");
            WBI ("");
         end if;

         if Bind_Main_Program
           and not Suppress_Standard_Library_On_Target
           and not CodePeer_Mode
         then
            WBI ("      SEH : aliased array (1 .. 2) of Integer;");
            WBI ("");
         end if;
      end if;

      --  Generate a reference to Ada_Main_Program_Name. This symbol is not
      --  referenced elsewhere in the generated program, but is needed by
      --  the debugger (that's why it is generated in the first place). The
      --  reference stops Ada_Main_Program_Name from being optimized away by
      --  smart linkers, such as the AiX linker.

      --  Because this variable is unused, we make this variable "aliased"
      --  with a pragma Volatile in order to tell the compiler to preserve
      --  this variable at any level of optimization.

      if Bind_Main_Program and not CodePeer_Mode then
         WBI ("      Ensure_Reference : aliased System.Address := " &
              "Ada_Main_Program_Name'Address;");
         WBI ("      pragma Volatile (Ensure_Reference);");
         WBI ("");
      end if;

      WBI ("   begin");

      --  Acquire command line arguments if present on target

      if CodePeer_Mode then
         null;

      elsif Command_Line_Args_On_Target then
         WBI ("      gnat_argc := argc;");
         WBI ("      gnat_argv := argv;");
         WBI ("      gnat_envp := envp;");
         WBI ("");

      --  If configurable run time and no command line args, then nothing needs
      --  to be done since the gnat_argc/argv/envp variables are suppressed in
      --  this case.

      elsif Configurable_Run_Time_On_Target then
         null;

      --  Otherwise set dummy values (to be filled in by some other unit?)

      else
         WBI ("      gnat_argc := 0;");
         WBI ("      gnat_argv := System.Null_Address;");
         WBI ("      gnat_envp := System.Null_Address;");
      end if;

      if Opt.Default_Exit_Status /= 0
        and then Bind_Main_Program
        and then not Configurable_Run_Time_Mode
      then
         Set_String ("      Set_Exit_Status (");
         Set_Int (Opt.Default_Exit_Status);
         Set_String (");");
         Write_Statement_Buffer;
      end if;

      if Dynamic_Stack_Measurement then
         Set_String ("      Initialize_Stack_Analysis (");
         Set_Int (Dynamic_Stack_Measurement_Array_Size);
         Set_String (");");
         Write_Statement_Buffer;
      end if;

      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
         then
            WBI ("      Initialize (SEH'Address);");
         else
            WBI ("      Initialize (System.Null_Address);");
         end if;
      end if;

      WBI ("      " & Ada_Init_Name.all & ";");

      if not No_Main_Subprogram then
         if CodePeer_Mode then
            if ALIs.Table (ALIs.First).Main_Program = Proc then
               WBI ("      " & CodePeer_Wrapper_Name & ";");
            else
               WBI ("      Result := " & CodePeer_Wrapper_Name & ";");
            end if;

         elsif ALIs.Table (ALIs.First).Main_Program = Proc then
            WBI ("      Ada_Main_Program;");

         else
            WBI ("      Result := Ada_Main_Program;");
         end if;
      end if;

      --  Adafinal call is skipped if no finalization

      if not Cumulative_Restrictions.Set (No_Finalization) then
         WBI ("      adafinal;");
      end if;

      --  Prints the result of static stack analysis

      if Dynamic_Stack_Measurement then
         WBI ("      Output_Results;");
      end if;

      --  Finalize is only called if we have a run time

      if not Cumulative_Restrictions.Set (No_Finalization)
        and then not CodePeer_Mode
      then
         WBI ("      Finalize;");
      end if;

      --  Return result

      if Exit_Status_Supported_On_Target then
         if No_Main_Subprogram
           or else ALIs.Table (ALIs.First).Main_Program = Proc
         then
            WBI ("      return (gnat_exit_status);");
         else
            WBI ("      return (Result);");
         end if;
      end if;

      WBI ("   end;");
      WBI ("");
   end Gen_Main;

   ------------------------------
   -- Gen_Object_Files_Options --
   ------------------------------

   procedure Gen_Object_Files_Options (Elab_Order : Unit_Id_Array) is
      Lgnat : Natural;
      --  This keeps track of the position in the sorted set of entries 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

      -------------------------
      -- Write_Linker_Option --
      -------------------------

      procedure Write_Linker_Option is
         Start : Natural;
         Stop  : Natural;

      begin
         --  Loop through string, breaking at null's

         Start := 1;
         while Start < Name_Len loop

            --  Find null ending this section

            Stop := Start + 1;
            while Name_Buffer (Stop) /= ASCII.NUL
              and then Stop <= Name_Len loop
               Stop := Stop + 1;
            end loop;

            --  Process section if non-null

            if Stop > Start then
               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_Str (Name_Buffer (Start .. Stop - 1));
                  Write_Eol;
               end if;
               WBI ("   --   " & Name_Buffer (Start .. Stop - 1));
            end if;

            Start := Stop + 1;
         end loop;
      end Write_Linker_Option;

   --  Start of processing for Gen_Object_Files_Options

   begin
      WBI ("--  BEGIN Object file/option list");

      if Object_List_Filename /= null then
         Set_List_File (Object_List_Filename.all);
      end if;

      for E in Elab_Order'Range loop

         --  If not spec that has an associated body, then generate a comment
         --  giving the name of the corresponding object file.

         if not Units.Table (Elab_Order (E)).SAL_Interface
           and then Units.Table (Elab_Order (E)).Utype /= Is_Spec
         then
            Get_Name_String
              (ALIs.Table
                (Units.Table (Elab_Order (E)).My_ALI).Ofile_Full_Name);

            --  If the presence of an object file is necessary or if it exists,
            --  then use it.

            if not Hostparm.Exclude_Missing_Objects
              or else
                System.OS_Lib.Is_Regular_File (Name_Buffer (1 .. Name_Len))
            then
               WBI ("   --   " & Name_Buffer (1 .. Name_Len));

               if Output_Object_List then
                  Write_Str (Name_Buffer (1 .. Name_Len));
                  Write_Eol;
               end if;
            end if;
         end if;
      end loop;

      if Object_List_Filename /= null then
         Close_List_File;
      end if;

      --  Add a "-Ldir" for each directory in the object path

      for J in 1 .. Nb_Dir_In_Obj_Search_Path loop
         declare
            Dir : constant String_Ptr := Dir_In_Obj_Search_Path (J);

         begin
            Name_Len := 0;
            Add_Str_To_Name_Buffer ("-L");
            Add_Str_To_Name_Buffer (Dir.all);
            Write_Linker_Option;
         end;
      end loop;

      if not (Opt.No_Run_Time_Mode or Opt.No_Stdlib) then
         Name_Len := 0;

         if Opt.Shared_Libgnat then
            Add_Str_To_Name_Buffer ("-shared");
         else
            Add_Str_To_Name_Buffer ("-static");
         end if;

         --  Write directly to avoid inclusion in -K output as -static and
         --  -shared are not usually specified linker options.

         WBI ("   --   " & Name_Buffer (1 .. Name_Len));
      end if;

      --  Sort linker options

      --  This sort accomplishes two important purposes:

      --    a) All application files are sorted to the front, and all GNAT
      --       internal files are sorted to the end. This results in a well
      --       defined dividing line between the two sets of files, for the
      --       purpose of inserting certain standard library references into
      --       the linker arguments list.

      --    b) Given two different units, we sort the linker options so that
      --       those from a unit earlier in the elaboration order comes later
      --       in the list. This is a heuristic designed to create a more
      --       friendly order of linker options when the operations appear in
      --       separate units. The idea is that if unit A must be elaborated
      --       before unit B, then it is more likely that B references
      --       libraries included by A, than vice versa, so we want libraries
      --       included by A to come after libraries included by B.

      --  These two criteria are implemented by function Lt_Linker_Option. Note
      --  that a special case of b) is that specs are elaborated before bodies,
      --  so linker options from specs come after linker options for bodies,
      --  and again, the assumption is that libraries used by the body are more
      --  likely to reference libraries used by the spec, than vice versa.

      Sort
        (Linker_Options.Last,
         Move_Linker_Option'Access,
         Lt_Linker_Option'Access);

      --  Write user linker options, i.e. the set of linker options that come
      --  from all files other than GNAT internal files, Lgnat is left set to
      --  point to the first entry from a GNAT internal file, or past the end
      --  of the entries if there are no internal files.

      Lgnat := Linker_Options.Last + 1;

      for J in 1 .. Linker_Options.Last loop
         if not Linker_Options.Table (J).Internal_File then
            Get_Name_String (Linker_Options.Table (J).Name);
            Write_Linker_Option;
         else
            Lgnat := J;
            exit;
         end if;
      end loop;

      --  Now we insert standard linker options that must appear after the
      --  entries from user files, and before the entries from GNAT run-time
      --  files. The reason for this decision is that libraries referenced
      --  by internal routines may reference these standard library entries.

      --  Note that we do not insert anything when pragma No_Run_Time has
      --  been specified or when the standard libraries are not to be used,
      --  otherwise on some platforms, we may get duplicate symbols when
      --  linking (not clear if this is still the case, but it is harmless).

      if not (Opt.No_Run_Time_Mode or else Opt.No_Stdlib) then
         if With_GNARL then
            Name_Len := 0;

            if Opt.Shared_Libgnat then
               Add_Str_To_Name_Buffer (Shared_Lib ("gnarl"));
            else
               Add_Str_To_Name_Buffer ("-lgnarl");
            end if;

            Write_Linker_Option;
         end if;

         Name_Len := 0;

         if Opt.Shared_Libgnat then
            Add_Str_To_Name_Buffer (Shared_Lib ("gnat"));
         else
            Add_Str_To_Name_Buffer ("-lgnat");
         end if;

         Write_Linker_Option;
      end if;

      --  Write linker options from all internal files

      for J in Lgnat .. Linker_Options.Last loop
         Get_Name_String (Linker_Options.Table (J).Name);
         Write_Linker_Option;
      end loop;

      if Output_Linker_Option_List and then not Zero_Formatting then
         Write_Eol;
      end if;

      WBI ("--  END Object file/option list   ");
   end Gen_Object_Files_Options;

   ---------------------
   -- Gen_Output_File --
   ---------------------

   procedure Gen_Output_File
     (Filename   : String;
      Elab_Order : Unit_Id_Array)
   is
   begin
      --  Acquire settings for Interrupt_State pragmas

      Set_IS_Pragma_Table;

      --  Acquire settings for Priority_Specific_Dispatching pragma

      Set_PSD_Pragma_Table;

      --  Override time slice value if -T switch is set

      if Time_Slice_Set then
         ALIs.Table (ALIs.First).Time_Slice_Value := Opt.Time_Slice_Value;
      end if;

      --  Count number of elaboration calls

      for E in Elab_Order'Range loop
         if Units.Table (Elab_Order (E)).No_Elab then
            null;
         else
            Num_Elab_Calls := Num_Elab_Calls + 1;
         end if;
      end loop;

      --  Count the number of statically allocated stacks to be generated by
      --  the binder. If the user has specified the number of default-sized
      --  secondary stacks, use that number. Otherwise start the count at one
      --  as the binder is responsible for creating a secondary stack for the
      --  main task.

      if Opt.Quantity_Of_Default_Size_Sec_Stacks /= -1 then
         Num_Sec_Stacks := Quantity_Of_Default_Size_Sec_Stacks;
      elsif Sec_Stack_Used then
         Num_Sec_Stacks := 1;
      end if;

      for J in Units.First .. Units.Last loop
         Num_Primary_Stacks :=
           Num_Primary_Stacks + Units.Table (J).Primary_Stack_Count;

         Num_Sec_Stacks :=
           Num_Sec_Stacks + Units.Table (J).Sec_Stack_Count;
      end loop;

      --  Generate output file in appropriate language

      Gen_Output_File_Ada (Filename, Elab_Order);
   end Gen_Output_File;

   -------------------------
   -- Gen_Output_File_Ada --
   -------------------------

   procedure Gen_Output_File_Ada
     (Filename : String; Elab_Order : Unit_Id_Array)
   is
      Ada_Main : constant String := Get_Ada_Main_Name;
      --  Name to be used for generated Ada main program. See the body of
      --  function Get_Ada_Main_Name for details on the form of the name.

      Needs_Library_Finalization : constant Boolean :=
        not Configurable_Run_Time_On_Target
        and then Has_Finalizer (Elab_Order);
      --  For restricted run-time libraries (ZFP and Ravenscar) tasks are
      --  non-terminating, so we do not want finalization.

      Bfiles : Name_Id;
      --  Name of generated bind file (spec)

      Bfileb : Name_Id;
      --  Name of generated bind file (body)

   begin
      --  Create spec first

      Create_Binder_Output (Filename, 's', Bfiles);

      --  We always compile the binder file in Ada 95 mode so that we properly
      --  handle use of Ada 2005 keywords as identifiers in Ada 95 mode. None
      --  of the Ada 2005 or Ada 2012 constructs are needed by the binder file.

      WBI ("pragma Warnings (Off);");
      WBI ("pragma Ada_95;");

      --  If we are operating in Restrictions (No_Exception_Handlers) mode,
      --  then we need to make sure that the binder program is compiled with
      --  the same restriction, so that no exception tables are generated.

      if Cumulative_Restrictions.Set (No_Exception_Handlers) then
         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;");

      --  Generate with of System.Initialize_Scalars if active

      if Initialize_Scalars_Used then
         WBI ("with System.Scalar_Values;");
      end if;

      --  Generate withs of System.Secondary_Stack and System.Parameters to
      --  allow the generation of the default-sized secondary stack pool.

      if Sec_Stack_Used then
         WBI ("with System.Parameters;");
         WBI ("with System.Secondary_Stack;");
      end if;

      Resolve_Binder_Options (Elab_Order);

      --  Generate standard with's

      if not Suppress_Standard_Library_On_Target then
         if CodePeer_Mode then
            WBI ("with System.Standard_Library;");
         end if;
      end if;

      WBI ("package " & Ada_Main & " is");

      --  Main program case

      if Bind_Main_Program then
         --  Generate argc/argv stuff unless suppressed

         if Command_Line_Args_On_Target
           or not Configurable_Run_Time_On_Target
         then
            WBI ("");
            WBI ("   gnat_argc : Integer;");
            WBI ("   gnat_argv : System.Address;");
            WBI ("   gnat_envp : System.Address;");

            --  If the standard library is not suppressed, these variables
            --  are in the run-time data area for easy run time access.

            if not Suppress_Standard_Library_On_Target then
               WBI ("");
               WBI ("   pragma Import (C, gnat_argc);");
               WBI ("   pragma Import (C, gnat_argv);");
               WBI ("   pragma Import (C, gnat_envp);");
            end if;
         end if;

         --  Define exit status. Again in normal mode, this is in the run-time
         --  library, and is initialized there, but in the configurable
         --  run-time case, the variable is declared and initialized in this
         --  file.

         WBI ("");

         if Configurable_Run_Time_Mode then
            if Exit_Status_Supported_On_Target then
               WBI ("   gnat_exit_status : Integer := 0;");
            end if;

         else
            WBI ("   gnat_exit_status : Integer;");
            WBI ("   pragma Import (C, gnat_exit_status);");
         end if;

         --  Generate the GNAT_Version and Ada_Main_Program_Name info only for
         --  the main program. Otherwise, it can lead under some circumstances
         --  to a symbol duplication during the link (for instance when a C
         --  program uses two Ada libraries). Also zero terminate the string
         --  so that its end can be found reliably at run time.

         WBI ("");
         WBI ("   GNAT_Version : constant String :=");
         WBI ("                    """ & Ver_Prefix &
                                   Gnat_Version_String &
                                   """ & ASCII.NUL;");
         WBI ("   pragma Export (C, GNAT_Version, ""__gnat_version"");");

         WBI ("");
         Set_String ("   Ada_Main_Program_Name : constant String := """);
         Get_Name_String (Units.Table (First_Unit_Entry).Uname);

         Set_Main_Program_Name;
         Set_String (""" & ASCII.NUL;");

         Write_Statement_Buffer;

         WBI
           ("   pragma Export (C, Ada_Main_Program_Name, " &
            """__gnat_ada_main_program_name"");");
      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 and pragma Linker_Destructor for the final procedure.

      if Use_Pragma_Linker_Constructor then
         WBI ("   pragma Linker_Constructor (" & Ada_Init_Name.all & ");");
      end if;

      if not Cumulative_Restrictions.Set (No_Finalization) then
         WBI ("");
         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;
      end if;

      if Bind_Main_Program then

         WBI ("");

         if Exit_Status_Supported_On_Target then
            Set_String ("   function ");
         else
            Set_String ("   procedure ");
         end if;

         Set_String (Get_Main_Name);

         --  Generate argument list if present

         if Command_Line_Args_On_Target then
            Write_Statement_Buffer;
            WBI ("     (argc : Integer;");
            WBI ("      argv : System.Address;");
            Set_String
                ("      envp : System.Address)");

            if Exit_Status_Supported_On_Target then
               Write_Statement_Buffer;
               WBI ("      return Integer;");
            else
               Write_Statement_Buffer (";");
            end if;

         else
            if Exit_Status_Supported_On_Target then
               Write_Statement_Buffer (" return Integer;");
            else
               Write_Statement_Buffer (";");
            end if;
         end if;

         WBI ("   pragma Export (C, " & Get_Main_Name & ", """ &
           Get_Main_Name & """);");
      end if;

      --  Generate version numbers for units, only if needed. Be very safe on
      --  the condition.

      if not Configurable_Run_Time_On_Target
        or else System_Version_Control_Used
        or else not Bind_Main_Program
      then
         Gen_Versions;
      end if;

      Gen_Elab_Order (Elab_Order);

      --  Spec is complete

      WBI ("");
      WBI ("end " & Ada_Main & ";");
      Close_Binder_Output;

      --  Prepare to write body

      Create_Binder_Output (Filename, 'b', Bfileb);

      --  We always compile the binder file in Ada 95 mode so that we properly
      --  handle use of Ada 2005 keywords as identifiers in Ada 95 mode. None
      --  of the Ada 2005/2012 constructs are needed by the binder file.

      WBI ("pragma Warnings (Off);");
      WBI ("pragma Ada_95;");

      --  Output Source_File_Name pragmas which look like

      --    pragma Source_File_Name (Ada_Main, Spec_File_Name => "sss");
      --    pragma Source_File_Name (Ada_Main, Body_File_Name => "bbb");

      --  where sss/bbb are the spec/body file names respectively

      Get_Name_String (Bfiles);
      Name_Buffer (Name_Len + 1 .. Name_Len + 3) := """);";

      WBI ("pragma Source_File_Name (" &
           Ada_Main &
           ", Spec_File_Name => """ &
           Name_Buffer (1 .. Name_Len + 3));

      Get_Name_String (Bfileb);
      Name_Buffer (Name_Len + 1 .. Name_Len + 3) := """);";

      WBI ("pragma Source_File_Name (" &
           Ada_Main &
           ", Body_File_Name => """ &
           Name_Buffer (1 .. Name_Len + 3));

      --  Generate pragma Suppress (Overflow_Check). This is needed for recent
      --  versions of the compiler which have overflow checks on by default.
      --  We do not want overflow checking enabled for the increments of the
      --  elaboration variables (since this can cause an unwanted reference to
      --  the last chance exception handler for limited run-times).

      WBI ("pragma Suppress (Overflow_Check);");

      --  Generate with of System.Restrictions to initialize
      --  Run_Time_Restrictions.

      if System_Restrictions_Used
        and not Suppress_Standard_Library_On_Target
      then
         WBI ("");
         WBI ("with System.Restrictions;");
      end if;

      --  Generate with of Ada.Exceptions if needs library finalization

      if Needs_Library_Finalization then
         WBI ("with Ada.Exceptions;");
      end if;

      --  Generate with of System.Elaboration_Allocators if the restriction
      --  No_Standard_Allocators_After_Elaboration was present.

      if Cumulative_Restrictions.Set
           (No_Standard_Allocators_After_Elaboration)
      then
         WBI ("with System.Elaboration_Allocators;");
      end if;

      --  Generate start of package body

      WBI ("");
      WBI ("package body " & Ada_Main & " is");
      WBI ("");

      --  Generate externals for elaboration entities

      Gen_Elab_Externals (Elab_Order);

      --  Generate default-sized secondary stacks pool. At least one stack is
      --  created and assigned to the environment task if secondary stacks are
      --  used by the program.

      if Sec_Stack_Used then
         Set_String ("   Sec_Default_Sized_Stacks");
         Set_String (" : array (1 .. ");
         Set_Int (Num_Sec_Stacks);
         Set_String (") of aliased System.Secondary_Stack.SS_Stack (");

         if Opt.Default_Sec_Stack_Size /= No_Stack_Size then
            Set_Int (Opt.Default_Sec_Stack_Size);
         else
            Set_String ("System.Parameters.Runtime_Default_Sec_Stack_Size");
         end if;

         Set_String (");");
         Write_Statement_Buffer;
         WBI ("");
      end if;

      --  Generate reference

      if not CodePeer_Mode then
         if not Suppress_Standard_Library_On_Target then

            --  Generate Priority_Specific_Dispatching pragma 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;

            Set_String (""";");
            Write_Statement_Buffer;

            --  Generate Interrupt_State pragma 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;

            Set_String (""";");
            Write_Statement_Buffer;
            WBI ("");
         end if;

         if not Suppress_Standard_Library_On_Target then

            --  The B.1(39) implementation advice says that the adainit and
            --  adafinal routines should be idempotent. Generate a flag to
            --  ensure that. This is not needed if we are suppressing the
            --  standard library since it would never be referenced.

            WBI ("   Is_Elaborated : Boolean := False;");

            --  Generate bind environment string

            Gen_Bind_Env_String;
         end if;

         WBI ("");
      end if;

      --  Generate the adafinal routine unless there is no finalization to do

      if not Cumulative_Restrictions.Set (No_Finalization) then
         if Needs_Library_Finalization then
            Gen_Finalize_Library (Elab_Order);
         end if;

         Gen_Adafinal;
      end if;

      Gen_Adainit (Elab_Order);

      if Bind_Main_Program then
         Gen_Main;
      end if;

      --  Output object file list and the Ada body is complete

      Gen_Object_Files_Options (Elab_Order);

      WBI ("");
      WBI ("end " & Ada_Main & ";");

      Close_Binder_Output;
   end Gen_Output_File_Ada;

   ----------------------
   -- Gen_Restrictions --
   ----------------------

   procedure Gen_Restrictions is
      Count : Integer;

   begin
      if Suppress_Standard_Library_On_Target
        or not System_Restrictions_Used
      then
         return;
      end if;

      WBI ("      System.Restrictions.Run_Time_Restrictions :=");
      WBI ("        (Set =>");
      Set_String      ("          (");

      Count := 0;

      for J in Cumulative_Restrictions.Set'Range loop
         Set_Boolean (Cumulative_Restrictions.Set (J));
         Set_String (", ");
         Count := Count + 1;

         if J /= Cumulative_Restrictions.Set'Last and then Count = 8 then
            Write_Statement_Buffer;
            Set_String ("           ");
            Count := 0;
         end if;
      end loop;

      Set_String_Replace ("),");
      Write_Statement_Buffer;
      Set_String ("         Value => (");

      for J in Cumulative_Restrictions.Value'Range loop
         Set_Int (Int (Cumulative_Restrictions.Value (J)));
         Set_String (", ");
      end loop;

      Set_String_Replace ("),");
      Write_Statement_Buffer;
      WBI ("         Violated =>");
      Set_String ("          (");
      Count := 0;

      for J in Cumulative_Restrictions.Violated'Range loop
         Set_Boolean (Cumulative_Restrictions.Violated (J));
         Set_String (", ");
         Count := Count + 1;

         if J /= Cumulative_Restrictions.Set'Last and then Count = 8 then
            Write_Statement_Buffer;
            Set_String ("           ");
            Count := 0;
         end if;
      end loop;

      Set_String_Replace ("),");
      Write_Statement_Buffer;
      Set_String ("         Count => (");

      for J in Cumulative_Restrictions.Count'Range loop
         Set_Int (Int (Cumulative_Restrictions.Count (J)));
         Set_String (", ");
      end loop;

      Set_String_Replace ("),");
      Write_Statement_Buffer;
      Set_String ("         Unknown => (");

      for J in Cumulative_Restrictions.Unknown'Range loop
         Set_Boolean (Cumulative_Restrictions.Unknown (J));
         Set_String (", ");
      end loop;

      Set_String_Replace ("))");
      Set_String (";");
      Write_Statement_Buffer;
   end Gen_Restrictions;

   ------------------
   -- Gen_Versions --
   ------------------

   --  This routine generates lines such as:

   --    unnnnn : constant Integer := 16#hhhhhhhh#;
   --    pragma Export (C, unnnnn, unam);

   --  for each unit, where unam is the unit name suffixed by either B or S for
   --  body or spec, with dots replaced by double underscores, and hhhhhhhh is
   --  the version number, and nnnnn is a 5-digits serial number.

   procedure Gen_Versions is
      Ubuf : String (1 .. 6) := "u00000";

      procedure Increment_Ubuf;
      --  Little procedure to increment the serial number

      --------------------
      -- Increment_Ubuf --
      --------------------

      procedure Increment_Ubuf is
      begin
         for J in reverse Ubuf'Range loop
            Ubuf (J) := Character'Succ (Ubuf (J));
            exit when Ubuf (J) <= '9';
            Ubuf (J) := '0';
         end loop;
      end Increment_Ubuf;

   --  Start of processing for Gen_Versions

   begin
      WBI ("");

      WBI ("   type Version_32 is mod 2 ** 32;");
      for U in Units.First .. Units.Last loop
         if not Units.Table (U).SAL_Interface
           and then (not Bind_For_Library
                      or else Units.Table (U).Directly_Scanned)
         then
            Increment_Ubuf;
            WBI ("   " & Ubuf & " : constant Version_32 := 16#" &
                 Units.Table (U).Version & "#;");
            Set_String ("   pragma Export (C, ");
            Set_String (Ubuf);
            Set_String (", """);

            Get_Name_String (Units.Table (U).Uname);

            for K in 1 .. Name_Len loop
               if Name_Buffer (K) = '.' then
                  Set_Char ('_');
                  Set_Char ('_');

               elsif Name_Buffer (K) = '%' then
                  exit;

               else
                  Set_Char (Name_Buffer (K));
               end if;
            end loop;

            if Name_Buffer (Name_Len) = 's' then
               Set_Char ('S');
            else
               Set_Char ('B');
            end if;

            Set_String (""");");
            Write_Statement_Buffer;
         end if;
      end loop;
   end Gen_Versions;

   ------------------------
   -- Get_Main_Unit_Name --
   ------------------------

   function Get_Main_Unit_Name (S : String) return String is
      Result : String := S;

   begin
      for J in S'Range loop
         if Result (J) = '.' then
            Result (J) := '_';
         end if;
      end loop;

      return Result;
   end Get_Main_Unit_Name;

   -----------------------
   -- Get_Ada_Main_Name --
   -----------------------

   function Get_Ada_Main_Name return String is
      Suffix : constant String := "_00";
      Name   : String (1 .. Opt.Ada_Main_Name.all'Length + Suffix'Length) :=
                 Opt.Ada_Main_Name.all & Suffix;
      Nlen   : Natural;

   begin
      --  For CodePeer, we want reproducible names (independent of other mains
      --  that may or may not be present) that don't collide when analyzing
      --  multiple mains and which are easily recognizable as "ada_main" names.

      if CodePeer_Mode then
         Get_Name_String (Units.Table (First_Unit_Entry).Uname);

         return
           "ada_main_for_" &
             Get_Main_Unit_Name (Name_Buffer (1 .. Name_Len - 2));
      end if;

      --  This loop tries the following possibilities in order
      --    <Ada_Main>
      --    <Ada_Main>_01
      --    <Ada_Main>_02
      --    ..
      --    <Ada_Main>_99
      --  where <Ada_Main> is equal to Opt.Ada_Main_Name. By default,
      --  it is set to 'ada_main'.

      for J in 0 .. 99 loop
         if J = 0 then
            Nlen := Name'Length - Suffix'Length;
         else
            Nlen := Name'Length;
            Name (Name'Last) := Character'Val (J mod 10 + Character'Pos ('0'));
            Name (Name'Last - 1) :=
              Character'Val (J /   10 + Character'Pos ('0'));
         end if;

         for K in ALIs.First .. ALIs.Last loop
            for L in ALIs.Table (K).First_Unit .. ALIs.Table (K).Last_Unit loop

               --  Get unit name, removing %b or %e at end

               Get_Name_String (Units.Table (L).Uname);
               Name_Len := Name_Len - 2;

               if Name_Buffer (1 .. Name_Len) = Name (1 .. Nlen) then
                  goto Continue;
               end if;
            end loop;
         end loop;

         return Name (1 .. Nlen);

      <<Continue>>
         null;
      end loop;

      --  If we fall through, just use a peculiar unlikely name

      return ("Qwertyuiop");
   end Get_Ada_Main_Name;

   -------------------
   -- Get_Main_Name --
   -------------------

   function Get_Main_Name return String is
   begin
      --  Explicit name given with -M switch

      if Bind_Alternate_Main_Name then
         return Alternate_Main_Name.all;

      --  Case of main program name to be used directly

      elsif Use_Ada_Main_Program_Name_On_Target then

         --  Get main program name

         Get_Name_String (Units.Table (First_Unit_Entry).Uname);

         --  If this is a child name, return only the name of the child, since
         --  we can't have dots in a nested program name. Note that we do not
         --  include the %b at the end of the unit name.

         for J in reverse 1 .. Name_Len - 2 loop
            if J = 1 or else Name_Buffer (J - 1) = '.' then
               return Name_Buffer (J .. Name_Len - 2);
            end if;
         end loop;

         raise Program_Error; -- impossible exit

      --  Case where "main" is to be used as default

      else
         return "main";
      end if;
   end Get_Main_Name;

   ---------------------
   -- Get_WC_Encoding --
   ---------------------

   function Get_WC_Encoding return Character is
   begin
      --  If encoding method specified by -W switch, then return it

      if Wide_Character_Encoding_Method_Specified then
         return WC_Encoding_Letters (Wide_Character_Encoding_Method);

      --  If no main program, and not specified, set brackets, we really have
      --  no better choice. If some other encoding is required when there is
      --  no main, it must be set explicitly using -Wx.

      --  Note: if the ALI file always passed the wide character encoding of
      --  every file, then we could use the encoding of the initial specified
      --  file, but this information is passed only for potential main
      --  programs. We could fix this sometime, but it is a very minor point
      --  (wide character default encoding for [Wide_[Wide_]]Text_IO when there
      --  is no main program).

      elsif No_Main_Subprogram then
         return 'b';

      --  Otherwise if there is a main program, take encoding from it

      else
         return ALIs.Table (ALIs.First).WC_Encoding;
      end if;
   end Get_WC_Encoding;

   -------------------
   -- Has_Finalizer --
   -------------------

   function Has_Finalizer (Elab_Order : Unit_Id_Array) return Boolean is
      U     : Unit_Record;
      Unum  : Unit_Id;

   begin
      for E in reverse Elab_Order'Range loop
         Unum := Elab_Order (E);
         U    := Units.Table (Unum);

         --  We are only interested in non-generic packages

         if U.Unit_Kind = 'p'
           and then U.Has_Finalizer
           and then not U.Is_Generic
           and then not U.No_Elab
         then
            return True;
         end if;
      end loop;

      return False;
   end Has_Finalizer;

   ----------
   -- Hash --
   ----------

   function Hash (Nam : Name_Id) return Header_Num is
   begin
      return Int (Nam - Names_Low_Bound) rem Header_Num'Last;
   end Hash;

   ----------------------
   -- Lt_Linker_Option --
   ----------------------

   function Lt_Linker_Option (Op1 : Natural; Op2 : Natural) return Boolean is
   begin
      --  Sort internal files last

      if Linker_Options.Table (Op1).Internal_File
           /=
         Linker_Options.Table (Op2).Internal_File
      then
         --  Note: following test uses False < True

         return Linker_Options.Table (Op1).Internal_File
                  <
                Linker_Options.Table (Op2).Internal_File;

      --  If both internal or both non-internal, sort according to the
      --  elaboration position. A unit that is elaborated later should come
      --  earlier in the linker options list.

      else
         return Units.Table (Linker_Options.Table (Op1).Unit).Elab_Position
                  >
                Units.Table (Linker_Options.Table (Op2).Unit).Elab_Position;
      end if;
   end Lt_Linker_Option;

   ------------------------
   -- Move_Linker_Option --
   ------------------------

   procedure Move_Linker_Option (From : Natural; To : Natural) is
   begin
      Linker_Options.Table (To) := Linker_Options.Table (From);
   end Move_Linker_Option;

   ----------------------------
   -- Resolve_Binder_Options --
   ----------------------------

   procedure Resolve_Binder_Options (Elab_Order : Unit_Id_Array) is
      procedure Check_Package (Var : in out Boolean; Name : String);
      --  Set Var to true iff the current identifier in Namet is Name. Do
      --  nothing if it doesn't match. This procedure is just a helper to
      --  avoid explicitly dealing with length.

      -------------------
      -- Check_Package --
      -------------------

      procedure Check_Package (Var : in out Boolean; Name : String) is
      begin
         if Name_Len = Name'Length
           and then Name_Buffer (1 .. Name_Len) = Name
         then
            Var := True;
         end if;
      end Check_Package;

   --  Start of processing for Resolve_Binder_Options

   begin
      for E in Elab_Order'Range loop
         Get_Name_String (Units.Table (Elab_Order (E)).Uname);

         --  This is not a perfect approach, but is the current protocol
         --  between the run-time and the binder to indicate that tasking is
         --  used: System.OS_Interface should always be used by any tasking
         --  application.

         Check_Package (With_GNARL, "system.os_interface%s");

         --  Ditto for the use of restricted tasking

         Check_Package
           (System_Tasking_Restricted_Stages_Used,
            "system.tasking.restricted.stages%s");

         --  Ditto for the use of interrupts

         Check_Package (System_Interrupts_Used, "system.interrupts%s");

         --  Ditto for the use of dispatching domains

         Check_Package
           (Dispatching_Domains_Used,
            "system.multiprocessors.dispatching_domains%s");

         --  Ditto for the use of restrictions

         Check_Package (System_Restrictions_Used, "system.restrictions%s");

         --  Ditto for the use of System.Secondary_Stack

         Check_Package
           (System_Secondary_Stack_Used, "system.secondary_stack%s");

         --  Ditto for use of an SMP bareboard runtime

         Check_Package (System_BB_CPU_Primitives_Multiprocessors_Used,
                        "system.bb.cpu_primitives.multiprocessors%s");

         --  Ditto for System.Version_Control, which is used for Version and
         --  Body_Version attributes.

         Check_Package (System_Version_Control_Used,
                        "system.version_control%s");
      end loop;
   end Resolve_Binder_Options;

   ------------------
   -- Set_Bind_Env --
   ------------------

   procedure Set_Bind_Env (Key, Value : String) is
   begin
      --  The lengths of Key and Value are stored as single bytes

      if Key'Length > 255 then
         Osint.Fail ("bind environment key """ & Key & """ too long");
      end if;

      if Value'Length > 255 then
         Osint.Fail ("bind environment value """ & Value & """ too long");
      end if;

      Bind_Environment.Set (Name_Find (Key), Name_Find (Value));
   end Set_Bind_Env;

   -----------------
   -- Set_Boolean --
   -----------------

   procedure Set_Boolean (B : Boolean) is
      False_Str : constant String := "False";
      True_Str  : constant String := "True";

   begin
      if B then
         Statement_Buffer (Stm_Last + 1 .. Stm_Last + True_Str'Length) :=
           True_Str;
         Stm_Last := Stm_Last + True_Str'Length;
      else
         Statement_Buffer (Stm_Last + 1 .. Stm_Last + False_Str'Length) :=
           False_Str;
         Stm_Last := Stm_Last + False_Str'Length;
      end if;
   end Set_Boolean;

   --------------
   -- Set_Char --
   --------------

   procedure Set_Char (C : Character) is
   begin
      Stm_Last := Stm_Last + 1;
      Statement_Buffer (Stm_Last) := C;
   end Set_Char;

   -------------
   -- Set_Int --
   -------------

   procedure Set_Int (N : Int) is
   begin
      if N < 0 then
         Set_String ("-");
         Set_Int (-N);

      else
         if N > 9 then
            Set_Int (N / 10);
         end if;

         Stm_Last := Stm_Last + 1;
         Statement_Buffer (Stm_Last) :=
           Character'Val (N mod 10 + Character'Pos ('0'));
      end if;
   end Set_Int;

   -------------------------
   -- Set_IS_Pragma_Table --
   -------------------------

   procedure Set_IS_Pragma_Table is
   begin
      for F in ALIs.First .. ALIs.Last loop
         for K in ALIs.Table (F).First_Interrupt_State ..
                  ALIs.Table (F).Last_Interrupt_State
         loop
            declare
               Inum : constant Int :=
                        Interrupt_States.Table (K).Interrupt_Id;
               Stat : constant Character :=
                        Interrupt_States.Table (K).Interrupt_State;

            begin
               while IS_Pragma_Settings.Last < Inum loop
                  IS_Pragma_Settings.Append ('n');
               end loop;

               IS_Pragma_Settings.Table (Inum) := Stat;
            end;
         end loop;
      end loop;
   end Set_IS_Pragma_Table;

   ---------------------------
   -- Set_Main_Program_Name --
   ---------------------------

   procedure Set_Main_Program_Name is
   begin
      --  Note that name has %b on the end which we ignore

      --  First we output the initial _ada_ since we know that the main program
      --  is a library level subprogram.

      Set_String ("_ada_");

      --  Copy name, changing dots to double underscores

      for J in 1 .. Name_Len - 2 loop
         if Name_Buffer (J) = '.' then
            Set_String ("__");
         else
            Set_Char (Name_Buffer (J));
         end if;
      end loop;
   end Set_Main_Program_Name;

   ---------------------
   -- Set_Name_Buffer --
   ---------------------

   procedure Set_Name_Buffer is
   begin
      for J in 1 .. Name_Len loop
         Set_Char (Name_Buffer (J));
      end loop;
   end Set_Name_Buffer;

   -------------------------
   -- Set_PSD_Pragma_Table --
   -------------------------

   procedure Set_PSD_Pragma_Table is
   begin
      for F in ALIs.First .. ALIs.Last loop
         for K in ALIs.Table (F).First_Specific_Dispatching ..
                  ALIs.Table (F).Last_Specific_Dispatching
         loop
            declare
               DTK : Specific_Dispatching_Record
                       renames Specific_Dispatching.Table (K);

            begin
               while PSD_Pragma_Settings.Last < DTK.Last_Priority loop
                  PSD_Pragma_Settings.Append ('F');
               end loop;

               for Prio in DTK.First_Priority .. DTK.Last_Priority loop
                  PSD_Pragma_Settings.Table (Prio) := DTK.Dispatching_Policy;
               end loop;
            end;
         end loop;
      end loop;
   end Set_PSD_Pragma_Table;

   ----------------
   -- Set_String --
   ----------------

   procedure Set_String (S : String) is
   begin
      Statement_Buffer (Stm_Last + 1 .. Stm_Last + S'Length) := S;
      Stm_Last := Stm_Last + S'Length;
   end Set_String;

   ------------------------
   -- Set_String_Replace --
   ------------------------

   procedure Set_String_Replace (S : String) is
   begin
      Statement_Buffer (Stm_Last - S'Length + 1 .. Stm_Last) := S;
   end Set_String_Replace;

   -------------------
   -- Set_Unit_Name --
   -------------------

   procedure Set_Unit_Name is
   begin
      for J in 1 .. Name_Len - 2 loop
         if Name_Buffer (J) = '.' then
            Set_String ("__");
         else
            Set_Char (Name_Buffer (J));
         end if;
      end loop;
   end Set_Unit_Name;

   ---------------------
   -- Set_Unit_Number --
   ---------------------

   procedure Set_Unit_Number (U : Unit_Id) is
      Num_Units : constant Nat := Nat (Units.Last) - Nat (Unit_Id'First);
      Unum      : constant Nat := Nat (U) - Nat (Unit_Id'First);

   begin
      if Num_Units >= 10 and then Unum < 10 then
         Set_Char ('0');
      end if;

      if Num_Units >= 100 and then Unum < 100 then
         Set_Char ('0');
      end if;

      Set_Int (Unum);
   end Set_Unit_Number;

   ---------------------
   -- Write_Bind_Line --
   ---------------------

   procedure Write_Bind_Line (S : String) is
   begin
      --  Need to strip trailing LF from S

      WBI (S (S'First .. S'Last - 1));
   end Write_Bind_Line;

   ----------------------------
   -- Write_Statement_Buffer --
   ----------------------------

   procedure Write_Statement_Buffer is
   begin
      WBI (Statement_Buffer (1 .. Stm_Last));
      Stm_Last := 0;
   end Write_Statement_Buffer;

   procedure Write_Statement_Buffer (S : String) is
   begin
      Set_String (S);
      Write_Statement_Buffer;
   end Write_Statement_Buffer;

end Bindgen;
