https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90912
Bug ID: 90912 Summary: Thread-local storage not working properly when compiling code with -fPIC and optimization on Solaris Product: gcc Version: 7.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: wpk at culm dot net Target Milestone: --- Created attachment 46497 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46497&action=edit Preprocessed minimal testcase When compiling with -fPIC and any level of optimization the following code doesn't work properly: ``` #include <stdio.h> static __thread int tls[4]; void initialize(void) { tls[0] = 1; tls[1] = 2; tls[2] = 3; tls[3] = 4; printf("initialize %u %u %u %u, ", tls[0], tls[1], tls[2], tls[3]); } int main() { initialize(); printf("value %u %u %u %u\n", tls[0], tls[1], tls[2], tls[3]); } ``` The result depends on the optimization level: -O0 initialize 1 2 3 4, value 1 2 3 4 -O1 initialize 1 2 3 4, value 4 4 4 4 -O2 initialize 1 2 3 4, value 3 3 3 3 -O3 initialize 1 2 3 4, value 1 1 1 1 This makes thread-local storage unusable in libraries on Solaris. gcc -v -O2 -fPIC -save-temps tls-test.c output: ``` Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/lto-wrapper Target: x86_64-pc-solaris2.11 Configured with: /builds/ulhg/workspace/Solaris_11u4/Userland/full-build/02a-build-i386/components/gcc7/gcc-7.3.0/configure --prefix=/usr/gcc/7 --mandir=/usr/gcc/7/share/man --bindir=/usr/gcc/7/bin --sbindir=/us Thread model: posix gcc version 7.3.0 (GCC) COLLECT_GCC_OPTIONS='-v' '-O2' '-fPIC' '-save-temps' '-mtune=generic' '-march=x86-64' /usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/cc1 -E -quiet -v tls-test.c -mtune=generic -march=x86-64 -fPIC -O2 -fpch-preprocess -o tls-test.i ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/../../../../x86_64-pc-solaris2.11/include" #include "..." search starts here: #include <...> search starts here: /usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/include /usr/gcc/7/include /usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/include-fixed /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-O2' '-fPIC' '-save-temps' '-mtune=generic' '-march=x86-64' /usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/cc1 -fpreprocessed tls-test.i -quiet -dumpbase tls-test.c -mtune=generic -march=x86-64 -auxbase tls-test -O2 -version -fPIC -o tls-test.s GNU C11 (GCC) version 7.3.0 (x86_64-pc-solaris2.11) compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 3.1.5, MPC version 1.0.3, isl version isl-0.18-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU C11 (GCC) version 7.3.0 (x86_64-pc-solaris2.11) compiled by GNU C version 7.3.0, GMP version 6.1.2, MPFR version 3.1.5, MPC version 1.0.3, isl version isl-0.18-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 295b202e34f5835e529741e171b5a9d2 COLLECT_GCC_OPTIONS='-v' '-O2' '-fPIC' '-save-temps' '-mtune=generic' '-march=x86-64' /usr/gnu/bin/as -v -V -Qy -s --64 -o tls-test.o tls-test.s GNU assembler version 2.30 (x86_64-pc-solaris2.11) using BFD version (GNU Binutils) 2.30 COMPILER_PATH=/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/:/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/:/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/:/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/:/usr/gcc/7/ LIBRARY_PATH=/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/:/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/../../../amd64/:/lib/amd64/:/usr/lib/amd64/:/usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/../../../:/l COLLECT_GCC_OPTIONS='-v' '-O2' '-fPIC' '-save-temps' '-mtune=generic' '-march=x86-64' /usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/collect2 -V -Y P,/lib/amd64:/usr/lib/amd64 -Qy /usr/lib/amd64/crt1.o /usr/gcc/7/lib/gcc/x86_64-pc-solaris2.11/7.3.0/crtp.o /usr/lib/amd64/crti.o /usr/lib/amd64/val ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.3159 COLLECT_GCC_OPTIONS='-v' '-O2' '-fPIC' '-save-temps' '-mtune=generic' '-march=x86-64' ```