diff options
-rw-r--r-- | config/ChangeLog | 4 | ||||
-rw-r--r-- | config/asmcfi.m4 | 15 | ||||
-rw-r--r-- | libitm/ChangeLog | 7 | ||||
-rw-r--r-- | libitm/aclocal.m4 | 1 | ||||
-rw-r--r-- | libitm/config.h.in | 3 | ||||
-rw-r--r-- | libitm/config/generic/asmcfi.h | 44 | ||||
-rw-r--r-- | libitm/config/x86/sjlj.S | 27 | ||||
-rw-r--r-- | libitm/configure | 36 | ||||
-rw-r--r-- | libitm/configure.ac | 3 |
9 files changed, 128 insertions, 12 deletions
diff --git a/config/ChangeLog b/config/ChangeLog index 7737f99..4f202ff 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -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> * mh-interix (LIBGCC2_DEBUG_CFLAGS): Remove. diff --git a/config/asmcfi.m4 b/config/asmcfi.m4 new file mode 100644 index 0000000..a725aa1 --- /dev/null +++ b/config/asmcfi.m4 @@ -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 +]) diff --git a/libitm/ChangeLog b/libitm/ChangeLog index fe1d7d0..e91f91e 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -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> * local.cc (_ITM_LB): Use a normal call, not a function alias. diff --git a/libitm/aclocal.m4 b/libitm/aclocal.m4 index 6dcccdf..96617e6 100644 --- a/libitm/aclocal.m4 +++ b/libitm/aclocal.m4 @@ -991,6 +991,7 @@ AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([../config/acx.m4]) +m4_include([../config/asmcfi.m4]) m4_include([../config/depstand.m4]) m4_include([../config/enable.m4]) m4_include([../config/futex.m4]) diff --git a/libitm/config.h.in b/libitm/config.h.in index af13264..369f6c6 100644 --- a/libitm/config.h.in +++ b/libitm/config.h.in @@ -6,6 +6,9 @@ /* Define to 1 if the target supports 64-bit __sync_*_compare_and_swap */ #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(...))). */ #undef HAVE_ATTRIBUTE_ALIAS diff --git a/libitm/config/generic/asmcfi.h b/libitm/config/generic/asmcfi.h new file mode 100644 index 0000000..fcb45c5 --- /dev/null +++ b/libitm/config/generic/asmcfi.h @@ -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 */ diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S index 725ffec..6169499 100644 --- a/libitm/config/x86/sjlj.S +++ b/libitm/config/x86/sjlj.S @@ -22,18 +22,21 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ + +#include "asmcfi.h" + .text .p2align 4 .globl _ITM_beginTransaction .type _ITM_beginTransaction, @function _ITM_beginTransaction: - .cfi_startproc + 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) @@ -45,12 +48,12 @@ _ITM_beginTransaction: movq %rsp, %rsi call 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) @@ -59,10 +62,10 @@ _ITM_beginTransaction: leal 8(%esp), %edx call GTM_begin_transaction addl $28, %esp - .cfi_def_cfa_offset 4 + cfi_def_cfa_offset(4) ret #endif - .cfi_endproc + cfi_endproc .size _ITM_beginTransaction, .-_ITM_beginTransaction .p2align 4 @@ -71,7 +74,7 @@ _ITM_beginTransaction: .hidden GTM_longjmp GTM_longjmp: - .cfi_startproc + cfi_startproc #ifdef __x86_64__ movq (%rdi), %rcx movq 8(%rdi), %rdx @@ -82,8 +85,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 +97,12 @@ 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 + cfi_endproc .size GTM_longjmp, .-GTM_longjmp .section .note.GNU-stack, "", @progbits diff --git a/libitm/configure b/libitm/configure index e6bc1aa..0f0ec1f 100644 --- a/libitm/configure +++ b/libitm/configure @@ -16908,6 +16908,42 @@ $as_echo "#define LIBITM_GNU_SYMBOL_VERSIONING 1" >>confdefs.h 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking how size_t is mangled" >&5 diff --git a/libitm/configure.ac b/libitm/configure.ac index dea7038..c40ecb5 100644 --- a/libitm/configure.ac +++ b/libitm/configure.ac @@ -219,6 +219,9 @@ if test $enable_symvers = gnu; then [Define to 1 if GNU symbol versioning is used for libitm.]) 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. LIBITM_CHECK_SIZE_T_MANGLING |