PR target/58115
[official-gcc.git] / gcc / ada / initialize.c
blob00c4d04e13bc4db4473431fc5d4a7c2cec262aa0
1 /****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * I N I T I A L I Z E *
6 * *
7 * C Implementation File *
8 * *
9 * Copyright (C) 1992-2012, Free Software Foundation, Inc. *
10 * *
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 3, 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. *
17 * *
18 * As a special exception under Section 7 of GPL version 3, you are granted *
19 * additional permissions described in the GCC Runtime Library Exception, *
20 * version 3.1, as published by the Free Software Foundation. *
21 * *
22 * You should have received a copy of the GNU General Public License and *
23 * a copy of the GCC Runtime Library Exception along with this program; *
24 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
25 * <http://www.gnu.org/licenses/>. *
26 * *
27 * GNAT was originally developed by the GNAT team at New York University. *
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
29 * *
30 ****************************************************************************/
32 /* This unit provides default implementation for __gnat_initialize ()
33 which is called before the elaboration of the partition. It is provided
34 in a separate file/object so that users can replace it easily.
35 The default implementation should be null on most targets. */
37 /* The following include is here to meet the published VxWorks requirement
38 that the __vxworks header appear before any other include. */
39 #ifdef __vxworks
40 #include "vxWorks.h"
41 #endif
43 #ifdef IN_RTS
44 #include "tconfig.h"
45 #include "tsystem.h"
46 /* We don't have libiberty, so use malloc. */
47 #define xmalloc(S) malloc (S)
48 #define xrealloc(V,S) realloc (V,S)
49 #else
50 #include "config.h"
51 #include "system.h"
52 #endif
54 #include "raise.h"
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
60 /******************************************/
61 /* __gnat_initialize (NT-mingw32 Version) */
62 /******************************************/
64 #if defined (__MINGW32__)
65 #include "mingw32.h"
66 #include <windows.h>
68 extern void __gnat_init_float (void);
69 extern void __gnat_install_SEH_handler (void *);
71 extern int gnat_argc;
72 extern char **gnat_argv;
74 #ifdef GNAT_UNICODE_SUPPORT
76 #define EXPAND_ARGV_RATE 128
78 static void
79 append_arg (int *index, LPWSTR dir, LPWSTR value,
80 char ***argv, int *last, int quoted)
82 int size;
83 LPWSTR fullvalue;
84 int vallen = _tcslen (value);
85 int dirlen;
87 if (dir == NULL)
89 /* no dir prefix */
90 dirlen = 0;
91 fullvalue = (LPWSTR) xmalloc ((vallen + 1) * sizeof(TCHAR));
93 else
95 /* Add dir first */
96 dirlen = _tcslen (dir);
98 fullvalue = (LPWSTR) xmalloc ((dirlen + vallen + 1) * sizeof(TCHAR));
99 _tcscpy (fullvalue, dir);
102 /* Append value */
104 if (quoted)
106 _tcsncpy (fullvalue + dirlen, value + 1, vallen - 1);
107 fullvalue [dirlen + vallen - sizeof(TCHAR)] = _T('\0');
109 else
110 _tcscpy (fullvalue + dirlen, value);
112 if (*last <= *index)
114 *last += EXPAND_ARGV_RATE;
115 *argv = (char **) xrealloc (*argv, (*last) * sizeof (char *));
118 size = WS2SC (NULL, fullvalue, 0);
119 (*argv)[*index] = (char *) xmalloc (size + sizeof(TCHAR));
120 WS2SC ((*argv)[*index], fullvalue, size);
122 free (fullvalue);
124 (*index)++;
126 #endif
128 void
129 __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
131 /* Initialize floating-point coprocessor. This call is needed because
132 the MS libraries default to 64-bit precision instead of 80-bit
133 precision, and we require the full precision for proper operation,
134 given that we have set Max_Digits etc with this in mind */
135 __gnat_init_float ();
137 #ifdef GNAT_UNICODE_SUPPORT
138 /* Set current code page for filenames handling. */
140 char *codepage = getenv ("GNAT_CODE_PAGE");
142 /* Default code page is UTF-8. */
143 CurrentCodePage = CP_UTF8;
145 if (codepage != NULL)
147 if (strcmp (codepage, "CP_ACP") == 0)
148 CurrentCodePage = CP_ACP;
149 else if (strcmp (codepage, "CP_UTF8") == 0)
150 CurrentCodePage = CP_UTF8;
154 /* Adjust gnat_argv to support Unicode characters. */
156 LPWSTR *wargv;
157 int wargc;
158 int k;
159 int last;
160 int argc_expanded = 0;
161 TCHAR result [MAX_PATH];
162 int quoted;
164 wargv = CommandLineToArgvW (GetCommandLineW(), &wargc);
166 if (wargv != NULL)
168 /* Set gnat_argv with arguments encoded in UTF-8. */
169 last = wargc + 1;
170 gnat_argv = (char **) xmalloc ((last) * sizeof (char *));
172 /* argv[0] is the executable full path-name. */
174 SearchPath (NULL, wargv[0], _T(".exe"), MAX_PATH, result, NULL);
175 append_arg (&argc_expanded, NULL, result, &gnat_argv, &last, 0);
177 for (k=1; k<wargc; k++)
179 quoted = (wargv[k][0] == _T('\''));
181 /* Check for wildcard expansion if the argument is not quoted. */
182 if (!quoted
183 && (_tcsstr (wargv[k], _T("?")) != 0 ||
184 _tcsstr (wargv[k], _T("*")) != 0))
186 /* Wilcards are present, append all corresponding matches. */
187 WIN32_FIND_DATA FileData;
188 HANDLE hDir = FindFirstFile (wargv[k], &FileData);
189 LPWSTR dir = NULL;
190 LPWSTR ldir = _tcsrchr (wargv[k], _T('\\'));
192 if (ldir == NULL)
193 ldir = _tcsrchr (wargv[k], _T('/'));
195 if (hDir == INVALID_HANDLE_VALUE)
197 /* No match, append arg as-is. */
198 append_arg (&argc_expanded, NULL, wargv[k],
199 &gnat_argv, &last, quoted);
201 else
203 if (ldir != NULL)
205 int n = ldir - wargv[k] + 1;
206 dir = (LPWSTR) xmalloc ((n + 1) * sizeof (TCHAR));
207 _tcsncpy (dir, wargv[k], n);
208 dir[n] = _T('\0');
211 /* Append first match and all remaining ones. */
213 do {
214 /* Do not add . and .. special entries */
216 if (_tcscmp (FileData.cFileName, _T(".")) != 0
217 && _tcscmp (FileData.cFileName, _T("..")) != 0)
218 append_arg (&argc_expanded, dir, FileData.cFileName,
219 &gnat_argv, &last, 0);
220 } while (FindNextFile (hDir, &FileData));
222 FindClose (hDir);
224 if (dir != NULL)
225 free (dir);
228 else
230 /* No wildcard. Store parameter as-is. Remove quote if
231 needed. */
232 append_arg (&argc_expanded, NULL, wargv[k],
233 &gnat_argv, &last, quoted);
237 LocalFree (wargv);
238 gnat_argc = argc_expanded;
239 gnat_argv = (char **) xrealloc
240 (gnat_argv, argc_expanded * sizeof (char *));
243 #endif
245 /* Note that we do not activate this for the compiler itself to avoid a
246 bootstrap path problem. Older version of gnatbind will generate a call
247 to __gnat_initialize() without argument. Therefore we cannot use eh in
248 this case. It will be possible to remove the following #ifdef at some
249 point. */
250 #ifdef IN_RTS
251 /* Install the Structured Exception handler. */
252 if (eh)
253 __gnat_install_SEH_handler (eh);
254 #endif
257 /******************************************/
258 /* __gnat_initialize (init_float version) */
259 /******************************************/
261 #elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \
262 || defined (__OpenBSD__)
264 extern void __gnat_init_float (void);
266 void
267 __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
269 __gnat_init_float ();
272 /***************************************/
273 /* __gnat_initialize (VxWorks Version) */
274 /***************************************/
276 #elif defined(__vxworks)
278 extern void __gnat_init_float (void);
280 void
281 __gnat_initialize (void *eh)
283 __gnat_init_float ();
286 #elif defined(_T_HPUX10) || (!defined(IN_RTS) && defined(_X_HPUX10))
288 /************************************************/
289 /* __gnat_initialize (PA-RISC HP-UX 10 Version) */
290 /************************************************/
292 extern void __main (void);
294 void
295 __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
297 __main ();
300 #else
302 /* For all other versions of GNAT, the initialize routine and handler
303 installation do nothing */
305 /***************************************/
306 /* __gnat_initialize (Default Version) */
307 /***************************************/
309 void
310 __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
314 #endif
316 #ifdef __cplusplus
318 #endif