OSDN Git Service

* config/x86/target.h (GTM_longjmp): Correct .cfi directives.
[pf3gnuchains/gcc-fork.git] / libitm / config / x86 / sjlj.S
1 /* Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc.
2    Contributed by Richard Henderson <rth@redhat.com>.
3
4    This file is part of the GNU Transactional Memory Library (libitm).
5
6    Libitm is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    Libitm is distributed in the hope that it will be useful, but WITHOUT ANY
12    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14    more details.
15
16    Under Section 7 of GPL version 3, you are granted additional
17    permissions described in the GCC Runtime Library Exception, version
18    3.1, as published by the Free Software Foundation.
19
20    You should have received a copy of the GNU General Public License and
21    a copy of the GCC Runtime Library Exception along with this program;
22    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23    <http://www.gnu.org/licenses/>.  */
24
25
26 #include "asmcfi.h"
27
28 #define CONCAT1(a, b) CONCAT2(a, b)
29 #define CONCAT2(a, b) a ## b
30
31 #ifdef __USER_LABEL_PREFIX__
32 #  define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
33 #else
34 #  define SYM(x) x
35 #endif
36
37 #ifdef __ELF__
38 #  define TYPE(x) .type SYM(x), @function
39 #  define SIZE(x) .size SYM(x), . - SYM(x)
40 #  ifdef HAVE_ATTRIBUTE_VISIBILITY
41 #    define HIDDEN(x) .hidden SYM(x)
42 #  else
43 #    define HIDDEN(x)
44 #  endif
45 #else
46 #  define TYPE(x)
47 #  define SIZE(x)
48 #  ifdef __MACH__
49 #    define HIDDEN(x) .private_extern SYM(x)
50 #  else
51 #    define HIDDEN(x)
52 #  endif
53 #endif
54
55         .text
56
57         .align 4
58         .globl  SYM(_ITM_beginTransaction)
59
60 SYM(_ITM_beginTransaction):
61         cfi_startproc
62 #ifdef __x86_64__
63         leaq    8(%rsp), %rax
64         subq    $56, %rsp
65         cfi_def_cfa_offset(64)
66         movq    %rax, (%rsp)
67         movq    %rbx, 8(%rsp)
68         movq    %rbp, 16(%rsp)
69         movq    %r12, 24(%rsp)
70         movq    %r13, 32(%rsp)
71         movq    %r14, 40(%rsp)
72         movq    %r15, 48(%rsp)
73         movq    %rsp, %rsi
74         call    SYM(GTM_begin_transaction)
75         addq    $56, %rsp
76         cfi_def_cfa_offset(8)
77         ret
78 #else
79         leal    4(%esp), %ecx
80         movl    4(%esp), %eax
81         subl    $28, %esp
82         cfi_def_cfa_offset(32)
83         movl    %ecx, 8(%esp)
84         movl    %ebx, 12(%esp)
85         movl    %esi, 16(%esp)
86         movl    %edi, 20(%esp)
87         movl    %ebp, 24(%esp)
88         leal    8(%esp), %edx
89 #if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__
90         call    SYM(GTM_begin_transaction)
91 #elif defined __ELF__
92         call    1f
93 1:      popl    %ebx
94         addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
95         call    SYM(GTM_begin_transaction)@PLT
96         movl    12(%esp), %ebx
97 #else
98 # error "Unsupported PIC sequence"
99 #endif
100         addl    $28, %esp
101         cfi_def_cfa_offset(4)
102         ret
103 #endif
104         cfi_endproc
105
106         TYPE(_ITM_beginTransaction)
107         SIZE(_ITM_beginTransaction)
108
109         .align 4
110         .globl  SYM(GTM_longjmp)
111
112 SYM(GTM_longjmp):
113         cfi_startproc
114 #ifdef __x86_64__
115         cfi_def_cfa(%rsi, 0)
116         movq    (%rsi), %rcx
117         movq    8(%rsi), %rbx
118         movq    16(%rsi), %rbp
119         movq    24(%rsi), %r12
120         movq    32(%rsi), %r13
121         movq    40(%rsi), %r14
122         movq    48(%rsi), %r15
123         cfi_offset(%rip, 56)
124         movl    %edi, %eax
125         movq    %rcx, %rsp
126         cfi_register(%rsp, %rcx)
127         jmp     *56(%rsi)
128 #else
129         cfi_def_cfa(%edx, 0)
130         movl    (%edx), %ecx
131         movl    4(%edx), %ebx
132         movl    8(%edx), %esi
133         movl    12(%edx), %edi
134         movl    16(%edx), %ebp
135         cfi_offset(%eip, 20)
136         movl    %ecx, %esp
137         cfi_register(%esp, %ecx)
138         jmp     *20(%edx)
139 #endif
140         cfi_endproc
141
142         TYPE(GTM_longjmp)
143         HIDDEN(GTM_longjmp)
144         SIZE(GTM_longjmp)
145
146 #ifdef __linux__
147 .section .note.GNU-stack, "", @progbits
148 #endif