diff options
| author | grischka <grischka> | 2010-09-15 13:43:40 +0200 |
|---|---|---|
| committer | grischka <grischka> | 2011-07-14 19:11:12 +0200 |
| commit | d483ab322f797972bb7e55624cd8c406a240a2ad (patch) | |
| tree | 623ddfecd6cfbce928d420068b3c92f46f259186 /tccrun.c | |
| parent | 08083ddb2141725baff51787b1a00d1eb7037269 (diff) | |
| download | tinycc-d483ab322f797972bb7e55624cd8c406a240a2ad.tar.gz tinycc-d483ab322f797972bb7e55624cd8c406a240a2ad.tar.bz2 | |
tccrun: win32: improve exception handler
Diffstat (limited to 'tccrun.c')
| -rw-r--r-- | tccrun.c | 57 |
1 files changed, 29 insertions, 28 deletions
@@ -76,6 +76,7 @@ int tcc_relocate(TCCState *s1) int tcc_run(TCCState *s1, int argc, char **argv) { int (*prog_main)(int, char **); + int ret; if (tcc_relocate(s1) < 0) return -1; @@ -83,38 +84,30 @@ int tcc_run(TCCState *s1, int argc, char **argv) prog_main = tcc_get_symbol_err(s1, "main"); #ifdef CONFIG_TCC_BACKTRACE - if (s1->do_debug) + if (s1->do_debug) { set_exception_handler(); + rt_prog_main = prog_main; + } #endif #ifdef CONFIG_TCC_BCHECK if (s1->do_bounds_check) { void (*bound_init)(void); void (*bound_exit)(void); - int ret; /* set error function */ rt_bound_error_msg = tcc_get_symbol_err(s1, "__bound_error_msg"); - rt_prog_main = prog_main; /* XXX: use .init section so that it also work in binary ? */ bound_init = tcc_get_symbol_err(s1, "__bound_init"); bound_exit = tcc_get_symbol_err(s1, "__bound_exit"); bound_init(); ret = (*prog_main)(argc, argv); bound_exit(); - return ret; - } -#endif - -#ifdef TCC_TARGET_PE - { - unsigned char *p = tcc_get_symbol(s1, "tinyc_no_getbp"); - if (p) *p = 0; - } + } else #endif - return (*prog_main)(argc, argv); + ret = (*prog_main)(argc, argv); + return ret; } - /* relocate code. Return -1 on error, required size if ptr is NULL, otherwise copy code into buffer passed by the caller */ static int tcc_relocate_ex(TCCState *s1, void *ptr) @@ -370,9 +363,10 @@ static void rt_error(ucontext_t *uc, const char *fmt, ...) uplong pc; int i; - va_start(ap, fmt); fprintf(stderr, "Runtime error: "); + va_start(ap, fmt); vfprintf(stderr, fmt, ap); + va_end(ap); fprintf(stderr, "\n"); for(i=0;i<num_callers;i++) { @@ -382,8 +376,6 @@ static void rt_error(ucontext_t *uc, const char *fmt, ...) if (pc == (uplong)rt_prog_main && pc) break; } - exit(255); - va_end(ap); } /* ------------------------------------------------------------- */ @@ -581,18 +573,27 @@ static int rt_get_caller_pc(unsigned long *paddr, static long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info) { - CONTEXT *uc = ex_info->ContextRecord; -/* EXCEPTION_RECORD *er = ex_info->ExceptionRecord; - printf("CPU exception: code=%08lx addr=%p\n", - er->ExceptionCode, er->ExceptionAddress); -*/ - if (rt_bound_error_msg && *rt_bound_error_msg) - rt_error(uc, *rt_bound_error_msg); - else - rt_error(uc, "dereferencing invalid pointer"); - exit(255); - //return EXCEPTION_CONTINUE_SEARCH; + CONTEXT *uc = ex_info->ContextRecord; + switch (er->ExceptionCode) { + case EXCEPTION_ACCESS_VIOLATION: + if (rt_bound_error_msg && *rt_bound_error_msg) + rt_error(uc, *rt_bound_error_msg); + else + rt_error(uc, "access violation"); + break; + case EXCEPTION_STACK_OVERFLOW: + rt_error(uc, "stack overflow"); + break; + case EXCEPTION_INT_DIVIDE_BY_ZERO: + rt_error(uc, "division by zero"); + break; + default: + rt_error(uc, "exception caught"); + break; + } + exit(-1); + return EXCEPTION_CONTINUE_SEARCH; } /* Generate a stack backtrace when a CPU exception occurs. */ |
