summaryrefslogtreecommitdiff
path: root/byterun
diff options
context:
space:
mode:
Diffstat (limited to 'byterun')
-rw-r--r--byterun/.cvsignore2
-rw-r--r--byterun/.depend18
-rw-r--r--byterun/backtrace.c7
-rw-r--r--byterun/backtrace.h1
-rw-r--r--byterun/gc_ctrl.c4
-rw-r--r--byterun/interp.c3
-rw-r--r--byterun/major_gc.c2
-rw-r--r--byterun/obj.c4
-rw-r--r--byterun/startup.c32
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);
+ }
}