libitm: Configure for gas cfi pseudo ops.

* asmcfi.m4: New file.

	* configure.ac (GCC_AS_CFI_PSEUDO_OP): Test it.
	* configure, aclocal.m4, config.h.in: Rebuild.
	* config/generic/asmcfi.h: New file.
	* config/x86/sjlj.S: Use it.

From-SVN: r181224
This commit is contained in:
Richard Henderson 2011-11-09 10:09:53 -08:00 committed by Richard Henderson
parent 29d281ca3a
commit 4bdd090f8e
9 changed files with 128 additions and 12 deletions

View File

@ -1,3 +1,7 @@
2011-11-09 Richard Henderson <rth@redhat.com>
* asmcfi.m4: New file.
2011-11-02 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2011-11-02 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* mh-interix (LIBGCC2_DEBUG_CFLAGS): Remove. * mh-interix (LIBGCC2_DEBUG_CFLAGS): Remove.

15
config/asmcfi.m4 Normal file
View File

@ -0,0 +1,15 @@
;; Cribbed from libffi
AC_DEFUN([GCC_AS_CFI_PSEUDO_OP],
[AC_CACHE_CHECK([assembler .cfi pseudo-op support],
gcc_cv_as_cfi_pseudo_op, [
gcc_cv_as_cfi_pseudo_op=unknown
AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],,
[gcc_cv_as_cfi_pseudo_op=yes],
[gcc_cv_as_cfi_pseudo_op=no])
])
if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then
AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1,
[Define if your assembler supports .cfi_* directives.])
fi
])

View File

@ -1,3 +1,10 @@
2011-11-09 Richard Henderson <rth@redhat.com>
* configure.ac (GCC_AS_CFI_PSEUDO_OP): Test it.
* configure, aclocal.m4, config.h.in: Rebuild.
* config/generic/asmcfi.h: New file.
* config/x86/sjlj.S: Use it.
2011-11-08 Richard Henderson <rth@redhat.com> 2011-11-08 Richard Henderson <rth@redhat.com>
* local.cc (_ITM_LB): Use a normal call, not a function alias. * local.cc (_ITM_LB): Use a normal call, not a function alias.

1
libitm/aclocal.m4 vendored
View File

@ -991,6 +991,7 @@ AC_SUBST([am__untar])
]) # _AM_PROG_TAR ]) # _AM_PROG_TAR
m4_include([../config/acx.m4]) m4_include([../config/acx.m4])
m4_include([../config/asmcfi.m4])
m4_include([../config/depstand.m4]) m4_include([../config/depstand.m4])
m4_include([../config/enable.m4]) m4_include([../config/enable.m4])
m4_include([../config/futex.m4]) m4_include([../config/futex.m4])

View File

@ -6,6 +6,9 @@
/* Define to 1 if the target supports 64-bit __sync_*_compare_and_swap */ /* Define to 1 if the target supports 64-bit __sync_*_compare_and_swap */
#undef HAVE_64BIT_SYNC_BUILTINS #undef HAVE_64BIT_SYNC_BUILTINS
/* Define if your assembler supports .cfi_* directives. */
#undef HAVE_AS_CFI_PSEUDO_OP
/* Define to 1 if the target supports __attribute__((alias(...))). */ /* Define to 1 if the target supports __attribute__((alias(...))). */
#undef HAVE_ATTRIBUTE_ALIAS #undef HAVE_ATTRIBUTE_ALIAS

View File

@ -0,0 +1,44 @@
/* Copyright (C) 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 "config.h"
#ifdef HAVE_AS_CFI_PSEUDO_OP
#define cfi_startproc .cfi_startproc
#define cfi_endproc .cfi_endproc
#define cfi_def_cfa_offset(n) .cfi_def_cfa_offset n
#define cfi_def_cfa(r,n) .cfi_def_cfa r, n
#define cfi_register(o,n) .cfi_register o, n
#else
#define cfi_startproc
#define cfi_endproc
#define cfi_def_cfa_offset(n)
#define cfi_def_cfa(r,n)
#define cfi_register(o,n)
#endif /* HAVE_ASM_CFI */

View File

