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