diff options
| -rw-r--r-- | lib/rts.c | 41 | ||||
| -rw-r--r-- | lib/rts.h | 2 | ||||
| -rw-r--r-- | src/c_backend.ml | 4 |
3 files changed, 15 insertions, 32 deletions
@@ -369,17 +369,6 @@ static struct option options[] = { {0, 0, 0, 0} }; -void z__SetConfig(char* arg, char* value) -{ - fprintf(stderr, "Warning: ignoring option -C %s=%s\n", arg, value); -} - -void z__ListConfig() -{ - fprintf(stderr, "Unable to list configuration options\n"); -} - - int process_arguments(int argc, char *argv[]) { int c; @@ -395,28 +384,20 @@ int process_arguments(int argc, char *argv[]) switch (c) { case 'C': { char arg[100]; - char value[100]; - if (!sscanf(optarg, "%99[a-zA-Z0-9_.]=%99s", arg, value)) { + uint64_t value; + if (sscanf(optarg, "%99[a-zA-Z0-9_-.]=%" PRId64, arg, &value)) { + // do nothing + } else if (sscanf(optarg, "%99[a-zA-Z0-9_.]=0x%" PRIx64, arg, &value)) { + // do nothing + } else { fprintf(stderr, "Could not parse argument %s\n", optarg); - z__ListConfig(); + // z__ListConfig(); return -1; }; - -#ifndef NO_AARCH64 - // Vile AArch64-specific hack to read the start address from standard - // command line option. This will not be needed once the official - // __SetConfig function is used. - if (strcmp(arg, "cpu.cpu0.RVBAR") == 0) { - if (!sscanf(value, "0x%" PRIx64, &elf_entry)) { - fprintf(stderr, "Could not parse RVBAR address %s\n", value); - exit(1); - } - elf_entry_set = true; - break; - } -#endif - - z__SetConfig(arg, value); + mpz_t s_value; + mpz_init_set_ui(s_value, value); + z__SetConfig(arg, s_value); + mpz_clear(s_value); } break; @@ -126,3 +126,5 @@ int process_arguments(int, char**); */ void setup_rts(void); void cleanup_rts(void); + +unit z__SetConfig(sail_string, sail_int); diff --git a/src/c_backend.ml b/src/c_backend.ml index 3b57c9ed..ef2d9a58 100644 --- a/src/c_backend.ml +++ b/src/c_backend.ml @@ -2748,13 +2748,13 @@ let compile_ast ctx (Defs defs) = let postamble = separate hardline (List.map string ( [ "int main(int argc, char *argv[])"; "{"; - " setup_rts();"; - " if (process_arguments(argc, argv)) exit(EXIT_FAILURE);" ] + " setup_rts();" ] @ fst exn_boilerplate @ startup cdefs @ List.concat (List.map (fun r -> fst (register_init_clear r)) regs) @ (if regs = [] then [] else [ " zinitializze_registers(UNIT);" ]) @ letbind_initializers + @ [ " if (process_arguments(argc, argv)) exit(EXIT_FAILURE);" ] @ [ " zmain(UNIT);" ] @ letbind_finalizers @ List.concat (List.map (fun r -> snd (register_init_clear r)) regs) |
