OSDN Git Service

libitm: Configure for gas cfi pseudo ops.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2011 18:09:53 +0000 (18:09 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2011 18:09:53 +0000 (18:09 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181224 138bc75d-0d04-0410-961f-82ee72b054a4

config/ChangeLog
config/asmcfi.m4 [new file with mode: 0644]
libitm/ChangeLog
libitm/aclocal.m4
libitm/config.h.in
libitm/config/generic/asmcfi.h [new file with mode: 0644]
libitm/config/x86/sjlj.S
libitm/configure
libitm/configure.ac

index 7737f99..4f202ff 100644 (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>
 
        * mh-interix (LIBGCC2_DEBUG_CFLAGS): Remove.
diff --git a/config/asmcfi.m4 b/config/asmcfi.m4
new file mode 100644 (file)
index 0000000..a725aa1
--- /dev/null
@@ -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
+])
index fe1d7d0..e91f91e 100644 (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>
 
        * local.cc (_ITM_LB): Use a normal call, not a function alias.
index 6dcccdf..96617e6 100644 (file)
@@ -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])
index af13264..369f6c6 100644 (file)
@@ -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 (file)
index 0000000..fcb45c5
--- /dev/null
@@ -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 */
index 725ffec..6169499 100644 (file)
    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
index e6bc1aa..0f0ec1f 100644 (file)
@@ -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
index dea7038..c40ecb5 100644 (file)
@@ -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