Files
tinycc/tests/tests2
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
..
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2020-01-20 05:48:48 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 14:27:38 +01:00
2017-07-10 22:20:34 +02:00
2017-07-10 22:20:34 +02:00
2013-02-05 13:22:36 +01:00
2013-02-05 14:27:38 +01:00
2013-02-05 14:27:38 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2014-04-07 11:20:45 +02:00
2014-04-07 11:20:45 +02:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2017-07-14 17:42:48 +02:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2016-12-18 05:20:14 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 14:27:38 +01:00
2013-02-05 14:27:38 +01:00
2013-02-05 13:22:36 +01:00
2019-12-12 12:56:06 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 14:27:38 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 14:27:38 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2013-02-05 13:22:36 +01:00
2019-04-09 04:39:38 +02:00
2016-03-24 15:44:01 +01:00
2016-04-05 13:05:09 +03:00
2018-01-05 02:19:26 +01:00
2018-01-05 02:19:26 +01:00
2019-12-16 21:37:44 +01:00
2019-06-24 11:40:01 +02:00
2020-08-09 07:50:34 +02:00
2020-08-09 08:28:45 +02:00
2020-08-09 07:50:34 +02:00
2018-06-01 12:52:01 +02:00
2019-12-16 21:37:44 +01:00
2020-07-06 13:00:47 +02:00
2020-07-06 13:00:47 +02:00
2019-05-03 12:32:55 +02:00
2019-05-03 12:32:55 +02:00
2019-06-17 19:08:08 +02:00
2019-10-22 20:43:30 +02:00
2019-10-29 12:02:58 +01:00
2020-01-19 11:46:07 +01:00
2020-01-19 11:46:07 +01:00
2020-01-19 11:46:07 +01:00
2013-02-05 13:22:36 +01:00