|   | --  The package is called Ada_Main unless this name is actually used
--  as a unit name in the partition, in which case some other unique
--  name is used.
with System;
package ada_main is
   Elab_Final_Code : Integer;
   pragma Import (C, Elab_Final_Code, "__gnat_inside_elab_final_code");
   --  The main program saves the parameters (argument count,
   --  argument values, environment pointer) in global variables
   --  for later access by other units including
   --  Ada.Command_Line.
   gnat_argc : Integer;
   gnat_argv : System.Address;
   gnat_envp : System.Address;
   --  The actual variables are stored in a library routine. This
   --  is useful for some shared library situations, where there
   --  are problems if variables are not in the library.
   pragma Import (C, gnat_argc);
   pragma Import (C, gnat_argv);
   pragma Import (C, gnat_envp);
   --  The exit status is similarly an external location
   gnat_exit_status : Integer;
   pragma Import (C, gnat_exit_status);
   GNAT_Version : constant String :=
                    "GNAT Version: 6.0.0w (20061115)";
   pragma Export (C, GNAT_Version, "__gnat_version");
   --  This is the generated adafinal routine that performs
   --  finalization at the end of execution. In the case where
   --  Ada is the main program, this main program makes a call
   --  to adafinal at program termination.
   procedure adafinal;
   pragma Export (C, adafinal, "adafinal");
   --  This is the generated adainit routine that performs
   --  initialization at the start of execution. In the case
   --  where Ada is the main program, this main program makes
   --  a call to adainit at program startup.
   procedure adainit;
   pragma Export (C, adainit, "adainit");
   --  This routine is called at the start of execution. It is
   --  a dummy routine that is used by the debugger to breakpoint
   --  at the start of execution.
   procedure Break_Start;
   pragma Import (C, Break_Start, "__gnat_break_start");
   --  This is the actual generated main program (it would be
   --  suppressed if the no main program switch were used). As
   --  required by standard system conventions, this program has
   --  the external name main.
   function main
     (argc : Integer;
      argv : System.Address;
      envp : System.Address)
      return Integer;
   pragma Export (C, main, "main");
   --  The following set of constants give the version
   --  identification values for every unit in the bound
   --  partition. This identification is computed from all
   --  dependent semantic units, and corresponds to the
   --  string that would be returned by use of the
   --  Body_Version or Version attributes.
   type Version_32 is mod 2 ** 32;
   u00001 : constant Version_32 := 16#7880BEB3#;
   u00002 : constant Version_32 := 16#0D24CBD0#;
   u00003 : constant Version_32 := 16#3283DBEB#;
   u00004 : constant Version_32 := 16#2359F9ED#;
   u00005 : constant Version_32 := 16#664FB847#;
   u00006 : constant Version_32 := 16#68E803DF#;
   u00007 : constant Version_32 := 16#5572E604#;
   u00008 : constant Version_32 := 16#46B173D8#;
   u00009 : constant Version_32 := 16#156A40CF#;
   u00010 : constant Version_32 := 16#033DABE0#;
   u00011 : constant Version_32 := 16#6AB38FEA#;
   u00012 : constant Version_32 := 16#22B6217D#;
   u00013 : constant Version_32 := 16#68A22947#;
   u00014 : constant Version_32 := 16#18CC4A56#;
   u00015 : constant Version_32 := 16#08258E1B#;
   u00016 : constant Version_32 := 16#367D5222#;
   u00017 : constant Version_32 := 16#20C9ECA4#;
   u00018 : constant Version_32 := 16#50D32CB6#;
   u00019 : constant Version_32 := 16#39A8BB77#;
   u00020 : constant Version_32 := 16#5CF8FA2B#;
   u00021 : constant Version_32 := 16#2F1EB794#;
   u00022 : constant Version_32 := 16#31AB6444#;
   u00023 : constant Version_32 := 16#1574B6E9#;
   u00024 : constant Version_32 := 16#5109C189#;
   u00025 : constant Version_32 := 16#56D770CD#;
   u00026 : constant Version_32 := 16#02F9DE3D#;
   u00027 : constant Version_32 := 16#08AB6B2C#;
   u00028 : constant Version_32 := 16#3FA37670#;
   u00029 : constant Version_32 := 16#476457A0#;
   u00030 : constant Version_32 := 16#731E1B6E#;
   u00031 : constant Version_32 := 16#23C2E789#;
   u00032 : constant Version_32 := 16#0F1BD6A1#;
   u00033 : constant Version_32 := 16#7C25DE96#;
   u00034 : constant Version_32 := 16#39ADFFA2#;
   u00035 : constant Version_32 := 16#571DE3E7#;
   u00036 : constant Version_32 := 16#5EB646AB#;
   u00037 : constant Version_32 := 16#4249379B#;
   u00038 : constant Version_32 := 16#0357E00A#;
   u00039 : constant Version_32 := 16#3784FB72#;
   u00040 : constant Version_32 := 16#2E723019#;
   u00041 : constant Version_32 := 16#623358EA#;
   u00042 : constant Version_32 := 16#107F9465#;
   u00043 : constant Version_32 := 16#6843F68A#;
   u00044 : constant Version_32 := 16#63305874#;
   u00045 : constant Version_32 := 16#31E56CE1#;
   u00046 : constant Version_32 := 16#02917970#;
   u00047 : constant Version_32 := 16#6CCBA70E#;
   u00048 : constant Version_32 := 16#41CD4204#;
   u00049 : constant Version_32 := 16#572E3F58#;
   u00050 : constant Version_32 := 16#20729FF5#;
   u00051 : constant Version_32 := 16#1D4F93E8#;
   u00052 : constant Version_32 := 16#30B2EC3D#;
   u00053 : constant Version_32 := 16#34054F96#;
   u00054 : constant Version_32 := 16#5A199860#;
   u00055 : constant Version_32 := 16#0E7F912B#;
   u00056 : constant Version_32 := 16#5760634A#;
   u00057 : constant Version_32 := 16#5D851835#;
   --  The following Export pragmas export the version numbers
   --  with symbolic names ending in B (for body) or S
   --  (for spec) so that they can be located in a link. The
   --  information provided here is sufficient to track down
   --  the exact versions of units used in a given build.
   pragma Export (C, u00001, "helloB");
   pragma Export (C, u00002, "system__standard_libraryB");
   pragma Export (C, u00003, "system__standard_libraryS");
   pragma Export (C, u00004, "adaS");
   pragma Export (C, u00005, "ada__text_ioB");
   pragma Export (C, u00006, "ada__text_ioS");
   pragma Export (C, u00007, "ada__exceptionsB");
   pragma Export (C, u00008, "ada__exceptionsS");
   pragma Export (C, u00009, "gnatS");
   pragma Export (C, u00010, "gnat__heap_sort_aB");
   pragma Export (C, u00011, "gnat__heap_sort_aS");
   pragma Export (C, u00012, "systemS");
   pragma Export (C, u00013, "system__exception_tableB");
   pragma Export (C, u00014, "system__exception_tableS");
   pragma Export (C, u00015, "gnat__htableB");
   pragma Export (C, u00016, "gnat__htableS");
   pragma Export (C, u00017, "system__exceptionsS");
   pragma Export (C, u00018, "system__machine_state_operationsB");
   pragma Export (C, u00019, "system__machine_state_operationsS");
   pragma Export (C, u00020, "system__machine_codeS");
   pragma Export (C, u00021, "system__storage_elementsB");
   pragma Export (C, u00022, "system__storage_elementsS");
   pragma Export (C, u00023, "system__secondary_stackB");
   pragma Export (C, u00024, "system__secondary_stackS");
   pragma Export (C, u00025, "system__parametersB");
   pragma Export (C, u00026, "system__parametersS");
   pragma Export (C, u00027, "system__soft_linksB");
   pragma Export (C, u00028, "system__soft_linksS");
   pragma Export (C, u00029, "system__stack_checkingB");
   pragma Export (C, u00030, "system__stack_checkingS");
   pragma Export (C, u00031, "system__tracebackB");
   pragma Export (C, u00032, "system__tracebackS");
   pragma Export (C, u00033, "ada__streamsS");
   pragma Export (C, u00034, "ada__tagsB");
   pragma Export (C, u00035, "ada__tagsS");
   pragma Export (C, u00036, "system__string_opsB");
   pragma Export (C, u00037, "system__string_opsS");
   pragma Export (C, u00038, "interfacesS");
   pragma Export (C, u00039, "interfaces__c_streamsB");
   pragma Export (C, u00040, "interfaces__c_streamsS");
   pragma Export (C, u00041, "system__file_ioB");
   pragma Export (C, u00042, "system__file_ioS");
   pragma Export (C, u00043, "ada__finalizationB");
   pragma Export (C, u00044, "ada__finalizationS");
   pragma Export (C, u00045, "system__finalization_rootB");
   pragma Export (C, u00046, "system__finalization_rootS");
   pragma Export (C, u00047, "system__finalization_implementationB");
   pragma Export (C, u00048, "system__finalization_implementationS");
   pragma Export (C, u00049, "system__string_ops_concat_3B");
   pragma Export (C, u00050, "system__string_ops_concat_3S");
   pragma Export (C, u00051, "system__stream_attributesB");
   pragma Export (C, u00052, "system__stream_attributesS");
   pragma Export (C, u00053, "ada__io_exceptionsS");
   pragma Export (C, u00054, "system__unsigned_typesS");
   pragma Export (C, u00055, "system__file_control_blockS");
   pragma Export (C, u00056, "ada__finalization__list_controllerB");
   pragma Export (C, u00057, "ada__finalization__list_controllerS");
   -- BEGIN ELABORATION ORDER
   -- ada (spec)
   -- gnat (spec)
   -- gnat.heap_sort_a (spec)
   -- gnat.heap_sort_a (body)
   -- gnat.htable (spec)
   -- gnat.htable (body)
   -- interfaces (spec)
   -- system (spec)
   -- system.machine_code (spec)
   -- system.parameters (spec)
   -- system.parameters (body)
   -- interfaces.c_streams (spec)
   -- interfaces.c_streams (body)
   -- system.standard_library (spec)
   -- ada.exceptions (spec)
   -- system.exception_table (spec)
   -- system.exception_table (body)
   -- ada.io_exceptions (spec)
   -- system.exceptions (spec)
   -- system.storage_elements (spec)
   -- system.storage_elements (body)
   -- system.machine_state_operations (spec)
   -- system.machine_state_operations (body)
   -- system.secondary_stack (spec)
   -- system.stack_checking (spec)
   -- system.soft_links (spec)
   -- system.soft_links (body)
   -- system.stack_checking (body)
   -- system.secondary_stack (body)
   -- system.standard_library (body)
   -- system.string_ops (spec)
   -- system.string_ops (body)
   -- ada.tags (spec)
   -- ada.tags (body)
   -- ada.streams (spec)
   -- system.finalization_root (spec)
   -- system.finalization_root (body)
   -- system.string_ops_concat_3 (spec)
   -- system.string_ops_concat_3 (body)
   -- system.traceback (spec)
   -- system.traceback (body)
   -- ada.exceptions (body)
   -- system.unsigned_types (spec)
   -- system.stream_attributes (spec)
   -- system.stream_attributes (body)
   -- system.finalization_implementation (spec)
   -- system.finalization_implementation (body)
   -- ada.finalization (spec)
   -- ada.finalization (body)
   -- ada.finalization.list_controller (spec)
   -- ada.finalization.list_controller (body)
   -- system.file_control_block (spec)
   -- system.file_io (spec)
   -- system.file_io (body)
   -- ada.text_io (spec)
   -- ada.text_io (body)
   -- hello (body)
   -- END ELABORATION ORDER
