From patchwork Thu Mar 5 23:40:28 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 446959 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 8EE161400DD for ; Fri, 6 Mar 2015 10:40:38 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass reason="1024-bit key; unprotected key" header.d=sourceware.org header.i=@sourceware.org header.b=byoKX3f2; dkim-adsp=none (unprotected policy); dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:content-type :content-transfer-encoding:from:to:subject:message-id:date; q= dns; s=default; b=Bc/Po7ewyKVJdMayyxggi078YRUj91ffeEHKhpveZpvFve +alcCqjqC9oUUGRR4trEW77ted8RT+TMgWnebNBIwsuci2CuxFEsBVOFOijKLI/8 y18Fy6wa1g8Fe5QHTP+aCEVYUqA55x8cJ3Mh4qBtgG8nTnVQ+BdqcTsy25d2E= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:content-type :content-transfer-encoding:from:to:subject:message-id:date; s= default; bh=pQZVnEBjkgGwz/IXt2LQWBJ2yAI=; b=byoKX3f2t57Ct646z5us IqHM8NN5933dJjdRbF2VUGl8VqbjzxO128AmweezUFtQ7r8ox9sapkmlyMYJSxjB 6LlYnZPwc+XP5a1r7oVKNpeQOpRijBpNfhOF+mqIkKjptAEpdOEJb0Hh6vsfHo/f MkH5lA9xaEJtA+qPiL8ZHCk= Received: (qmail 61975 invoked by alias); 5 Mar 2015 23:40:32 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 61964 invoked by uid 89); 5 Mar 2015 23:40:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "GNU C. Library" Subject: [PATCH roland/arm] ARM: Rewrite sysdeps/arm/tls-macros.h Message-Id: <20150305234028.DC8CE2C3AB9@topped-with-meat.com> Date: Thu, 5 Mar 2015 15:40:28 -0800 (PST) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=PZdZiigrDStC_FSz3y8A:9 a=CjuIK1q_8ugA:10 I've rewritten the ARM tls-macros.h so that there is less repeated boilerplate assembly and a bit less overall done in assembly that can be in C, and so it's friendly to systems that do not allow random literal pool words in the code segment (like NaCl). The file is basically wholly replaced but diff finds some useless context, so it's a bit easier to read the new file than to read the patch. I've tested armv7l-linux-gnueabihf both with the compiler's default -mthumb and with explicit -marm; there are no regressions. I've also tested the ARM_PCREL_MOVW_OK case in the out-of-tree arm-nacl port. OK? Thanks, Roland * sysdeps/arm/tls-macros.h: Include . (GET_SPECIAL_RELOC, GET_SPECIAL_PCREL): New macros to encapsulate all the necessary asm magic in one place. (TLS_LE, TLS_IE, TLS_LD, TLS_GD): Rewritten as C expressions using those. --- a/sysdeps/arm/tls-macros.h +++ b/sysdeps/arm/tls-macros.h @@ -1,78 +1,72 @@ +#include /* For ARCH_HAS_T2. */ + #ifdef __thumb2__ -#define ARM_PC_OFFSET "4" +# define ARM_PC_OFFSET "4" #else -#define ARM_PC_OFFSET "8" +# define ARM_PC_OFFSET "8" #endif -#define TLS_LE(x) \ - ({ int *__result; \ - void *tp = __builtin_thread_pointer (); \ - asm ("ldr %0, 1f; " \ - "add %0, %1, %0; " \ - "b 2f; " \ - ".align 2; " \ - "1: .word " #x "(tpoff); " \ - "2: " \ - : "=&r" (__result) : "r" (tp)); \ - __result; }) - -#ifdef __thumb2__ -#define TLS_IE(x) \ - ({ int *__result; \ - void *tp = __builtin_thread_pointer (); \ - asm ("ldr %0, 1f; " \ - "3: add %0, pc, %0;" \ - "ldr %0, [%0];" \ - "add %0, %1, %0; " \ - "b 2f; " \ - ".align 2; " \ - "1: .word " #x "(gottpoff) + (. - 3b - 4); " \ - "2: " \ - : "=&r" (__result) : "r" (tp)); \ - __result; }) +/* Returns the address of data containing ".word SYMBOL(RELOC)". */ +#if defined (ARCH_HAS_T2) && !defined (PIC) +# define GET_SPECIAL_RELOC(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata; \ + asm ("movw %0, #:lower16:1f\n" \ + "movt %0, #:upper16:1f\n" \ + ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n" \ + ".balign 4\n" \ + "1: .word " #symbol "(" #reloc ")\n" \ + ".popsection" \ + : "=r" (__##symbol##_rodata)); \ + __##symbol##_rodata; \ + }) +#elif defined (ARCH_HAS_T2) && defined (PIC) && ARM_PCREL_MOVW_OK +# define GET_SPECIAL_RELOC(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata; \ + asm ("movw %0, #:lower16:1f - 2f - " ARM_PC_OFFSET "\n" \ + "movt %0, #:upper16:1f - 2f - " ARM_PC_OFFSET "\n" \ + ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n" \ + ".balign 4\n" \ + "1: .word " #symbol "(" #reloc ")\n" \ + ".popsection\n" \ + "2: add %0, %0, pc" \ + : "=r" (__##symbol##_rodata)); \ + __##symbol##_rodata; \ + }) #else -#define TLS_IE(x) \ - ({ int *__result; \ - void *tp = __builtin_thread_pointer (); \ - asm ("ldr %0, 1f; " \ - "3: ldr %0, [pc, %0];" \ - "add %0, %1, %0; " \ - "b 2f; " \ - ".align 2; " \ - "1: .word " #x "(gottpoff) + (. - 3b - 8); " \ - "2: " \ - : "=&r" (__result) : "r" (tp)); \ - __result; }) +# define GET_SPECIAL_RELOC(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata; \ + asm ("adr %0, 1f\n" \ + "b 2f\n" \ + ".balign 4\n" \ + "1: .word " #symbol "(" #reloc ")\n" \ + "2:" \ + : "=r" (__##symbol##_rodata)); \ + __##symbol##_rodata; \ + }) #endif -#define TLS_LD(x) \ - ({ char *__result; \ - int __offset; \ - extern void *__tls_get_addr (void *); \ - asm ("ldr %0, 2f; " \ - "1: add %0, pc, %0; " \ - "b 3f; " \ - ".align 2; " \ - "2: .word " #x "(tlsldm) + (. - 1b - "ARM_PC_OFFSET"); " \ - "3: " \ - : "=r" (__result)); \ - __result = (char *)__tls_get_addr (__result); \ - asm ("ldr %0, 1f; " \ - "b 2f; " \ - ".align 2; " \ - "1: .word " #x "(tlsldo); " \ - "2: " \ - : "=r" (__offset)); \ - (int *) (__result + __offset); }) +/* Returns the pointer value (SYMBOL(RELOC) + pc - PC_OFS). */ +#define GET_SPECIAL_PCREL(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata = GET_SPECIAL_RELOC (symbol, reloc); \ + (void *) ((int) __##symbol##_rodata + *__##symbol##_rodata); \ + }) + +#define TLS_LE(x) \ + (__builtin_thread_pointer () + *GET_SPECIAL_RELOC (x, tpoff)) + +#define TLS_IE(x) \ + ((int *) (__builtin_thread_pointer () \ + + *(int *) GET_SPECIAL_PCREL (x, gottpoff))) + +extern void *__tls_get_addr (void *); + +#define TLS_LD(x) \ + ((int *) (__tls_get_addr (GET_SPECIAL_PCREL (x, tlsldm)) \ + + *GET_SPECIAL_RELOC (x, tlsldo))) -#define TLS_GD(x) \ - ({ int *__result; \ - extern void *__tls_get_addr (void *); \ - asm ("ldr %0, 2f; " \ - "1: add %0, pc, %0; " \ - "b 3f; " \ - ".align 2; " \ - "2: .word " #x "(tlsgd) + (. - 1b - "ARM_PC_OFFSET"); " \ - "3: " \ - : "=r" (__result)); \ - (int *)__tls_get_addr (__result); }) +#define TLS_GD(x) \ + ((int *) __tls_get_addr (GET_SPECIAL_PCREL (x, tlsgd)))