From 3a6c33c66683940de0d794a447a11f9baddc53c9 Mon Sep 17 00:00:00 2001 From: Torbjorn Granlund Date: Wed, 12 Dec 2012 22:53:54 +0100 Subject: Properly support PIC code in x86_64 code with jump tables. --- ChangeLog | 11 ++++++++++- mpn/x86_64/darwin.m4 | 7 ++++++- mpn/x86_64/dos64.m4 | 4 ++++ mpn/x86_64/mod_34lsub1.asm | 29 ++++++++++++++++------------- mpn/x86_64/mullo_basecase.asm | 33 +++++++++++++++++++-------------- mpn/x86_64/sqr_basecase.asm | 26 ++++++++++++++++---------- mpn/x86_64/x86_64-defs.m4 | 4 ++++ 7 files changed, 75 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7fc57b39b..bc0af108c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,16 @@ -2012-12-11 Torbjorn Granlund +2012-12-12 Torbjorn Granlund * Version 5.1.0 released. + * mpn/x86_64/x86_64-defs.m4 (JMPENT): New macro. + * mpn/x86_64/dos64.m4: Likewise. + * mpn/x86_64/darwin.m4: Likewise. + * mpn/x86_64/mod_34lsub1.asm: Use JMPENT to properly support PIC. + * mpn/x86_64/mullo_basecase.asm: Likewise. + * mpn/x86_64/sqr_basecase.asm: Likewise. + +2012-12-11 Torbjorn Granlund + * mpn/x86_64/mod_34lsub1.asm: Try different jump table for the benefit of broken Apple linkers. diff --git a/mpn/x86_64/darwin.m4 b/mpn/x86_64/darwin.m4 index c327631e7..d14009694 100644 --- a/mpn/x86_64/darwin.m4 +++ b/mpn/x86_64/darwin.m4 @@ -32,8 +32,13 @@ dnl Simply override the definition in x86_64-defs.m4. define(`CALL',`call GSYM_PREFIX`'$1') -define(`JUMPTABSECT', `DATA') +define(`JUMPTABSECT', `RODATA') +ifdef(`PIC', + `define(`JMPENT', + `.set $1_tmp, $1-$2 + .long $1_tmp')', + `define(`JMPENT', `.quad $1')') dnl Target ABI macros. For Darwin we override IFELF (and leave default for dnl IFDOS and IFSTD). diff --git a/mpn/x86_64/dos64.m4 b/mpn/x86_64/dos64.m4 index 74ca5489f..c1ae46c04 100644 --- a/mpn/x86_64/dos64.m4 +++ b/mpn/x86_64/dos64.m4 @@ -24,6 +24,10 @@ define(`LEA',` define(`JUMPTABSECT', `RODATA') +ifdef(`PIC', + `define(`JMPENT', `.long $1-$2')', + `define(`JMPENT', `.quad $1')') + dnl Usage: FUNC_ENTRY(nregparmas) dnl Usage: FUNC_EXIT() diff --git a/mpn/x86_64/mod_34lsub1.asm b/mpn/x86_64/mod_34lsub1.asm index 2e69be430..d088381bb 100644 --- a/mpn/x86_64/mod_34lsub1.asm +++ b/mpn/x86_64/mod_34lsub1.asm @@ -103,24 +103,27 @@ forloop(i,1,UNROLL-1,`dnl jnc L(top) L(end): -C Handle 0-8 remaining limbs. The switch code here is zany in an attempt to -C fit the tiny envelope of code that triggers no Apple bugs lea L(tab)(%rip), %r8 +ifdef(`PIC', +` movslq 36(%r8,%rsi,4), %r10 + add %r10, %r8 + jmp *%r8 +',` jmp *72(%r8,%rsi,8) - +') JUMPTABSECT ALIGN(8) -L(tab): .quad L(0) - .quad L(1) - .quad L(2) - .quad L(3) - .quad L(4) - .quad L(5) - .quad L(6) - .quad L(7) - .quad L(8) - +L(tab): JMPENT( L(0), L(tab)) + JMPENT( L(1), L(tab)) + JMPENT( L(2), L(tab)) + JMPENT( L(3), L(tab)) + JMPENT( L(4), L(tab)) + JMPENT( L(5), L(tab)) + JMPENT( L(6), L(tab)) + JMPENT( L(7), L(tab)) + JMPENT( L(8), L(tab)) TEXT + L(6): add (ap), %rax adc 8(ap), %rcx adc 16(ap), %rdx diff --git a/mpn/x86_64/mullo_basecase.asm b/mpn/x86_64/mullo_basecase.asm index 95ccdb5fc..a066b8256 100644 --- a/mpn/x86_64/mullo_basecase.asm +++ b/mpn/x86_64/mullo_basecase.asm @@ -64,23 +64,28 @@ PROLOGUE(mpn_mullo_basecase) mov (up), %rax C u0 mov (vp_param), %r8 C v0 - lea L(jmptab)(%rip), %r9 + lea L(tab)(%rip), %r9 +ifdef(`PIC', +` movslq (%r9,%rcx,4), %r10 + add %r10, %r9 + jmp *%r9 +',` jmp *(%r9,n,8) +') JUMPTABSECT ALIGN(8) -L(jmptab): - .quad 0 C not allowed - .quad L(1) C 1 - .quad L(2) C 2 - .quad L(3) C 3 -C .quad L(0m4) C 4 -C .quad L(1m4) C 5 -C .quad L(2m4) C 6 -C .quad L(3m4) C 7 -C .quad L(0m4) C 8 -C .quad L(1m4) C 9 -C .quad L(2m4) C 10 -C .quad L(3m4) C 11 +L(tab): JMPENT( L(tab), L(tab)) C not allowed + JMPENT( L(1), L(tab)) C 1 + JMPENT( L(2), L(tab)) C 2 + JMPENT( L(3), L(tab)) C 3 +dnl JMPENT( L(0m4), L(tab)) C 4 +dnl JMPENT( L(1m4), L(tab)) C 5 +dnl JMPENT( L(2m4), L(tab)) C 6 +dnl JMPENT( L(3m4), L(tab)) C 7 +dnl JMPENT( L(0m4), L(tab)) C 8 +dnl JMPENT( L(1m4), L(tab)) C 9 +dnl JMPENT( L(2m4), L(tab)) C 10 +dnl JMPENT( L(3m4), L(tab)) C 11 TEXT L(1): imul %r8, %rax diff --git a/mpn/x86_64/sqr_basecase.asm b/mpn/x86_64/sqr_basecase.asm index 412288131..9c3dd7667 100644 --- a/mpn/x86_64/sqr_basecase.asm +++ b/mpn/x86_64/sqr_basecase.asm @@ -99,19 +99,25 @@ PROLOGUE(mpn_sqr_basecase) mov %r14, (%rsp) cmovg %r8, %rcx - lea L(jmptab)(%rip), %rax + + lea L(tab)(%rip), %rax +ifdef(`PIC', +` movslq (%rax,%rcx,4), %r10 + add %r10, %rax + jmp *%rax +',` jmp *(%rax,%rcx,8) +') JUMPTABSECT ALIGN(8) -L(jmptab): - .quad L(4) - .quad L(1) - .quad L(2) - .quad L(3) - .quad L(0m4) - .quad L(1m4) - .quad L(2m4) - .quad L(3m4) +L(tab): JMPENT( L(4), L(tab)) + JMPENT( L(1), L(tab)) + JMPENT( L(2), L(tab)) + JMPENT( L(3), L(tab)) + JMPENT( L(0m4), L(tab)) + JMPENT( L(1m4), L(tab)) + JMPENT( L(2m4), L(tab)) + JMPENT( L(3m4), L(tab)) TEXT L(1): mov (up), %rax diff --git a/mpn/x86_64/x86_64-defs.m4 b/mpn/x86_64/x86_64-defs.m4 index 5180ad5d8..870abb6b7 100644 --- a/mpn/x86_64/x86_64-defs.m4 +++ b/mpn/x86_64/x86_64-defs.m4 @@ -187,6 +187,10 @@ ifdef(`PIC', define(`JUMPTABSECT', `.section .data.rel.ro.local,"aw",@progbits') +ifdef(`PIC', + `define(`JMPENT', `.long $1-$2')', + `define(`JMPENT', `.quad $1')') + dnl These macros are defined just for DOS64, where they provide calling dnl sequence glue code. -- cgit v1.2.1