@ -22,18 +22,21 @@
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "asmcfi.h"
.text .text
.p2align 4 .p2align 4
.globl _ITM_beginTransaction .globl _ITM_beginTransaction
.type _ITM_beginTransaction, @function .type _ITM_beginTransaction, @function
_ITM_beginTransaction: _ITM_beginTransaction:
.cfi_startproc cfi_startproc
#ifdef __x86_64__ #ifdef __x86_64__
leaq 8(%rsp), %rax leaq 8(%rsp), %rax
movq (%rsp), %r8 movq (%rsp), %r8
subq $72, %rsp subq $72, %rsp
.cfi_def_cfa_offset 80 cfi_def_cfa_offset(80)
movq %rax, (%rsp) movq %rax, (%rsp)
movq %r8, 8(%rsp) movq %r8, 8(%rsp)
movq %rbx, 16(%rsp) movq %rbx, 16(%rsp)
@ -45,12 +48,12 @@ _ITM_beginTransaction:
movq %rsp, %rsi movq %rsp, %rsi
call GTM_begin_transaction call GTM_begin_transaction
addq $72, %rsp addq $72, %rsp
.cfi_def_cfa_offset 8 cfi_def_cfa_offset(8)
ret ret
#else #else
leal 4(%esp), %ecx leal 4(%esp), %ecx
subl $28, %esp subl $28, %esp
.cfi_def_cfa_offset 32 cfi_def_cfa_offset(32)
movl %ecx, 8(%esp) movl %ecx, 8(%esp)
movl %ebx, 12(%esp) movl %ebx, 12(%esp)
movl %esi, 16(%esp) movl %esi, 16(%esp)
@ -59,10 +62,10 @@ _ITM_beginTransaction:
leal 8(%esp), %edx leal 8(%esp), %edx
call GTM_begin_transaction call GTM_begin_transaction
addl $28, %esp addl $28, %esp
.cfi_def_cfa_offset 4 cfi_def_cfa_offset(4)
ret ret
#endif #endif
.cfi_endproc cfi_endproc
.size _ITM_beginTransaction, .-_ITM_beginTransaction .size _ITM_beginTransaction, .-_ITM_beginTransaction
.p2align 4 .p2align 4
@ -71,7 +74,7 @@ _ITM_beginTransaction:
.hidden GTM_longjmp .hidden GTM_longjmp
GTM_longjmp: GTM_longjmp:
.cfi_startproc cfi_startproc
#ifdef __x86_64__ #ifdef __x86_64__
movq (%rdi), %rcx movq (%rdi), %rcx
movq 8(%rdi), %rdx movq 8(%rdi), %rdx
@ -82,8 +85,8 @@ GTM_longjmp:
movq 48(%rdi), %r14 movq 48(%rdi), %r14
movq 56(%rdi), %r15 movq 56(%rdi), %r15
movl %esi, %eax movl %esi, %eax
.cfi_def_cfa %rcx, 0 cfi_def_cfa(%rcx, 0)
.cfi_register %rip, %rdx cfi_register(%rip, %rdx)
movq %rcx, %rsp movq %rcx, %rsp
jmp *%rdx jmp *%rdx
#else #else
@ -94,12 +97,12 @@ GTM_longjmp:
movl 12(%edx), %edi movl 12(%edx), %edi
movl 16(%edx), %ebp movl 16(%edx), %ebp
movl 20(%edx), %edx movl 20(%edx), %edx
.cfi_def_cfa %ecx, 0 cfi_def_cfa(%ecx, 0)
.cfi_register %eip, %edx cfi_register(%eip, %edx)
movl %ecx, %esp movl %ecx, %esp
jmp *%edx jmp *%edx
#endif #endif
.cfi_endproc cfi_endproc
.size GTM_longjmp, .-GTM_longjmp .size GTM_longjmp, .-GTM_longjmp
.section .note.GNU-stack, "", @progbits .section .note.GNU-stack, "", @progbits

36
libitm/configure vendored
View File

@ -16908,6 +16908,42 @@ $as_echo "#define LIBITM_GNU_SYMBOL_VERSIONING 1" >>confdefs.h
fi fi
# See if we can emit unwind info in the sjlj stub.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5
$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; }
if test "${gcc_cv_as_cfi_pseudo_op+set}" = set; then :
$as_echo_n "(cached) " >&6
else
gcc_cv_as_cfi_pseudo_op=unknown
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
asm (".cfi_startproc\n\t.cfi_endproc");
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
gcc_cv_as_cfi_pseudo_op=yes
else
gcc_cv_as_cfi_pseudo_op=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5
$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; }
if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then
$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h
fi
# Determine the proper ABI type for size_t. # Determine the proper ABI type for size_t.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how size_t is mangled" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how size_t is mangled" >&5

View File

@ -219,6 +219,9 @@ if test $enable_symvers = gnu; then
[Define to 1 if GNU symbol versioning is used for libitm.]) [Define to 1 if GNU symbol versioning is used for libitm.])
fi fi
# See if we can emit unwind info in the sjlj stub.
GCC_AS_CFI_PSEUDO_OP
# Determine the proper ABI type for size_t. # Determine the proper ABI type for size_t.
LIBITM_CHECK_SIZE_T_MANGLING LIBITM_CHECK_SIZE_T_MANGLING