tinycc/lib
herman ten brugge 853a498f2c Fix boundschecking for signal/sigaction/fork
The BOUNDS_CHECKING_ON/BOUNDS_CHECKING_OFF is not working for
signal/sigaction/fork. The reason is that the code stops bound checking
for the whole application. This result in wrong handling of
__bound_local_new/__bound_local_delete and malloc/calloc/realloc/free.
Consider the following code:

void tst(int n) {
  int i, arr[n];
  for (i = 0; i < n; i++) arr[i] = 0;
}

void *some_thread(void *dummy) {
  while (running) { tst(10); tst(20); }
}

void signal_handler(int sig) { ... }

When the signal handler is called the some_thread code can be interrupted when
is just registered the arr[10] data. When the signal handler is leaved the
arr[10] is still registered and did not see the call to deregister arr[10] and
then register arr[20]. The code resumes when tst(20) is running. This results
in a bound checking error when i >= 10.

To solve the above problem I changed the bound checking code to use
tls (thread local storage) for the no_checking variable.
This also makes it now possible to redirect signal/sigaction/fork code
through the bound checking library and disable checking when a signal is
running and to correct the bounds_sem for the fork child process.
The BOUNDS_CHECKING_ON/BOUNDS_CHECKING_OFF is not needed any more for
signal/sigaction/fork. In fact I could remove them from all my applications.

The use of the tls function code slows down the code by about 10%.
So if the slowdown due to bound checking was 5. It is now 5.5 times slower.

For x86_64/i386 I also allowed to use __thread variable in bcheck.c when
compiled with gcc with:
make x86_64-libtcc1-usegcc=yes
make i386-libtcc1-usegcc=yes
This makes code run faster due to use of gcc and __thread variable.
With the __thread variable there is no 10% slowdown.
For other targets this does not work because stabs is not supported.

Changes:

lib/bcheck.c:
- Add TRY_SEM
- Add HAVE_SIGNAL/HAVE_SIGACTION/HAVE_FORK/HAVE_TLS_FUNC/HAVE_TLS_VAR
  - HAVE_SIGNAL: redirect signal() call if set.
  - HAVE_SIGACTION: redirect sigaction() call if set.
  - HAVE_FORK: redirect fork() call if set.
  - HAVE_TLS_FUNC: If target has tls function calls.
  - HAVE_TLS_VAR: If target has __thread tls support.
- Replace all no_checking refecrences to NO_CHECKING_SET/NO_CHECKING_GET macros

tcc-doc.texi:
- Remove examples for signal/sigaction/fork code.
- Add some explanation for signal/sigaction/fork code.
- Add documentaion for __bounds_checking().

tccelf.c:
- Add support for SHF_TLS

tests/tests2/114_bound_signal.c:
- Remove BOUNDS_CHECKING_ON/BOUNDS_CHECKING_OFF
- Add code to trigger failure when tls is not working.

x86_64-link.c:
- Add support for R_X86_64_TLSGD/R_X86_64_TLSLD/R_X86_64_DTPOFF32/R_X86_64_TPOFF32

i386-link.c:
- Add support for R_386_TLS_GD/R_386_TLS_LDM/R_386_TLS_LDO_32/R_386_TLS_LE
2020-09-08 14:31:58 +02:00
..
alloca86_64-bt.S rework leading underscores 2020-07-06 13:00:47 +02:00
alloca86_64.S rework leading underscores 2020-07-06 13:00:47 +02:00
alloca86-bt.S rework leading underscores 2020-07-06 13:00:47 +02:00
alloca86.S rework leading underscores 2020-07-06 13:00:47 +02:00
alloca-arm.S cross-compilers: allow individual configuration 2017-02-23 08:41:57 +01:00
armeabi.c cross-compilers: allow individual configuration 2017-02-23 08:41:57 +01:00
armflush.c arm: Don't override syscall implementation 2019-11-06 01:01:56 +11:00
bcheck.c Fix boundschecking for signal/sigaction/fork 2020-09-08 14:31:58 +02:00
bt-dll.c rework leading underscores 2020-07-06 13:00:47 +02:00
bt-exe.c macos: support bounds checking 2020-06-20 22:14:56 +02:00
bt-log.c rework leading underscores 2020-07-06 13:00:47 +02:00
dsohandle.c Define __dso_handle in libtcc1.a 2019-06-22 01:38:43 +02:00
fetch_and_add_arm64.S Fix fetch_and_add code 2020-06-18 07:21:48 +02:00
fetch_and_add_arm.S Call __bound_main_arg at startup 2020-06-22 14:55:27 +02:00
fetch_and_add_riscv64.S Fix fetch_and_add code 2020-06-18 07:21:48 +02:00
lib-arm64.c Fix conversions of subnormals to long double 2020-07-15 22:02:02 +02:00
libtcc1.c tccgen: nodata_wanted fix, default ONE_SOURCE, etc... 2017-07-23 21:24:11 +02:00
Makefile some cleanups related to recent commits 2020-07-06 13:00:47 +02:00
va_list.c stdarg: always have the __builtin_va_* available 2020-04-15 22:06:52 +02:00