ARM: A few libgcj bug fixes
Andrew Haley
aph@redhat.com
Wed Aug 12 16:24:00 GMT 2009
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.
Andrew.
2009-08-12 Andrew Haley <aph@redhat.com>
* 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
More information about the Java-patches
mailing list