annotate gcc/ada/rtinit.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /****************************************************************************
kono
parents:
diff changeset
2 * *
kono
parents:
diff changeset
3 * GNAT COMPILER COMPONENTS *
kono
parents:
diff changeset
4 * *
kono
parents:
diff changeset
5 * I N I T I A L I Z E *
kono
parents:
diff changeset
6 * *
kono
parents:
diff changeset
7 * C Implementation File *
kono
parents:
diff changeset
8 * *
kono
parents:
diff changeset
9 * Copyright (C) 2014-2016, Free Software Foundation, Inc. *
kono
parents:
diff changeset
10 * *
kono
parents:
diff changeset
11 * GNAT is free software; you can redistribute it and/or modify it under *
kono
parents:
diff changeset
12 * terms of the GNU General Public License as published by the Free Soft- *
kono
parents:
diff changeset
13 * ware Foundation; either version 3, or (at your option) any later ver- *
kono
parents:
diff changeset
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
kono
parents:
diff changeset
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
kono
parents:
diff changeset
16 * or FITNESS FOR A PARTICULAR PURPOSE. *
kono
parents:
diff changeset
17 * *
kono
parents:
diff changeset
18 * As a special exception under Section 7 of GPL version 3, you are granted *
kono
parents:
diff changeset
19 * additional permissions described in the GCC Runtime Library Exception, *
kono
parents:
diff changeset
20 * version 3.1, as published by the Free Software Foundation. *
kono
parents:
diff changeset
21 * *
kono
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License and *
kono
parents:
diff changeset
23 * a copy of the GCC Runtime Library Exception along with this program; *
kono
parents:
diff changeset
24 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
kono
parents:
diff changeset
25 * <http://www.gnu.org/licenses/>. *
kono
parents:
diff changeset
26 * *
kono
parents:
diff changeset
27 * GNAT was originally developed by the GNAT team at New York University. *
kono
parents:
diff changeset
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
kono
parents:
diff changeset
29 * *
kono
parents:
diff changeset
30 ****************************************************************************/
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 /* This unit provides implementation for __gnat_runtime_initialize ()
kono
parents:
diff changeset
33 which is called in adainit() to do special initialization needed by
kono
parents:
diff changeset
34 the GNAT runtime. */
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* The following include is here to meet the published VxWorks requirement
kono
parents:
diff changeset
38 that the __vxworks header appear before any other include. */
kono
parents:
diff changeset
39 #ifdef __vxworks
kono
parents:
diff changeset
40 #include "vxWorks.h"
kono
parents:
diff changeset
41 #endif
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 #ifdef IN_RTS
kono
parents:
diff changeset
44 #include "tconfig.h"
kono
parents:
diff changeset
45 #include "tsystem.h"
kono
parents:
diff changeset
46 /* We don't have libiberty, so use malloc. */
kono
parents:
diff changeset
47 #define xmalloc(S) malloc (S)
kono
parents:
diff changeset
48 #define xrealloc(V,S) realloc (V,S)
kono
parents:
diff changeset
49 #else
kono
parents:
diff changeset
50 #include "config.h"
kono
parents:
diff changeset
51 #include "system.h"
kono
parents:
diff changeset
52 #endif
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 #include "raise.h"
kono
parents:
diff changeset
55 #include <fcntl.h>
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 #ifdef __cplusplus
kono
parents:
diff changeset
58 extern "C" {
kono
parents:
diff changeset
59 #endif
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 /**************************************************/
kono
parents:
diff changeset
62 /* __gnat_runtime_initialize (NT-mingw32 Version) */
kono
parents:
diff changeset
63 /**************************************************/
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 extern void __gnat_install_handler(void);
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 int __gnat_wide_text_translation_required = 0;
kono
parents:
diff changeset
68 /* wide text translation, 0=none, 1=activated */
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 int __gnat_rt_init_count = 0;
kono
parents:
diff changeset
71 /* number of references to the GNAT runtime, this is used to initialize
kono
parents:
diff changeset
72 and finalize properly the run-time. */
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 #if defined (__MINGW32__)
kono
parents:
diff changeset
75 #include "mingw32.h"
kono
parents:
diff changeset
76 #include <windows.h>
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 extern void __gnat_init_float (void);
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 extern int gnat_argc;
kono
parents:
diff changeset
81 extern char **gnat_argv;
kono
parents:
diff changeset
82 extern CRITICAL_SECTION ProcListCS;
kono
parents:
diff changeset
83 extern HANDLE ProcListEvt;
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 #ifdef GNAT_UNICODE_SUPPORT
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 #define EXPAND_ARGV_RATE 128
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 int __gnat_do_argv_expansion = 1;
kono
parents:
diff changeset
90 #pragma weak __gnat_do_argv_expansion
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 static void
kono
parents:
diff changeset
93 append_arg (int *index, LPWSTR dir, LPWSTR value,
kono
parents:
diff changeset
94 char ***argv, int *last, int quoted)
kono
parents:
diff changeset
95 {
kono
parents:
diff changeset
96 int size;
kono
parents:
diff changeset
97 LPWSTR fullvalue;
kono
parents:
diff changeset
98 int vallen = _tcslen (value);
kono
parents:
diff changeset
99 int dirlen;
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 if (dir == NULL)
kono
parents:
diff changeset
102 {
kono
parents:
diff changeset
103 /* no dir prefix */
kono
parents:
diff changeset
104 dirlen = 0;
kono
parents:
diff changeset
105 fullvalue = (LPWSTR) xmalloc ((vallen + 1) * sizeof(TCHAR));
kono
parents:
diff changeset
106 }
kono
parents:
diff changeset
107 else
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 /* Add dir first */
kono
parents:
diff changeset
110 dirlen = _tcslen (dir);
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 fullvalue = (LPWSTR) xmalloc ((dirlen + vallen + 1) * sizeof(TCHAR));
kono
parents:
diff changeset
113 _tcscpy (fullvalue, dir);
kono
parents:
diff changeset
114 }
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 /* Append value */
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 if (quoted)
kono
parents:
diff changeset
119 {
kono
parents:
diff changeset
120 _tcsncpy (fullvalue + dirlen, value + 1, vallen - 1);
kono
parents:
diff changeset
121 fullvalue [dirlen + vallen - sizeof(TCHAR)] = _T('\0');
kono
parents:
diff changeset
122 }
kono
parents:
diff changeset
123 else
kono
parents:
diff changeset
124 _tcscpy (fullvalue + dirlen, value);
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 if (*last <= *index)
kono
parents:
diff changeset
127 {
kono
parents:
diff changeset
128 *last += EXPAND_ARGV_RATE;
kono
parents:
diff changeset
129 *argv = (char **) xrealloc (*argv, (*last) * sizeof (char *));
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 size = WS2SC (NULL, fullvalue, 0);
kono
parents:
diff changeset
133 (*argv)[*index] = (char *) xmalloc (size + sizeof(TCHAR));
kono
parents:
diff changeset
134 WS2SC ((*argv)[*index], fullvalue, size);
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 free (fullvalue);
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 (*index)++;
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140 #endif
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 void
kono
parents:
diff changeset
143 __gnat_runtime_initialize(int install_handler)
kono
parents:
diff changeset
144 {
kono
parents:
diff changeset
145 /* increment the reference counter */
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 __gnat_rt_init_count++;
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 /* if already initialized return now */
kono
parents:
diff changeset
150 if (__gnat_rt_init_count > 1)
kono
parents:
diff changeset
151 return;
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 /* Initialize floating-point coprocessor. This call is needed because
kono
parents:
diff changeset
154 the MS libraries default to 64-bit precision instead of 80-bit
kono
parents:
diff changeset
155 precision, and we require the full precision for proper operation,
kono
parents:
diff changeset
156 given that we have set Max_Digits etc with this in mind */
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 __gnat_init_float ();
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 /* Initialize the critical section and event handle for the win32_wait()
kono
parents:
diff changeset
161 implementation, see adaint.c */
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 InitializeCriticalSection (&ProcListCS);
kono
parents:
diff changeset
164 ProcListEvt = CreateEvent (NULL, FALSE, FALSE, NULL);
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 #ifdef GNAT_UNICODE_SUPPORT
kono
parents:
diff changeset
167 /* Set current code page for filenames handling. */
kono
parents:
diff changeset
168 {
kono
parents:
diff changeset
169 char *codepage = getenv ("GNAT_CODE_PAGE");
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 /* Default code page is UTF-8. */
kono
parents:
diff changeset
172 __gnat_current_codepage = CP_UTF8;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 if (codepage != NULL)
kono
parents:
diff changeset
175 {
kono
parents:
diff changeset
176 if (strcmp (codepage, "CP_ACP") == 0)
kono
parents:
diff changeset
177 __gnat_current_codepage = CP_ACP;
kono
parents:
diff changeset
178 else if (strcmp (codepage, "CP_UTF8") == 0)
kono
parents:
diff changeset
179 __gnat_current_codepage = CP_UTF8;
kono
parents:
diff changeset
180 }
kono
parents:
diff changeset
181 }
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 /* Set current encoding for the IO. */
kono
parents:
diff changeset
184 {
kono
parents:
diff changeset
185 char *ccsencoding = getenv ("GNAT_CCS_ENCODING");
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 /* Default CCS Encoding. */
kono
parents:
diff changeset
188 __gnat_current_ccs_encoding = _O_TEXT;
kono
parents:
diff changeset
189 __gnat_wide_text_translation_required = 0;
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 if (ccsencoding != NULL)
kono
parents:
diff changeset
192 {
kono
parents:
diff changeset
193 if (strcmp (ccsencoding, "U16TEXT") == 0)
kono
parents:
diff changeset
194 {
kono
parents:
diff changeset
195 __gnat_current_ccs_encoding = _O_U16TEXT;
kono
parents:
diff changeset
196 __gnat_wide_text_translation_required = 1;
kono
parents:
diff changeset
197 }
kono
parents:
diff changeset
198 else if (strcmp (ccsencoding, "TEXT") == 0)
kono
parents:
diff changeset
199 {
kono
parents:
diff changeset
200 __gnat_current_ccs_encoding = _O_TEXT;
kono
parents:
diff changeset
201 __gnat_wide_text_translation_required = 0;
kono
parents:
diff changeset
202 }
kono
parents:
diff changeset
203 else if (strcmp (ccsencoding, "WTEXT") == 0)
kono
parents:
diff changeset
204 {
kono
parents:
diff changeset
205 __gnat_current_ccs_encoding = _O_WTEXT;
kono
parents:
diff changeset
206 __gnat_wide_text_translation_required = 1;
kono
parents:
diff changeset
207 }
kono
parents:
diff changeset
208 else if (strcmp (ccsencoding, "U8TEXT") == 0)
kono
parents:
diff changeset
209 {
kono
parents:
diff changeset
210 __gnat_current_ccs_encoding = _O_U8TEXT;
kono
parents:
diff changeset
211 __gnat_wide_text_translation_required = 1;
kono
parents:
diff changeset
212 }
kono
parents:
diff changeset
213 }
kono
parents:
diff changeset
214 }
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 /* Adjust gnat_argv to support Unicode characters. */
kono
parents:
diff changeset
217 {
kono
parents:
diff changeset
218 LPWSTR *wargv;
kono
parents:
diff changeset
219 int wargc;
kono
parents:
diff changeset
220 int k;
kono
parents:
diff changeset
221 int last;
kono
parents:
diff changeset
222 int argc_expanded = 0;
kono
parents:
diff changeset
223 TCHAR result [MAX_PATH];
kono
parents:
diff changeset
224 int quoted;
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 wargv = CommandLineToArgvW (GetCommandLineW(), &wargc);
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 if (wargv != NULL)
kono
parents:
diff changeset
229 {
kono
parents:
diff changeset
230 /* Set gnat_argv with arguments encoded in UTF-8. */
kono
parents:
diff changeset
231 last = wargc + 1;
kono
parents:
diff changeset
232 gnat_argv = (char **) xmalloc ((last) * sizeof (char *));
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 /* argv[0] is the executable full path-name. */
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 SearchPath (NULL, wargv[0], _T(".exe"), MAX_PATH, result, NULL);
kono
parents:
diff changeset
237 append_arg (&argc_expanded, NULL, result, &gnat_argv, &last, 0);
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 for (k=1; k<wargc; k++)
kono
parents:
diff changeset
240 {
kono
parents:
diff changeset
241 quoted = (wargv[k][0] == _T('\''));
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 /* Check for wildcard expansion if the argument is not quoted. */
kono
parents:
diff changeset
244 if (!quoted && __gnat_do_argv_expansion
kono
parents:
diff changeset
245 && (_tcsstr (wargv[k], _T("?")) != 0 ||
kono
parents:
diff changeset
246 _tcsstr (wargv[k], _T("*")) != 0))
kono
parents:
diff changeset
247 {
kono
parents:
diff changeset
248 /* Wilcards are present, append all corresponding matches. */
kono
parents:
diff changeset
249 WIN32_FIND_DATA FileData;
kono
parents:
diff changeset
250 HANDLE hDir = FindFirstFile (wargv[k], &FileData);
kono
parents:
diff changeset
251 LPWSTR dir = NULL;
kono
parents:
diff changeset
252 LPWSTR ldir = _tcsrchr (wargv[k], _T('\\'));
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 if (ldir == NULL)
kono
parents:
diff changeset
255 ldir = _tcsrchr (wargv[k], _T('/'));
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 if (hDir == INVALID_HANDLE_VALUE)
kono
parents:
diff changeset
258 {
kono
parents:
diff changeset
259 /* No match, append arg as-is. */
kono
parents:
diff changeset
260 append_arg (&argc_expanded, NULL, wargv[k],
kono
parents:
diff changeset
261 &gnat_argv, &last, quoted);
kono
parents:
diff changeset
262 }
kono
parents:
diff changeset
263 else
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 if (ldir != NULL)
kono
parents:
diff changeset
266 {
kono
parents:
diff changeset
267 int n = ldir - wargv[k] + 1;
kono
parents:
diff changeset
268 dir = (LPWSTR) xmalloc ((n + 1) * sizeof (TCHAR));
kono
parents:
diff changeset
269 _tcsncpy (dir, wargv[k], n);
kono
parents:
diff changeset
270 dir[n] = _T('\0');
kono
parents:
diff changeset
271 }
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 /* Append first match and all remaining ones. */
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 do {
kono
parents:
diff changeset
276 /* Do not add . and .. special entries */
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 if (_tcscmp (FileData.cFileName, _T(".")) != 0
kono
parents:
diff changeset
279 && _tcscmp (FileData.cFileName, _T("..")) != 0)
kono
parents:
diff changeset
280 append_arg (&argc_expanded, dir, FileData.cFileName,
kono
parents:
diff changeset
281 &gnat_argv, &last, 0);
kono
parents:
diff changeset
282 } while (FindNextFile (hDir, &FileData));
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 FindClose (hDir);
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 if (dir != NULL)
kono
parents:
diff changeset
287 free (dir);
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289 }
kono
parents:
diff changeset
290 else
kono
parents:
diff changeset
291 {
kono
parents:
diff changeset
292 /* No wildcard. Store parameter as-is. Remove quote if
kono
parents:
diff changeset
293 needed. */
kono
parents:
diff changeset
294 append_arg (&argc_expanded, NULL, wargv[k],
kono
parents:
diff changeset
295 &gnat_argv, &last,
kono
parents:
diff changeset
296 quoted && __gnat_do_argv_expansion);
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298 }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 LocalFree (wargv);
kono
parents:
diff changeset
301 gnat_argc = argc_expanded;
kono
parents:
diff changeset
302 gnat_argv = (char **) xrealloc
kono
parents:
diff changeset
303 (gnat_argv, argc_expanded * sizeof (char *));
kono
parents:
diff changeset
304 }
kono
parents:
diff changeset
305 }
kono
parents:
diff changeset
306 #endif
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 if (install_handler)
kono
parents:
diff changeset
309 __gnat_install_handler();
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 /**************************************************/
kono
parents:
diff changeset
313 /* __gnat_runtime_initialize (init_float version) */
kono
parents:
diff changeset
314 /**************************************************/
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 #elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \
kono
parents:
diff changeset
317 || defined (__OpenBSD__)
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 extern void __gnat_init_float (void);
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 void
kono
parents:
diff changeset
322 __gnat_runtime_initialize(int install_handler)
kono
parents:
diff changeset
323 {
kono
parents:
diff changeset
324 /* increment the reference counter */
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 __gnat_rt_init_count++;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 /* if already initialized return now */
kono
parents:
diff changeset
329 if (__gnat_rt_init_count > 1)
kono
parents:
diff changeset
330 return;
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 __gnat_init_float ();
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 if (install_handler)
kono
parents:
diff changeset
335 __gnat_install_handler();
kono
parents:
diff changeset
336 }
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 /***********************************************/
kono
parents:
diff changeset
339 /* __gnat_runtime_initialize (VxWorks Version) */
kono
parents:
diff changeset
340 /***********************************************/
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 #elif defined(__vxworks)
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 extern void __gnat_init_float (void);
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 void
kono
parents:
diff changeset
347 __gnat_runtime_initialize(int install_handler)
kono
parents:
diff changeset
348 {
kono
parents:
diff changeset
349 /* increment the reference counter */
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 __gnat_rt_init_count++;
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 /* if already initialized return now */
kono
parents:
diff changeset
354 if (__gnat_rt_init_count > 1)
kono
parents:
diff changeset
355 return;
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 __gnat_init_float ();
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 if (install_handler)
kono
parents:
diff changeset
360 __gnat_install_handler();
kono
parents:
diff changeset
361 }
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 #else
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 /***********************************************/
kono
parents:
diff changeset
366 /* __gnat_runtime_initialize (default version) */
kono
parents:
diff changeset
367 /***********************************************/
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 void
kono
parents:
diff changeset
370 __gnat_runtime_initialize(int install_handler)
kono
parents:
diff changeset
371 {
kono
parents:
diff changeset
372 /* increment the reference counter */
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 __gnat_rt_init_count++;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 /* if already initialized return now */
kono
parents:
diff changeset
377 if (__gnat_rt_init_count > 1)
kono
parents:
diff changeset
378 return;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 if (install_handler)
kono
parents:
diff changeset
381 __gnat_install_handler();
kono
parents:
diff changeset
382 }
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 #endif
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 #ifdef __cplusplus
kono
parents:
diff changeset
387 }
kono
parents:
diff changeset
388 #endif