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'
```

Reply via email to