From 0b41ebef72631ec8cf5ffd16537d1274c3fd6800 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Tue, 22 Nov 2011 09:57:19 +0000 Subject: [PATCH] sjlj.S (CONCAT1, [...]): Respond to __USER_LABEL_PREFIX__ for targets that use it. libitm: * config/x86/sjlj.S (CONCAT1, CONCAT2, SYM): Respond to __USER_LABEL_PREFIX__ for targets that use it. TYPE, SIZE, HIDDEN): New macros to assist on non-elf targets. (_ITM_beginTransaction): Use SYM, TYPE, SIZE macros to assist in portability to non-elf targets. (GTM_longjmp): LIkewise. * libitm_i.h (begin_transaction): Apply __USER_LABEL_PREFIX__ where required. From-SVN: r181612 --- libitm/ChangeLog | 11 ++++++++++ libitm/config/x86/sjlj.S | 57 +++++++++++++++++++++++++++++++++--------------- libitm/libitm_i.h | 8 ++++++- 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/libitm/ChangeLog b/libitm/ChangeLog index b58a4f8..ae091d8 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,5 +1,16 @@ 2011-11-22 Iain Sandoe + * config/x86/sjlj.S (CONCAT1, CONCAT2, SYM): Respond to + __USER_LABEL_PREFIX__ for targets that use it. + TYPE, SIZE, HIDDEN): New macros to assist on non-elf targets. + (_ITM_beginTransaction): Use SYM, TYPE, SIZE macros to assist + in portability to non-elf targets. + (GTM_longjmp): LIkewise. + * libitm_i.h (begin_transaction): Apply __USER_LABEL_PREFIX__ + where required. + +2011-11-22 Iain Sandoe + * testsuite/libitm.c/memcpy-1.c: Allow for MAP_ANON spelling. * testsuite/libitm.c/memset-1.c: Likewise. diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S index ed755da..39e0c75 100644 --- a/libitm/config/x86/sjlj.S +++ b/libitm/config/x86/sjlj.S @@ -25,12 +25,39 @@ #include "asmcfi.h" +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +#ifdef __USER_LABEL_PREFIX__ +# define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) +#else +# define SYM(x) x +#endif + +#ifdef __ELF__ +# define TYPE(x) .type SYM(x), @function +# define SIZE(x) .size SYM(x), . - SYM(x) +# ifdef HAVE_ATTRIBUTE_VISIBILITY +# define HIDDEN(x) .hidden SYM(x) +# else +# define HIDDEN(x) +# endif +#else +# define TYPE(x) +# define SIZE(x) +# ifdef __MACH__ +# define HIDDEN(x) .private_extern SYM(x) +# else +# define HIDDEN(x) +# endif +#endif + .text .align 4 - .globl _ITM_beginTransaction + .globl SYM(_ITM_beginTransaction) -_ITM_beginTransaction: +SYM(_ITM_beginTransaction): cfi_startproc #ifdef __x86_64__ leaq 8(%rsp), %rax @@ -46,7 +73,7 @@ _ITM_beginTransaction: movq %r14, 48(%rsp) movq %r15, 56(%rsp) movq %rsp, %rsi - call GTM_begin_transaction + call SYM(GTM_begin_transaction) addq $72, %rsp cfi_def_cfa_offset(8) ret @@ -61,12 +88,12 @@ _ITM_beginTransaction: movl %ebp, 24(%esp) leal 8(%esp), %edx #if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__ - call GTM_begin_transaction + call SYM(GTM_begin_transaction) #elif defined __ELF__ call 1f 1: popl %ebx addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx - call GTM_begin_transaction@PLT + call SYM(GTM_begin_transaction)@PLT movl 12(%esp), %ebx #else # error "Unsupported PIC sequence" @@ -77,15 +104,13 @@ _ITM_beginTransaction: #endif cfi_endproc -#ifdef __ELF__ - .type _ITM_beginTransaction, @function - .size _ITM_beginTransaction, .-_ITM_beginTransaction -#endif + TYPE(_ITM_beginTransaction) + SIZE(_ITM_beginTransaction) .align 4 - .globl GTM_longjmp + .globl SYM(GTM_longjmp) -GTM_longjmp: +SYM(GTM_longjmp): cfi_startproc #ifdef __x86_64__ movq (%rdi), %rcx @@ -116,13 +141,9 @@ GTM_longjmp: #endif cfi_endproc -#ifdef __ELF__ - .type GTM_longjmp, @function -#ifdef HAVE_ATTRIBUTE_VISIBILITY - .hidden GTM_longjmp -#endif - .size GTM_longjmp, .-GTM_longjmp -#endif + TYPE(GTM_longjmp) + HIDDEN(GTM_longjmp) + SIZE(GTM_longjmp) #ifdef __linux__ .section .note.GNU-stack, "", @progbits diff --git a/libitm/libitm_i.h b/libitm/libitm_i.h index 58e43b0..ba1afb4 100644 --- a/libitm/libitm_i.h +++ b/libitm/libitm_i.h @@ -240,9 +240,15 @@ struct gtm_thread // Invoked from assembly language, thus the "asm" specifier on // the name, avoiding complex name mangling. +#ifdef __USER_LABEL_PREFIX__ +#define UPFX1(t) UPFX(t) +#define UPFX(t) #t + static uint32_t begin_transaction(uint32_t, const gtm_jmpbuf *) + __asm__(UPFX1(__USER_LABEL_PREFIX__) "GTM_begin_transaction") ITM_REGPARM; +#else static uint32_t begin_transaction(uint32_t, const gtm_jmpbuf *) __asm__("GTM_begin_transaction") ITM_REGPARM; - +#endif // In eh_cpp.cc void revert_cpp_exceptions (gtm_transaction_cp *cp = 0); -- 2.7.4