OSDN Git Service

libitm:
[pf3gnuchains/gcc-fork.git] / libitm / config / x86 / sjlj.S
index 725ffec..39e0c75 100644 (file)
    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+
+#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
-       .p2align 4
-       .globl  _ITM_beginTransaction
-       .type   _ITM_beginTransaction, @function
 
-_ITM_beginTransaction:
-       .cfi_startproc
+       .align 4
+       .globl  SYM(_ITM_beginTransaction)
+
+SYM(_ITM_beginTransaction):
+       cfi_startproc
 #ifdef __x86_64__
        leaq    8(%rsp), %rax
        movq    (%rsp), %r8
        subq    $72, %rsp
-       .cfi_def_cfa_offset 80
+       cfi_def_cfa_offset(80)
        movq    %rax, (%rsp)
        movq    %r8, 8(%rsp)
        movq    %rbx, 16(%rsp)
@@ -43,35 +73,45 @@ _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
+       cfi_def_cfa_offset(8)
        ret
 #else
        leal    4(%esp), %ecx
        subl    $28, %esp
-       .cfi_def_cfa_offset 32
+       cfi_def_cfa_offset(32)
        movl    %ecx, 8(%esp)
        movl    %ebx, 12(%esp)
        movl    %esi, 16(%esp)
        movl    %edi, 20(%esp)
        movl    %ebp, 24(%esp)
        leal    8(%esp), %edx
-       call    GTM_begin_transaction
+#if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__
+       call    SYM(GTM_begin_transaction)
+#elif defined __ELF__
+       call    1f
+1:     popl    %ebx
+       addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
+       call    SYM(GTM_begin_transaction)@PLT
+       movl    12(%esp), %ebx
+#else
+# error "Unsupported PIC sequence"
+#endif
        addl    $28, %esp
-       .cfi_def_cfa_offset 4
+       cfi_def_cfa_offset(4)
        ret
 #endif
-       .cfi_endproc
-       .size   _ITM_beginTransaction, .-_ITM_beginTransaction
+       cfi_endproc
 
-       .p2align 4
-       .globl  GTM_longjmp
-       .type   GTM_longjmp, @function
-       .hidden GTM_longjmp
+       TYPE(_ITM_beginTransaction)
+       SIZE(_ITM_beginTransaction)
 
-GTM_longjmp:
-       .cfi_startproc
+       .align 4
+       .globl  SYM(GTM_longjmp)
+
+SYM(GTM_longjmp):
+       cfi_startproc
 #ifdef __x86_64__
        movq    (%rdi), %rcx
        movq    8(%rdi), %rdx
@@ -82,8 +122,8 @@ GTM_longjmp:
        movq    48(%rdi), %r14
        movq    56(%rdi), %r15
        movl    %esi, %eax
-       .cfi_def_cfa %rcx, 0
-       .cfi_register %rip, %rdx
+       cfi_def_cfa(%rcx, 0)
+       cfi_register(%rip, %rdx)
        movq    %rcx, %rsp
        jmp     *%rdx
 #else
@@ -94,12 +134,17 @@ GTM_longjmp:
        movl    12(%edx), %edi
        movl    16(%edx), %ebp
        movl    20(%edx), %edx
-       .cfi_def_cfa %ecx, 0
-       .cfi_register %eip, %edx
+       cfi_def_cfa(%ecx, 0)
+       cfi_register(%eip, %edx)
        movl    %ecx, %esp
        jmp     *%edx
 #endif
-       .cfi_endproc
-       .size   GTM_longjmp, .-GTM_longjmp
+       cfi_endproc
+
+       TYPE(GTM_longjmp)
+       HIDDEN(GTM_longjmp)
+       SIZE(GTM_longjmp)
 
+#ifdef __linux__
 .section .note.GNU-stack, "", @progbits
+#endif