forked from Imagelibrary/binutils-gdb
This commit introduces a new test, gdb.base/tls-nothreads.exp. It has a test case, a C file, which has several TLS variables in the main program, which, once compiled and linked, should end up (in ELF files) in .tdata and .tbss. The test compiles the program in a number of different ways, making sure that each variable is accessible regardless of how it was compiled. Note that some of the compilation scenarios end up with a statically linked executable. Prior to this series of commits, accessing TLS variables from a statically linked program on Linux did not work. For certain targets (x86_64, aarch64, s390x, riscv, and ppc64), all on Linux, support has been added to GDB for accessing thread local storage in statically linked executables. This test is important for testing those build scenarios. But it's also important to make sure that GDB's internal TLS support works for other scenarios too. In order to accomplish that, the tests are also run in a mode which forces the internal support to be used. It also adds a new file, gdb.base/tls-common.exp.tcl, which includes some common definitions used by the three new TLS tests, including the one added by this commit. In particular, it sets a TCL variable, 'internal_tls_linux_targets' which list the targets mentioned earlier. This means that as internal TLS support is added for other targets, the target should be listed in just one file as opposed to three (or more if other tests using tls-common.exp.tcl are added). Tested-By: Luis Machado <luis.machado@arm.com> Approved-By: Luis Machado <luis.machado@arm.com>
58 lines
1.3 KiB
C
58 lines
1.3 KiB
C
/* This testcase is part of GDB, the GNU debugger.
|
|
|
|
Copyright 2024 Free Software Foundation, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
__thread int tls_tbss_1;
|
|
__thread int tls_tbss_2;
|
|
__thread int tls_tbss_3;
|
|
|
|
__thread int tls_tdata_1 = 21;
|
|
__thread int tls_tdata_2 = 22;
|
|
__thread int tls_tdata_3 = 23;
|
|
|
|
volatile int data;
|
|
|
|
void
|
|
use_it (int a)
|
|
{
|
|
data = a;
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
use_it (-1);
|
|
|
|
tls_tbss_1 = 24; /* main-breakpoint-1 */
|
|
tls_tbss_2 = 25;
|
|
tls_tbss_3 = 26;
|
|
|
|
tls_tdata_1 = 42;
|
|
tls_tdata_2 = 43;
|
|
tls_tdata_3 = 44;
|
|
|
|
use_it (tls_tbss_1);
|
|
use_it (tls_tbss_2);
|
|
use_it (tls_tbss_3);
|
|
use_it (tls_tdata_1);
|
|
use_it (tls_tdata_2);
|
|
use_it (tls_tdata_3);
|
|
|
|
use_it (100); /* main-breakpoint-2 */
|
|
|
|
return 0;
|
|
}
|