1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 2, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING. If not, write --
19 -- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
20 -- Boston, MA 02110-1301, USA. --
22 -- GNAT was originally developed by the GNAT team at New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc. --
25 ------------------------------------------------------------------------------
28 with Binde
; use Binde
;
29 with Casing
; use Casing
;
30 with Fname
; use Fname
;
31 with GNAT
.OS_Lib
; use GNAT
.OS_Lib
;
32 with Gnatvsn
; use Gnatvsn
;
34 with Namet
; use Namet
;
36 with Osint
; use Osint
;
37 with Osint
.B
; use Osint
.B
;
38 with Output
; use Output
;
39 with Rident
; use Rident
;
40 with Table
; use Table
;
41 with Targparm
; use Targparm
;
42 with Types
; use Types
;
44 with GNAT
.Heap_Sort_A
; use GNAT
.Heap_Sort_A
;
46 package body Bindgen
is
48 Statement_Buffer
: String (1 .. 1000);
49 -- Buffer used for constructing output statements
52 -- Last location in Statement_Buffer currently set
54 With_DECGNAT
: Boolean := False;
55 -- Flag which indicates whether the program uses the DECGNAT library
56 -- (presence of the unit DEC).
58 With_GNARL
: Boolean := False;
59 -- Flag which indicates whether the program uses the GNARL library
60 -- (presence of the unit System.OS_Interface)
62 Num_Elab_Calls
: Nat
:= 0;
63 -- Number of generated calls to elaboration routines
65 ----------------------------------
66 -- Interface_State Pragma Table --
67 ----------------------------------
69 -- This table assembles the interface state pragma information from
70 -- all the units in the partition. Note that Bcheck has already checked
71 -- that the information is consistent across partitions. The entries
72 -- in this table are n/u/r/s for not set/user/runtime/system.
74 package IS_Pragma_Settings
is new Table
.Table
(
75 Table_Component_Type
=> Character,
76 Table_Index_Type
=> Int
,
79 Table_Increment
=> 200,
80 Table_Name
=> "IS_Pragma_Settings");
82 ----------------------
83 -- Run-Time Globals --
84 ----------------------
86 -- This section documents the global variables that are passed to the
87 -- run time from the generated binder file. The call that is made is
88 -- to the routine Set_Globals, which has the following spec:
90 -- procedure Set_Globals
91 -- (Main_Priority : Integer;
92 -- Time_Slice_Value : Integer;
93 -- WC_Encoding : Character;
94 -- Locking_Policy : Character;
95 -- Queuing_Policy : Character;
96 -- Task_Dispatching_Policy : Character;
97 -- Restrictions : System.Address;
98 -- Interrupt_States : System.Address;
99 -- Num_Interrupt_States : Integer;
100 -- Unreserve_All_Interrupts : Integer;
101 -- Exception_Tracebacks : Integer;
102 -- Zero_Cost_Exceptions : Integer;
103 -- Detect_Blocking : Integer);
105 -- Main_Priority is the priority value set by pragma Priority in the
106 -- main program. If no such pragma is present, the value is -1.
108 -- Time_Slice_Value is the time slice value set by pragma Time_Slice
109 -- in the main program, or by the use of a -Tnnn parameter for the
110 -- binder (if both are present, the binder value overrides). The
111 -- value is in milliseconds. A value of zero indicates that time
112 -- slicing should be suppressed. If no pragma is present, and no
113 -- -T switch was used, the value is -1.
115 -- WC_Encoding shows the wide character encoding method used for
116 -- the main program. This is one of the encoding letters defined
117 -- in System.WCh_Con.WC_Encoding_Letters.
119 -- Locking_Policy is a space if no locking policy was specified
120 -- for the partition. If a locking policy was specified, the value
121 -- is the upper case first character of the locking policy name,
122 -- for example, 'C' for Ceiling_Locking.
124 -- Queuing_Policy is a space if no queuing policy was specified
125 -- for the partition. If a queuing policy was specified, the value
126 -- is the upper case first character of the queuing policy name
127 -- for example, 'F' for FIFO_Queuing.
129 -- Task_Dispatching_Policy is a space if no task dispatching policy
130 -- was specified for the partition. If a task dispatching policy
131 -- was specified, the value is the upper case first character of
132 -- the policy name, e.g. 'F' for FIFO_Within_Priorities.
134 -- Restrictions is the address of a null-terminated string specifying the
135 -- restrictions information for the partition. The format is identical to
136 -- that of the parameter string found on R lines in ali files (see Lib.Writ
137 -- spec in lib-writ.ads for full details). The difference is that in this
138 -- context the values are the cumulative ones for the entire partition.
140 -- Interrupt_States is the address of a string used to specify the
141 -- cumulative results of Interrupt_State pragmas used in the partition.
142 -- The length of this string is determined by the last interrupt for which
143 -- such a pragma is given (the string will be a null string if no pragmas
144 -- were used). If pragma were present the entries apply to the interrupts
145 -- in sequence from the first interrupt, and are set to one of four
146 -- possible settings: 'n' for not specified, 'u' for user, 'r' for
147 -- run time, 's' for system, see description of Interrupt_State pragma
148 -- for further details.
150 -- Num_Interrupt_States is the length of the Interrupt_States string.
151 -- It will be set to zero if no Interrupt_State pragmas are present.
153 -- Unreserve_All_Interrupts is set to one if at least one unit in the
154 -- partition had a pragma Unreserve_All_Interrupts, and zero otherwise.
156 -- Exception_Tracebacks is set to one if the -E parameter was present
157 -- in the bind and to zero otherwise. Note that on some targets exception
158 -- tracebacks are provided by default, so a value of zero for this
159 -- parameter does not necessarily mean no trace backs are available.
161 -- Zero_Cost_Exceptions is set to one if zero cost exceptions are used for
162 -- this partition, and to zero if longjmp/setjmp exceptions are used.
165 -- Detect_Blocking indicates whether pragma Detect_Blocking is
166 -- active or not. A value of zero indicates that the pragma is not
167 -- present, while a value of 1 signals its presence in the
170 -----------------------
171 -- Local Subprograms --
172 -----------------------
174 procedure WBI
(Info
: String) renames Osint
.B
.Write_Binder_Info
;
175 -- Convenient shorthand used throughout
177 procedure Gen_Adainit_Ada
;
178 -- Generates the Adainit procedure (Ada code case)
180 procedure Gen_Adainit_C
;
181 -- Generates the Adainit procedure (C code case)
183 procedure Gen_Adafinal_Ada
;
184 -- Generate the Adafinal procedure (Ada code case)
186 procedure Gen_Adafinal_C
;
187 -- Generate the Adafinal procedure (C code case)
189 procedure Gen_Elab_Calls_Ada
;
190 -- Generate sequence of elaboration calls (Ada code case)
192 procedure Gen_Elab_Calls_C
;
193 -- Generate sequence of elaboration calls (C code case)
195 procedure Gen_Elab_Order_Ada
;
196 -- Generate comments showing elaboration order chosen (Ada case)
198 procedure Gen_Elab_Order_C
;
199 -- Generate comments showing elaboration order chosen (C case)
201 procedure Gen_Elab_Defs_C
;
202 -- Generate sequence of definitions for elaboration routines (C code case)
204 procedure Gen_Main_Ada
;
205 -- Generate procedure main (Ada code case)
207 procedure Gen_Main_C
;
208 -- Generate main() procedure (C code case)
210 procedure Gen_Object_Files_Options
;
211 -- Output comments containing a list of the full names of the object
212 -- files to be linked and the list of linker options supplied by
213 -- Linker_Options pragmas in the source. (C and Ada code case)
215 procedure Gen_Output_File_Ada
(Filename
: String);
216 -- Generate output file (Ada code case)
218 procedure Gen_Output_File_C
(Filename
: String);
219 -- Generate output file (C code case)
221 procedure Gen_Restrictions_String_1
;
222 -- Generate first restrictions string, which consists of the parameters
223 -- the first R line, as described in lib-writ.ads, with the restrictions
224 -- being those for the entire partition (from Cumulative_Restrictions).
226 procedure Gen_Restrictions_String_2
;
227 -- Generate first restrictions string, which consists of the parameters
228 -- the second R line, as described in lib-writ.ads, with the restrictions
229 -- being those for the entire partition (from Cumulative_Restrictions).
231 procedure Gen_Versions_Ada
;
232 -- Output series of definitions for unit versions (Ada code case)
234 procedure Gen_Versions_C
;
235 -- Output series of definitions for unit versions (C code case)
237 function Get_Ada_Main_Name
return String;
238 -- This function is used in the Ada main output case to compute a usable
239 -- name for the generated main program. The normal main program name is
240 -- Ada_Main, but this won't work if the user has a unit with this name.
241 -- This function tries Ada_Main first, and if there is such a clash, then
242 -- it tries Ada_Name_01, Ada_Name_02 ... Ada_Name_99 in sequence.
244 function Get_Main_Name
return String;
245 -- This function is used in the Ada main output case to compute the
246 -- correct external main program. It is "main" by default, unless the
247 -- flag Use_Ada_Main_Program_Name_On_Target is set, in which case it
248 -- is the name of the Ada main name without the "_ada". This default
249 -- can be overridden explicitly using the -Mname binder switch.
251 function Lt_Linker_Option
(Op1
, Op2
: Natural) return Boolean;
252 -- Compare linker options, when sorting, first according to
253 -- Is_Internal_File (internal files come later) and then by
254 -- elaboration order position (latest to earliest).
256 procedure Move_Linker_Option
(From
: Natural; To
: Natural);
257 -- Move routine for sorting linker options
259 procedure Public_Version_Warning
;
260 -- Emit a warning concerning the use of the Public version under
261 -- certain circumstances. See details in body.
263 procedure Resolve_Binder_Options
;
264 -- Set the value of With_GNARL and With_DECGNAT. The latter only on VMS
265 -- since it tests for a package named "dec" which might cause a conflict
266 -- on non-VMS systems.
268 procedure Set_Char
(C
: Character);
269 -- Set given character in Statement_Buffer at the Last + 1 position
270 -- and increment Last by one to reflect the stored character.
272 procedure Set_Int
(N
: Int
);
273 -- Set given value in decimal in Statement_Buffer with no spaces
274 -- starting at the Last + 1 position, and updating Last past the value.
275 -- A minus sign is output for a negative value.
277 procedure Set_IS_Pragma_Table
;
278 -- Initializes contents of IS_Pragma_Settings table from ALI table
280 procedure Set_Main_Program_Name
;
281 -- Given the main program name in Name_Buffer (length in Name_Len)
282 -- generate the name of the routine to be used in the call. The name
283 -- is generated starting at Last + 1, and Last is updated past it.
285 procedure Set_Name_Buffer
;
286 -- Set the value stored in positions 1 .. Name_Len of the Name_Buffer
288 procedure Set_String
(S
: String);
289 -- Sets characters of given string in Statement_Buffer, starting at the
290 -- Last + 1 position, and updating last past the string value.
292 procedure Set_Unit_Name
;
293 -- Given a unit name in the Name_Buffer, copies it to Statement_Buffer,
294 -- starting at the Last + 1 position, and updating last past the value.
295 -- changing periods to double underscores, and updating Last appropriately.
297 procedure Set_Unit_Number
(U
: Unit_Id
);
298 -- Sets unit number (first unit is 1, leading zeroes output to line
299 -- up all output unit numbers nicely as required by the value, and
300 -- by the total number of units.
302 procedure Tab_To
(N
: Natural);
303 -- If Last is greater than or equal to N, no effect, otherwise store
304 -- blanks in Statement_Buffer bumping Last, until Last = N.
306 procedure Write_Info_Ada_C
(Ada
: String; C
: String; Common
: String);
307 -- For C code case, write C & Common, for Ada case write Ada & Common
308 -- to current binder output file using Write_Binder_Info.
310 procedure Write_Statement_Buffer
;
311 -- Write out contents of statement buffer up to Last, and reset Last to 0
313 procedure Write_Statement_Buffer
(S
: String);
314 -- First writes its argument (using Set_String (S)), then writes out the
315 -- contents of statement buffer up to Last, and reset Last to 0
317 ----------------------
318 -- Gen_Adafinal_Ada --
319 ----------------------
321 procedure Gen_Adafinal_Ada
is
324 WBI
(" procedure " & Ada_Final_Name
.all & " is");
327 -- If compiling for the JVM, we directly call Adafinal because
328 -- we don't import it via Do_Finalize (see Gen_Output_File_Ada).
330 if Hostparm
.Java_VM
then
331 WBI
(" System.Standard_Library.Adafinal;");
333 -- If there is no finalization, there is nothing to do
335 elsif Cumulative_Restrictions
.Set
(No_Finalization
) then
338 WBI
(" Do_Finalize;");
341 WBI
(" end " & Ada_Final_Name
.all & ";");
342 end Gen_Adafinal_Ada
;
348 procedure Gen_Adafinal_C
is
350 WBI
("void " & Ada_Final_Name
.all & " (void) {");
351 WBI
(" system__standard_library__adafinal ();");
356 ---------------------
357 -- Gen_Adainit_Ada --
358 ---------------------
360 procedure Gen_Adainit_Ada
is
361 Main_Priority
: Int
renames ALIs
.Table
(ALIs
.First
).Main_Priority
;
364 WBI
(" procedure " & Ada_Init_Name
.all & " is");
366 -- Generate externals for elaboration entities
368 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
370 Unum
: constant Unit_Id
:= Elab_Order
.Table
(E
);
371 U
: Unit_Record
renames Units
.Table
(Unum
);
374 -- Check for Elab_Entity to be set for this unit
378 -- Don't generate reference for stand alone library
380 and then not U
.SAL_Interface
382 -- Don't generate reference for predefined file in No_Run_Time
383 -- mode, since we don't include the object files in this case
387 and then Is_Predefined_File_Name
(U
.Sfile
))
391 Set_Unit_Number
(Unum
);
392 Set_String
(" : Boolean; pragma Import (Ada, ");
394 Set_Unit_Number
(Unum
);
396 Get_Name_String
(U
.Uname
);
398 -- In the case of JGNAT we need to emit an Import name
399 -- that includes the class name (using '$' separators
400 -- in the case of a child unit name).
402 if Hostparm
.Java_VM
then
403 for J
in 1 .. Name_Len
- 2 loop
404 if Name_Buffer
(J
) /= '.' then
405 Set_Char
(Name_Buffer
(J
));
413 -- If the unit name is very long, then split the
414 -- Import link name across lines using "&" (occurs
415 -- in some C2 tests).
417 if 2 * Name_Len
+ 60 > Hostparm
.Max_Line_Length
then
419 Write_Statement_Buffer
;
425 Set_String
("_E"");");
426 Write_Statement_Buffer
;
431 Write_Statement_Buffer
;
433 -- If the standard library is suppressed, then the only global variable
434 -- that might be needed (by the Ravenscar profile) is the priority of
435 -- the environment. Also no exception tables are needed.
437 if Suppress_Standard_Library_On_Target
then
438 if Main_Priority
/= No_Main_Priority
then
439 WBI
(" Main_Priority : Integer;");
440 WBI
(" pragma Import (C, Main_Priority," &
441 " ""__gl_main_priority"");");
447 if Main_Priority
/= No_Main_Priority
then
448 Set_String
(" Main_Priority := ");
449 Set_Int
(Main_Priority
);
451 Write_Statement_Buffer
;
457 -- Normal case (standard library not suppressed). Global values are
458 -- assigned using the runtime routine Set_Globals (we have to use
459 -- the routine call, rather than define the globals in the binder
460 -- file to deal with cross-library calls in some systems.
463 -- Generate restrictions string
465 Set_String
(" Restrictions : constant String :=");
466 Write_Statement_Buffer
;
469 Gen_Restrictions_String_1
;
471 Write_Statement_Buffer
;
474 Gen_Restrictions_String_2
;
475 Set_String
(""" & ASCII.Nul;");
476 Write_Statement_Buffer
;
479 -- Generate Interrupt_State pragma string
481 Set_String
(" Interrupt_States : constant String :=");
482 Write_Statement_Buffer
;
491 for J
in 0 .. IS_Pragma_Settings
.Last
loop
494 Write_Statement_Buffer
;
502 Set_Char
(IS_Pragma_Settings
.Table
(J
));
507 Write_Statement_Buffer
;
510 -- Generate spec for Set_Globals procedure
512 WBI
(" procedure Set_Globals");
513 WBI
(" (Main_Priority : Integer;");
514 WBI
(" Time_Slice_Value : Integer;");
515 WBI
(" WC_Encoding : Character;");
516 WBI
(" Locking_Policy : Character;");
517 WBI
(" Queuing_Policy : Character;");
518 WBI
(" Task_Dispatching_Policy : Character;");
520 WBI
(" Restrictions : System.Address;");
521 WBI
(" Interrupt_States : System.Address;");
522 WBI
(" Num_Interrupt_States : Integer;");
523 WBI
(" Unreserve_All_Interrupts : Integer;");
524 WBI
(" Exception_Tracebacks : Integer;");
525 WBI
(" Zero_Cost_Exceptions : Integer;");
526 WBI
(" Detect_Blocking : Integer;");
527 WBI
(" Default_Stack_Size : Integer);");
528 WBI
(" pragma Import (C, Set_Globals, ""__gnat_set_globals"");");
530 -- Import entry point for elaboration time signal handler
531 -- installation, and indication of if it's been called previously.
534 WBI
(" procedure Install_Handler;");
535 WBI
(" pragma Import (C, Install_Handler, " &
536 """__gnat_install_handler"");");
538 WBI
(" Handler_Installed : Integer;");
539 WBI
(" pragma Import (C, Handler_Installed, " &
540 """__gnat_handler_installed"");");
543 -- Generate the call to Set_Globals
545 WBI
(" Set_Globals");
547 Set_String
(" (Main_Priority => ");
548 Set_Int
(Main_Priority
);
550 Write_Statement_Buffer
;
552 Set_String
(" Time_Slice_Value => ");
554 if Task_Dispatching_Policy_Specified
= 'F'
555 and then ALIs
.Table
(ALIs
.First
).Time_Slice_Value
= -1
559 Set_Int
(ALIs
.Table
(ALIs
.First
).Time_Slice_Value
);
563 Write_Statement_Buffer
;
565 Set_String
(" WC_Encoding => '");
566 Set_Char
(ALIs
.Table
(ALIs
.First
).WC_Encoding
);
568 Write_Statement_Buffer
;
570 Set_String
(" Locking_Policy => '");
571 Set_Char
(Locking_Policy_Specified
);
573 Write_Statement_Buffer
;
575 Set_String
(" Queuing_Policy => '");
576 Set_Char
(Queuing_Policy_Specified
);
578 Write_Statement_Buffer
;
580 Set_String
(" Task_Dispatching_Policy => '");
581 Set_Char
(Task_Dispatching_Policy_Specified
);
583 Write_Statement_Buffer
;
585 WBI
(" Restrictions => Restrictions'Address,");
587 WBI
(" Interrupt_States => " &
588 "Interrupt_States'Address,");
590 Set_String
(" Num_Interrupt_States => ");
591 Set_Int
(IS_Pragma_Settings
.Last
+ 1);
593 Write_Statement_Buffer
;
595 Set_String
(" Unreserve_All_Interrupts => ");
597 if Unreserve_All_Interrupts_Specified
then
604 Write_Statement_Buffer
;
606 Set_String
(" Exception_Tracebacks => ");
608 if Exception_Tracebacks
then
615 Write_Statement_Buffer
;
617 Set_String
(" Zero_Cost_Exceptions => ");
619 if Zero_Cost_Exceptions_Specified
then
626 Write_Statement_Buffer
;
628 Set_String
(" Detect_Blocking => ");
630 if Detect_Blocking
then
637 Write_Statement_Buffer
;
639 Set_String
(" Default_Stack_Size => ");
640 Set_Int
(Default_Stack_Size
);
643 Write_Statement_Buffer
;
645 -- Generate call to Install_Handler
648 WBI
(" if Handler_Installed = 0 then");
649 WBI
(" Install_Handler;");
653 -- Generate call to set Initialize_Scalar values if active
655 if Initialize_Scalars_Used
then
657 Set_String
(" System.Scalar_Values.Initialize ('");
658 Set_Char
(Initialize_Scalars_Mode1
);
660 Set_Char
(Initialize_Scalars_Mode2
);
662 Write_Statement_Buffer
;
665 -- Generate assignment of default secondary stack size if set
667 if Sec_Stack_Used
and then Default_Sec_Stack_Size
/= -1 then
669 Set_String
(" System.Secondary_Stack.");
670 Set_String
("Default_Secondary_Stack_Size := ");
671 Set_Int
(Opt
.Default_Sec_Stack_Size
);
673 Write_Statement_Buffer
;
676 -- Generate elaboration calls
681 WBI
(" end " & Ada_Init_Name
.all & ";");
688 procedure Gen_Adainit_C
is
689 Main_Priority
: Int
renames ALIs
.Table
(ALIs
.First
).Main_Priority
;
692 WBI
("void " & Ada_Init_Name
.all & " (void)");
695 -- Generate externals for elaboration entities
697 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
699 Unum
: constant Unit_Id
:= Elab_Order
.Table
(E
);
700 U
: Unit_Record
renames Units
.Table
(Unum
);
703 -- Check for Elab entity to be set for this unit
707 -- Don't generate reference for stand alone library
709 and then not U
.SAL_Interface
711 -- Don't generate reference for predefined file in No_Run_Time
712 -- mode, since we don't include the object files in this case
716 and then Is_Predefined_File_Name
(U
.Sfile
))
718 Set_String
(" extern char ");
719 Get_Name_String
(U
.Uname
);
722 Write_Statement_Buffer
;
727 Write_Statement_Buffer
;
729 -- Standard library suppressed
731 if Suppress_Standard_Library_On_Target
then
733 -- Case of High_Integrity_Mode mode. Set __gl_main_priority if needed
734 -- for the Ravenscar profile.
736 if Main_Priority
/= No_Main_Priority
then
737 Set_String
(" extern int __gl_main_priority = ");
738 Set_Int
(Main_Priority
);
740 Write_Statement_Buffer
;
743 -- Normal case (standard library not suppressed)
746 -- Generate definition for restrictions string
748 Set_String
(" const char *restrictions = """);
749 Gen_Restrictions_String_1
;
750 Gen_Restrictions_String_2
;
752 Write_Statement_Buffer
;
754 -- Generate definition for interrupt states string
756 Set_String
(" const char *interrupt_states = """);
758 for J
in 0 .. IS_Pragma_Settings
.Last
loop
759 Set_Char
(IS_Pragma_Settings
.Table
(J
));
763 Write_Statement_Buffer
;
765 -- Generate declaration for secondary stack default if needed
767 if Sec_Stack_Used
and then Default_Sec_Stack_Size
/= -1 then
768 WBI
(" extern int system__secondary_stack__" &
769 "default_secondary_stack_size;");
774 -- Code for normal case (standard library not suppressed)
776 -- Generate call to set the runtime global variables defined in
777 -- init.c. We define the varables in init.c, rather than in
778 -- the binder generated file itself to avoid undefined externals
779 -- when the runtime is linked as a shareable image library.
781 -- We call the routine from inside adainit() because this works for
782 -- both programs with and without binder generated "main" functions.
784 WBI
(" __gnat_set_globals (");
787 Set_Int
(Main_Priority
);
790 Set_String
("/* Main_Priority */");
791 Write_Statement_Buffer
;
795 if Task_Dispatching_Policy
= 'F'
796 and then ALIs
.Table
(ALIs
.First
).Time_Slice_Value
= -1
800 Set_Int
(ALIs
.Table
(ALIs
.First
).Time_Slice_Value
);
805 Set_String
("/* Time_Slice_Value */");
806 Write_Statement_Buffer
;
809 Set_Char
(ALIs
.Table
(ALIs
.First
).WC_Encoding
);
812 Set_String
("/* WC_Encoding */");
813 Write_Statement_Buffer
;
816 Set_Char
(Locking_Policy_Specified
);
819 Set_String
("/* Locking_Policy */");
820 Write_Statement_Buffer
;
823 Set_Char
(Queuing_Policy_Specified
);
826 Set_String
("/* Queuing_Policy */");
827 Write_Statement_Buffer
;
830 Set_Char
(Task_Dispatching_Policy_Specified
);
833 Set_String
("/* Tasking_Dispatching_Policy */");
834 Write_Statement_Buffer
;
837 Set_String
("restrictions");
840 Set_String
("/* Restrictions */");
841 Write_Statement_Buffer
;
844 Set_String
("interrupt_states");
847 Set_String
("/* Interrupt_States */");
848 Write_Statement_Buffer
;
851 Set_Int
(IS_Pragma_Settings
.Last
+ 1);
854 Set_String
("/* Num_Interrupt_States */");
855 Write_Statement_Buffer
;
858 Set_Int
(Boolean'Pos (Unreserve_All_Interrupts_Specified
));
861 Set_String
("/* Unreserve_All_Interrupts */");
862 Write_Statement_Buffer
;
865 Set_Int
(Boolean'Pos (Exception_Tracebacks
));
868 Set_String
("/* Exception_Tracebacks */");
869 Write_Statement_Buffer
;
872 Set_Int
(Boolean'Pos (Zero_Cost_Exceptions_Specified
));
875 Set_String
("/* Zero_Cost_Exceptions */");
876 Write_Statement_Buffer
;
880 if Detect_Blocking
then
888 Set_String
("/* Detect_Blocking */");
889 Write_Statement_Buffer
;
892 Set_Int
(Default_Stack_Size
);
895 Set_String
("/* Default_Stack_Size */");
896 Write_Statement_Buffer
;
900 -- Install elaboration time signal handler
902 WBI
(" if (__gnat_handler_installed == 0)");
904 WBI
(" __gnat_install_handler ();");
908 -- Generate call to set Initialize_Scalar values if needed
910 if Initialize_Scalars_Used
then
912 Set_String
(" system__scalar_values__initialize('");
913 Set_Char
(Initialize_Scalars_Mode1
);
915 Set_Char
(Initialize_Scalars_Mode2
);
917 Write_Statement_Buffer
;
920 -- Generate assignment of default secondary stack size if set
922 if Sec_Stack_Used
and then Default_Sec_Stack_Size
/= -1 then
924 Set_String
(" system__secondary_stack__");
925 Set_String
("default_secondary_stack_size = ");
926 Set_Int
(Opt
.Default_Sec_Stack_Size
);
928 Write_Statement_Buffer
;
931 -- Generate elaboration calls
938 ------------------------
939 -- Gen_Elab_Calls_Ada --
940 ------------------------
942 procedure Gen_Elab_Calls_Ada
is
944 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
946 Unum
: constant Unit_Id
:= Elab_Order
.Table
(E
);
947 U
: Unit_Record
renames Units
.Table
(Unum
);
950 -- This is the unit number of the spec that corresponds to
951 -- this entry. It is the same as Unum except when the body
952 -- and spec are different and we are currently processing
953 -- the body, in which case it is the spec (Unum + 1).
956 if U
.Utype
= Is_Body
then
957 Unum_Spec
:= Unum
+ 1;
962 -- Nothing to do if predefined unit in no run time mode
964 if No_Run_Time_Mode
and then Is_Predefined_File_Name
(U
.Sfile
) then
967 -- Case of no elaboration code
971 -- The only case in which we have to do something is if
972 -- this is a body, with a separate spec, where the separate
973 -- spec has an elaboration entity defined.
975 -- In that case, this is where we set the elaboration entity
976 -- to True, we do not need to test if this has already been
977 -- done, since it is quicker to set the flag than to test it.
979 if not U
.SAL_Interface
and then U
.Utype
= Is_Body
980 and then Units
.Table
(Unum_Spec
).Set_Elab_Entity
983 Set_Unit_Number
(Unum_Spec
);
984 Set_String
(" := True;");
985 Write_Statement_Buffer
;
988 -- Here if elaboration code is present. If binding a library
989 -- or if there is a non-Ada main subprogram then we generate:
991 -- if not uname_E then
992 -- uname'elab_[spec|body];
996 -- Otherwise, elaboration routines are called unconditionally:
998 -- uname'elab_[spec|body];
1001 -- The uname_E assignment is skipped if this is a separate spec,
1002 -- since the assignment will be done when we process the body.
1004 elsif not U
.SAL_Interface
then
1005 if Force_Checking_Of_Elaboration_Flags
or
1006 Interface_Library_Unit
or
1007 (not Bind_Main_Program
)
1009 Set_String
(" if not E");
1010 Set_Unit_Number
(Unum_Spec
);
1011 Set_String
(" then");
1012 Write_Statement_Buffer
;
1017 Get_Decoded_Name_String_With_Brackets
(U
.Uname
);
1019 if Name_Buffer
(Name_Len
) = 's' then
1020 Name_Buffer
(Name_Len
- 1 .. Name_Len
+ 8) := "'elab_spec";
1022 Name_Buffer
(Name_Len
- 1 .. Name_Len
+ 8) := "'elab_body";
1025 Name_Len
:= Name_Len
+ 8;
1026 Set_Casing
(U
.Icasing
);
1029 Write_Statement_Buffer
;
1031 if U
.Utype
/= Is_Spec
then
1032 if Force_Checking_Of_Elaboration_Flags
or
1033 Interface_Library_Unit
or
1034 (not Bind_Main_Program
)
1040 Set_Unit_Number
(Unum_Spec
);
1041 Set_String
(" := True;");
1042 Write_Statement_Buffer
;
1045 if Force_Checking_Of_Elaboration_Flags
or
1046 Interface_Library_Unit
or
1047 (not Bind_Main_Program
)
1054 end Gen_Elab_Calls_Ada
;
1056 ----------------------
1057 -- Gen_Elab_Calls_C --
1058 ----------------------
1060 procedure Gen_Elab_Calls_C
is
1062 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
1064 Unum
: constant Unit_Id
:= Elab_Order
.Table
(E
);
1065 U
: Unit_Record
renames Units
.Table
(Unum
);
1067 Unum_Spec
: Unit_Id
;
1068 -- This is the unit number of the spec that corresponds to
1069 -- this entry. It is the same as Unum except when the body
1070 -- and spec are different and we are currently processing
1071 -- the body, in which case it is the spec (Unum + 1).
1074 if U
.Utype
= Is_Body
then
1075 Unum_Spec
:= Unum
+ 1;
1080 -- Nothing to do if predefined unit in no run time mode
1082 if No_Run_Time_Mode
and then Is_Predefined_File_Name
(U
.Sfile
) then
1085 -- Case of no elaboration code
1087 elsif U
.No_Elab
then
1089 -- The only case in which we have to do something is if
1090 -- this is a body, with a separate spec, where the separate
1091 -- spec has an elaboration entity defined.
1093 -- In that case, this is where we set the elaboration entity
1094 -- to True, we do not need to test if this has already been
1095 -- done, since it is quicker to set the flag than to test it.
1097 if not U
.SAL_Interface
and then U
.Utype
= Is_Body
1098 and then Units
.Table
(Unum_Spec
).Set_Elab_Entity
1101 Get_Name_String
(U
.Uname
);
1103 Set_String
("_E = 1;");
1104 Write_Statement_Buffer
;
1107 -- Here if elaboration code is present. If binding a library
1108 -- or if there is a non-Ada main subprogram then we generate:
1110 -- if (uname_E == 0) {
1111 -- uname__elab[s|b] ();
1115 -- The uname_E assignment is skipped if this is a separate spec,
1116 -- since the assignment will be done when we process the body.
1118 elsif not U
.SAL_Interface
then
1119 Get_Name_String
(U
.Uname
);
1121 if Force_Checking_Of_Elaboration_Flags
or
1122 Interface_Library_Unit
or
1123 (not Bind_Main_Program
)
1125 Set_String
(" if (");
1127 Set_String
("_E == 0) {");
1128 Write_Statement_Buffer
;
1134 Set_String
("___elab");
1135 Set_Char
(Name_Buffer
(Name_Len
)); -- 's' or 'b' for spec/body
1136 Set_String
(" ();");
1137 Write_Statement_Buffer
;
1139 if U
.Utype
/= Is_Spec
then
1140 if Force_Checking_Of_Elaboration_Flags
or
1141 Interface_Library_Unit
or
1142 (not Bind_Main_Program
)
1149 Set_String
("_E++;");
1150 Write_Statement_Buffer
;
1153 if Force_Checking_Of_Elaboration_Flags
or
1154 Interface_Library_Unit
or
1155 (not Bind_Main_Program
)
1163 end Gen_Elab_Calls_C
;
1165 ----------------------
1166 -- Gen_Elab_Defs_C --
1167 ----------------------
1169 procedure Gen_Elab_Defs_C
is
1171 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
1173 -- Generate declaration of elaboration procedure if elaboration
1174 -- needed. Note that passive units are always excluded.
1176 if not Units
.Table
(Elab_Order
.Table
(E
)).No_Elab
then
1177 Get_Name_String
(Units
.Table
(Elab_Order
.Table
(E
)).Uname
);
1178 Set_String
("extern void ");
1180 Set_String
("___elab");
1181 Set_Char
(Name_Buffer
(Name_Len
)); -- 's' or 'b' for spec/body
1182 Set_String
(" (void);");
1183 Write_Statement_Buffer
;
1189 end Gen_Elab_Defs_C
;
1191 ------------------------
1192 -- Gen_Elab_Order_Ada --
1193 ------------------------
1195 procedure Gen_Elab_Order_Ada
is
1198 WBI
(" -- BEGIN ELABORATION ORDER");
1200 for J
in Elab_Order
.First
.. Elab_Order
.Last
loop
1201 Set_String
(" -- ");
1202 Get_Name_String
(Units
.Table
(Elab_Order
.Table
(J
)).Uname
);
1204 Write_Statement_Buffer
;
1207 WBI
(" -- END ELABORATION ORDER");
1208 end Gen_Elab_Order_Ada
;
1210 ----------------------
1211 -- Gen_Elab_Order_C --
1212 ----------------------
1214 procedure Gen_Elab_Order_C
is
1217 WBI
("/* BEGIN ELABORATION ORDER");
1219 for J
in Elab_Order
.First
.. Elab_Order
.Last
loop
1220 Get_Name_String
(Units
.Table
(Elab_Order
.Table
(J
)).Uname
);
1222 Write_Statement_Buffer
;
1225 WBI
(" END ELABORATION ORDER */");
1226 end Gen_Elab_Order_C
;
1232 procedure Gen_Main_Ada
is
1236 if Exit_Status_Supported_On_Target
then
1237 Set_String
(" function ");
1239 Set_String
(" procedure ");
1242 Set_String
(Get_Main_Name
);
1244 if Command_Line_Args_On_Target
then
1245 Write_Statement_Buffer
;
1246 WBI
(" (argc : Integer;");
1247 WBI
(" argv : System.Address;");
1248 WBI
(" envp : System.Address)");
1250 if Exit_Status_Supported_On_Target
then
1251 WBI
(" return Integer");
1257 if Exit_Status_Supported_On_Target
then
1258 Set_String
(" return Integer is");
1263 Write_Statement_Buffer
;
1266 if Opt
.Default_Exit_Status
/= 0
1267 and then Bind_Main_Program
1268 and then not Configurable_Run_Time_Mode
1270 WBI
(" procedure Set_Exit_Status (Status : Integer);");
1271 WBI
(" pragma Import (C, Set_Exit_Status, " &
1272 """__gnat_set_exit_status"");");
1276 -- Initialize and Finalize
1278 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
1279 WBI
(" procedure initialize (Addr : System.Address);");
1280 WBI
(" pragma Import (C, initialize, ""__gnat_initialize"");");
1282 WBI
(" procedure finalize;");
1283 WBI
(" pragma Import (C, finalize, ""__gnat_finalize"");");
1286 -- If we want to analyze the stack, we have to import corresponding
1289 if Dynamic_Stack_Measurement
then
1291 WBI
(" procedure Output_Results;");
1292 WBI
(" pragma Import (C, Output_Results, " &
1293 """__gnat_stack_usage_output_results"");");
1297 "procedure Initialize_Stack_Analysis (Buffer_Size : Natural);");
1298 WBI
(" pragma Import (C, Initialize_Stack_Analysis, " &
1299 """__gnat_stack_usage_initialize"");");
1302 -- Deal with declarations for main program case
1304 if not No_Main_Subprogram
then
1306 -- To call the main program, we declare it using a pragma Import
1307 -- Ada with the right link name.
1309 -- It might seem more obvious to "with" the main program, and call
1310 -- it in the normal Ada manner. We do not do this for three reasons:
1312 -- 1. It is more efficient not to recompile the main program
1313 -- 2. We are not entitled to assume the source is accessible
1314 -- 3. We don't know what options to use to compile it
1316 -- It is really reason 3 that is most critical (indeed we used
1317 -- to generate the "with", but several regression tests failed).
1321 if ALIs
.Table
(ALIs
.First
).Main_Program
= Func
then
1322 WBI
(" Result : Integer;");
1324 WBI
(" function Ada_Main_Program return Integer;");
1327 WBI
(" procedure Ada_Main_Program;");
1330 Set_String
(" pragma Import (Ada, Ada_Main_Program, """);
1331 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
1332 Set_Main_Program_Name
;
1333 Set_String
(""");");
1335 Write_Statement_Buffer
;
1338 if Bind_Main_Program
1339 and then not Suppress_Standard_Library_On_Target
1341 WBI
(" SEH : aliased array (1 .. 2) of Integer;");
1346 -- Generate a reference to Ada_Main_Program_Name. This symbol is
1347 -- not referenced elsewhere in the generated program, but is needed
1348 -- by the debugger (that's why it is generated in the first place).
1349 -- The reference stops Ada_Main_Program_Name from being optimized
1350 -- away by smart linkers, such as the AiX linker.
1352 -- Because this variable is unused, we make this variable "aliased"
1353 -- with a pragma Volatile in order to tell the compiler to preserve
1354 -- this variable at any level of optimization.
1356 if Bind_Main_Program
then
1358 (" Ensure_Reference : aliased System.Address := " &
1359 "Ada_Main_Program_Name'Address;");
1360 WBI
(" pragma Volatile (Ensure_Reference);");
1366 -- Acquire command line arguments if present on target
1368 if Command_Line_Args_On_Target
then
1369 WBI
(" gnat_argc := argc;");
1370 WBI
(" gnat_argv := argv;");
1371 WBI
(" gnat_envp := envp;");
1374 -- If configurable run time and no command line args, then nothing
1375 -- needs to be done since the gnat_argc/argv/envp variables are
1376 -- suppressed in this case.
1378 elsif Configurable_Run_Time_On_Target
then
1381 -- Otherwise set dummy values (to be filled in by some other unit?)
1384 WBI
(" gnat_argc := 0;");
1385 WBI
(" gnat_argv := System.Null_Address;");
1386 WBI
(" gnat_envp := System.Null_Address;");
1389 if Opt
.Default_Exit_Status
/= 0
1390 and then Bind_Main_Program
1391 and then not Configurable_Run_Time_Mode
1393 Set_String
(" Set_Exit_Status (");
1394 Set_Int
(Opt
.Default_Exit_Status
);
1396 Write_Statement_Buffer
;
1399 if Dynamic_Stack_Measurement
then
1400 Set_String
(" Initialize_Stack_Analysis (");
1401 Set_Int
(Dynamic_Stack_Measurement_Array_Size
);
1403 Write_Statement_Buffer
;
1406 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
1408 if not No_Main_Subprogram
1409 and then Bind_Main_Program
1410 and then not Suppress_Standard_Library_On_Target
1412 WBI
(" Initialize (SEH'Address);");
1414 WBI
(" Initialize (System.Null_Address);");
1418 WBI
(" " & Ada_Init_Name
.all & ";");
1420 if not No_Main_Subprogram
then
1421 WBI
(" Break_Start;");
1423 if ALIs
.Table
(ALIs
.First
).Main_Program
= Proc
then
1424 WBI
(" Ada_Main_Program;");
1426 WBI
(" Result := Ada_Main_Program;");
1430 -- Adafinal call is skipped if no finalization
1432 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
1434 -- If compiling for the JVM, we directly call Adafinal because
1435 -- we don't import it via Do_Finalize (see Gen_Output_File_Ada).
1437 if Hostparm
.Java_VM
then
1438 WBI
(" System.Standard_Library.Adafinal;");
1440 WBI
(" Do_Finalize;");
1444 -- Prints the result of static stack analysis
1446 if Dynamic_Stack_Measurement
then
1447 WBI
(" Output_Results;");
1450 -- Finalize is only called if we have a run time
1452 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
1458 if Exit_Status_Supported_On_Target
then
1459 if No_Main_Subprogram
1460 or else ALIs
.Table
(ALIs
.First
).Main_Program
= Proc
1462 WBI
(" return (gnat_exit_status);");
1464 WBI
(" return (Result);");
1475 procedure Gen_Main_C
is
1477 if Exit_Status_Supported_On_Target
then
1478 WBI
("#include <stdlib.h>");
1479 Set_String
("int ");
1481 Set_String
("void ");
1484 Set_String
(Get_Main_Name
);
1486 -- Generate command line args in prototype if present on target
1488 if Command_Line_Args_On_Target
then
1489 Write_Statement_Buffer
(" (int argc, char **argv, char **envp)");
1491 -- Case of no command line arguments on target
1494 Write_Statement_Buffer
(" (void)");
1499 -- Generate a reference to __gnat_ada_main_program_name. This symbol
1500 -- is not referenced elsewhere in the generated program, but is
1501 -- needed by the debugger (that's why it is generated in the first
1502 -- place). The reference stops Ada_Main_Program_Name from being
1503 -- optimized away by smart linkers, such as the AiX linker.
1505 -- Because this variable is unused, we declare this variable as
1506 -- volatile in order to tell the compiler to preserve it at any
1507 -- level of optimization.
1509 if Bind_Main_Program
then
1510 WBI
(" char * volatile ensure_reference " &
1511 "__attribute__ ((__unused__)) = " &
1512 "__gnat_ada_main_program_name;");
1515 if not Suppress_Standard_Library_On_Target
1516 and then not No_Main_Subprogram
1518 WBI
(" int SEH [2];");
1523 -- If main program is a function, generate result variable
1525 if ALIs
.Table
(ALIs
.First
).Main_Program
= Func
then
1526 WBI
(" int result;");
1529 -- Set command line argument values from parameters if command line
1530 -- arguments are present on target
1532 if Command_Line_Args_On_Target
then
1533 WBI
(" gnat_argc = argc;");
1534 WBI
(" gnat_argv = argv;");
1535 WBI
(" gnat_envp = envp;");
1538 -- If configurable run-time, then nothing to do, since in this case
1539 -- the gnat_argc/argv/envp variables are entirely suppressed.
1541 elsif Configurable_Run_Time_On_Target
then
1544 -- if no command line arguments on target, set dummy values
1547 WBI
(" int result;");
1548 WBI
(" gnat_argc = 0;");
1549 WBI
(" gnat_argv = 0;");
1550 WBI
(" gnat_envp = 0;");
1553 if Opt
.Default_Exit_Status
/= 0
1554 and then Bind_Main_Program
1555 and then not Configurable_Run_Time_Mode
1557 Set_String
(" __gnat_set_exit_status (");
1558 Set_Int
(Opt
.Default_Exit_Status
);
1560 Write_Statement_Buffer
;
1563 -- Initializes dynamic stack measurement if needed
1565 if Dynamic_Stack_Measurement
then
1566 Set_String
(" __gnat_stack_usage_initialize (");
1567 Set_Int
(Dynamic_Stack_Measurement_Array_Size
);
1569 Write_Statement_Buffer
;
1572 -- The __gnat_initialize routine is used only if we have a run-time
1574 if not Suppress_Standard_Library_On_Target
then
1575 if not No_Main_Subprogram
and then Bind_Main_Program
then
1576 WBI
(" __gnat_initialize ((void *)SEH);");
1578 WBI
(" __gnat_initialize ((void *)0);");
1582 WBI
(" " & Ada_Init_Name
.all & " ();");
1584 if not No_Main_Subprogram
then
1585 WBI
(" __gnat_break_start ();");
1588 -- Output main program name
1590 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
1592 -- Main program is procedure case
1594 if ALIs
.Table
(ALIs
.First
).Main_Program
= Proc
then
1596 Set_Main_Program_Name
;
1597 Set_String
(" ();");
1598 Write_Statement_Buffer
;
1600 -- Main program is function case
1602 else -- ALIs.Table (ALIs_First).Main_Program = Func
1603 Set_String
(" result = ");
1604 Set_Main_Program_Name
;
1605 Set_String
(" ();");
1606 Write_Statement_Buffer
;
1611 -- Call adafinal if finalization active
1613 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
1615 WBI
(" system__standard_library__adafinal ();");
1618 -- Outputs the dynamic stack measurement if needed
1620 if Dynamic_Stack_Measurement
then
1621 WBI
(" __gnat_stack_usage_output_results ();");
1624 -- The finalize routine is used only if we have a run-time
1626 if not Suppress_Standard_Library_On_Target
then
1627 WBI
(" __gnat_finalize ();");
1630 -- Case of main program is a function, so the value it returns
1631 -- is the exit status in this case.
1633 if ALIs
.Table
(ALIs
.First
).Main_Program
= Func
then
1634 if Exit_Status_Supported_On_Target
then
1636 -- VMS must use Posix exit routine in order to get the effect
1637 -- of a Unix compatible setting of the program exit status.
1638 -- For all other systems, we use the standard exit routine.
1640 if OpenVMS_On_Target
then
1641 WBI
(" decc$__posix_exit (result);");
1643 WBI
(" exit (result);");
1647 -- Case of main program is a procedure, in which case the exit
1648 -- status is whatever was set by a Set_Exit call most recently
1651 if Exit_Status_Supported_On_Target
then
1653 -- VMS must use Posix exit routine in order to get the effect
1654 -- of a Unix compatible setting of the program exit status.
1655 -- For all other systems, we use the standard exit routine.
1657 if OpenVMS_On_Target
then
1658 WBI
(" decc$__posix_exit (gnat_exit_status);");
1660 WBI
(" exit (gnat_exit_status);");
1668 ------------------------------
1669 -- Gen_Object_Files_Options --
1670 ------------------------------
1672 procedure Gen_Object_Files_Options
is
1674 -- This keeps track of the position in the sorted set of entries
1675 -- in the Linker_Options table of where the first entry from an
1676 -- internal file appears.
1678 procedure Write_Linker_Option
;
1679 -- Write binder info linker option
1681 -------------------------
1682 -- Write_Linker_Option --
1683 -------------------------
1685 procedure Write_Linker_Option
is
1690 -- Loop through string, breaking at null's
1693 while Start
< Name_Len
loop
1695 -- Find null ending this section
1698 while Name_Buffer
(Stop
) /= ASCII
.NUL
1699 and then Stop
<= Name_Len
loop
1703 -- Process section if non-null
1705 if Stop
> Start
then
1706 if Output_Linker_Option_List
then
1707 Write_Str
(Name_Buffer
(Start
.. Stop
- 1));
1711 (" -- ", "", Name_Buffer
(Start
.. Stop
- 1));
1716 end Write_Linker_Option
;
1718 -- Start of processing for Gen_Object_Files_Options
1722 Write_Info_Ada_C
("-- ", "/* ", " BEGIN Object file/option list");
1724 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
1726 -- If not spec that has an associated body, then generate a
1727 -- comment giving the name of the corresponding object file.
1729 if (not Units
.Table
(Elab_Order
.Table
(E
)).SAL_Interface
)
1730 and then Units
.Table
(Elab_Order
.Table
(E
)).Utype
/= Is_Spec
1734 (Units
.Table
(Elab_Order
.Table
(E
)).My_ALI
).Ofile_Full_Name
);
1736 -- If the presence of an object file is necessary or if it
1737 -- exists, then use it.
1739 if not Hostparm
.Exclude_Missing_Objects
1740 or else GNAT
.OS_Lib
.Is_Regular_File
(Name_Buffer
(1 .. Name_Len
))
1742 Write_Info_Ada_C
(" -- ", "", Name_Buffer
(1 .. Name_Len
));
1744 if Output_Object_List
then
1745 Write_Str
(Name_Buffer
(1 .. Name_Len
));
1749 -- Don't link with the shared library on VMS if an internal
1750 -- filename object is seen. Multiply defined symbols will
1753 if OpenVMS_On_Target
1754 and then Is_Internal_File_Name
1756 (Units
.Table
(Elab_Order
.Table
(E
)).My_ALI
).Sfile
)
1758 -- Special case for g-trasym.obj, which is not included
1761 Get_Name_String
(ALIs
.Table
1762 (Units
.Table
(Elab_Order
.Table
(E
)).My_ALI
).Sfile
);
1764 if Name_Buffer
(1 .. 8) /= "g-trasym" then
1765 Opt
.Shared_Libgnat
:= False;
1772 -- Add a "-Ldir" for each directory in the object path
1774 for J
in 1 .. Nb_Dir_In_Obj_Search_Path
loop
1776 Dir
: constant String_Ptr
:= Dir_In_Obj_Search_Path
(J
);
1779 Add_Str_To_Name_Buffer
("-L");
1780 Add_Str_To_Name_Buffer
(Dir
.all);
1781 Write_Linker_Option
;
1785 -- Sort linker options
1787 -- This sort accomplishes two important purposes:
1789 -- a) All application files are sorted to the front, and all
1790 -- GNAT internal files are sorted to the end. This results
1791 -- in a well defined dividing line between the two sets of
1792 -- files, for the purpose of inserting certain standard
1793 -- library references into the linker arguments list.
1795 -- b) Given two different units, we sort the linker options so
1796 -- that those from a unit earlier in the elaboration order
1797 -- comes later in the list. This is a heuristic designed
1798 -- to create a more friendly order of linker options when
1799 -- the operations appear in separate units. The idea is that
1800 -- if unit A must be elaborated before unit B, then it is
1801 -- more likely that B references libraries included by A,
1802 -- than vice versa, so we want the libraries included by
1803 -- A to come after the libraries included by B.
1805 -- These two criteria are implemented by function Lt_Linker_Option.
1806 -- Note that a special case of b) is that specs are elaborated before
1807 -- bodies, so linker options from specs come after linker options
1808 -- for bodies, and again, the assumption is that libraries used by
1809 -- the body are more likely to reference libraries used by the spec,
1813 (Linker_Options
.Last
,
1814 Move_Linker_Option
'Access,
1815 Lt_Linker_Option
'Access);
1817 -- Write user linker options, i.e. the set of linker options that
1818 -- come from all files other than GNAT internal files, Lgnat is
1819 -- left set to point to the first entry from a GNAT internal file,
1820 -- or past the end of the entriers if there are no internal files.
1822 Lgnat
:= Linker_Options
.Last
+ 1;
1824 for J
in 1 .. Linker_Options
.Last
loop
1825 if not Linker_Options
.Table
(J
).Internal_File
then
1826 Get_Name_String
(Linker_Options
.Table
(J
).Name
);
1827 Write_Linker_Option
;
1834 -- Now we insert standard linker options that must appear after the
1835 -- entries from user files, and before the entries from GNAT run-time
1836 -- files. The reason for this decision is that libraries referenced
1837 -- by internal routines may reference these standard library entries.
1839 if not Opt
.No_Stdlib
then
1842 if Opt
.Shared_Libgnat
then
1843 Add_Str_To_Name_Buffer
("-shared");
1845 Add_Str_To_Name_Buffer
("-static");
1848 -- Write directly to avoid -K output (why???)
1850 Write_Info_Ada_C
(" -- ", "", Name_Buffer
(1 .. Name_Len
));
1852 if With_DECGNAT
then
1855 if Opt
.Shared_Libgnat
then
1856 Add_Str_To_Name_Buffer
(Shared_Lib
("decgnat"));
1858 Add_Str_To_Name_Buffer
("-ldecgnat");
1861 Write_Linker_Option
;
1867 if Opt
.Shared_Libgnat
then
1868 Add_Str_To_Name_Buffer
(Shared_Lib
("gnarl"));
1870 Add_Str_To_Name_Buffer
("-lgnarl");
1873 Write_Linker_Option
;
1878 if Opt
.Shared_Libgnat
then
1879 Add_Str_To_Name_Buffer
(Shared_Lib
("gnat"));
1881 Add_Str_To_Name_Buffer
("-lgnat");
1884 Write_Linker_Option
;
1887 -- Write linker options from all internal files
1889 for J
in Lgnat
.. Linker_Options
.Last
loop
1890 Get_Name_String
(Linker_Options
.Table
(J
).Name
);
1891 Write_Linker_Option
;
1894 if Ada_Bind_File
then
1895 WBI
("-- END Object file/option list ");
1897 WBI
(" END Object file/option list */");
1899 end Gen_Object_Files_Options
;
1901 ---------------------
1902 -- Gen_Output_File --
1903 ---------------------
1905 procedure Gen_Output_File
(Filename
: String) is
1906 Is_Public_Version
: constant Boolean := Get_Gnat_Build_Type
= Public
;
1907 Is_GAP_Version
: constant Boolean := Get_Gnat_Build_Type
= GAP
;
1910 -- Acquire settings for Interrupt_State pragmas
1912 Set_IS_Pragma_Table
;
1914 -- Override Ada_Bind_File and Bind_Main_Program for Java since
1915 -- JGNAT only supports Ada code, and the main program is already
1916 -- generated by the compiler.
1918 if Hostparm
.Java_VM
then
1919 Ada_Bind_File
:= True;
1920 Bind_Main_Program
:= False;
1923 -- Override time slice value if -T switch is set
1925 if Time_Slice_Set
then
1926 ALIs
.Table
(ALIs
.First
).Time_Slice_Value
:= Opt
.Time_Slice_Value
;
1929 -- Count number of elaboration calls
1931 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
1932 if Units
.Table
(Elab_Order
.Table
(E
)).No_Elab
then
1935 Num_Elab_Calls
:= Num_Elab_Calls
+ 1;
1939 -- Get the time stamp of the former bind for public version warning
1941 if Is_Public_Version
or Is_GAP_Version
then
1942 Record_Time_From_Last_Bind
;
1945 -- Generate output file in appropriate language
1947 if Ada_Bind_File
then
1948 Gen_Output_File_Ada
(Filename
);
1950 Gen_Output_File_C
(Filename
);
1953 -- Periodically issue a warning when the public version is used on
1956 if Is_Public_Version
then
1957 Public_Version_Warning
;
1959 end Gen_Output_File
;
1961 -------------------------
1962 -- Gen_Output_File_Ada --
1963 -------------------------
1965 procedure Gen_Output_File_Ada
(Filename
: String) is
1968 -- Name of generated bind file (spec)
1971 -- Name of generated bind file (body)
1973 Ada_Main
: constant String := Get_Ada_Main_Name
;
1974 -- Name to be used for generated Ada main program. See the body of
1975 -- function Get_Ada_Main_Name for details on the form of the name.
1978 -- Create spec first
1980 Create_Binder_Output
(Filename
, 's', Bfiles
);
1982 -- If we are operating in Restrictions (No_Exception_Handlers) mode,
1983 -- then we need to make sure that the binder program is compiled with
1984 -- the same restriction, so that no exception tables are generated.
1986 if Cumulative_Restrictions
.Set
(No_Exception_Handlers
) then
1987 WBI
("pragma Restrictions (No_Exception_Handlers);");
1990 -- Generate with of System so we can reference System.Address
1992 WBI
("with System;");
1994 -- Generate with of System.Initialize_Scalars if active
1996 if Initialize_Scalars_Used
then
1997 WBI
("with System.Scalar_Values;");
2000 -- Generate with of System.Secondary_Stack if active
2002 if Sec_Stack_Used
and then Default_Sec_Stack_Size
/= -1 then
2003 WBI
("with System.Secondary_Stack;");
2006 Resolve_Binder_Options
;
2008 if not Suppress_Standard_Library_On_Target
then
2010 -- Usually, adafinal is called using a pragma Import C. Since
2011 -- Import C doesn't have the same semantics for JGNAT, we use
2014 if Hostparm
.Java_VM
then
2015 WBI
("with System.Standard_Library;");
2019 WBI
("package " & Ada_Main
& " is");
2020 WBI
(" pragma Warnings (Off);");
2022 -- Main program case
2024 if Bind_Main_Program
then
2026 -- Generate argc/argv stuff unless suppressed
2028 if Command_Line_Args_On_Target
2029 or not Configurable_Run_Time_On_Target
2032 WBI
(" gnat_argc : Integer;");
2033 WBI
(" gnat_argv : System.Address;");
2034 WBI
(" gnat_envp : System.Address;");
2036 -- If the standard library is not suppressed, these variables are
2037 -- in the runtime data area for easy access from the runtime
2039 if not Suppress_Standard_Library_On_Target
then
2041 WBI
(" pragma Import (C, gnat_argc);");
2042 WBI
(" pragma Import (C, gnat_argv);");
2043 WBI
(" pragma Import (C, gnat_envp);");
2047 -- Define exit status. Again in normal mode, this is in the
2048 -- run-time library, and is initialized there, but in the
2049 -- configurable runtime case, the variable is declared and
2050 -- initialized in this file.
2054 if Configurable_Run_Time_Mode
then
2055 if Exit_Status_Supported_On_Target
then
2056 WBI
(" gnat_exit_status : Integer := 0;");
2059 WBI
(" gnat_exit_status : Integer;");
2060 WBI
(" pragma Import (C, gnat_exit_status);");
2064 -- Generate the GNAT_Version and Ada_Main_Program_Name info only for
2065 -- the main program. Otherwise, it can lead under some circumstances
2066 -- to a symbol duplication during the link (for instance when a
2067 -- C program uses 2 Ada libraries)
2069 if Bind_Main_Program
then
2071 WBI
(" GNAT_Version : constant String :=");
2072 WBI
(" ""GNAT Version: " &
2073 Gnat_Version_String
& """;");
2074 WBI
(" pragma Export (C, GNAT_Version, ""__gnat_version"");");
2077 Set_String
(" Ada_Main_Program_Name : constant String := """);
2078 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
2079 Set_Main_Program_Name
;
2080 Set_String
(""" & Ascii.NUL;");
2081 Write_Statement_Buffer
;
2084 (" pragma Export (C, Ada_Main_Program_Name, " &
2085 """__gnat_ada_main_program_name"");");
2089 WBI
(" procedure " & Ada_Final_Name
.all & ";");
2090 WBI
(" pragma Export (C, " & Ada_Final_Name
.all & ", """ &
2091 Ada_Final_Name
.all & """);");
2093 if Use_Pragma_Linker_Constructor
then
2094 WBI
(" pragma Linker_Destructor (" & Ada_Final_Name
.all & ");");
2098 WBI
(" procedure " & Ada_Init_Name
.all & ";");
2099 WBI
(" pragma Export (C, " & Ada_Init_Name
.all & ", """ &
2100 Ada_Init_Name
.all & """);");
2102 if Use_Pragma_Linker_Constructor
then
2103 WBI
(" pragma Linker_Constructor (" & Ada_Init_Name
.all & ");");
2106 if Bind_Main_Program
then
2108 -- If we have the standard library, then Break_Start is defined
2109 -- there, but when the standard library is suppressed, Break_Start
2113 WBI
(" procedure Break_Start;");
2115 if Suppress_Standard_Library_On_Target
then
2116 WBI
(" pragma Export (C, Break_Start, ""__gnat_break_start"");");
2118 WBI
(" pragma Import (C, Break_Start, ""__gnat_break_start"");");
2123 if Exit_Status_Supported_On_Target
then
2124 Set_String
(" function ");
2126 Set_String
(" procedure ");
2129 Set_String
(Get_Main_Name
);
2131 -- Generate argument list if present
2133 if Command_Line_Args_On_Target
then
2134 Write_Statement_Buffer
;
2135 WBI
(" (argc : Integer;");
2136 WBI
(" argv : System.Address;");
2138 (" envp : System.Address)");
2140 if Exit_Status_Supported_On_Target
then
2141 Write_Statement_Buffer
;
2142 WBI
(" return Integer;");
2144 Write_Statement_Buffer
(";");
2148 if Exit_Status_Supported_On_Target
then
2149 Write_Statement_Buffer
(" return Integer;");
2151 Write_Statement_Buffer
(";");
2155 WBI
(" pragma Export (C, " & Get_Main_Name
& ", """ &
2156 Get_Main_Name
& """);");
2165 WBI
("end " & Ada_Main
& ";");
2166 Close_Binder_Output
;
2168 -- Prepare to write body
2170 Create_Binder_Output
(Filename
, 'b', Bfileb
);
2172 -- Output Source_File_Name pragmas which look like
2174 -- pragma Source_File_Name (Ada_Main, Spec_File_Name => "sss");
2175 -- pragma Source_File_Name (Ada_Main, Body_File_Name => "bbb");
2177 -- where sss/bbb are the spec/body file names respectively
2179 Get_Name_String
(Bfiles
);
2180 Name_Buffer
(Name_Len
+ 1 .. Name_Len
+ 3) := """);";
2182 WBI
("pragma Source_File_Name (" &
2184 ", Spec_File_Name => """ &
2185 Name_Buffer
(1 .. Name_Len
+ 3));
2187 Get_Name_String
(Bfileb
);
2188 Name_Buffer
(Name_Len
+ 1 .. Name_Len
+ 3) := """);";
2190 WBI
("pragma Source_File_Name (" &
2192 ", Body_File_Name => """ &
2193 Name_Buffer
(1 .. Name_Len
+ 3));
2196 WBI
("package body " & Ada_Main
& " is");
2197 WBI
(" pragma Warnings (Off);");
2199 -- Import the finalization procedure only if finalization active
2201 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
2203 -- In the Java case, pragma Import C cannot be used, so the
2204 -- standard Ada constructs will be used instead.
2206 if not Hostparm
.Java_VM
then
2208 WBI
(" procedure Do_Finalize;");
2210 (" pragma Import (C, Do_Finalize, " &
2211 """system__standard_library__adafinal"");");
2220 if Bind_Main_Program
then
2222 -- When suppressing the standard library then generate dummy body
2225 if Suppress_Standard_Library_On_Target
then
2227 WBI
(" procedure Break_Start is");
2236 -- Output object file list and the Ada body is complete
2238 Gen_Object_Files_Options
;
2241 WBI
("end " & Ada_Main
& ";");
2243 Close_Binder_Output
;
2244 end Gen_Output_File_Ada
;
2246 -----------------------
2247 -- Gen_Output_File_C --
2248 -----------------------
2250 procedure Gen_Output_File_C
(Filename
: String) is
2253 -- Name of generated bind file
2256 Create_Binder_Output
(Filename
, 'c', Bfile
);
2258 Resolve_Binder_Options
;
2260 WBI
("extern void __gnat_set_globals");
2261 WBI
(" (int, int, char, char, char, char,");
2262 WBI
(" const char *, const char *,");
2263 WBI
(" int, int, int, int, int, int);");
2265 if Use_Pragma_Linker_Constructor
then
2266 WBI
("extern void " & Ada_Final_Name
.all &
2267 " (void) __attribute__((destructor));");
2268 WBI
("extern void " & Ada_Init_Name
.all &
2269 " (void) __attribute__((constructor));");
2272 WBI
("extern void " & Ada_Final_Name
.all & " (void);");
2273 WBI
("extern void " & Ada_Init_Name
.all & " (void);");
2276 WBI
("extern void system__standard_library__adafinal (void);");
2278 if not No_Main_Subprogram
then
2279 Set_String
("extern ");
2281 if Exit_Status_Supported_On_Target
then
2284 Set_String
("void");
2287 Set_String
(" main ");
2289 if Command_Line_Args_On_Target
then
2290 Write_Statement_Buffer
("(int, char **, char **);");
2292 Write_Statement_Buffer
("(void);");
2295 if OpenVMS_On_Target
then
2296 WBI
("extern void decc$__posix_exit (int);");
2298 WBI
("extern void exit (int);");
2301 WBI
("extern void __gnat_break_start (void);");
2302 Set_String
("extern ");
2304 if ALIs
.Table
(ALIs
.First
).Main_Program
= Proc
then
2305 Set_String
("void ");
2307 Set_String
("int ");
2310 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
2311 Set_Main_Program_Name
;
2312 Set_String
(" (void);");
2313 Write_Statement_Buffer
;
2316 if not Suppress_Standard_Library_On_Target
then
2317 WBI
("extern void __gnat_initialize (void *);");
2318 WBI
("extern void __gnat_finalize (void);");
2319 WBI
("extern void __gnat_install_handler (void);");
2322 if Dynamic_Stack_Measurement
then
2324 WBI
("extern void __gnat_stack_usage_output_results (void);");
2325 WBI
("extern void __gnat_stack_usage_initialize (int size);");
2332 -- Imported variable used to track elaboration/finalization phase.
2333 -- Used only when we have a runtime.
2335 if not Suppress_Standard_Library_On_Target
then
2336 WBI
("extern int __gnat_handler_installed;");
2340 -- Write argv/argc exit status stuff if main program case
2342 if Bind_Main_Program
then
2344 -- First deal with argc/argv/envp. In the normal case they
2345 -- are in the run-time library.
2347 if not Configurable_Run_Time_On_Target
then
2348 WBI
("extern int gnat_argc;");
2349 WBI
("extern char **gnat_argv;");
2350 WBI
("extern char **gnat_envp;");
2352 -- If configurable run time and no command line args, then the
2353 -- generation of these variables is entirely suppressed.
2355 elsif not Command_Line_Args_On_Target
then
2358 -- Otherwise, in the configurable run-time case they are right in
2362 WBI
("int gnat_argc;");
2363 WBI
("char **gnat_argv;");
2364 WBI
("char **gnat_envp;");
2367 -- Similarly deal with exit status
2368 -- are in the run-time library.
2370 if not Configurable_Run_Time_On_Target
then
2371 WBI
("extern int gnat_exit_status;");
2373 -- If configurable run time and no exit status on target, then
2374 -- the generation of this variables is entirely suppressed.
2376 elsif not Exit_Status_Supported_On_Target
then
2379 -- Otherwise, in the configurable run-time case this variable is
2380 -- right in the binder file, and initialized to zero there.
2383 WBI
("int gnat_exit_status = 0;");
2389 -- When suppressing the standard library, the __gnat_break_start
2390 -- routine (for the debugger to get initial control) is defined in
2393 if Suppress_Standard_Library_On_Target
then
2395 WBI
("void __gnat_break_start (void) {}");
2398 -- Generate the __gnat_version and __gnat_ada_main_program_name info
2399 -- only for the main program. Otherwise, it can lead under some
2400 -- circumstances to a symbol duplication during the link (for instance
2401 -- when a C program uses 2 Ada libraries)
2403 if Bind_Main_Program
then
2405 WBI
("char __gnat_version[] = ""GNAT Version: " &
2406 Gnat_Version_String
& """;");
2408 Set_String
("char __gnat_ada_main_program_name[] = """);
2409 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
2410 Set_Main_Program_Name
;
2412 Write_Statement_Buffer
;
2415 -- Generate the adafinal routine. In no runtime mode, this is
2416 -- not needed, since there is no finalization to do.
2418 if not Cumulative_Restrictions
.Set
(No_Finalization
) then
2424 -- Main is only present for Ada main case
2426 if Bind_Main_Program
then
2430 -- Generate versions, elaboration order, list of object files
2434 Gen_Object_Files_Options
;
2436 -- C binder output is complete
2438 Close_Binder_Output
;
2439 end Gen_Output_File_C
;
2441 -------------------------------
2442 -- Gen_Restrictions_String_1 --
2443 -------------------------------
2445 procedure Gen_Restrictions_String_1
is
2447 for R
in All_Boolean_Restrictions
loop
2448 if Cumulative_Restrictions
.Set
(R
) then
2450 elsif Cumulative_Restrictions
.Violated
(R
) then
2456 end Gen_Restrictions_String_1
;
2458 -------------------------------
2459 -- Gen_Restrictions_String_2 --
2460 -------------------------------
2462 procedure Gen_Restrictions_String_2
is
2464 for RP
in All_Parameter_Restrictions
loop
2465 if Cumulative_Restrictions
.Set
(RP
) then
2467 Set_Int
(Int
(Cumulative_Restrictions
.Value
(RP
)));
2472 if not Cumulative_Restrictions
.Violated
(RP
)
2473 or else RP
not in Checked_Parameter_Restrictions
2478 Set_Int
(Int
(Cumulative_Restrictions
.Count
(RP
)));
2480 if Cumulative_Restrictions
.Unknown
(RP
) then
2485 end Gen_Restrictions_String_2
;
2487 ----------------------
2488 -- Gen_Versions_Ada --
2489 ----------------------
2491 -- This routine generates two sets of lines. The first set has the form:
2493 -- unnnnn : constant Integer := 16#hhhhhhhh#;
2495 -- The second set has the form
2497 -- pragma Export (C, unnnnn, unam);
2499 -- for each unit, where unam is the unit name suffixed by either B or
2500 -- S for body or spec, with dots replaced by double underscores, and
2501 -- hhhhhhhh is the version number, and nnnnn is a 5-digits serial number.
2503 procedure Gen_Versions_Ada
is
2504 Ubuf
: String (1 .. 6) := "u00000";
2506 procedure Increment_Ubuf
;
2507 -- Little procedure to increment the serial number
2509 procedure Increment_Ubuf
is
2511 for J
in reverse Ubuf
'Range loop
2512 Ubuf
(J
) := Character'Succ (Ubuf
(J
));
2513 exit when Ubuf
(J
) <= '9';
2518 -- Start of processing for Gen_Versions_Ada
2521 if Bind_For_Library
then
2523 -- When building libraries, the version number of each unit can
2524 -- not be computed, since the binder does not know the full list
2525 -- of units. Therefore, the 'Version and 'Body_Version
2526 -- attributes cannot supported in this case.
2533 WBI
(" type Version_32 is mod 2 ** 32;");
2534 for U
in Units
.First
.. Units
.Last
loop
2536 WBI
(" " & Ubuf
& " : constant Version_32 := 16#" &
2537 Units
.Table
(U
).Version
& "#;");
2543 for U
in Units
.First
.. Units
.Last
loop
2545 Set_String
(" pragma Export (C, ");
2547 Set_String
(", """);
2549 Get_Name_String
(Units
.Table
(U
).Uname
);
2551 for K
in 1 .. Name_Len
loop
2552 if Name_Buffer
(K
) = '.' then
2556 elsif Name_Buffer
(K
) = '%' then
2560 Set_Char
(Name_Buffer
(K
));
2564 if Name_Buffer
(Name_Len
) = 's' then
2570 Set_String
(""");");
2571 Write_Statement_Buffer
;
2574 end Gen_Versions_Ada
;
2576 --------------------
2577 -- Gen_Versions_C --
2578 --------------------
2580 -- This routine generates a line of the form:
2582 -- unsigned unam = 0xhhhhhhhh;
2584 -- for each unit, where unam is the unit name suffixed by either B or
2585 -- S for body or spec, with dots replaced by double underscores.
2587 procedure Gen_Versions_C
is
2589 if Bind_For_Library
then
2591 -- When building libraries, the version number of each unit can
2592 -- not be computed, since the binder does not know the full list
2593 -- of units. Therefore, the 'Version and 'Body_Version
2594 -- attributes cannot supported.
2599 for U
in Units
.First
.. Units
.Last
loop
2600 Set_String
("unsigned ");
2602 Get_Name_String
(Units
.Table
(U
).Uname
);
2604 for K
in 1 .. Name_Len
loop
2605 if Name_Buffer
(K
) = '.' then
2608 elsif Name_Buffer
(K
) = '%' then
2612 Set_Char
(Name_Buffer
(K
));
2616 if Name_Buffer
(Name_Len
) = 's' then
2622 Set_String
(" = 0x");
2623 Set_String
(Units
.Table
(U
).Version
);
2625 Write_Statement_Buffer
;
2630 -----------------------
2631 -- Get_Ada_Main_Name --
2632 -----------------------
2634 function Get_Ada_Main_Name
return String is
2635 Suffix
: constant String := "_00";
2636 Name
: String (1 .. Opt
.Ada_Main_Name
.all'Length + Suffix
'Length) :=
2637 Opt
.Ada_Main_Name
.all & Suffix
;
2641 -- The main program generated by JGNAT expects a package called
2642 -- ada_<main procedure>.
2644 if Hostparm
.Java_VM
then
2645 -- Get main program name
2647 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
2651 return "ada_" & Name_Buffer
(1 .. Name_Len
- 2);
2654 -- This loop tries the following possibilities in order
2660 -- where <Ada_Main> is equal to Opt.Ada_Main_Name. By default,
2661 -- it is set to 'ada_main'.
2663 for J
in 0 .. 99 loop
2665 Nlen
:= Name
'Length - Suffix
'Length;
2667 Nlen
:= Name
'Length;
2668 Name
(Name
'Last) := Character'Val (J
mod 10 + Character'Pos ('0'));
2669 Name
(Name
'Last - 1) :=
2670 Character'Val (J
/ 10 + Character'Pos ('0'));
2673 for K
in ALIs
.First
.. ALIs
.Last
loop
2674 for L
in ALIs
.Table
(K
).First_Unit
.. ALIs
.Table
(K
).Last_Unit
loop
2676 -- Get unit name, removing %b or %e at end
2678 Get_Name_String
(Units
.Table
(L
).Uname
);
2679 Name_Len
:= Name_Len
- 2;
2681 if Name_Buffer
(1 .. Name_Len
) = Name
(1 .. Nlen
) then
2687 return Name
(1 .. Nlen
);
2693 -- If we fall through, just use a peculiar unlikely name
2695 return ("Qwertyuiop");
2696 end Get_Ada_Main_Name
;
2702 function Get_Main_Name
return String is
2704 -- Explicit name given with -M switch
2706 if Bind_Alternate_Main_Name
then
2707 return Alternate_Main_Name
.all;
2709 -- Case of main program name to be used directly
2711 elsif Use_Ada_Main_Program_Name_On_Target
then
2713 -- Get main program name
2715 Get_Name_String
(Units
.Table
(First_Unit_Entry
).Uname
);
2717 -- If this is a child name, return only the name of the child,
2718 -- since we can't have dots in a nested program name. Note that
2719 -- we do not include the %b at the end of the unit name.
2721 for J
in reverse 1 .. Name_Len
- 2 loop
2722 if J
= 1 or else Name_Buffer
(J
- 1) = '.' then
2723 return Name_Buffer
(J
.. Name_Len
- 2);
2727 raise Program_Error
; -- impossible exit
2729 -- Case where "main" is to be used as default
2736 ----------------------
2737 -- Lt_Linker_Option --
2738 ----------------------
2740 function Lt_Linker_Option
(Op1
, Op2
: Natural) return Boolean is
2742 -- Sort internal files last
2744 if Linker_Options
.Table
(Op1
).Internal_File
2746 Linker_Options
.Table
(Op2
).Internal_File
2748 -- Note: following test uses False < True
2750 return Linker_Options
.Table
(Op1
).Internal_File
2752 Linker_Options
.Table
(Op2
).Internal_File
;
2754 -- If both internal or both non-internal, sort according to the
2755 -- elaboration position. A unit that is elaborated later should
2756 -- come earlier in the linker options list.
2759 return Units
.Table
(Linker_Options
.Table
(Op1
).Unit
).Elab_Position
2761 Units
.Table
(Linker_Options
.Table
(Op2
).Unit
).Elab_Position
;
2764 end Lt_Linker_Option
;
2766 ------------------------
2767 -- Move_Linker_Option --
2768 ------------------------
2770 procedure Move_Linker_Option
(From
: Natural; To
: Natural) is
2772 Linker_Options
.Table
(To
) := Linker_Options
.Table
(From
);
2773 end Move_Linker_Option
;
2775 ----------------------------
2776 -- Public_Version_Warning --
2777 ----------------------------
2779 procedure Public_Version_Warning
is
2780 Time
: constant Int
:= Time_From_Last_Bind
;
2782 -- Constants to help defining periods
2784 Hour
: constant := 60;
2785 Day
: constant := 24 * Hour
;
2787 Never
: constant := Integer'Last;
2788 -- Special value indicating no warnings should be given
2790 -- Constants defining when the warning is issued. Programs with more
2791 -- than Large Units will issue a warning every Period_Large amount of
2792 -- time. Smaller programs will generate a warning every Period_Small
2795 Large
: constant := 20;
2796 -- Threshold for considering a program small or large
2798 Period_Large
: constant := Day
;
2799 -- Periodic warning time for large programs
2801 Period_Small
: constant := Never
;
2802 -- Periodic warning time for small programs
2807 -- Compute the number of units that are not GNAT internal files
2810 for A
in ALIs
.First
.. ALIs
.Last
loop
2811 if not Is_Internal_File_Name
(ALIs
.Table
(A
).Sfile
) then
2812 Nb_Unit
:= Nb_Unit
+ 1;
2816 -- Do not emit the message if the last message was emitted in the
2817 -- specified period taking into account the number of units.
2819 pragma Warnings
(Off
);
2820 -- Turn off warning of constant condition, which may happen here
2821 -- depending on the choice of constants in the above declarations.
2823 if Nb_Unit
< Large
and then Time
<= Period_Small
then
2825 elsif Time
<= Period_Large
then
2829 pragma Warnings
(On
);
2832 Write_Str
("IMPORTANT NOTICE:");
2834 Write_Str
(" This version of GNAT is unsupported"
2835 & " and comes with absolutely no warranty.");
2837 Write_Str
(" If you intend to evaluate or use GNAT for building "
2838 & "commercial applications,");
2840 Write_Str
(" please consult http://www.gnat.com/ for information");
2842 Write_Str
(" on the GNAT Professional product line.");
2845 end Public_Version_Warning
;
2847 ----------------------------
2848 -- Resolve_Binder_Options --
2849 ----------------------------
2851 procedure Resolve_Binder_Options
is
2853 for E
in Elab_Order
.First
.. Elab_Order
.Last
loop
2854 Get_Name_String
(Units
.Table
(Elab_Order
.Table
(E
)).Uname
);
2856 -- The procedure of looking for specific packages and setting
2857 -- flags is somewhat dubious, but there isn't a good alternative
2858 -- at the current time ???
2860 if Name_Buffer
(1 .. 19) = "system.os_interface" then
2864 if OpenVMS_On_Target
and then Name_Buffer
(1 .. 5) = "dec%s" then
2865 With_DECGNAT
:= True;
2868 end Resolve_Binder_Options
;
2874 procedure Set_Char
(C
: Character) is
2877 Statement_Buffer
(Last
) := C
;
2884 procedure Set_Int
(N
: Int
) is
2896 Statement_Buffer
(Last
) :=
2897 Character'Val (N
mod 10 + Character'Pos ('0'));
2901 -------------------------
2902 -- Set_IS_Pragma_Table --
2903 -------------------------
2905 procedure Set_IS_Pragma_Table
is
2907 for F
in ALIs
.First
.. ALIs
.Last
loop
2908 for K
in ALIs
.Table
(F
).First_Interrupt_State
..
2909 ALIs
.Table
(F
).Last_Interrupt_State
2912 Inum
: constant Int
:=
2913 Interrupt_States
.Table
(K
).Interrupt_Id
;
2914 Stat
: constant Character :=
2915 Interrupt_States
.Table
(K
).Interrupt_State
;
2918 while IS_Pragma_Settings
.Last
< Inum
loop
2919 IS_Pragma_Settings
.Append
('n');
2922 IS_Pragma_Settings
.Table
(Inum
) := Stat
;
2926 end Set_IS_Pragma_Table
;
2928 ---------------------------
2929 -- Set_Main_Program_Name --
2930 ---------------------------
2932 procedure Set_Main_Program_Name
is
2934 -- Note that name has %b on the end which we ignore
2936 -- First we output the initial _ada_ since we know that the main
2937 -- program is a library level subprogram.
2939 Set_String
("_ada_");
2941 -- Copy name, changing dots to double underscores
2943 for J
in 1 .. Name_Len
- 2 loop
2944 if Name_Buffer
(J
) = '.' then
2947 Set_Char
(Name_Buffer
(J
));
2950 end Set_Main_Program_Name
;
2952 ---------------------
2953 -- Set_Name_Buffer --
2954 ---------------------
2956 procedure Set_Name_Buffer
is
2958 for J
in 1 .. Name_Len
loop
2959 Set_Char
(Name_Buffer
(J
));
2961 end Set_Name_Buffer
;
2967 procedure Set_String
(S
: String) is
2969 Statement_Buffer
(Last
+ 1 .. Last
+ S
'Length) := S
;
2970 Last
:= Last
+ S
'Length;
2977 procedure Set_Unit_Name
is
2979 for J
in 1 .. Name_Len
- 2 loop
2980 if Name_Buffer
(J
) /= '.' then
2981 Set_Char
(Name_Buffer
(J
));
2988 ---------------------
2989 -- Set_Unit_Number --
2990 ---------------------
2992 procedure Set_Unit_Number
(U
: Unit_Id
) is
2993 Num_Units
: constant Nat
:= Nat
(Units
.Last
) - Nat
(Unit_Id
'First);
2994 Unum
: constant Nat
:= Nat
(U
) - Nat
(Unit_Id
'First);
2997 if Num_Units
>= 10 and then Unum
< 10 then
3001 if Num_Units
>= 100 and then Unum
< 100 then
3006 end Set_Unit_Number
;
3012 procedure Tab_To
(N
: Natural) is
3019 ----------------------
3020 -- Write_Info_Ada_C --
3021 ----------------------
3023 procedure Write_Info_Ada_C
(Ada
: String; C
: String; Common
: String) is
3025 if Ada_Bind_File
then
3027 S
: String (1 .. Ada
'Length + Common
'Length);
3029 S
(1 .. Ada
'Length) := Ada
;
3030 S
(Ada
'Length + 1 .. S
'Length) := Common
;
3036 S
: String (1 .. C
'Length + Common
'Length);
3038 S
(1 .. C
'Length) := C
;
3039 S
(C
'Length + 1 .. S
'Length) := Common
;
3043 end Write_Info_Ada_C
;
3045 ----------------------------
3046 -- Write_Statement_Buffer --
3047 ----------------------------
3049 procedure Write_Statement_Buffer
is
3051 WBI
(Statement_Buffer
(1 .. Last
));
3053 end Write_Statement_Buffer
;
3055 procedure Write_Statement_Buffer
(S
: String) is
3058 Write_Statement_Buffer
;
3059 end Write_Statement_Buffer
;