OSDN Git Service

libitm:
authoriains <iains@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Nov 2011 09:57:19 +0000 (09:57 +0000)
committeriains <iains@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Nov 2011 09:57:19 +0000 (09:57 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181612 138bc75d-0d04-0410-961f-82ee72b054a4

libitm/ChangeLog
libitm/config/x86/sjlj.S
libitm/libitm_i.h

index b58a4f8..ae091d8 100644 (file)
@@ -1,5 +1,16 @@
 2011-11-22  Iain Sandoe  <iains@gcc.gnu.org>
 
+       * 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  <iains@gcc.gnu.org>
+
        * testsuite/libitm.c/memcpy-1.c: Allow for MAP_ANON spelling.
        * testsuite/libitm.c/memset-1.c: Likewise.
 
index ed755da..39e0c75 100644 (file)
 
 #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
index 58e43b0..ba1afb4 100644 (file)
@@ -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);