|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
ARM: A few libgcj bug fixesThis patch fixes a few bugs in ARM libgcj.
* We now use libgcc's atomic builtins. * We silence an ABI warning message that was causing spurious test failures. * We force libtool to link with the static libgcc as well as the dynamic libgcc_s. Not all routines are in libgcc_s, so linking only with that library causes failure. Andrew. 2009-08-12 Andrew Haley <aph@...> * sysdep/arm/locks.h: Use atomic builtins For Linux EABI. * configure.ac: Add ATOMICSPEC. * libgcj.spec.in: Likewise. * configure.host (arm*-linux*): Add -Wno-abi to cxxflags. (testsuite/libjava.jvmti/jvmti-interp.exp): Likewise. (testsuite/libjava.jvmti/jvmti.exp): Likewise. (testsuite/libjava.jni/jni.exp): Likewise. Set ATOMICSPEC. Set LDFLAGS to work around libtool feature. Index: configure.host =================================================================== --- configure.host (revision 150373) +++ configure.host (working copy) @@ -69,6 +69,7 @@ EXCEPTIONSPEC=-fnon-call-exceptions CHECKREFSPEC= BACKTRACESPEC= +ATOMICSPEC= # This case statement supports per-CPU defaults. case "${host}" in @@ -87,6 +88,11 @@ libgcj_interpreter=yes sysdeps_dir=arm fallback_backtrace_h=sysdep/arm/backtrace.h + libgcj_cxxflags=-Wno-abi + ATOMICSPEC=-fuse-atomic-builtins + # Work around a strange libtool feature that causes libraries + # to be linked with libgcc_s but not libgcc. + LDFLAGS="${LDFLAGS} -Wl,-lgcc" ;; mips-tx39-*|mipstx39-unknown-*) libgcj_flags="${libgcj_flags} -G 0" Index: configure.ac =================================================================== --- configure.ac (revision 150373) +++ configure.ac (working copy) @@ -1447,6 +1447,7 @@ AC_SUBST(EXCEPTIONSPEC) AC_SUBST(BACKTRACESPEC) AC_SUBST(IEEESPEC) +AC_SUBST(ATOMICSPEC) AM_CONDITIONAL(NATIVE, test "$NATIVE" = yes) AM_CONDITIONAL(ENABLE_SHARED, test "$enable_shared" = yes) Index: testsuite/libjava.jvmti/jvmti-interp.exp =================================================================== --- testsuite/libjava.jvmti/jvmti-interp.exp (revision 150373) +++ testsuite/libjava.jvmti/jvmti-interp.exp (working copy) @@ -32,7 +32,12 @@ set so_extension "so" set so_flag "-shared" } - + + # ARM C++ emits an ABI warning for varargs. + if { [istarget "arm*"] } { + lappend options "additional_flags=-Wno-abi" + } + set filename [file tail $file] set name [file rootname $filename] set soname lib${name}.${so_extension} Index: testsuite/libjava.jvmti/jvmti.exp =================================================================== --- testsuite/libjava.jvmti/jvmti.exp (revision 150373) +++ testsuite/libjava.jvmti/jvmti.exp (working copy) @@ -16,6 +16,10 @@ lappend options "additional_flags=-I$srcdir/.." # Find jvmti.h, jvmti_md.h, jvmti-int.h, jvm.h requirements lappend options "additional_flags=-I$srcdir/../include -I$srcdir/../classpath/include -I$objdir/../include -I$objdir/../../boehm-gc/include " + # ARM C++ emits an ABI warning for varargs. + if { [istarget "arm*"] } { + lappend options "additional_flags=-Wno-abi" + } set x [libjava_prune_warnings \ [target_compile $file $oname object $options]] Index: testsuite/libjava.jni/jni.exp =================================================================== --- testsuite/libjava.jni/jni.exp (revision 150373) +++ testsuite/libjava.jni/jni.exp (working copy) @@ -165,6 +165,11 @@ lappend cxxflaglist "-lstdc++" } + # ARM C++ emits an ABI warning for varargs. + if { [istarget "arm*"] } { + lappend cxxflaglist "-Wno-abi" + } + set cxxflags [join $cxxflaglist] } Index: sysdep/arm/locks.h =================================================================== --- sysdep/arm/locks.h (revision 150373) +++ sysdep/arm/locks.h (working copy) @@ -13,6 +13,59 @@ typedef size_t obj_addr_t; /* Integer type big enough for object */ /* address. */ +#if (__ARM_EABI__ && __linux) + +// Atomically replace *addr by new_val if it was initially equal to old. +// Return true if the comparison succeeded. +// Assumed to have acquire semantics, i.e. later memory operations +// cannot execute before the compare_and_swap finishes. +inline static bool +compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) +{ + return __sync_bool_compare_and_swap(addr, old, new_val); +} + +// Set *addr to new_val with release semantics, i.e. making sure +// that prior loads and stores complete before this +// assignment. +inline static void +release_set(volatile obj_addr_t *addr, obj_addr_t new_val) +{ + __sync_synchronize(); + *(addr) = new_val; +} + +// Compare_and_swap with release semantics instead of acquire semantics. +// On many architecture, the operation makes both guarantees, so the +// implementation can be the same. +inline static bool +compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) +{ + return __sync_bool_compare_and_swap(addr, old, new_val); +} + +// Ensure that subsequent instructions do not execute on stale +// data that was loaded from memory before the barrier. +// On X86, the hardware ensures that reads are properly ordered. +inline static void +read_barrier() +{ + __sync_synchronize(); +} + +// Ensure that prior stores to memory are completed with respect to other +// processors. +inline static void +write_barrier() +{ + __sync_synchronize(); +} + +#else /* Atomic compare and exchange. These sequences are not actually atomic; there is a race if *ADDR != OLD_VAL and we are preempted @@ -54,8 +107,8 @@ inline static bool compare_and_swap_release(volatile obj_addr_t *addr, - obj_addr_t old, - obj_addr_t new_val) + obj_addr_t old, + obj_addr_t new_val) { return compare_and_swap(addr, old, new_val); } @@ -77,3 +130,4 @@ } #endif +#endif Index: libgcj.spec.in =================================================================== --- libgcj.spec.in (revision 150373) +++ libgcj.spec.in (working copy) @@ -9,4 +9,4 @@ %rename lib liborig *lib: @LD_START_STATIC_SPEC@ @LIBGCJ_SPEC@ @LD_FINISH_STATIC_SPEC@ -lm @LIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) @LIBSTDCXXSPEC@ %(liborig) -*jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ -fkeep-inline-functions +*jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ @ATOMICSPEC@ -fkeep-inline-functions |
|
|
Re: ARM: A few libgcj bug fixesAndrew Haley wrote:
> This patch fixes a few bugs in ARM libgcj. > > * We now use libgcc's atomic builtins. > > * We silence an ABI warning message that was causing spurious test > failures. > > * We force libtool to link with the static libgcc as well as the > dynamic libgcc_s. Not all routines are in libgcc_s, so linking > only with that library causes failure. Duh. Andrew. 2009-08-17 Andrew Haley <aph@...> * Makefile.in, include/Makefile.in, testsuite/Makefile.in, gcj/Makefile.in: Regenerate. |
| Free embeddable forum powered by Nabble | Forum Help |