diff options
Diffstat (limited to 'byterun')
| -rw-r--r-- | byterun/.cvsignore | 2 | ||||
| -rw-r--r-- | byterun/.depend | 18 | ||||
| -rw-r--r-- | byterun/backtrace.c | 7 | ||||
| -rw-r--r-- | byterun/backtrace.h | 1 | ||||
| -rw-r--r-- | byterun/gc_ctrl.c | 4 | ||||
| -rw-r--r-- | byterun/interp.c | 3 | ||||
| -rw-r--r-- | byterun/major_gc.c | 2 | ||||
| -rw-r--r-- | byterun/obj.c | 4 | ||||
| -rw-r--r-- | byterun/startup.c | 32 |
9 files changed, 55 insertions, 18 deletions
diff --git a/byterun/.cvsignore b/byterun/.cvsignore index 9020f408e2..b4714b0506 100644 --- a/byterun/.cvsignore +++ b/byterun/.cvsignore @@ -15,3 +15,5 @@ interp.a.lst *.[sd]obj *.lib .gdb_history +*.so +*.a diff --git a/byterun/.depend b/byterun/.depend index b92cc6de2a..4ff7c0c693 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -105,13 +105,13 @@ printexc.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ roots.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ freelist.h minor_gc.h globroots.h stacks.h +signals_byt.o: signals_byt.c config.h ../config/m.h ../config/s.h \ + compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ + minor_gc.h osdeps.h signals.h signals_machdep.h signals.o: signals.c alloc.h compatibility.h misc.h config.h \ ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ sys.h -signals_byt.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h stacks.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ minor_gc.h @@ -243,13 +243,13 @@ printexc.d.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ roots.d.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ freelist.h minor_gc.h globroots.h stacks.h +signals_byt.d.o: signals_byt.c config.h ../config/m.h ../config/s.h \ + compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ + minor_gc.h osdeps.h signals.h signals_machdep.h signals.d.o: signals.c alloc.h compatibility.h misc.h config.h \ ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ sys.h -signals_byt.d.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h stacks.d.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ minor_gc.h @@ -379,13 +379,13 @@ printexc.pic.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ roots.pic.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ freelist.h minor_gc.h globroots.h stacks.h +signals_byt.pic.o: signals_byt.c config.h ../config/m.h ../config/s.h \ + compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ + minor_gc.h osdeps.h signals.h signals_machdep.h signals.pic.o: signals.c alloc.h compatibility.h misc.h config.h \ ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ sys.h -signals_byt.pic.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h stacks.pic.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ minor_gc.h diff --git a/byterun/backtrace.c b/byterun/backtrace.c index 2e645ab512..1afce8ae2a 100644 --- a/byterun/backtrace.c +++ b/byterun/backtrace.c @@ -39,6 +39,7 @@ CAMLexport int caml_backtrace_active = 0; CAMLexport int caml_backtrace_pos = 0; CAMLexport code_t * caml_backtrace_buffer = NULL; CAMLexport value caml_backtrace_last_exn = Val_unit; +CAMLexport char * caml_cds_file = NULL; #define BACKTRACE_BUFFER_SIZE 1024 /* Location of fields in the Instruct.debug_event record */ @@ -135,7 +136,11 @@ static value read_debug_info(void) uint32 num_events, orig, i; value evl, l; - exec_name = caml_exe_name; + if (caml_cds_file != NULL) { + exec_name = caml_cds_file; + } else { + exec_name = caml_exe_name; + } fd = caml_attempt_open(&exec_name, &trail, 1); if (fd < 0) CAMLreturn(Val_false); caml_read_section_descriptors(fd, &trail); diff --git a/byterun/backtrace.h b/byterun/backtrace.h index c2a21c2088..2d9c202eaa 100644 --- a/byterun/backtrace.h +++ b/byterun/backtrace.h @@ -22,6 +22,7 @@ CAMLextern int caml_backtrace_active; CAMLextern int caml_backtrace_pos; CAMLextern code_t * caml_backtrace_buffer; CAMLextern value caml_backtrace_last_exn; +CAMLextern char * caml_cds_file; CAMLprim value caml_record_backtrace(value vflag); #ifndef NATIVE_CODE diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index ec9c82ab12..0083f36734 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -41,7 +41,7 @@ intnat caml_stat_minor_collections = 0, caml_stat_compactions = 0, caml_stat_heap_chunks = 0; -extern asize_t caml_major_heap_increment; /* bytes; see major_gc.c */ +extern uintnat caml_major_heap_increment; /* bytes; see major_gc.c */ extern uintnat caml_percent_free; /* see major_gc.c */ extern uintnat caml_percent_max; /* see compact.c */ extern uintnat caml_allocation_policy; /* see freelist.c */ @@ -419,7 +419,7 @@ static void test_and_compact (void) fp = 100.0 * caml_fl_cur_size / (Wsize_bsize (caml_stat_heap_size) - caml_fl_cur_size); - if (fp > 1000000.0) fp = 1000000.0; + if (fp > 999999.0) fp = 999999.0; caml_gc_message (0x200, "Estimated overhead (lower bound) = %" ARCH_INTNAT_PRINTF_FORMAT "u%%\n", (uintnat) fp); diff --git a/byterun/interp.c b/byterun/interp.c index bbd8367e8a..a162a1327d 100644 --- a/byterun/interp.c +++ b/byterun/interp.c @@ -157,7 +157,8 @@ sp is a local copy of the global variable caml_extern_sp. */ #define SP_REG asm("a4") #define ACCU_REG asm("d7") #endif -#ifdef __arm__ +/* PR#4953: these specific registers not available in Thumb mode */ +#if defined (__arm__) && !defined(__thumb__) #define PC_REG asm("r9") #define SP_REG asm("r8") #define ACCU_REG asm("r7") diff --git a/byterun/major_gc.c b/byterun/major_gc.c index 1298498f48..b9ec8cbfe0 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -30,7 +30,7 @@ #include "weak.h" uintnat caml_percent_free; -intnat caml_major_heap_increment; +uintnat caml_major_heap_increment; CAMLexport char *caml_heap_start; char *caml_gc_sweep_hp; int caml_gc_phase; /* always Phase_mark, Phase_sweep, or Phase_idle */ diff --git a/byterun/obj.c b/byterun/obj.c index ded8416b1e..5e15c47dae 100644 --- a/byterun/obj.c +++ b/byterun/obj.c @@ -165,6 +165,10 @@ CAMLprim value caml_obj_truncate (value v, value newsize) return Val_unit; } +CAMLprim value caml_obj_add_offset (value v, value offset) +{ + return v + Int32_val (offset); +} /* The following functions are used in stdlib/lazy.ml. They are not written in O'Caml because they must be atomic with respect diff --git a/byterun/startup.c b/byterun/startup.c index 34d6f315c9..419d49be60 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -439,12 +439,18 @@ CAMLexport void caml_startup_code( char **argv) { value res; + char* cds_file; caml_init_ieee_floats(); caml_init_custom_operations(); #ifdef DEBUG caml_verb_gc = 63; #endif + cds_file = getenv("CAML_DEBUG_FILE"); + if (cds_file != NULL) { + caml_cds_file = caml_stat_alloc(strlen(cds_file) + 1); + strcpy(caml_cds_file, cds_file); + } parse_camlrunparam(); caml_external_raise = NULL; /* Initialize the abstract machine */ @@ -454,8 +460,17 @@ CAMLexport void caml_startup_code( init_atoms(); /* Initialize the interpreter */ caml_interprete(NULL, 0); + /* Initialize the debugger, if needed */ + caml_debugger_init(); /* Load the code */ caml_start_code = code; + caml_code_size = code_size; + if (caml_debugger_in_use) { + int len, i; + len = code_size / sizeof(opcode_t); + caml_saved_code = (unsigned char *) caml_stat_alloc(len); + for (i = 0; i < len; i++) caml_saved_code[i] = caml_start_code[i]; + } #ifdef THREADED_CODE caml_thread_code(caml_start_code, code_size); #endif @@ -469,10 +484,19 @@ CAMLexport void caml_startup_code( /* Record the sections (for caml_get_section_table in meta.c) */ caml_section_table = section_table; caml_section_table_size = section_table_size; - /* Run the code */ + /* Initialize system libraries */ caml_init_exceptions(); caml_sys_init("", argv); - res = caml_interprete(caml_start_code, code_size); - if (Is_exception_result(res)) - caml_fatal_uncaught_exception(Extract_exception(res)); + /* Execute the program */ + caml_debugger(PROGRAM_START); + res = caml_interprete(caml_start_code, caml_code_size); + if (Is_exception_result(res)) { + caml_exn_bucket = Extract_exception(res); + if (caml_debugger_in_use) { + caml_extern_sp = &caml_exn_bucket; /* The debugger needs the + exception value.*/ + caml_debugger(UNCAUGHT_EXC); + } + caml_fatal_uncaught_exception(caml_exn_bucket); + } } |
