# HG changeset patch # User Doug Simon # Date 1363972735 -3600 # Node ID 71a9f3a5d8c5a0729238d7dc9de9fc2f95802011 # Parent b6b9ab1fde62c26bde0d23701a2e3ed89ec01302# Parent 3e85441907dedad60548e7d2229bb9a59603d846 Merge. diff -r 3e85441907de -r 71a9f3a5d8c5 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java Fri Mar 22 09:28:38 2013 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java Fri Mar 22 18:18:55 2013 +0100 @@ -27,6 +27,7 @@ import com.oracle.graal.api.replacements.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.java.*; import com.oracle.graal.replacements.*; import com.oracle.graal.word.*; @@ -47,6 +48,11 @@ return computeHashCode(thisObj); } + @MethodSubstitution(value = "", isStatic = false) + public static void init(Object thisObj) { + RegisterFinalizerNode.register(thisObj); + } + @MacroSubstitution(macro = ObjectCloneNode.class, isStatic = false) public static native Object clone(Object obj); } diff -r 3e85441907de -r 71a9f3a5d8c5 graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Fri Mar 22 09:28:38 2013 -0700 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Fri Mar 22 18:18:55 2013 +0100 @@ -782,14 +782,6 @@ stream.setBCI(block.startBci); while (stream.currentBCI() <= block.endBci) { switch (stream.currentBC()) { - case RETURN: - if (method.isConstructor() && MetaUtil.isJavaLangObject(method.getDeclaringClass())) { - // return from Object.init implicitly registers a finalizer - // for the receiver if needed, so keep it alive. - loadOne(block, 0); - } - break; - case LLOAD: case DLOAD: loadTwo(block, stream.readLocalIndex()); diff -r 3e85441907de -r 71a9f3a5d8c5 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Mar 22 09:28:38 2013 -0700 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Mar 22 18:18:55 2013 +0100 @@ -1143,11 +1143,6 @@ } } - private void callRegisterFinalizer() { - // append a call to the finalizer registration - append(currentGraph.add(new RegisterFinalizerNode(frameState.loadLocal(0)))); - } - private void genReturn(ValueNode x) { frameState.clearStack(); if (x != null) { @@ -1562,9 +1557,6 @@ } private void createReturn() { - if (method.isConstructor() && MetaUtil.isJavaLangObject(method.getDeclaringClass())) { - callRegisterFinalizer(); - } Kind returnKind = method.getSignature().getReturnKind().getStackKind(); ValueNode x = returnKind == Kind.Void ? null : frameState.pop(returnKind); assert frameState.stackSize() == 0; diff -r 3e85441907de -r 71a9f3a5d8c5 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Fri Mar 22 09:28:38 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Fri Mar 22 18:18:55 2013 +0100 @@ -22,7 +22,14 @@ */ package com.oracle.graal.nodes.extended; +import static com.oracle.graal.graph.UnsafeAccess.*; + +import java.lang.reflect.*; + +import sun.misc.*; + import com.oracle.graal.api.code.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -55,5 +62,25 @@ @SuppressWarnings("unused") @NodeIntrinsic public static void memoryBarrier(@ConstantNodeParameter int barriers) { + // Overly conservative but it doesn't matter in the interpreter + unsafe.putIntVolatile(dummyBase, dummyOffset, 0); + unsafe.getIntVolatile(dummyBase, dummyOffset); + } + + /** + * An unused field that it used to exercise barriers in the interpreter. This can be replaced + * with direct support for barriers in {@link Unsafe} if/when they become available. + */ + @SuppressWarnings("unused") private static int dummy; + private static Object dummyBase; + private static long dummyOffset; + static { + try { + Field dummyField = MembarNode.class.getDeclaredField("dummy"); + dummyBase = unsafe.staticFieldBase(dummyField); + dummyOffset = unsafe.staticFieldOffset(dummyField); + } catch (Exception e) { + throw new GraalInternalError(e); + } } } diff -r 3e85441907de -r 71a9f3a5d8c5 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Fri Mar 22 09:28:38 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Fri Mar 22 18:18:55 2013 +0100 @@ -61,8 +61,8 @@ if (stamp.isExactType()) { needsCheck = stamp.type().hasFinalizer(); } else if (stamp.type() != null && !stamp.type().hasFinalizableSubclass()) { - // if either the declared type of receiver or the holder can be assumed to have no - // finalizers + // if either the declared type of receiver or the holder + // can be assumed to have no finalizers if (tool.assumptions().useOptimisticAssumptions() && tool.assumptions().recordNoFinalizableSubclassAssumption(stamp.type())) { needsCheck = false; } @@ -82,4 +82,9 @@ tool.delete(); } } + + @SuppressWarnings("unused") + @NodeIntrinsic + public static void register(Object thisObj) { + } } diff -r 3e85441907de -r 71a9f3a5d8c5 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java Fri Mar 22 09:28:38 2013 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java Fri Mar 22 18:18:55 2013 +0100 @@ -22,7 +22,8 @@ */ package com.oracle.graal.replacements; -import com.oracle.graal.api.code.*; +import static com.oracle.graal.api.code.MemoryBarriers.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.nodes.extended.*; @@ -57,9 +58,9 @@ @MethodSubstitution(isStatic = false) public static Object getObjectVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); Object result = getObject(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -70,16 +71,16 @@ @MethodSubstitution(isStatic = false) public static void putObjectVolatile(final Object thisObj, Object o, long offset, Object x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putObject(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) public static void putOrderedObject(final Object thisObj, Object o, long offset, Object x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putObject(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -90,9 +91,9 @@ @MethodSubstitution(isStatic = false) public static int getIntVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); int result = getInt(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -103,16 +104,16 @@ @MethodSubstitution(isStatic = false) public static void putIntVolatile(final Object thisObj, Object o, long offset, int x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putInt(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) public static void putOrderedInt(final Object thisObj, Object o, long offset, int x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putInt(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -124,9 +125,9 @@ @MethodSubstitution(isStatic = false) public static boolean getBooleanVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); boolean result = getBoolean(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -137,9 +138,9 @@ @MethodSubstitution(isStatic = false) public static void putBooleanVolatile(final Object thisObj, Object o, long offset, boolean x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putBoolean(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -151,9 +152,9 @@ @MethodSubstitution(isStatic = false) public static byte getByteVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); byte result = getByte(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -164,9 +165,9 @@ @MethodSubstitution(isStatic = false) public static void putByteVolatile(final Object thisObj, Object o, long offset, byte x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putByte(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -178,9 +179,9 @@ @MethodSubstitution(isStatic = false) public static short getShortVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); short result = getShort(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -191,9 +192,9 @@ @MethodSubstitution(isStatic = false) public static void putShortVolatile(final Object thisObj, Object o, long offset, short x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putShort(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -205,9 +206,9 @@ @MethodSubstitution(isStatic = false) public static char getCharVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); char result = getChar(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -218,9 +219,9 @@ @MethodSubstitution(isStatic = false) public static void putCharVolatile(final Object thisObj, Object o, long offset, char x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putChar(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -232,9 +233,9 @@ @MethodSubstitution(isStatic = false) public static long getLongVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); long result = getLong(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -245,16 +246,16 @@ @MethodSubstitution(isStatic = false) public static void putLongVolatile(final Object thisObj, Object o, long offset, long x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putLong(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) public static void putOrderedLong(final Object thisObj, Object o, long offset, long x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putLong(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -266,9 +267,9 @@ @MethodSubstitution(isStatic = false) public static float getFloatVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); float result = getFloat(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -279,9 +280,9 @@ @MethodSubstitution(isStatic = false) public static void putFloatVolatile(final Object thisObj, Object o, long offset, float x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putFloat(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) @@ -293,9 +294,9 @@ @MethodSubstitution(isStatic = false) public static double getDoubleVolatile(final Object thisObj, Object o, long offset) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ); double result = getDouble(thisObj, o, offset); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ); return result; } @@ -306,9 +307,9 @@ @MethodSubstitution(isStatic = false) public static void putDoubleVolatile(final Object thisObj, Object o, long offset, double x) { - MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE); putDouble(thisObj, o, offset, x); - MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE); + MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE); } @MethodSubstitution(isStatic = false) diff -r 3e85441907de -r 71a9f3a5d8c5 mxtool/mx.py --- a/mxtool/mx.py Fri Mar 22 09:28:38 2013 -0700 +++ b/mxtool/mx.py Fri Mar 22 18:18:55 2013 +0100 @@ -133,7 +133,7 @@ """ import sys, os, errno, time, subprocess, shlex, types, urllib2, contextlib, StringIO, zipfile, signal, xml.sax.saxutils, tempfile -import shutil, fnmatch, re, xml.dom.minidom +import shutil, re, xml.dom.minidom from collections import Callable from threading import Thread from argparse import ArgumentParser, REMAINDER @@ -1345,7 +1345,7 @@ parser.add_argument('--only', action='store', help='comma separated projects to build, without checking their dependencies (omit to build all projects)') parser.add_argument('--no-java', action='store_false', dest='java', help='do not build Java projects') parser.add_argument('--no-native', action='store_false', dest='native', help='do not build native projects') - parser.add_argument('--jdt', help='Eclipse installation or path to ecj.jar for using the Eclipse batch compiler (default: ' + defaultEcjPath + ')', default=defaultEcjPath, metavar='') + parser.add_argument('--jdt', help='path to ecj.jar, the Eclipse batch compiler (default: ' + defaultEcjPath + ')', default=defaultEcjPath, metavar='') parser.add_argument('--jdt-warning-as-error', action='store_true', help='convert all Eclipse batch compiler warnings to errors') if suppliedParser: @@ -1360,11 +1360,6 @@ if not exists(jdtJar) and os.path.abspath(jdtJar) == os.path.abspath(defaultEcjPath): # Silently ignore JDT if default location is used but not ecj.jar exists there jdtJar = None - elif isdir(args.jdt): - plugins = join(args.jdt, 'plugins') - choices = [f for f in os.listdir(plugins) if fnmatch.fnmatch(f, 'org.eclipse.jdt.core_*.jar')] - if len(choices) != 0: - jdtJar = join(plugins, sorted(choices, reverse=True)[0]) built = set()