Files
binutils-gdb/gdb/testsuite/gdb.base/tls-nothreads.c
Kevin Buettner de893f31c1 New test - gdb.base/tls-nothreads.exp
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>
2025-04-24 09:54:43 -07:00

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;
}