[COMMITTED] BZ#18383: Add test case for large alignment in TLS blocks.

Message ID CAMe9rOr4kRxVYXnrxhAm7ctkxMEJtbMx3Qwhza6LUyYj03yjZw@mail.gmail.com
State Committed
Headers

Commit Message

H.J. Lu May 7, 2015, 8:30 p.m. UTC
  On Thu, May 7, 2015 at 1:15 PM, Roland McGrath <roland@hack.frob.com> wrote:
> Note that your change only affects static linking, while the bug on ARM
> affects dynamic linking as well.
>
> On arm-linux-gnueabihf (test runs under qemu), your change did not fix
> tst-tlsalign-static and it caused these regressions:
>

Someone needs to investigate TLS_DTV_AT_TP targets.  Here is a patch
for TLS_TCB_AT_TP targets.  OK for master?
  

Comments

Roland McGrath May 7, 2015, 9:10 p.m. UTC | #1
The log entry needs the BZ# marker.  

I'm having a hard time finding the calculation in the dynamic-linking case
that corresponds to this piece of __libc_setup_tls.  Since there are two
places where the logic should match, we really should make it much more
clear how they relate.  If there isn't any obvious refactoring that would
share more of this logic between the two cases, can you at least add a
comment in __libc_setup_tls that points to the implementation of the
matching logic in the dynamic-linking case?


Thanks,
Roland
  

Patch

From dbb8cf8d1d0acdaa9384c995b18f50083ba8f4c9 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 7 May 2015 13:26:34 -0700
Subject: [PATCH] Fix a typo in __libc_setup_tls

We need to align TCB offset to the maximum alignment for TLS_TCB_AT_TP
targets.

	* csu/libc-tls.c (__libc_setup_tls): Align TCB offset to the
	maximum alignment for TLS_TCB_AT_TP targets.
---
 csu/libc-tls.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/csu/libc-tls.c b/csu/libc-tls.c
index 64d1779..eead735 100644
--- a/csu/libc-tls.c
+++ b/csu/libc-tls.c
@@ -138,7 +138,7 @@  __libc_setup_tls (size_t tcbsize, size_t tcbalign)
      to request some surplus that permits dynamic loading of modules with
      IE-model TLS.  */
 #if TLS_TCB_AT_TP
-  tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign);
+  tcb_offset = roundup (memsz + GL(dl_tls_static_size), max_align);
   tlsblock = __sbrk (tcb_offset + tcbsize + max_align);
 #elif TLS_DTV_AT_TP
   tcb_offset = roundup (tcbsize, align ?: 1);
-- 
1.9.3