summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorherman ten brugge <hermantenbrugge@home.nl>2024-02-15 07:17:15 +0100
committerherman ten brugge <hermantenbrugge@home.nl>2024-02-15 07:17:15 +0100
commit8d8d75ca75bc8d2dfd4ff870e9276811a29b9da3 (patch)
treebd4c8f312ba7a4709562cc79a4548bbcd7e8f1f5
parentf2e8b2ad792bd6b494f0af19b292bc9670014921 (diff)
Allow tcc to run with bounds checking enabled
tcc failed to run with bounds checking enabled because the functions rt_wait_sem, rt_post_sem and _rt_error where defined twice. This is solved by making them weak in tccrun.c Also a nested lock was present when setting TCC_BOUNDS_PRINT_CALLS=1 This is solved in lib/bt-exe.c by moving lock/unlock code. Also added a testcase in tests/Makefile to test tcc with bounds checking enabled.
-rw-r--r--lib/bt-exe.c10
-rw-r--r--tccrun.c12
-rw-r--r--tests/Makefile12
3 files changed, 25 insertions, 9 deletions
diff --git a/lib/bt-exe.c b/lib/bt-exe.c
index 258ab0f..2960dd0 100644
--- a/lib/bt-exe.c
+++ b/lib/bt-exe.c
@@ -18,7 +18,6 @@ void __bt_init(rt_context *p, int is_exe)
__attribute__((weak)) int main();
__attribute__((weak)) void __bound_init(void*, int);
- WAIT_SEM(&rt_sem);
//fprintf(stderr, "__bt_init %d %p %p %p\n", is_exe, p, p->stab_sym, p->bounds_start), fflush(stderr);
/* call __bound_init here due to redirection of sigaction */
@@ -27,13 +26,14 @@ void __bt_init(rt_context *p, int is_exe)
__bound_init(p->bounds_start, -1);
/* add to chain */
+ WAIT_SEM(&rt_sem);
p->next = g_rc, g_rc = p;
- if (is_exe) {
+ if (is_exe)
/* we are the executable (not a dll) */
p->top_func = main;
- set_exception_handler();
- }
POST_SEM(&rt_sem);
+ if (is_exe)
+ set_exception_handler();
}
__declspec(dllexport)
@@ -42,13 +42,13 @@ void __bt_exit(rt_context *p)
struct rt_context *rc, **pp;
__attribute__((weak)) void __bound_exit_dll(void*);
- WAIT_SEM(&rt_sem);
//fprintf(stderr, "__bt_exit %d %p\n", !!p->top_func, p);
if (p->bounds_start)
__bound_exit_dll(p->bounds_start);
/* remove from chain */
+ WAIT_SEM(&rt_sem);
for (pp = &g_rc; rc = *pp, rc; pp = &rc->next)
if (rc == p) {
*pp = rc->next;
diff --git a/tccrun.c b/tccrun.c
index ff8849e..54aa9d6 100644
--- a/tccrun.c
+++ b/tccrun.c
@@ -66,9 +66,15 @@ TCC_SEM(static rt_sem);
static int signal_set;
static void set_exception_handler(void);
-int _rt_error(rt_frame *f, const char *msg, const char *fmt, va_list ap);
-void rt_wait_sem(void) { WAIT_SEM(&rt_sem); }
-void rt_post_sem(void) { POST_SEM(&rt_sem); }
+#ifdef _WIN32
+#define ATTR_WEAK
+#else
+#define ATTR_WEAK __attribute__((weak))
+#endif
+int ATTR_WEAK _rt_error(rt_frame *f, const char *msg, const char *fmt, va_list ap);
+void ATTR_WEAK rt_wait_sem(void) { WAIT_SEM(&rt_sem); }
+void ATTR_WEAK rt_post_sem(void) { POST_SEM(&rt_sem); }
+#undef ATTR_WEAK
#endif /* def CONFIG_TCC_BACKTRACE */
/* handle exit/atexit for tcc_run() -- thread-unsafe */
diff --git a/tests/Makefile b/tests/Makefile
index f5b91ad..2d6f64f 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -28,6 +28,9 @@ TESTS = \
ifneq ($(CONFIG_bcheck),no)
TESTS += btest test1b
+ ifndef CONFIG_WIN32
+ TESTS += tccb
+ endif
endif
ifeq ($(CONFIG_dll),no)
TESTS := $(filter-out dlltest, $(TESTS))
@@ -198,6 +201,13 @@ btest: boundtest.c
done ;\
echo Bound test OK
+tccb:
+ @echo ------------ $@ ------------
+ $(TCC) -b $(TOPSRC)/tcc.c $(TCCFLAGS) $(NATIVE_DEFINES) -o v1-tcc$(EXESUF)
+ mv v1-tcc$(EXESUF) v2-tcc$(EXESUF)
+ ./v2-tcc$(EXESUF) -b $(TOPSRC)/tcc.c $(TCCFLAGS) $(NATIVE_DEFINES) -o v1-tcc$(EXESUF)
+ cmp -s v1-tcc$(EXESUF) v2-tcc$(EXESUF) && echo "Bound-Test tcc OK"
+
# speed test
speedtest: ex2 ex3
@echo ------------ $@ ------------
@@ -260,7 +270,7 @@ vla_test-run: vla_test$(EXESUF)
@echo ------------ $@ ------------
./vla_test$(EXESUF)
-.PHONY: abitest vla_test
+.PHONY: abitest vla_test tccb
asm-c-connect$(EXESUF): asm-c-connect-1.c asm-c-connect-2.c
$(TCC) -o $@ $^