end ada_main;
--  The following source file name pragmas allow the generated file
--  names to be unique for different main programs. They are needed
--  since the package name will always be Ada_Main.
pragma Source_File_Name (ada_main, Spec_File_Name => "b~hello.ads");
pragma Source_File_Name (ada_main, Body_File_Name => "b~hello.adb");
--  Generated package body for Ada_Main starts here
package body ada_main is
   --  The actual finalization is performed by calling the
   --  library routine in System.Standard_Library.Adafinal
   procedure Do_Finalize;
   pragma Import (C, Do_Finalize, "system__standard_library__adafinal");
   -------------
   -- adainit --
   -------------
   procedure adainit is
      --  These booleans are set to True once the associated unit has
      --  been elaborated. It is also used to avoid elaborating the
      --  same unit twice.
      E040 : Boolean;
      pragma Import (Ada, E040, "interfaces__c_streams_E");
      E008 : Boolean;
      pragma Import (Ada, E008, "ada__exceptions_E");
      E014 : Boolean;
      pragma Import (Ada, E014, "system__exception_table_E");
      E053 : Boolean;
      pragma Import (Ada, E053, "ada__io_exceptions_E");
      E017 : Boolean;
      pragma Import (Ada, E017, "system__exceptions_E");
      E024 : Boolean;
      pragma Import (Ada, E024, "system__secondary_stack_E");
      E030 : Boolean;
      pragma Import (Ada, E030, "system__stack_checking_E");
      E028 : Boolean;
      pragma Import (Ada, E028, "system__soft_links_E");
      E035 : Boolean;
      pragma Import (Ada, E035, "ada__tags_E");
      E033 : Boolean;
      pragma Import (Ada, E033, "ada__streams_E");
      E046 : Boolean;
      pragma Import (Ada, E046, "system__finalization_root_E");
      E048 : Boolean;
      pragma Import (Ada, E048, "system__finalization_implementation_E");
      E044 : Boolean;
      pragma Import (Ada, E044, "ada__finalization_E");
      E057 : Boolean;
      pragma Import (Ada, E057, "ada__finalization__list_controller_E");
      E055 : Boolean;
      pragma Import (Ada, E055, "system__file_control_block_E");
      E042 : Boolean;
      pragma Import (Ada, E042, "system__file_io_E");
      E006 : Boolean;
      pragma Import (Ada, E006, "ada__text_io_E");
      --  Set_Globals is a library routine that stores away the
      --  value of the indicated set of global values in global
      --  variables within the library.
      procedure Set_Globals
        (Main_Priority            : Integer;
         Time_Slice_Value         : Integer;
         WC_Encoding              : Character;
         Locking_Policy           : Character;
         Queuing_Policy           : Character;
         Task_Dispatching_Policy  : Character;
         Adafinal                 : System.Address;
         Unreserve_All_Interrupts : Integer;
         Exception_Tracebacks     : Integer);
      pragma Import (C, Set_Globals, "__gnat_set_globals");
      --  SDP_Table_Build is a library routine used to build the
      --  exception tables. See unit Ada.Exceptions in files
      --  a-except.ads/adb for full details of how zero cost
      --  exception handling works. This procedure, the call to
      --  it, and the two following tables are all omitted if the
      --  build is in longjmp/setjmp exception mode.
      procedure SDP_Table_Build
        (SDP_Addresses   : System.Address;
         SDP_Count       : Natural;
         Elab_Addresses  : System.Address;
         Elab_Addr_Count : Natural);
      pragma Import (C, SDP_Table_Build, "__gnat_SDP_Table_Build");
      --  Table of Unit_Exception_Table addresses. Used for zero
      --  cost exception handling to build the top level table.
      ST : aliased constant array (1 .. 23) of System.Address := (
        Hello'UET_Address,
        Ada.Text_Io'UET_Address,
        Ada.Exceptions'UET_Address,
        Gnat.Heap_Sort_A'UET_Address,
        System.Exception_Table'UET_Address,
        System.Machine_State_Operations'UET_Address,
        System.Secondary_Stack'UET_Address,
        System.Parameters'UET_Address,
        System.Soft_Links'UET_Address,
        System.Stack_Checking'UET_Address,
        System.Traceback'UET_Address,
        Ada.Streams'UET_Address,
        Ada.Tags'UET_Address,
        System.String_Ops'UET_Address,
        Interfaces.C_Streams'UET_Address,
        System.File_Io'UET_Address,
        Ada.Finalization'UET_Address,
        System.Finalization_Root'UET_Address,
        System.Finalization_Implementation'UET_Address,
        System.String_Ops_Concat_3'UET_Address,
        System.Stream_Attributes'UET_Address,
        System.File_Control_Block'UET_Address,
        Ada.Finalization.List_Controller'UET_Address);
      --  Table of addresses of elaboration routines. Used for
      --  zero cost exception handling to make sure these
      --  addresses are included in the top level procedure
      --  address table.
      EA : aliased constant array (1 .. 23) of System.Address := (
        adainit'Code_Address,
        Do_Finalize'Code_Address,
        Ada.Exceptions'Elab_Spec'Address,
        System.Exceptions'Elab_Spec'Address,
        Interfaces.C_Streams'Elab_Spec'Address,
        System.Exception_Table'Elab_Body'Address,
        Ada.Io_Exceptions'Elab_Spec'Address,
        System.Stack_Checking'Elab_Spec'Address,
        System.Soft_Links'Elab_Body'Address,
        System.Secondary_Stack'Elab_Body'Address,
        Ada.Tags'Elab_Spec'Address,
        Ada.Tags'Elab_Body'Address,
        Ada.Streams'Elab_Spec'Address,
        System.Finalization_Root'Elab_Spec'Address,
        Ada.Exceptions'Elab_Body'Address,
        System.Finalization_Implementation'Elab_Spec'Address,
        System.Finalization_Implementation'Elab_Body'Address,
        Ada.Finalization'Elab_Spec'Address,
        Ada.Finalization.List_Controller'Elab_Spec'Address,
        System.File_Control_Block'Elab_Spec'Address,
        System.File_Io'Elab_Body'Address,
        Ada.Text_Io'Elab_Spec'Address,
        Ada.Text_Io'Elab_Body'Address);
   --  Start of processing for adainit
   begin
      --  Call SDP_Table_Build to build the top level procedure
      --  table for zero cost exception handling (omitted in
      --  longjmp/setjmp mode).
      SDP_Table_Build (ST'Address, 23, EA'Address, 23);
      --  Call Set_Globals to record various information for
      --  this partition.  The values are derived by the binder
      --  from information stored in the ali files by the compiler.
      Set_Globals
        (Main_Priority            => -1,
         --  Priority of main program, -1 if no pragma Priority used
         Time_Slice_Value         => -1,
         --  Time slice from Time_Slice pragma, -1 if none used
         WC_Encoding              => 'b',
         --  Wide_Character encoding used, default is brackets
         Locking_Policy           => ' ',
         --  Locking_Policy used, default of space means not
         --  specified, otherwise it is the first character of
         --  the policy name.
         Queuing_Policy           => ' ',
         --  Queuing_Policy used, default of space means not
         --  specified, otherwise it is the first character of
         --  the policy name.
         Task_Dispatching_Policy  => ' ',
         --  Task_Dispatching_Policy used, default of space means
         --  not specified, otherwise first character of the
         --  policy name.
         Adafinal                 => System.Null_Address,
         --  Address of Adafinal routine, not used anymore
         Unreserve_All_Interrupts => 0,
         --  Set true if pragma Unreserve_All_Interrupts was used
         Exception_Tracebacks     => 0);
         --  Indicates if exception tracebacks are enabled
      Elab_Final_Code := 1;
      --  Now we have the elaboration calls for all units in the partition.
      --  The Elab_Spec and Elab_Body attributes generate references to the
      --  implicit elaboration procedures generated by the compiler for
      --  each unit that requires elaboration.
      if not E040 then
         Interfaces.C_Streams'Elab_Spec;
      end if;
      E040 := True;
      if not E008 then
         Ada.Exceptions'Elab_Spec;
      end if;
      if not E014 then
         System.Exception_Table'Elab_Body;
         E014 := True;
      end if;
      if not E053 then
         Ada.Io_Exceptions'Elab_Spec;
         E053 := True;
      end if;
      if not E017 then
         System.Exceptions'Elab_Spec;
         E017 := True;
      end if;
      if not E030 then
         System.Stack_Checking'Elab_Spec;
      end if;
      if not E028 then
         System.Soft_Links'Elab_Body;
         E028 := True;
      end if;
      E030 := True;
      if not E024 then
         System.Secondary_Stack'Elab_Body;
         E024 := True;
      end if;
      if not E035 then
         Ada.Tags'Elab_Spec;
      end if;
      if not E035 then
         Ada.Tags'Elab_Body;
         E035 := True;
      end if;
      if not E033 then
         Ada.Streams'Elab_Spec;
         E033 := True;
      end if;
      if not E046 then
         System.Finalization_Root'Elab_Spec;
      end if;
      E046 := True;
      if not E008 then
         Ada.Exceptions'Elab_Body;
         E008 := True;
      end if;
      if not E048 then
         System.Finalization_Implementation'Elab_Spec;
      end if;
      if not E048 then
         System.Finalization_Implementation'Elab_Body;
         E048 := True;
      end if;
      if not E044 then
         Ada.Finalization'Elab_Spec;
      end if;
      E044 := True;
      if not E057 then
         Ada.Finalization.List_Controller'Elab_Spec;
      end if;
      E057 := True;
      if not E055 then
         System.File_Control_Block'Elab_Spec;
         E055 := True;
      end if;
      if not E042 then
         System.File_Io'Elab_Body;
         E042 := True;
      end if;
      if not E006 then
         Ada.Text_Io'Elab_Spec;
      end if;
      if not E006 then
         Ada.Text_Io'Elab_Body;
         E006 := True;
      end if;
      Elab_Final_Code := 0;
   end adainit;
   --------------
   -- adafinal --
   --------------
   procedure adafinal is
   begin
      Do_Finalize;
   end adafinal;
   ----------
   -- main --
   ----------
   --  main is actually a function, as in the ANSI C standard,
   --  defined to return the exit status. The three parameters
   --  are the argument count, argument values and environment
   --  pointer.
   function main
     (argc : Integer;
      argv : System.Address;
      envp : System.Address)
      return Integer
   is
      --  The initialize routine performs low level system
      --  initialization using a standard library routine which
      --  sets up signal handling and performs any other
      --  required setup. The routine can be found in file
      --  a-init.c.
      procedure initialize;
      pragma Import (C, initialize, "__gnat_initialize");
      --  The finalize routine performs low level system
      --  finalization using a standard library routine. The
      --  routine is found in file a-final.c and in the standard
      --  distribution is a dummy routine that does nothing, so
      --  really this is a hook for special user finalization.
      procedure finalize;
      pragma Import (C, finalize, "__gnat_finalize");
      --  We get to the main program of the partition by using
      --  pragma Import because if we try to with the unit and
      --  call it Ada style, then not only do we waste time
      --  recompiling it, but also, we don't really know the right
      --  switches (e.g. identifier character set) to be used
      --  to compile it.
      procedure Ada_Main_Program;
      pragma Import (Ada, Ada_Main_Program, "_ada_hello");
   --  Start of processing for main
   begin
      --  Save global variables
      gnat_argc := argc;
      gnat_argv := argv;
      gnat_envp := envp;
      --  Call low level system initialization
      Initialize;
      --  Call our generated Ada initialization routine
      adainit;
      --  This is the point at which we want the debugger to get
      --  control
      Break_Start;
      --  Now we call the main program of the partition
      Ada_Main_Program;
      --  Perform Ada finalization
      adafinal;
      --  Perform low level system finalization
      Finalize;
      --  Return the proper exit status
      return (gnat_exit_status);
   end;
--  This section is entirely comments, so it has no effect on the
--  compilation of the Ada_Main package. It provides the list of
--  object files and linker options, as well as some standard
--  libraries needed for the link. The gnatlink utility parses
--  this b~hello.adb file to read these comment lines to generate
--  the appropriate command line arguments for the call to the
--  system linker. The BEGIN/END lines are used for sentinels for
--  this parsing operation.
--  The exact file names will of course depend on the environment,
--  host/target and location of files on the host system.
-- BEGIN Object file/option list
   --   ./hello.o
   --   -L./
   --   -L/usr/local/gnat/lib/gcc-lib/i686-pc-linux-gnu/2.8.1/adalib/
   --   /usr/local/gnat/lib/gcc-lib/i686-pc-linux-gnu/2.8.1/adalib/libgnat.a
-- END Object file/option list
end ada_main;
 |