diff options
Diffstat (limited to 'libitm/config/x86/sjlj.S')
-rw-r--r-- | libitm/config/x86/sjlj.S | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S new file mode 100644 index 0000000000..884422882b --- /dev/null +++ b/libitm/config/x86/sjlj.S @@ -0,0 +1,148 @@ +/* Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc. + Contributed by Richard Henderson <rth@redhat.com>. + + This file is part of the GNU Transactional Memory Library (libitm). + + Libitm is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + Libitm is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + 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 + + .align 4 + .globl SYM(_ITM_beginTransaction) + +SYM(_ITM_beginTransaction): + cfi_startproc +#ifdef __x86_64__ + leaq 8(%rsp), %rax + subq $56, %rsp + cfi_def_cfa_offset(64) + movq %rax, (%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 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) + movl %ebx, 12(%esp) + movl %esi, 16(%esp) + movl %edi, 20(%esp) + movl %ebp, 24(%esp) + leal 8(%esp), %edx +#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) + ret +#endif + cfi_endproc + + TYPE(_ITM_beginTransaction) + SIZE(_ITM_beginTransaction) + + .align 4 + .globl SYM(GTM_longjmp) + +SYM(GTM_longjmp): + cfi_startproc +#ifdef __x86_64__ + 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 + movl %edi, %eax + cfi_def_cfa(%rsi, 0) + cfi_offset(%rip, 56) + cfi_register(%rsp, %rcx) + movq %rcx, %rsp + jmp *56(%rsi) +#else + movl (%edx), %ecx + movl 4(%edx), %ebx + movl 8(%edx), %esi + movl 12(%edx), %edi + movl 16(%edx), %ebp + cfi_def_cfa(%edx, 0) + cfi_offset(%eip, 20) + cfi_register(%esp, %ecx) + movl %ecx, %esp + jmp *20(%edx) +#endif + cfi_endproc + + TYPE(GTM_longjmp) + HIDDEN(GTM_longjmp) + SIZE(GTM_longjmp) + +#ifdef __linux__ +.section .note.GNU-stack, "", @progbits +#endif |