diff options
Diffstat (limited to 'libitm')
-rw-r--r-- | libitm/ChangeLog | 72 | ||||
-rw-r--r-- | libitm/Makefile.am | 23 | ||||
-rw-r--r-- | libitm/Makefile.in | 32 | ||||
-rw-r--r-- | libitm/acinclude.m4 | 65 | ||||
-rw-r--r-- | libitm/aclocal.m4 | 1 | ||||
-rw-r--r-- | libitm/alloc_cpp.cc | 18 | ||||
-rw-r--r-- | libitm/config.h.in | 3 | ||||
-rw-r--r-- | libitm/config/generic/asmcfi.h | 2 | ||||
-rw-r--r-- | libitm/config/x86/sjlj.S | 63 | ||||
-rw-r--r-- | libitm/configure | 160 | ||||
-rw-r--r-- | libitm/configure.ac | 2 | ||||
-rw-r--r-- | libitm/eh_cpp.cc | 8 | ||||
-rw-r--r-- | libitm/libitm_i.h | 8 | ||||
-rw-r--r-- | libitm/testsuite/Makefile.in | 10 | ||||
-rw-r--r-- | libitm/testsuite/lib/libitm.exp | 2 | ||||
-rw-r--r-- | libitm/testsuite/libitm.c/memcpy-1.c | 6 | ||||
-rw-r--r-- | libitm/testsuite/libitm.c/memset-1.c | 6 |
17 files changed, 406 insertions, 75 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog index 46c984e8c75..be994a5c36e 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,3 +1,75 @@ +2011-11-23 Iain Sandoe <iains@gcc.gnu.org> + + * Makefile.am (libitm_la_LDFLAGS): Remove "-no-undefined". + * Makefile.in: Regenerate. + +2011-11-22 Iain Sandoe <iains@gcc.gnu.org> + + * configure.ac: Use GCC_CHECK_ELF_STYLE_WEAKREF. + * alloc_cpp.cc: Generate dummy functions if we don't + HAVE_ELF_STYLE_WEAKREF. + * eh_cpp.cc: Likewise. + * configure: Regenerate. + * aclocal.m4: Likewise. + * config.h.in: Likewise. + * Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + +2011-11-22 Iain Sandoe <iains@gcc.gnu.org> + + * config/x86/sjlj.S (CONCAT1, CONCAT2, SYM): Respond to + __USER_LABEL_PREFIX__ for targets that use it. + (TYPE, SIZE, HIDDEN): New macros to assist on non-elf targets. + (_ITM_beginTransaction): Use SYM, TYPE, SIZE macros to assist + in portability to non-elf targets. + (GTM_longjmp): Likewise. + * libitm_i.h (begin_transaction): Apply __USER_LABEL_PREFIX__ + where required. + +2011-11-22 Iain Sandoe <iains@gcc.gnu.org> + + * testsuite/libitm.c/memcpy-1.c: Allow for MAP_ANON spelling. + * testsuite/libitm.c/memset-1.c: Likewise. + +2011-11-21 Andreas Tobler <andreast@fgznet.ch> + + * configure: Regenerate. + +2011-11-21 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * acinclude.m4 (LIBITM_CHECK_LINKER_FEATURES): Handle gold. + (LIBITM_ENABLE_SYMVERS): Handle sun style. + * Makefile.am: Handle sun style versioning. + (libitm_la_LINK): Add $(libitm_la_LDFLAGS). + * configure: Regenerate. + * Makefile.in: Regenerate. + +2011-11-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * config/generic/asmcfi.h: Fix comment. + * config/x86/sjlj.S (_ITM_beginTransaction): Provide ELF PIC code + sequence without .hidden support, error for non-ELF targets. + (GTM_longjmp) [__ELF__]: Only use .hidden if + HAVE_ATTRIBUTE_VISIBILITY. + +2011-11-17 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * alloc_cpp.cc [__osf__] (_ZnwX, _ZdlPv, _ZnaX, _ZdaPv, + _ZnwXRKSt9nothrow_t, _ZdlPvRKSt9nothrow_t, _ZdaPvRKSt9nothrow_t): + Dummy functions. + * eh_cpp.cc [__osf__] (__cxa_allocate_exception, __cxa_throw, + __cxa_begin_catch, __cxa_end_catch, __cxa_tm_cleanup): Likewise. + +2011-11-16 Uros Bizjak <ubizjak@gmail.com> + + PR bootstrap/51098 + * acinclude.m4 (LIBITM_CHECK_AS_AVX): Fix target selector. + * configure: Regenerate. + +2011-11-14 H.J. Lu <hongjiu.lu@intel.com> + + * testsuite/lib/libitm.exp: Check ia32 instead of ilp32. + 2011-11-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * config/alpha/sjlj.S (_ITM_beginTransaction) [!__ELF__]: Don't use diff --git a/libitm/Makefile.am b/libitm/Makefile.am index b4674a572fc..26e1ebc632c 100644 --- a/libitm/Makefile.am +++ b/libitm/Makefile.am @@ -27,17 +27,34 @@ toolexeclib_LTLIBRARIES = libitm.la nodist_toolexeclib_HEADERS = libitm.spec if LIBITM_BUILD_VERSIONED_SHLIB +if LIBITM_BUILD_VERSIONED_SHLIB_GNU libitm_version_script = -Wl,--version-script,$(top_srcdir)/libitm.map +libitm_version_dep = $(top_srcdir)/libitm.map +endif +if LIBITM_BUILD_VERSIONED_SHLIB_SUN +libitm_version_script = -Wl,-M,libitm.map-sun +libitm_version_dep = libitm.map-sun +libitm.map-sun : $(top_srcdir)/libitm.map \ + $(top_srcdir)/../contrib/make_sunver.pl \ + $(libitm_la_OBJECTS) $(libitm_la_LIBADD) + perl $(top_srcdir)/../contrib/make_sunver.pl \ + $(top_srcdir)/libitm.map \ + $(libitm_la_OBJECTS:%.lo=.libs/%.o) \ + `echo $(libitm_la_LIBADD) | \ + sed 's,/\([^/.]*\)\.la,/.libs/\1.a,g'` \ + > $@ || (rm -f $@ ; exit 1) +endif else libitm_version_script = +libitm_version_dep = endif libitm_version_info = -version-info $(libtool_VERSION) # Force link with C, not C++. For now, while we're using C++ we don't # want or need libstdc++. -libitm_la_LINK = $(LINK) -libitm_la_LDFLAGS = $(libitm_version_info) $(libitm_version_script) \ - -no-undefined +libitm_la_DEPENDENCIES = $(libitm_version_dep) +libitm_la_LINK = $(LINK) $(libitm_la_LDFLAGS) +libitm_la_LDFLAGS = $(libitm_version_info) $(libitm_version_script) libitm_la_SOURCES = \ aatree.cc alloc.cc alloc_c.cc alloc_cpp.cc barrier.cc beginend.cc \ diff --git a/libitm/Makefile.in b/libitm/Makefile.in index 74261463ebf..dc7738275e8 100644 --- a/libitm/Makefile.in +++ b/libitm/Makefile.in @@ -57,10 +57,12 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \ $(top_srcdir)/../config/multi.m4 \ $(top_srcdir)/../config/override.m4 \ $(top_srcdir)/../config/stdint.m4 \ - $(top_srcdir)/../config/tls.m4 $(top_srcdir)/../ltoptions.m4 \ - $(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \ - $(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/../libtool.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/../config/tls.m4 \ + $(top_srcdir)/../config/weakref.m4 \ + $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ + $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -359,15 +361,18 @@ AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS) toolexeclib_LTLIBRARIES = libitm.la nodist_toolexeclib_HEADERS = libitm.spec @LIBITM_BUILD_VERSIONED_SHLIB_FALSE@libitm_version_script = -@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@libitm_version_script = -Wl,--version-script,$(top_srcdir)/libitm.map +@LIBITM_BUILD_VERSIONED_SHLIB_GNU_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@libitm_version_script = -Wl,--version-script,$(top_srcdir)/libitm.map +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@libitm_version_script = -Wl,-M,libitm.map-sun +@LIBITM_BUILD_VERSIONED_SHLIB_FALSE@libitm_version_dep = +@LIBITM_BUILD_VERSIONED_SHLIB_GNU_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@libitm_version_dep = $(top_srcdir)/libitm.map +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@libitm_version_dep = libitm.map-sun libitm_version_info = -version-info $(libtool_VERSION) # Force link with C, not C++. For now, while we're using C++ we don't # want or need libstdc++. -libitm_la_LINK = $(LINK) -libitm_la_LDFLAGS = $(libitm_version_info) $(libitm_version_script) \ - -no-undefined - +libitm_la_DEPENDENCIES = $(libitm_version_dep) +libitm_la_LINK = $(LINK) $(libitm_la_LDFLAGS) +libitm_la_LDFLAGS = $(libitm_version_info) $(libitm_version_script) libitm_la_SOURCES = aatree.cc alloc.cc alloc_c.cc alloc_cpp.cc \ barrier.cc beginend.cc clone.cc eh_cpp.cc local.cc query.cc \ retry.cc rwlock.cc useraction.cc util.cc sjlj.S tls.cc \ @@ -1258,6 +1263,15 @@ uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ vpath % $(strip $(search_path)) +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@libitm.map-sun : $(top_srcdir)/libitm.map \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ $(top_srcdir)/../contrib/make_sunver.pl \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ $(libitm_la_OBJECTS) $(libitm_la_LIBADD) +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ perl $(top_srcdir)/../contrib/make_sunver.pl \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ $(top_srcdir)/libitm.map \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ $(libitm_la_OBJECTS:%.lo=.libs/%.o) \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ `echo $(libitm_la_LIBADD) | \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ sed 's,/\([^/.]*\)\.la,/.libs/\1.a,g'` \ +@LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE@@LIBITM_BUILD_VERSIONED_SHLIB_TRUE@ > $@ || (rm -f $@ ; exit 1) @ARCH_X86_TRUE@x86_sse.lo : XCFLAGS += -msse @ARCH_X86_AVX_TRUE@x86_avx.lo : XCFLAGS += -mavx diff --git a/libitm/acinclude.m4 b/libitm/acinclude.m4 index 58fbf424c60..069738d8e80 100644 --- a/libitm/acinclude.m4 +++ b/libitm/acinclude.m4 @@ -98,7 +98,7 @@ AC_DEFUN([LIBITM_CHECK_SIZE_T_MANGLING], [ dnl Check if as supports AVX instructions. AC_DEFUN([LIBITM_CHECK_AS_AVX], [ case "${target_cpu}" in -i[3456]86 | x86_64) +i[[34567]]86 | x86_64) AC_CACHE_CHECK([if the assembler supports AVX], libitm_cv_as_avx, [ AC_TRY_COMPILE([], [asm("vzeroupper");], [libitm_cv_as_avx=yes], [libitm_cv_as_avx=no]) @@ -169,6 +169,7 @@ dnl OPT_LDFLAGS='-Wl,-O1' if possible dnl LD (as a side effect of testing) dnl Sets: dnl with_gnu_ld +dnl libitm_ld_is_gold (possibly) dnl libitm_gnu_ld_version (possibly) dnl dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will @@ -200,9 +201,13 @@ AC_DEFUN([LIBITM_CHECK_LINKER_FEATURES], [ # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. + libitm_ld_is_gold=no + if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then + libitm_ld_is_gold=yes + fi changequote(,) - ldver=`$LD --version 2>/dev/null | head -1 | \ - sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` + ldver=`$LD --version 2>/dev/null | + sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` changequote([,]) libitm_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` @@ -272,16 +277,46 @@ AC_DEFUN([LIBITM_ENABLE_SYMVERS], [ LIBITM_ENABLE(symvers,yes,[=STYLE], [enables symbol versioning of the shared library], - [permit yes|no|gnu]) + [permit yes|no|gnu*|sun]) # If we never went through the LIBITM_CHECK_LINKER_FEATURES macro, then we # don't know enough about $LD to do tricks... AC_REQUIRE([LIBITM_CHECK_LINKER_FEATURES]) -# FIXME The following test is too strict, in theory. -if test $enable_shared = no || - test "x$LD" = x || - test x$libitm_gnu_ld_version = x; then - enable_symvers=no + +# Turn a 'yes' into a suitable default. +if test x$enable_symvers = xyes ; then + # FIXME The following test is too strict, in theory. + if test $enable_shared = no || test "x$LD" = x; then + enable_symvers=no + else + if test $with_gnu_ld = yes ; then + enable_symvers=gnu + else + case ${target_os} in + # Sun symbol versioning exists since Solaris 2.5. + solaris2.[[5-9]]* | solaris2.1[[0-9]]*) + enable_symvers=sun ;; + *) + enable_symvers=no ;; + esac + fi + fi +fi + +# Check if 'sun' was requested on non-Solaris 2 platforms. +if test x$enable_symvers = xsun ; then + case ${target_os} in + solaris2*) + # All fine. + ;; + *) + # Unlikely to work. + AC_MSG_WARN([=== You have requested Sun symbol versioning, but]) + AC_MSG_WARN([=== you are not targetting Solaris 2.]) + AC_MSG_WARN([=== Symbol versioning will be disabled.]) + enable_symvers=no + ;; + esac fi # Check to see if libgcc_s exists, indicating that shared libgcc is possible. @@ -318,12 +353,12 @@ libitm_min_gnu_ld_version=21400 # Check to see if unspecified "yes" value can win, given results above. # Change "yes" into either "no" or a style name. -if test $enable_symvers = yes; then - if test $with_gnu_ld = yes && - test $libitm_shared_libgcc = yes; - then +if test $enable_symvers != no && test $libitm_shared_libgcc = yes; then + if test $with_gnu_ld = yes; then if test $libitm_gnu_ld_version -ge $libitm_min_gnu_ld_version ; then enable_symvers=gnu + elif test $libitm_ld_is_gold = yes ; then + enable_symvers=gnu else # The right tools, the right setup, but too old. Fallbacks? AC_MSG_WARN(=== Linker version $libitm_gnu_ld_version is too old for) @@ -342,6 +377,8 @@ if test $enable_symvers = yes; then enable_symvers=no fi fi + elif test $enable_symvers = sun; then + : All interesting versions of Sun ld support sun style symbol versioning. else # just fail for now AC_MSG_WARN([=== You have requested some kind of symbol versioning, but]) @@ -353,5 +390,7 @@ if test $enable_symvers = yes; then fi AM_CONDITIONAL(LIBITM_BUILD_VERSIONED_SHLIB, test $enable_symvers != no) +AM_CONDITIONAL(LIBITM_BUILD_VERSIONED_SHLIB_GNU, test $enable_symvers = gnu) +AM_CONDITIONAL(LIBITM_BUILD_VERSIONED_SHLIB_SUN, test $enable_symvers = sun) AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers) ]) diff --git a/libitm/aclocal.m4 b/libitm/aclocal.m4 index 96617e6e4db..625404e06f6 100644 --- a/libitm/aclocal.m4 +++ b/libitm/aclocal.m4 @@ -1001,6 +1001,7 @@ m4_include([../config/multi.m4]) m4_include([../config/override.m4]) m4_include([../config/stdint.m4]) m4_include([../config/tls.m4]) +m4_include([../config/weakref.m4]) m4_include([../ltoptions.m4]) m4_include([../ltsugar.m4]) m4_include([../ltversion.m4]) diff --git a/libitm/alloc_cpp.cc b/libitm/alloc_cpp.cc index 4e535513cd5..0789b2e5342 100644 --- a/libitm/alloc_cpp.cc +++ b/libitm/alloc_cpp.cc @@ -60,13 +60,17 @@ extern void _ZdlPvRKSt9nothrow_t (void *, c_nothrow_p) __attribute__((weak)); extern void *_ZnaXRKSt9nothrow_t (size_t, c_nothrow_p) __attribute__((weak)); extern void _ZdaPvRKSt9nothrow_t (void *, c_nothrow_p) __attribute__((weak)); -#ifdef __osf__ /* Really: !HAVE_WEAKDEF */ -void * -_ZnaXRKSt9nothrow_t (size_t, c_nothrow_p) -{ - return NULL; -} -#endif /* __osf__ */ +#if !defined (HAVE_ELF_STYLE_WEAKREF) +void *_ZnwX (size_t) { return NULL; } +void _ZdlPv (void *) { return; } +void *_ZnaX (size_t) { return NULL; } +void _ZdaPv (void *) { return; } + +void *_ZnwXRKSt9nothrow_t (size_t, c_nothrow_p) { return NULL; } +void _ZdlPvRKSt9nothrow_t (void *, c_nothrow_p) { return; } +void *_ZnaXRKSt9nothrow_t (size_t, c_nothrow_p) { return NULL; } +void _ZdaPvRKSt9nothrow_t (void *, c_nothrow_p) { return; } +#endif /* HAVE_ELF_STYLE_WEAKREF */ /* Wrap the delete nothrow symbols for usage with a single argument. Perhaps should have a configure type check for this, because the diff --git a/libitm/config.h.in b/libitm/config.h.in index 52db1a6fdc1..1c3469cd5f9 100644 --- a/libitm/config.h.in +++ b/libitm/config.h.in @@ -30,6 +30,9 @@ /* Define to 1 if you have the <dlfcn.h> header file. */ #undef HAVE_DLFCN_H +/* Define to 1 if target has a weakref that works like the ELF one. */ +#undef HAVE_ELF_STYLE_WEAKREF + /* Define to 1 if you have the <inttypes.h> header file. */ #undef HAVE_INTTYPES_H diff --git a/libitm/config/generic/asmcfi.h b/libitm/config/generic/asmcfi.h index fcb45c58739..4344d6f8f97 100644 --- a/libitm/config/generic/asmcfi.h +++ b/libitm/config/generic/asmcfi.h @@ -41,4 +41,4 @@ #define cfi_def_cfa(r,n) #define cfi_register(o,n) -#endif /* HAVE_ASM_CFI */ +#endif /* HAVE_AS_CFI_PSEUDO_OP */ diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S index 32572d9db60..39e0c758d6d 100644 --- a/libitm/config/x86/sjlj.S +++ b/libitm/config/x86/sjlj.S @@ -25,12 +25,39 @@ #include "asmcfi.h" +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +#ifdef __USER_LABEL_PREFIX__ +# define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) +#else +# define SYM(x) x +#endif + +#ifdef __ELF__ +# define TYPE(x) .type SYM(x), @function +# define SIZE(x) .size SYM(x), . - SYM(x) +# ifdef HAVE_ATTRIBUTE_VISIBILITY +# define HIDDEN(x) .hidden SYM(x) +# else +# define HIDDEN(x) +# endif +#else +# define TYPE(x) +# define SIZE(x) +# ifdef __MACH__ +# define HIDDEN(x) .private_extern SYM(x) +# else +# define HIDDEN(x) +# endif +#endif + .text .align 4 - .globl _ITM_beginTransaction + .globl SYM(_ITM_beginTransaction) -_ITM_beginTransaction: +SYM(_ITM_beginTransaction): cfi_startproc #ifdef __x86_64__ leaq 8(%rsp), %rax @@ -46,7 +73,7 @@ _ITM_beginTransaction: movq %r14, 48(%rsp) movq %r15, 56(%rsp) movq %rsp, %rsi - call GTM_begin_transaction + call SYM(GTM_begin_transaction) addq $72, %rsp cfi_def_cfa_offset(8) ret @@ -60,22 +87,30 @@ _ITM_beginTransaction: movl %edi, 20(%esp) movl %ebp, 24(%esp) leal 8(%esp), %edx - call GTM_begin_transaction +#if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__ + call SYM(GTM_begin_transaction) +#elif defined __ELF__ + call 1f +1: popl %ebx + addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx + call SYM(GTM_begin_transaction)@PLT + movl 12(%esp), %ebx +#else +# error "Unsupported PIC sequence" +#endif addl $28, %esp cfi_def_cfa_offset(4) ret #endif cfi_endproc -#ifdef __ELF__ - .type _ITM_beginTransaction, @function - .size _ITM_beginTransaction, .-_ITM_beginTransaction -#endif + TYPE(_ITM_beginTransaction) + SIZE(_ITM_beginTransaction) .align 4 - .globl GTM_longjmp + .globl SYM(GTM_longjmp) -GTM_longjmp: +SYM(GTM_longjmp): cfi_startproc #ifdef __x86_64__ movq (%rdi), %rcx @@ -106,11 +141,9 @@ GTM_longjmp: #endif cfi_endproc -#ifdef __ELF__ - .type GTM_longjmp, @function - .hidden GTM_longjmp - .size GTM_longjmp, .-GTM_longjmp -#endif + TYPE(GTM_longjmp) + HIDDEN(GTM_longjmp) + SIZE(GTM_longjmp) #ifdef __linux__ .section .note.GNU-stack, "", @progbits diff --git a/libitm/configure b/libitm/configure index c0317ccfc4d..9b063594111 100644 --- a/libitm/configure +++ b/libitm/configure @@ -611,6 +611,10 @@ link_itm XLDFLAGS XCFLAGS config_path +LIBITM_BUILD_VERSIONED_SHLIB_SUN_FALSE +LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE +LIBITM_BUILD_VERSIONED_SHLIB_GNU_FALSE +LIBITM_BUILD_VERSIONED_SHLIB_GNU_TRUE LIBITM_BUILD_VERSIONED_SHLIB_FALSE LIBITM_BUILD_VERSIONED_SHLIB_TRUE OPT_LDFLAGS @@ -9951,7 +9955,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) + freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes @@ -10864,7 +10868,7 @@ freebsd* | dragonfly*) objformat=`/usr/bin/objformat` else case $host_os in - freebsd[123]*) objformat=aout ;; + freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi @@ -10882,7 +10886,7 @@ freebsd* | dragonfly*) esac shlibpath_var=LD_LIBRARY_PATH case $host_os in - freebsd2*) + freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) @@ -11716,7 +11720,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11719 "configure" +#line 11723 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11822,7 +11826,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11825 "configure" +#line 11829 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12748,7 +12752,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac ;; - freebsd[12]*) + freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no @@ -14523,7 +14527,7 @@ freebsd* | dragonfly*) objformat=`/usr/bin/objformat` else case $host_os in - freebsd[123]*) objformat=aout ;; + freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi @@ -14541,7 +14545,7 @@ freebsd* | dragonfly*) esac shlibpath_var=LD_LIBRARY_PATH case $host_os in - freebsd2*) + freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) @@ -16688,9 +16692,13 @@ with_gnu_ld=$lt_cv_prog_gnu_ld # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. + libitm_ld_is_gold=no + if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then + libitm_ld_is_gold=yes + fi - ldver=`$LD --version 2>/dev/null | head -1 | \ - sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` + ldver=`$LD --version 2>/dev/null | + sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` libitm_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` @@ -16764,7 +16772,7 @@ $as_echo "$ac_sectionLDflags" >&6; } if test "${enable_symvers+set}" = set; then : enableval=$enable_symvers; case "$enableval" in - yes|no|gnu) ;; + yes|no|gnu*|sun) ;; *) as_fn_error "Unknown argument to enable/disable symvers" "$LINENO" 5 ;; esac @@ -16777,11 +16785,44 @@ fi # If we never went through the LIBITM_CHECK_LINKER_FEATURES macro, then we # don't know enough about $LD to do tricks... -# FIXME The following test is too strict, in theory. -if test $enable_shared = no || - test "x$LD" = x || - test x$libitm_gnu_ld_version = x; then - enable_symvers=no + +# Turn a 'yes' into a suitable default. +if test x$enable_symvers = xyes ; then + # FIXME The following test is too strict, in theory. + if test $enable_shared = no || test "x$LD" = x; then + enable_symvers=no + else + if test $with_gnu_ld = yes ; then + enable_symvers=gnu + else + case ${target_os} in + # Sun symbol versioning exists since Solaris 2.5. + solaris2.[5-9]* | solaris2.1[0-9]*) + enable_symvers=sun ;; + *) + enable_symvers=no ;; + esac + fi + fi +fi + +# Check if 'sun' was requested on non-Solaris 2 platforms. +if test x$enable_symvers = xsun ; then + case ${target_os} in + solaris2*) + # All fine. + ;; + *) + # Unlikely to work. + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You have requested Sun symbol versioning, but" >&5 +$as_echo "$as_me: WARNING: === You have requested Sun symbol versioning, but" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === you are not targetting Solaris 2." >&5 +$as_echo "$as_me: WARNING: === you are not targetting Solaris 2." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Symbol versioning will be disabled." >&5 +$as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;} + enable_symvers=no + ;; + esac fi # Check to see if libgcc_s exists, indicating that shared libgcc is possible. @@ -16850,12 +16891,12 @@ libitm_min_gnu_ld_version=21400 # Check to see if unspecified "yes" value can win, given results above. # Change "yes" into either "no" or a style name. -if test $enable_symvers = yes; then - if test $with_gnu_ld = yes && - test $libitm_shared_libgcc = yes; - then +if test $enable_symvers != no && test $libitm_shared_libgcc = yes; then + if test $with_gnu_ld = yes; then if test $libitm_gnu_ld_version -ge $libitm_min_gnu_ld_version ; then enable_symvers=gnu + elif test $libitm_ld_is_gold = yes ; then + enable_symvers=gnu else # The right tools, the right setup, but too old. Fallbacks? { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Linker version $libitm_gnu_ld_version is too old for" >&5 @@ -16878,6 +16919,8 @@ $as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;} enable_symvers=no fi fi + elif test $enable_symvers = sun; then + : All interesting versions of Sun ld support sun style symbol versioning. else # just fail for now { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You have requested some kind of symbol versioning, but" >&5 @@ -16900,6 +16943,22 @@ else LIBITM_BUILD_VERSIONED_SHLIB_FALSE= fi + if test $enable_symvers = gnu; then + LIBITM_BUILD_VERSIONED_SHLIB_GNU_TRUE= + LIBITM_BUILD_VERSIONED_SHLIB_GNU_FALSE='#' +else + LIBITM_BUILD_VERSIONED_SHLIB_GNU_TRUE='#' + LIBITM_BUILD_VERSIONED_SHLIB_GNU_FALSE= +fi + + if test $enable_symvers = sun; then + LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE= + LIBITM_BUILD_VERSIONED_SHLIB_SUN_FALSE='#' +else + LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE='#' + LIBITM_BUILD_VERSIONED_SHLIB_SUN_FALSE= +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: versioning on shared library symbols is $enable_symvers" >&5 $as_echo "$as_me: versioning on shared library symbols is $enable_symvers" >&6;} @@ -17118,7 +17177,7 @@ $as_echo "#define HAVE_64BIT_SYNC_BUILTINS 1" >>confdefs.h fi case "${target_cpu}" in -i345686 | x86_64) +i[34567]86 | x86_64) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler supports AVX" >&5 $as_echo_n "checking if the assembler supports AVX... " >&6; } if test "${libitm_cv_as_avx+set}" = set; then : @@ -17154,6 +17213,57 @@ $as_echo "#define HAVE_AS_AVX 1" >>confdefs.h ;; esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether weak refs work like ELF" >&5 +$as_echo_n "checking whether weak refs work like ELF... " >&6; } +if test "${ac_cv_have_elf_style_weakref+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + weakref_m4_saved_CFLAGS="$CFLAGS" + case "${host}" in + *-apple-darwin*) CFLAGS="$CFLAGS -Wl,-undefined,dynamic_lookup" ;; + *) ;; + esac + if test "$cross_compiling" = yes; then : + +case "${host}" in + alpha*-dec-osf*) ac_cv_have_elf_style_weakref=no ;; + *-apple-darwin[89]*) ac_cv_have_elf_style_weakref=no ;; + *) ac_cv_have_elf_style_weakref=yes;; +esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +extern void fNotToBeFound(void) __attribute__((weak)); +int main () +{ + if (fNotToBeFound) + return 1; + else + return 0; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_have_elf_style_weakref=yes +else + ac_cv_have_elf_style_weakref=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +CFLAGS="$weakref_m4_saved_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_elf_style_weakref" >&5 +$as_echo "$ac_cv_have_elf_style_weakref" >&6; } +if test x"$ac_cv_have_elf_style_weakref" = xyes; then + +$as_echo "#define HAVE_ELF_STYLE_WEAKREF 1" >>confdefs.h + +fi + # Cleanup and exit. CFLAGS="$save_CFLAGS" cat >confcache <<\_ACEOF @@ -17424,6 +17534,14 @@ if test -z "${LIBITM_BUILD_VERSIONED_SHLIB_TRUE}" && test -z "${LIBITM_BUILD_VER as_fn_error "conditional \"LIBITM_BUILD_VERSIONED_SHLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${LIBITM_BUILD_VERSIONED_SHLIB_GNU_TRUE}" && test -z "${LIBITM_BUILD_VERSIONED_SHLIB_GNU_FALSE}"; then + as_fn_error "conditional \"LIBITM_BUILD_VERSIONED_SHLIB_GNU\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LIBITM_BUILD_VERSIONED_SHLIB_SUN_TRUE}" && test -z "${LIBITM_BUILD_VERSIONED_SHLIB_SUN_FALSE}"; then + as_fn_error "conditional \"LIBITM_BUILD_VERSIONED_SHLIB_SUN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${ARCH_X86_TRUE}" && test -z "${ARCH_X86_FALSE}"; then as_fn_error "conditional \"ARCH_X86\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/libitm/configure.ac b/libitm/configure.ac index 672b71279e3..45ee8701e38 100644 --- a/libitm/configure.ac +++ b/libitm/configure.ac @@ -239,6 +239,8 @@ LIBITM_CHECK_SYNC_BUILTINS LIBITM_CHECK_64BIT_SYNC_BUILTINS LIBITM_CHECK_AS_AVX +GCC_CHECK_ELF_STYLE_WEAKREF + # Cleanup and exit. CFLAGS="$save_CFLAGS" AC_CACHE_SAVE diff --git a/libitm/eh_cpp.cc b/libitm/eh_cpp.cc index 7cba97cc48c..6f302cdc4ae 100644 --- a/libitm/eh_cpp.cc +++ b/libitm/eh_cpp.cc @@ -39,6 +39,14 @@ extern void *__cxa_begin_catch (void *) WEAK; extern void *__cxa_end_catch (void) WEAK; extern void __cxa_tm_cleanup (void *, void *, unsigned int) WEAK; +#if !defined (HAVE_ELF_STYLE_WEAKREF) +void *__cxa_allocate_exception (size_t) { return NULL; } +void __cxa_throw (void *, void *, void *) { return; } +void *__cxa_begin_catch (void *) { return NULL; } +void *__cxa_end_catch (void) { return NULL; } +void __cxa_tm_cleanup (void *, void *, unsigned int) { return; } +#endif /* HAVE_ELF_STYLE_WEAKREF */ + } diff --git a/libitm/libitm_i.h b/libitm/libitm_i.h index 58e43b01281..ba1afb4710c 100644 --- a/libitm/libitm_i.h +++ b/libitm/libitm_i.h @@ -240,9 +240,15 @@ struct gtm_thread // Invoked from assembly language, thus the "asm" specifier on // the name, avoiding complex name mangling. +#ifdef __USER_LABEL_PREFIX__ +#define UPFX1(t) UPFX(t) +#define UPFX(t) #t + static uint32_t begin_transaction(uint32_t, const gtm_jmpbuf *) + __asm__(UPFX1(__USER_LABEL_PREFIX__) "GTM_begin_transaction") ITM_REGPARM; +#else static uint32_t begin_transaction(uint32_t, const gtm_jmpbuf *) __asm__("GTM_begin_transaction") ITM_REGPARM; - +#endif // In eh_cpp.cc void revert_cpp_exceptions (gtm_transaction_cp *cp = 0); diff --git a/libitm/testsuite/Makefile.in b/libitm/testsuite/Makefile.in index 6990cfeb681..8066a2a0388 100644 --- a/libitm/testsuite/Makefile.in +++ b/libitm/testsuite/Makefile.in @@ -47,10 +47,12 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \ $(top_srcdir)/../config/multi.m4 \ $(top_srcdir)/../config/override.m4 \ $(top_srcdir)/../config/stdint.m4 \ - $(top_srcdir)/../config/tls.m4 $(top_srcdir)/../ltoptions.m4 \ - $(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \ - $(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/../libtool.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/../config/tls.m4 \ + $(top_srcdir)/../config/weakref.m4 \ + $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ + $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs diff --git a/libitm/testsuite/lib/libitm.exp b/libitm/testsuite/lib/libitm.exp index 701120aa557..74f7f80859a 100644 --- a/libitm/testsuite/lib/libitm.exp +++ b/libitm/testsuite/lib/libitm.exp @@ -144,7 +144,7 @@ proc libitm_init { args } { # We use atomic operations in the testcases to validate results. if { ([istarget i?86-*-*] || [istarget x86_64-*-*]) - && [check_effective_target_ilp32] } { + && [check_effective_target_ia32] } { lappend ALWAYS_CFLAGS "additional_flags=-march=i486" } diff --git a/libitm/testsuite/libitm.c/memcpy-1.c b/libitm/testsuite/libitm.c/memcpy-1.c index e4b56573b26..03b381285df 100644 --- a/libitm/testsuite/libitm.c/memcpy-1.c +++ b/libitm/testsuite/libitm.c/memcpy-1.c @@ -84,6 +84,12 @@ do_test (size_t align1, size_t align2, size_t len) } } +#ifndef MAP_ANONYMOUS +# ifdef MAP_ANON +# define MAP_ANONYMOUS MAP_ANON +# endif +#endif + int main() { size_t i, j; diff --git a/libitm/testsuite/libitm.c/memset-1.c b/libitm/testsuite/libitm.c/memset-1.c index 87bf6c62322..11aea458ca1 100644 --- a/libitm/testsuite/libitm.c/memset-1.c +++ b/libitm/testsuite/libitm.c/memset-1.c @@ -33,6 +33,12 @@ static unsigned char *buf; static size_t bufsize, page_size; static int fail; +#ifndef MAP_ANONYMOUS +# ifdef MAP_ANON +# define MAP_ANONYMOUS MAP_ANON +# endif +#endif + static void do_test (size_t align, size_t len) { |