This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Optimizes out TLS variable called in a child function


During my adventures in wine and gcc5 I've had to compile updated wine-gecko and wine-mono binaries as they get updated at various periods alongside wine. I encountered an issue with gcc5 not compiling a TLS routine in wine-mono. I created a simple test case and can see the same failure result with the test case in gcc 4.8 and 4.9 as well as 5. My test case may be doing something wrong, and if it is I may be able to fix wine-mono, but the test case fails in a suspiciously single way that looks like a gcc bug.

The attached test case is getting the offset location of a TLS variable. When compiled with -O0 the test case compiles. When compiled with -O1 the test case will not compile with an error for an undefined reference to the TLS variable. If you move the THREAD_VAR_OFFSET macro call to main() gcc will compile without error. Any suggestions?

Thanks,
Michael

#define THREAD_VAR_OFFSET(var,offset) do { long int foo; __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (foo)); offset = foo; } while ( 0 )

static __thread void *foo_tls;


int foo( void )
{
    int offset;

    THREAD_VAR_OFFSET( foo_tls, offset );

    return offset;
}


int main( int argc, char *argv[] )
{
    foo(  );

    return 0;
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]