OSDN Git Service

* config/x86/target.h (GTM_longjmp): Correct .cfi directives.
[pf3gnuchains/gcc-fork.git] / libitm / config / x86 / sjlj.S
index ed755da..554ec98 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
-       movq    (%rsp), %r8
-       subq    $72, %rsp
-       cfi_def_cfa_offset(80)
+       subq    $56, %rsp
+       cfi_def_cfa_offset(64)
        movq    %rax, (%rsp)
-       movq    %r8, 8(%rsp)
-       movq    %rbx, 16(%rsp)
-       movq    %rbp, 24(%rsp)
-       movq    %r12, 32(%rsp)
-       movq    %r13, 40(%rsp)
-       movq    %r14, 48(%rsp)
-       movq    %r15, 56(%rsp)
+       movq    %rbx, 8(%rsp)
+       movq    %rbp, 16(%rsp)
+       movq    %r12, 24(%rsp)
+       movq    %r13, 32(%rsp)
+       movq    %r14, 40(%rsp)
+       movq    %r15, 48(%rsp)
        movq    %rsp, %rsi
-       call    GTM_begin_transaction
-       addq    $72, %rsp
+       call    SYM(GTM_begin_transaction)
+       addq    $56, %rsp
        cfi_def_cfa_offset(8)
        ret
 #else
        leal    4(%esp), %ecx
+       movl    4(%esp), %eax
        subl    $28, %esp
        cfi_def_cfa_offset(32)
        movl    %ecx, 8(%esp)
@@ -61,12 +87,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,52 +103,45 @@ _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
-       movq    8(%rdi), %rdx
-       movq    16(%rdi), %rbx
-       movq    24(%rdi), %rbp
-       movq    32(%rdi), %r12
-       movq    40(%rdi), %r13
-       movq    48(%rdi), %r14
-       movq    56(%rdi), %r15
-       movl    %esi, %eax
-       cfi_def_cfa(%rcx, 0)
-       cfi_register(%rip, %rdx)
+       cfi_def_cfa(%rsi, 0)
+       movq    (%rsi), %rcx
+       movq    8(%rsi), %rbx
+       movq    16(%rsi), %rbp
+       movq    24(%rsi), %r12
+       movq    32(%rsi), %r13
+       movq    40(%rsi), %r14
+       movq    48(%rsi), %r15
+       cfi_offset(%rip, 56)
+       movl    %edi, %eax
        movq    %rcx, %rsp
-       jmp     *%rdx
+       cfi_register(%rsp, %rcx)
+       jmp     *56(%rsi)
 #else
-       xchgl   %eax, %edx
+       cfi_def_cfa(%edx, 0)
        movl    (%edx), %ecx
        movl    4(%edx), %ebx
        movl    8(%edx), %esi
        movl    12(%edx), %edi
        movl    16(%edx), %ebp
-       movl    20(%edx), %edx
-       cfi_def_cfa(%ecx, 0)
-       cfi_register(%eip, %edx)
+       cfi_offset(%eip, 20)
        movl    %ecx, %esp
-       jmp     *%edx
+       cfi_register(%esp, %ecx)
+       jmp     *20(%edx)
 #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