From patchwork Wed Nov 9 18:11:37 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 124649 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id BD7BA1007DB for ; Thu, 10 Nov 2011 05:12:00 +1100 (EST) Received: (qmail 17122 invoked by alias); 9 Nov 2011 18:11:57 -0000 Received: (qmail 17112 invoked by uid 22791); 9 Nov 2011 18:11:56 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL, BAYES_00, KAM_STOCKGEN, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, SPF_HELO_PASS, TW_BF, TW_DD, TW_GJ, TW_JL, TW_OV, TW_SV X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 Nov 2011 18:11:42 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pA9IBd2A015960 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 9 Nov 2011 13:11:39 -0500 Received: from anchor.twiddle.net (vpn-225-179.phx2.redhat.com [10.3.225.179]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id pA9IBcJK024817; Wed, 9 Nov 2011 13:11:38 -0500 Message-ID: <4EBAC259.1090002@redhat.com> Date: Wed, 09 Nov 2011 10:11:37 -0800 From: Richard Henderson User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0) Gecko/20110927 Thunderbird/7.0 MIME-Version: 1.0 To: GCC Patches CC: Rainer Orth Subject: [libitm] Configure for gas cfi pseudos X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Tested on x86_64-linux. This *ought* to fix RO's Solaris problem. Committed. r~ commit 67ba1f57ef6bafdcc0d5e43dbe5793367622977b Author: rth Date: Wed Nov 9 18:09:53 2011 +0000 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181224 138bc75d-0d04-0410-961f-82ee72b054a4 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 + + * asmcfi.m4: New file. + 2011-11-02 Rainer Orth * 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 + + * 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 * 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 . + + 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 + . */ + +#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 . */ + +#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