4
4
#include <alloca.h>
5
5
#include <dlfcn.h>
6
6
#include <sys/stat.h>
7
- #include "mir-gen.h" // mir.h gets included as well
7
+ #include "mir-gen.h" // mir.h gets included as well
8
8
9
9
#define MIR_TYPE_INTERP 1
10
10
#define MIR_TYPE_INTERP_NAME "interp"
11
- #define MIR_TYPE_JIT 2
12
- #define MIR_TYPE_JIT_NAME "jit "
11
+ #define MIR_TYPE_GEN 2
12
+ #define MIR_TYPE_GEN_NAME "gen "
13
13
#define MIR_TYPE_LAZY 3
14
14
#define MIR_TYPE_LAZY_NAME "lazy"
15
15
16
- #define MIR_TYPE_DEFAULT MIR_TYPE_INTERP
16
+ #define MIR_TYPE_DEFAULT MIR_TYPE_LAZY
17
17
18
18
#define MIR_ENV_VAR_LIB_DIRS "MIR_LIB_DIRS"
19
19
#define MIR_ENV_VAR_EXTRA_LIBS "MIR_LIBS"
@@ -34,11 +34,13 @@ static lib_t std_libs[]
34
34
static const char * std_lib_dirs [] = {"/lib" , "/lib32" };
35
35
#elif UINTPTR_MAX == 0xffffffffffffffff
36
36
#if defined(__x86_64__ )
37
- static lib_t std_libs []
38
- = {{"/lib64/libc.so.6" , NULL }, {"/lib/x86_64-linux-gnu/libc.so.6" , NULL },
39
- {"/lib64/libm.so.6" , NULL }, {"/lib/x86_64-linux-gnu/libm.so.6" , NULL },
40
- {"/usr/lib64/libpthread.so.0" , NULL }, {"/lib/x86_64-linux-gnu/libpthread.so.0" , NULL },
41
- {"/usr/lib/libc.so" , NULL }};
37
+ static lib_t std_libs [] = {{"/lib64/libc.so.6" , NULL },
38
+ {"/lib/x86_64-linux-gnu/libc.so.6" , NULL },
39
+ {"/lib64/libm.so.6" , NULL },
40
+ {"/lib/x86_64-linux-gnu/libm.so.6" , NULL },
41
+ {"/usr/lib64/libpthread.so.0" , NULL },
42
+ {"/lib/x86_64-linux-gnu/libpthread.so.0" , NULL },
43
+ {"/usr/lib/libc.so" , NULL }};
42
44
static const char * std_lib_dirs [] = {"/lib64" , "/lib/x86_64-linux-gnu" };
43
45
#elif (__aarch64__ )
44
46
static lib_t std_libs []
@@ -111,7 +113,6 @@ static const char *lib_suffix = ".dll";
111
113
#define dlsym (h , s ) GetProcAddress (h, s)
112
114
#endif
113
115
114
-
115
116
static void close_std_libs (void ) {
116
117
for (int i = 0 ; i < sizeof (std_libs ) / sizeof (lib_t ); i ++ )
117
118
if (std_libs [i ].handler != NULL ) dlclose (std_libs [i ].handler );
@@ -222,20 +223,19 @@ static void *import_resolver (const char *name) {
222
223
return sym ;
223
224
}
224
225
225
- void lib_dirs_from_env_var (const char * env_var ) {
226
- const char * var_value = getenv (env_var );
227
- if (var_value == NULL || var_value [0 ] == '\0' )
228
- return ;
226
+ void lib_dirs_from_env_var (const char * env_var ) {
227
+ const char * var_value = getenv (env_var );
228
+ if (var_value == NULL || var_value [0 ] == '\0' ) return ;
229
229
230
230
// copy to an allocated buffer
231
- int value_len = strlen (var_value );
232
- char * value = (char * ) malloc (value_len + 1 );
233
- strcpy (value , var_value );
231
+ int value_len = strlen (var_value );
232
+ char * value = (char * ) malloc (value_len + 1 );
233
+ strcpy (value , var_value );
234
234
235
235
// colon separated list
236
236
char * value_ptr = value ;
237
237
char * colon = NULL ;
238
- while ((colon = strchr (value_ptr , ':' )) != NULL ) {
238
+ while ((colon = strchr (value_ptr , ':' )) != NULL ) {
239
239
colon [0 ] = '\0' ;
240
240
VARR_PUSH (char_ptr_t , lib_dirs , value_ptr );
241
241
// goto next
@@ -246,76 +246,69 @@ void lib_dirs_from_env_var(const char *env_var) {
246
246
VARR_PUSH (char_ptr_t , lib_dirs , value_ptr );
247
247
}
248
248
249
- int get_mir_type (void ) {
250
- const char * type_value = getenv (MIR_ENV_VAR_TYPE );
251
- if (type_value == NULL || type_value [0 ] == '\0' )
252
- return MIR_TYPE_DEFAULT ;
249
+ int get_mir_type (void ) {
250
+ const char * type_value = getenv (MIR_ENV_VAR_TYPE );
251
+ if (type_value == NULL || type_value [0 ] == '\0' ) return MIR_TYPE_DEFAULT ;
253
252
254
- if (strcmp (type_value , MIR_TYPE_INTERP_NAME ) == 0 )
255
- return MIR_TYPE_INTERP ;
253
+ if (strcmp (type_value , MIR_TYPE_INTERP_NAME ) == 0 ) return MIR_TYPE_INTERP ;
256
254
257
- if (strcmp (type_value , MIR_TYPE_JIT_NAME ) == 0 )
258
- return MIR_TYPE_JIT ;
255
+ if (strcmp (type_value , MIR_TYPE_GEN_NAME ) == 0 ) return MIR_TYPE_GEN ;
259
256
260
- if (strcmp (type_value , MIR_TYPE_LAZY_NAME ) == 0 )
261
- return MIR_TYPE_LAZY ;
257
+ if (strcmp (type_value , MIR_TYPE_LAZY_NAME ) == 0 ) return MIR_TYPE_LAZY ;
262
258
263
- fprintf (stderr , "warning: unknown MIR_TYPE '%s', using default one\n" , type_value );
259
+ fprintf (stderr , "warning: unknown MIR_TYPE '%s', using default one\n" , type_value );
264
260
return MIR_TYPE_DEFAULT ;
265
261
}
266
262
267
- void open_extra_libs (void ) {
268
- const char * var_value = getenv (MIR_ENV_VAR_EXTRA_LIBS );
269
- if (var_value == NULL || var_value [0 ] == '\0' )
270
- return ;
263
+ void open_extra_libs (void ) {
264
+ const char * var_value = getenv (MIR_ENV_VAR_EXTRA_LIBS );
265
+ if (var_value == NULL || var_value [0 ] == '\0' ) return ;
271
266
272
- int value_len = strlen (var_value );
273
- char * value = (char * ) malloc (value_len + 1 );
274
- strcpy (value , var_value );
267
+ int value_len = strlen (var_value );
268
+ char * value = (char * ) malloc (value_len + 1 );
269
+ strcpy (value , var_value );
275
270
276
271
char * value_ptr = value ;
277
272
char * colon = NULL ;
278
- while ((colon = strchr (value_ptr , ':' )) != NULL ) {
273
+ while ((colon = strchr (value_ptr , ':' )) != NULL ) {
279
274
colon [0 ] = '\0' ;
280
- process_extra_lib (value_ptr );
275
+ process_extra_lib (value_ptr );
281
276
282
277
value_ptr = colon + 1 ;
283
278
}
284
- process_extra_lib (value_ptr );
279
+ process_extra_lib (value_ptr );
285
280
}
286
281
287
-
288
282
int main (int argc , char * * argv , char * * envp ) {
289
-
290
283
// from binfmt_misc we expect the arguments to be:
291
284
// `mir-run /full/path/to/mir-binary mir-binary <args...>`
292
285
if (argc < 3 ) {
293
- fprintf (stderr , "usage: %s <full-path> <name> [<args>...]\n" , argv [0 ]);
286
+ fprintf (stderr , "usage: %s <full-path> <name> [<args>...]\n" , argv [0 ]);
294
287
return 1 ;
295
288
}
296
289
297
- int mir_type = get_mir_type ();
290
+ int mir_type = get_mir_type ();
298
291
299
292
MIR_val_t val ;
300
293
int exit_code ;
301
294
302
295
VARR_CREATE (char , temp_string , 0 );
303
296
VARR_CREATE (lib_t , extra_libs , 16 );
304
297
VARR_CREATE (char_ptr_t , lib_dirs , 16 );
305
- for (int i = 0 ; i < sizeof (std_lib_dirs ) / sizeof (char_ptr_t ); i ++ )
298
+ for (int i = 0 ; i < sizeof (std_lib_dirs ) / sizeof (char_ptr_t ); i ++ )
306
299
VARR_PUSH (char_ptr_t , lib_dirs , std_lib_dirs [i ]);
307
- lib_dirs_from_env_var ("LD_LIBRARY_PATH" );
308
- lib_dirs_from_env_var (MIR_ENV_VAR_LIB_DIRS );
300
+ lib_dirs_from_env_var ("LD_LIBRARY_PATH" );
301
+ lib_dirs_from_env_var (MIR_ENV_VAR_LIB_DIRS );
309
302
310
303
MIR_item_t main_func = NULL ;
311
304
312
- MIR_context_t mctx = MIR_init ();
313
- FILE * mir_file = fopen (argv [1 ], "r" );
305
+ MIR_context_t mctx = MIR_init ();
306
+ FILE * mir_file = fopen (argv [1 ], "r" );
314
307
if (!mir_file ) {
315
- fprintf (stderr , "failed to open file '%s'\n" , argv [1 ]);
308
+ fprintf (stderr , "failed to open file '%s'\n" , argv [1 ]);
316
309
return 1 ;
317
310
}
318
- MIR_read (mctx , mir_file );
311
+ MIR_read (mctx , mir_file );
319
312
320
313
for (MIR_module_t module = DLIST_HEAD (MIR_module_t , * MIR_get_module_list (mctx )); module != NULL ;
321
314
module = DLIST_NEXT (MIR_module_t , module )) {
@@ -336,27 +329,20 @@ int main (int argc, char **argv, char **envp) {
336
329
337
330
if (mir_type == MIR_TYPE_INTERP ) {
338
331
MIR_link (mctx , MIR_set_interp_interface , import_resolver );
339
- MIR_interp (
340
- mctx , main_func , & val , 3 ,
341
- (MIR_val_t ){.i = (argc - 2 )},
342
- (MIR_val_t ){.a = (void * )(argv + 2 )},
343
- (MIR_val_t ){.a = (void * )envp }
344
- );
332
+ MIR_interp (mctx , main_func , & val , 3 , (MIR_val_t ){.i = (argc - 2 )},
333
+ (MIR_val_t ){.a = (void * ) (argv + 2 )}, (MIR_val_t ){.a = (void * ) envp });
345
334
exit_code = val .i ;
346
335
} else {
347
336
MIR_gen_init (mctx , 1 );
348
- MIR_link (mctx ,
349
- mir_type == MIR_TYPE_JIT
350
- ? MIR_set_gen_interface
351
- : MIR_set_lazy_gen_interface ,
337
+ MIR_link (mctx , mir_type == MIR_TYPE_GEN ? MIR_set_gen_interface : MIR_set_lazy_gen_interface ,
352
338
import_resolver );
353
- uint64_t (* fun_addr )(int , char * * , char * * ) = MIR_gen (mctx , 0 , main_func );
354
- exit_code = fun_addr (argc - 2 , argv + 2 , envp );
355
- MIR_gen_finish (mctx );
339
+ uint64_t (* fun_addr ) (int , char * * , char * * ) = MIR_gen (mctx , 0 , main_func );
340
+ exit_code = fun_addr (argc - 2 , argv + 2 , envp );
341
+ MIR_gen_finish (mctx );
356
342
}
357
343
MIR_finish (mctx );
358
- close_extra_libs ();
359
- close_std_libs ();
344
+ close_extra_libs ();
345
+ close_std_libs ();
360
346
361
347
return exit_code ;
362
348
}
0 commit comments