Bug 24465 - [4.1 Regression] -mminimal-toc miscompilation of __thread vars
Summary: [4.1 Regression] -mminimal-toc miscompilation of __thread vars
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 4.1.0
: P2 critical
Target Milestone: 3.4.5
Assignee: Alan Modra
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2005-10-21 03:40 UTC by Alan Modra
Modified: 2005-10-21 12:59 UTC (History)
1 user (show)

See Also:
Host:
Target: powerpc64-linux
Build:
Known to work: 3.4.5 4.0.3 4.1.0
Known to fail: 4.0.0 3.4.4 4.0.2
Last reconfirmed: 2005-10-21 03:47:35


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alan Modra 2005-10-21 03:40:46 UTC
RS6000_PIC_OFFSET_TABLE_REGNUM isn't being set up for functions that don't need a constant pool but access __thread vars using __tls_get_addr.

/* Fails with -m64 -mminimal-toc -fPIC */
static __thread int x;
int foo (void)
{
  return x;
}

This is the reason why powerpc64 has been getting lots of libjava failures since this libjava change: 2005-09-27  Tom Tromey  <tromey@redhat.com>
Comment 1 Andrew Pinski 2005-10-21 03:47:35 UTC
Confirmed, This is a latent bug but shows up as testsuite regressions which is why I am marking it as a regression.
Comment 2 Alan Modra 2005-10-21 05:05:51 UTC
Actually, it's not that RS6000_PIC_OFFSET_TABLE_REGNUM isn't being set up, it's that RS6000_PIC_OFFSET_TABLE_REGNUM is wrongly being using for tls accesses.  As currently implemented by gcc, powerpc tls uses x@got@tlsgd and similar.  ie. we are expecting the linker to manage allocation of tls entries in the got rather than having gcc allocate them itself in toc sections.  This means that powerpc64 should use r2 for tls always, even when -mminimal-toc.

Testing the following fix.

Index: gcc/config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.872
diff -u -p -r1.872 rs6000.c
--- gcc/config/rs6000/rs6000.c	6 Oct 2005 22:58:59 -0000	1.872
+++ gcc/config/rs6000/rs6000.c	21 Oct 2005 05:02:57 -0000
@@ -2979,7 +2979,7 @@ rs6000_legitimize_tls_address (rtx addr,
       rtx r3, got, tga, tmp1, tmp2, eqv;
 
       if (TARGET_64BIT)
-	got = gen_rtx_REG (Pmode, TOC_REGISTER);
+	got = gen_rtx_REG (Pmode, 2);
       else
 	{
 	  if (flag_pic == 1)
Comment 3 GCC Commits 2005-10-21 07:33:37 UTC
Subject: Bug 24465

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	amodra@gcc.gnu.org	2005-10-21 07:33:30

Modified files:
	gcc            : ChangeLog 
	gcc/config/rs6000: rs6000.c 

Log message:
	PR target/24465
	* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Always
	use r2 for 64-bit tls .got access.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.10197&r2=2.10198
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/rs6000/rs6000.c.diff?cvsroot=gcc&r1=1.872&r2=1.873

Comment 4 GCC Commits 2005-10-21 07:37:05 UTC
Subject: Bug 24465

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-4_0-branch
Changes by:	amodra@gcc.gnu.org	2005-10-21 07:36:56

Modified files:
	gcc            : ChangeLog 
	gcc/config/rs6000: rs6000.c 

Log message:
	PR target/24465
	* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Always
	use r2 for 64-bit tls .got access.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.475&r2=2.7592.2.476
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/rs6000/rs6000.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.788.2.11&r2=1.788.2.12

Comment 5 GCC Commits 2005-10-21 07:48:32 UTC
Subject: Bug 24465

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_4-branch
Changes by:	amodra@gcc.gnu.org	2005-10-21 07:48:26

Modified files:
	gcc            : ChangeLog 
	gcc/config/rs6000: rs6000.c 

Log message:
	PR target/24465
	* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Always
	use r2 for 64-bit tls .got access.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.925&r2=2.2326.2.926
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/rs6000/rs6000.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.576.2.46&r2=1.576.2.47

Comment 6 Alan Modra 2005-10-21 07:49:20 UTC
Fixed on all active branches