changeset 17167:b8f54c5ec73a

Merge
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Fri, 19 Sep 2014 09:27:01 -0700
parents 9df38e5fbed6 (current diff) 4a955509b98a (diff)
children 65c75f0bfc7b
files src/share/vm/graal/graalRuntime.cpp
diffstat 36 files changed, 2243 insertions(+), 267 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestResolvedJavaType.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestResolvedJavaType.java	Fri Sep 19 09:27:01 2014 -0700
@@ -685,6 +685,16 @@
         }
     }
 
+    @Test
+    public void isTrustedInterfaceTypeTest() {
+        for (Class<?> c : classes) {
+            ResolvedJavaType type = metaAccess.lookupJavaType(c);
+            if (TrustedInterface.class.isAssignableFrom(c)) {
+                assertTrue(type.isTrustedInterfaceType());
+            }
+        }
+    }
+
     private Method findTestMethod(Method apiMethod) {
         String testName = apiMethod.getName() + "Test";
         for (Method m : getClass().getDeclaredMethods()) {
@@ -731,5 +741,4 @@
             }
         }
     }
-
 }
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java	Fri Sep 19 09:27:01 2014 -0700
@@ -165,9 +165,9 @@
     ResolvedJavaType asExactType();
 
     /**
-     * Gets the super class of this type. If this type represents either the {@code Object} class, a
-     * primitive type, or void, then null is returned. If this object represents an array class or
-     * an interface then the type object representing the {@code Object} class is returned.
+     * Gets the super class of this type. If this type represents either the {@code Object} class,
+     * an interface, a primitive type, or void, then null is returned. If this object represents an
+     * array class then the type object representing the {@code Object} class is returned.
      */
     ResolvedJavaType getSuperclass();
 
@@ -336,4 +336,10 @@
      * method is similar to {@link Array#newInstance(Class, int)}.
      */
     Constant newArray(int length);
+
+    /**
+     * Returns true if this type represents and interface and it should be trusted even in places
+     * where the JVM verifier would not give any guarantees other than {@link Object}.
+     */
+    boolean isTrustedInterfaceType();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/TrustedInterface.java	Fri Sep 19 09:27:01 2014 -0700
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.api.meta;
+
+/**
+ * Interfaces extanding this interface should be trusted by the compiler. See
+ * {@link ResolvedJavaType#isTrustedInterfaceType()}.
+ *
+ */
+public interface TrustedInterface {
+
+}
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java	Fri Sep 19 09:27:01 2014 -0700
@@ -224,19 +224,48 @@
     }
 
     public static Stamp declared(ResolvedJavaType type, boolean nonNull) {
-        return object(type, false, nonNull);
+        return object(type, false, nonNull, false);
+    }
+
+    public static Stamp declaredNonNull(ResolvedJavaType type, boolean trustInterfaces) {
+        return declared(type, true, trustInterfaces);
+    }
+
+    public static Stamp declared(ResolvedJavaType type, boolean nonNull, boolean trustInterfaces) {
+        return object(type, false, nonNull, trustInterfaces);
     }
 
-    public static Stamp object(ResolvedJavaType type, boolean exactType, boolean nonNull) {
+    private static ResolvedJavaType filterInterfaceTypesOut(ResolvedJavaType type) {
+        if (type.isArray()) {
+            ResolvedJavaType componentType = filterInterfaceTypesOut(type.getComponentType());
+            if (componentType != null) {
+                return componentType.getArrayClass();
+            }
+            return type.getSuperclass().getArrayClass(); // arrayType.getSuperClass() == Object type
+        }
+        if (type.isInterface() && !type.isTrustedInterfaceType()) {
+            return null;
+        }
+        return type;
+    }
+
+    public static Stamp object(ResolvedJavaType type, boolean exactType, boolean nonNull, boolean trustInterfaces) {
         assert type != null;
         assert type.getKind() == Kind.Object;
-        ResolvedJavaType exact = type.asExactType();
+        ResolvedJavaType trustedtype;
+        if (!trustInterfaces) {
+            trustedtype = filterInterfaceTypesOut(type);
+            assert !exactType || trustedtype.equals(type);
+        } else {
+            trustedtype = type;
+        }
+        ResolvedJavaType exact = trustedtype != null ? trustedtype.asExactType() : null;
         if (exact != null) {
-            assert !exactType || type.equals(exact);
+            assert !exactType || trustedtype.equals(exact);
             return new ObjectStamp(exact, true, nonNull, false);
-        } else {
-            return new ObjectStamp(type, exactType, nonNull, false);
         }
+        assert !exactType || AbstractObjectStamp.isConcreteType(trustedtype);
+        return new ObjectStamp(trustedtype, exactType, nonNull, false);
     }
 
     public static Stamp exactNonNull(ResolvedJavaType type) {
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Fri Sep 19 09:27:01 2014 -0700
@@ -32,6 +32,7 @@
 
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.debug.*;
+import com.oracle.graal.debug.internal.*;
 import com.oracle.graal.graph.Graph.DuplicationReplacement;
 import com.oracle.graal.graph.Node.Input;
 import com.oracle.graal.graph.Node.Successor;
@@ -50,6 +51,8 @@
 
     private static final Object GetNodeClassLock = new Object();
 
+    private static final DebugTimer NodeClassCreation = Debug.timer("NodeClassCreation");
+
     /**
      * Gets the {@link NodeClass} associated with a given {@link Class}.
      */
@@ -64,23 +67,30 @@
             // The creation of a NodeClass must be serialized as the NodeClass constructor accesses
             // both FieldIntrospection.allClasses and NodeClass.nextIterableId.
             synchronized (GetNodeClassLock) {
-                value = (NodeClass) allClasses.get(key);
-                if (value == null) {
-                    GeneratedNode gen = c.getAnnotation(GeneratedNode.class);
-                    if (gen != null) {
-                        Class<? extends Node> originalNodeClass = (Class<? extends Node>) gen.value();
-                        value = (NodeClass) allClasses.get(originalNodeClass);
-                        assert value != null;
-                        if (value.genClass == null) {
-                            value.genClass = (Class<? extends Node>) c;
+                try (TimerCloseable t = NodeClassCreation.start()) {
+                    value = (NodeClass) allClasses.get(key);
+                    if (value == null) {
+                        GeneratedNode gen = c.getAnnotation(GeneratedNode.class);
+                        if (gen != null) {
+                            Class<? extends Node> originalNodeClass = (Class<? extends Node>) gen.value();
+                            value = (NodeClass) allClasses.get(originalNodeClass);
+                            assert value != null;
+                            if (value.genClass == null) {
+                                value.genClass = (Class<? extends Node>) c;
+                            } else {
+                                assert value.genClass == c;
+                            }
                         } else {
-                            assert value.genClass == c;
+                            Class<?> superclass = c.getSuperclass();
+                            if (superclass != NODE_CLASS) {
+                                // Ensure NodeClass for superclass exists
+                                get(superclass);
+                            }
+                            value = new NodeClass(key);
                         }
-                    } else {
-                        value = new NodeClass(key);
+                        Object old = allClasses.putIfAbsent(key, value);
+                        assert old == null : old + "   " + key;
                     }
-                    Object old = allClasses.putIfAbsent(key, value);
-                    assert old == null : old + "   " + key;
                 }
             }
         }
@@ -243,30 +253,19 @@
         } else if (IterableNodeType.class.isAssignableFrom(clazz)) {
             ITERABLE_NODE_TYPES.increment();
             this.iterableId = nextIterableId++;
-            List<NodeClass> existingClasses = new LinkedList<>();
-            for (FieldIntrospection nodeClass : allClasses.values()) {
-                // There are duplicate entries in allClasses when using generated nodes
-                // hence the extra logic below guarded by USE_GENERATED_NODES
-                if (clazz.isAssignableFrom(nodeClass.getClazz())) {
-                    if (!USE_GENERATED_NODES || !existingClasses.contains(nodeClass)) {
-                        existingClasses.add((NodeClass) nodeClass);
-                    }
+
+            Class<?> superclass = clazz.getSuperclass();
+            while (superclass != NODE_CLASS) {
+                if (IterableNodeType.class.isAssignableFrom(superclass)) {
+                    NodeClass superNodeClass = NodeClass.get(superclass);
+                    assert !containsId(this.iterableId, superNodeClass.iterableIds);
+                    superNodeClass.iterableIds = Arrays.copyOf(superNodeClass.iterableIds, superNodeClass.iterableIds.length + 1);
+                    superNodeClass.iterableIds[superNodeClass.iterableIds.length - 1] = this.iterableId;
                 }
-                if (nodeClass.getClazz().isAssignableFrom(clazz) && IterableNodeType.class.isAssignableFrom(nodeClass.getClazz())) {
-                    NodeClass superNodeClass = (NodeClass) nodeClass;
-                    if (!containsId(this.iterableId, superNodeClass.iterableIds)) {
-                        superNodeClass.iterableIds = Arrays.copyOf(superNodeClass.iterableIds, superNodeClass.iterableIds.length + 1);
-                        superNodeClass.iterableIds[superNodeClass.iterableIds.length - 1] = this.iterableId;
-                    }
-                }
+                superclass = superclass.getSuperclass();
             }
-            int[] ids = new int[existingClasses.size() + 1];
-            ids[0] = iterableId;
-            int i = 1;
-            for (NodeClass other : existingClasses) {
-                ids[i++] = other.iterableId;
-            }
-            this.iterableIds = ids;
+
+            this.iterableIds = new int[]{iterableId};
         } else {
             this.iterableId = Node.NOT_ITERABLE;
             this.iterableIds = null;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java	Fri Sep 19 09:27:01 2014 -0700
@@ -29,6 +29,7 @@
 import static com.oracle.graal.compiler.common.UnsafeAccess.*;
 import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*;
 import static com.oracle.graal.hotspot.InitTimer.*;
+import static com.oracle.graal.hotspot.meta.HotSpotSuitesProvider.*;
 import static com.oracle.graal.nodes.StructuredGraph.*;
 import static com.oracle.graal.phases.common.inlining.InliningUtil.*;
 
@@ -129,7 +130,8 @@
     }
 
     protected PhaseSuite<HighTierContext> getGraphBuilderSuite(HotSpotProviders providers) {
-        PhaseSuite<HighTierContext> suite = providers.getSuites().getDefaultGraphBuilderSuite();
+        PhaseSuite<HighTierContext> suite = withSimpleDebugInfoIfRequested(providers.getSuites().getDefaultGraphBuilderSuite());
+
         boolean osrCompilation = entryBCI != StructuredGraph.INVOCATION_ENTRY_BCI;
         if (osrCompilation) {
             suite = suite.copy();
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java	Fri Sep 19 09:27:01 2014 -0700
@@ -853,4 +853,11 @@
     public String toString() {
         return "HotSpotType<" + getName() + ", resolved>";
     }
+
+    private static final ResolvedJavaType trustedInterfaceType = fromClass(TrustedInterface.class);
+
+    @Override
+    public boolean isTrustedInterfaceType() {
+        return trustedInterfaceType.isAssignableFrom(this);
+    }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java	Fri Sep 19 09:27:01 2014 -0700
@@ -272,4 +272,9 @@
     public Constant newArray(int length) {
         return HotSpotObjectConstant.forObject(Array.newInstance(mirror(), length));
     }
+
+    @Override
+    public boolean isTrustedInterfaceType() {
+        return false;
+    }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSuitesProvider.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSuitesProvider.java	Fri Sep 19 09:27:01 2014 -0700
@@ -25,6 +25,7 @@
 import static com.oracle.graal.compiler.common.GraalOptions.*;
 
 import com.oracle.graal.hotspot.*;
+import com.oracle.graal.hotspot.bridge.*;
 import com.oracle.graal.hotspot.phases.*;
 import com.oracle.graal.java.*;
 import com.oracle.graal.java.GraphBuilderConfiguration.*;
@@ -77,10 +78,28 @@
     protected PhaseSuite<HighTierContext> createGraphBuilderSuite() {
         PhaseSuite<HighTierContext> suite = new PhaseSuite<>();
         GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault();
-        if (runtime.getCompilerToVM().shouldDebugNonSafepoints()) {
-            config = config.withDebugInfoMode(DebugInfoMode.Simple);
-        }
         suite.appendPhase(new GraphBuilderPhase(config));
         return suite;
     }
+
+    /**
+     * Modifies the {@link GraphBuilderConfiguration} to build extra
+     * {@linkplain DebugInfoMode#Simple debug info} if the VM
+     * {@linkplain CompilerToVM#shouldDebugNonSafepoints() requests} it.
+     *
+     * @param gbs the current graph builder suite
+     * @return a possibly modified graph builder suite
+     */
+    public static PhaseSuite<HighTierContext> withSimpleDebugInfoIfRequested(PhaseSuite<HighTierContext> gbs) {
+        if (HotSpotGraalRuntime.runtime().getCompilerToVM().shouldDebugNonSafepoints()) {
+            PhaseSuite<HighTierContext> newGbs = gbs.copy();
+            GraphBuilderPhase graphBuilderPhase = (GraphBuilderPhase) newGbs.findPhase(GraphBuilderPhase.class).previous();
+            GraphBuilderConfiguration graphBuilderConfig = graphBuilderPhase.getGraphBuilderConfig();
+            GraphBuilderPhase newGraphBuilderPhase = new GraphBuilderPhase(graphBuilderConfig.withDebugInfoMode(DebugInfoMode.Simple));
+            newGbs.findPhase(GraphBuilderPhase.class).set(newGraphBuilderPhase);
+            return newGbs;
+        }
+        return gbs;
+    }
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/except/UntrustedInterfaces.java	Fri Sep 19 09:27:01 2014 -0700
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.jtt.except;
+
+import org.junit.*;
+import org.objectweb.asm.*;
+
+import com.oracle.graal.jtt.*;
+
+public class UntrustedInterfaces extends JTTTest {
+
+    public interface CallBack {
+        public int callBack(TestInterface ti);
+    }
+
+    private interface TestInterface {
+        int method();
+    }
+
+    /**
+     * What a GoodPill would look like:
+     *
+     * <pre>
+     * private static final class GoodPill extends Pill {
+     *     public void setField() {
+     *         field = new TestConstant();
+     *     }
+     *
+     *     public void setStaticField() {
+     *         staticField = new TestConstant();
+     *     }
+     *
+     *     public int callMe(CallBack callback) {
+     *         return callback.callBack(new TestConstant());
+     *     }
+     *
+     *     public TestInterface get() {
+     *         return new TestConstant();
+     *     }
+     * }
+     *
+     * private static final class TestConstant implements TestInterface {
+     *     public int method() {
+     *         return 42;
+     *     }
+     * }
+     * </pre>
+     */
+    public static abstract class Pill {
+        public static TestInterface staticField;
+        public TestInterface field;
+
+        public abstract void setField();
+
+        public abstract void setStaticField();
+
+        public abstract int callMe(CallBack callback);
+
+        public abstract TestInterface get();
+    }
+
+    public int callBack(TestInterface list) {
+        return list.method();
+    }
+
+    public int staticFieldInvoke(Pill pill) {
+        pill.setStaticField();
+        return Pill.staticField.method();
+    }
+
+    public int fieldInvoke(Pill pill) {
+        pill.setField();
+        return pill.field.method();
+    }
+
+    public int argumentInvoke(Pill pill) {
+        return pill.callMe(ti -> ti.method());
+    }
+
+    public int returnInvoke(Pill pill) {
+        return pill.get().method();
+    }
+
+    @SuppressWarnings("cast")
+    public boolean staticFieldInstanceof(Pill pill) {
+        pill.setStaticField();
+        return Pill.staticField instanceof TestInterface;
+    }
+
+    @SuppressWarnings("cast")
+    public boolean fieldInstanceof(Pill pill) {
+        pill.setField();
+        return pill.field instanceof TestInterface;
+    }
+
+    @SuppressWarnings("cast")
+    public int argumentInstanceof(Pill pill) {
+        return pill.callMe(ti -> ti instanceof TestInterface ? 42 : 24);
+    }
+
+    @SuppressWarnings("cast")
+    public boolean returnInstanceof(Pill pill) {
+        return pill.get() instanceof TestInterface;
+    }
+
+    public TestInterface staticFieldCheckcast(Pill pill) {
+        pill.setStaticField();
+        return TestInterface.class.cast(Pill.staticField);
+    }
+
+    public TestInterface fieldCheckcast(Pill pill) {
+        pill.setField();
+        return TestInterface.class.cast(pill.field);
+    }
+
+    public int argumentCheckcast(Pill pill) {
+        return pill.callMe(ti -> TestInterface.class.cast(ti).method());
+    }
+
+    public TestInterface returnCheckcast(Pill pill) {
+        return TestInterface.class.cast(pill.get());
+    }
+
+    private static Pill poisonPill;
+
+    @BeforeClass
+    public static void setup() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+        poisonPill = (Pill) new PoisonLoader().findClass(PoisonLoader.POISON_IMPL_NAME).newInstance();
+    }
+
+    @Test
+    public void testStaticField0() {
+        runTest("staticFieldInvoke", poisonPill);
+    }
+
+    @Test
+    public void testStaticField1() {
+        runTest("staticFieldInstanceof", poisonPill);
+    }
+
+    @Test
+    public void testStaticField2() {
+        runTest("staticFieldCheckcast", poisonPill);
+    }
+
+    @Test
+    public void testField0() {
+        runTest("fieldInvoke", poisonPill);
+    }
+
+    @Test
+    public void testField1() {
+        runTest("fieldInstanceof", poisonPill);
+    }
+
+    @Test
+    public void testField2() {
+        runTest("fieldCheckcast", poisonPill);
+    }
+
+    @Test
+    public void testArgument0() {
+        runTest("argumentInvoke", poisonPill);
+    }
+
+    @Test
+    public void testArgument1() {
+        runTest("argumentInstanceof", poisonPill);
+    }
+
+    @Test
+    public void testArgument2() {
+        runTest("argumentCheckcast", poisonPill);
+    }
+
+    @Test
+    public void testReturn0() {
+        runTest("returnInvoke", poisonPill);
+    }
+
+    @Test
+    public void testReturn1() {
+        runTest("returnInstanceof", poisonPill);
+    }
+
+    @Test
+    public void testReturn2() {
+        runTest("returnCheckcast", poisonPill);
+    }
+
+    private static class PoisonLoader extends ClassLoader {
+        public static final String POISON_IMPL_NAME = "com.oracle.graal.jtt.except.PoisonPill";
+
+        @Override
+        protected Class<?> findClass(String name) throws ClassNotFoundException {
+            if (name.equals(POISON_IMPL_NAME)) {
+                ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+
+                cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, POISON_IMPL_NAME.replace('.', '/'), null, Type.getInternalName(Pill.class), null);
+                // constructor
+                MethodVisitor constructor = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
+                constructor.visitCode();
+                constructor.visitVarInsn(Opcodes.ALOAD, 0);
+                constructor.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Pill.class), "<init>", "()V", false);
+                constructor.visitInsn(Opcodes.RETURN);
+                constructor.visitMaxs(0, 0);
+                constructor.visitEnd();
+
+                MethodVisitor setList = cw.visitMethod(Opcodes.ACC_PUBLIC, "setField", "()V", null, null);
+                setList.visitCode();
+                setList.visitVarInsn(Opcodes.ALOAD, 0);
+                setList.visitTypeInsn(Opcodes.NEW, Type.getInternalName(Object.class));
+                setList.visitInsn(Opcodes.DUP);
+                setList.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false);
+                setList.visitFieldInsn(Opcodes.PUTFIELD, Type.getInternalName(Pill.class), "field", Type.getDescriptor(TestInterface.class));
+                setList.visitInsn(Opcodes.RETURN);
+                setList.visitMaxs(0, 0);
+                setList.visitEnd();
+
+                MethodVisitor setStaticList = cw.visitMethod(Opcodes.ACC_PUBLIC, "setStaticField", "()V", null, null);
+                setStaticList.visitCode();
+                setStaticList.visitTypeInsn(Opcodes.NEW, Type.getInternalName(Object.class));
+                setStaticList.visitInsn(Opcodes.DUP);
+                setStaticList.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false);
+                setStaticList.visitFieldInsn(Opcodes.PUTSTATIC, Type.getInternalName(Pill.class), "staticField", Type.getDescriptor(TestInterface.class));
+                setStaticList.visitInsn(Opcodes.RETURN);
+                setStaticList.visitMaxs(0, 0);
+                setStaticList.visitEnd();
+
+                MethodVisitor callMe = cw.visitMethod(Opcodes.ACC_PUBLIC, "callMe", Type.getMethodDescriptor(Type.INT_TYPE, Type.getType(CallBack.class)), null, null);
+                callMe.visitCode();
+                callMe.visitVarInsn(Opcodes.ALOAD, 1);
+                callMe.visitTypeInsn(Opcodes.NEW, Type.getInternalName(Object.class));
+                callMe.visitInsn(Opcodes.DUP);
+                callMe.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false);
+                callMe.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type.getInternalName(CallBack.class), "callBack", Type.getMethodDescriptor(Type.INT_TYPE, Type.getType(TestInterface.class)), true);
+                callMe.visitInsn(Opcodes.IRETURN);
+                callMe.visitMaxs(0, 0);
+                callMe.visitEnd();
+
+                MethodVisitor getList = cw.visitMethod(Opcodes.ACC_PUBLIC, "get", Type.getMethodDescriptor(Type.getType(TestInterface.class)), null, null);
+                getList.visitCode();
+                getList.visitTypeInsn(Opcodes.NEW, Type.getInternalName(Object.class));
+                getList.visitInsn(Opcodes.DUP);
+                getList.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false);
+                getList.visitInsn(Opcodes.ARETURN);
+                getList.visitMaxs(0, 0);
+                getList.visitEnd();
+
+                cw.visitEnd();
+
+                byte[] bytes = cw.toByteArray();
+                return defineClass(name, bytes, 0, bytes.length);
+            }
+            return super.findClass(name);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/AbstractObjectStampTest.java	Fri Sep 19 09:27:01 2014 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.nodes.test;
+
+import org.junit.*;
+
+import com.oracle.graal.api.meta.*;
+import com.oracle.graal.compiler.common.type.*;
+import com.oracle.graal.compiler.test.*;
+
+public abstract class AbstractObjectStampTest extends GraalCompilerTest {
+
+    protected static class A {
+
+    }
+
+    protected static class B extends A {
+
+    }
+
+    protected static class C extends B implements I {
+
+    }
+
+    protected static class D extends A {
+
+    }
+
+    protected abstract static class E extends A {
+
+    }
+
+    protected interface I {
+
+    }
+
+    protected static Stamp join(Stamp a, Stamp b) {
+        Stamp ab = a.join(b);
+        Stamp ba = b.join(a);
+        Assert.assertEquals(ab, ba);
+        return ab;
+    }
+
+    protected static Stamp meet(Stamp a, Stamp b) {
+        Stamp ab = a.meet(b);
+        Stamp ba = b.meet(a);
+        Assert.assertEquals(ab, ba);
+        return ab;
+    }
+
+    protected ResolvedJavaType getType(Class<?> clazz) {
+        return getMetaAccess().lookupJavaType(clazz);
+    }
+}
--- a/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java	Fri Sep 19 09:27:01 2014 -0700
@@ -28,7 +28,7 @@
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.nodes.type.*;
 
-public class ObjectStampJoinTest extends ObjectStampTest {
+public class ObjectStampJoinTest extends AbstractObjectStampTest {
 
     // class A
     // class B extends A
@@ -124,14 +124,14 @@
     @Test
     public void testJoinInterface0() {
         Stamp a = StampFactory.declared(getType(A.class));
-        Stamp i = StampFactory.declared(getType(I.class));
+        Stamp i = StampFactory.declared(getType(I.class), false, true);
         Assert.assertNotSame(StampFactory.illegal(Kind.Object), join(a, i));
     }
 
     @Test
     public void testJoinInterface1() {
         Stamp aNonNull = StampFactory.declaredNonNull(getType(A.class));
-        Stamp i = StampFactory.declared(getType(I.class));
+        Stamp i = StampFactory.declared(getType(I.class), false, true);
         Stamp join = join(aNonNull, i);
         Assert.assertTrue(join instanceof ObjectStamp);
         Assert.assertTrue(((ObjectStamp) join).nonNull());
@@ -140,9 +140,16 @@
     @Test
     public void testJoinInterface2() {
         Stamp bExact = StampFactory.exactNonNull(getType(B.class));
-        Stamp i = StampFactory.declared(getType(I.class));
+        Stamp i = StampFactory.declared(getType(I.class), false, true);
         Stamp join = join(i, bExact);
         Assert.assertEquals(StampFactory.illegal(Kind.Object), join);
     }
 
+    @Test
+    public void testJoinInterface3() {
+        Stamp bExact = StampFactory.exactNonNull(getType(B.class));
+        Stamp i = StampFactory.declared(getType(I.class)); // not trusted
+        Stamp join = join(i, bExact);
+        Assert.assertEquals(bExact, join);
+    }
 }
--- a/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampMeetTest.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampMeetTest.java	Fri Sep 19 09:27:01 2014 -0700
@@ -27,7 +27,7 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 
-public class ObjectStampMeetTest extends ObjectStampTest {
+public class ObjectStampMeetTest extends AbstractObjectStampTest {
 
     // class A
     // class B extends A
@@ -104,7 +104,7 @@
     @Test
     public void testMeetInterface0() {
         Stamp a = StampFactory.declared(getType(A.class));
-        Stamp i = StampFactory.declared(getType(I.class));
+        Stamp i = StampFactory.declared(getType(I.class), false, true);
         Assert.assertEquals(StampFactory.declared(getType(Object.class)), meet(a, i));
     }
 
--- a/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampTest.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampTest.java	Fri Sep 19 09:27:01 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,49 +26,25 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
-import com.oracle.graal.compiler.test.*;
 
-public class ObjectStampTest extends GraalCompilerTest {
-
-    protected static class A {
-
+public class ObjectStampTest extends AbstractObjectStampTest {
+    @Test
+    public void testInterfaceTrust0() {
+        Stamp notTrusted = StampFactory.declared(getType(I.class));
+        Assert.assertEquals(StampFactory.object(), notTrusted);
     }
 
-    protected static class B extends A {
-
-    }
-
-    protected static class C extends B implements I {
-
-    }
-
-    protected static class D extends A {
+    private static interface TrustedI extends TrustedInterface {
 
     }
 
-    protected abstract static class E extends A {
-
-    }
-
-    protected interface I {
-
-    }
-
-    protected static Stamp join(Stamp a, Stamp b) {
-        Stamp ab = a.join(b);
-        Stamp ba = b.join(a);
-        Assert.assertEquals(ab, ba);
-        return ab;
-    }
-
-    protected static Stamp meet(Stamp a, Stamp b) {
-        Stamp ab = a.meet(b);
-        Stamp ba = b.meet(a);
-        Assert.assertEquals(ab, ba);
-        return ab;
-    }
-
-    protected ResolvedJavaType getType(Class<?> clazz) {
-        return getMetaAccess().lookupJavaType(clazz);
+    @Test
+    public void testInterfaceTrust1() {
+        Stamp trusted = StampFactory.declared(getType(TrustedI.class));
+        Assert.assertNotEquals(StampFactory.object(), trusted);
+        Assert.assertTrue("Should be an AbstractObjectStamp", trusted instanceof AbstractObjectStamp);
+        AbstractObjectStamp trustedObjectStamp = (AbstractObjectStamp) trusted;
+        Assert.assertNotNull(trustedObjectStamp.type());
+        Assert.assertTrue("Should be an interface", trustedObjectStamp.type().isInterface());
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -76,7 +76,7 @@
     }
 
     protected PiNode(ValueNode object, ResolvedJavaType toType, boolean exactType, boolean nonNull) {
-        this(object, StampFactory.object(toType, exactType, nonNull || StampTool.isObjectNonNull(object.stamp())));
+        this(object, StampFactory.object(toType, exactType, nonNull || StampTool.isObjectNonNull(object.stamp()), true));
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimpleInfopointNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimpleInfopointNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -24,11 +24,12 @@
 
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.graph.*;
+import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.spi.*;
 
 @NodeInfo
-public class SimpleInfopointNode extends InfopointNode implements LIRLowerable, IterableNodeType {
+public class SimpleInfopointNode extends InfopointNode implements LIRLowerable, IterableNodeType, Simplifiable {
     private BytecodePosition position;
 
     public static SimpleInfopointNode create(InfopointReason reason, BytecodePosition position) {
@@ -60,4 +61,11 @@
             return new BytecodePosition(relink(position.getCaller(), link), position.getMethod(), position.getBCI());
         }
     }
+
+    @Override
+    public void simplify(SimplifierTool tool) {
+        if (next() instanceof SimpleInfopointNode) {
+            graph().removeFixed(this);
+        }
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -65,7 +65,7 @@
     }
 
     UnsafeCastNode(ValueNode object, ResolvedJavaType toType, boolean exactType, boolean nonNull) {
-        this(object, toType.getKind() == Kind.Object ? StampFactory.object(toType, exactType, nonNull || StampTool.isObjectNonNull(object.stamp())) : StampFactory.forKind(toType.getKind()));
+        this(object, toType.getKind() == Kind.Object ? StampFactory.object(toType, exactType, nonNull || StampTool.isObjectNonNull(object.stamp()), true) : StampFactory.forKind(toType.getKind()));
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -64,7 +64,7 @@
     }
 
     protected CheckCastNode(ResolvedJavaType type, ValueNode object, JavaTypeProfile profile, boolean forStoreCheck) {
-        super(StampFactory.declared(type));
+        super(StampFactory.declared(type, false, true));
         assert type != null;
         this.type = type;
         this.object = object;
@@ -104,7 +104,7 @@
      */
     @Override
     public void lower(LoweringTool tool) {
-        Stamp stamp = StampFactory.declared(type);
+        Stamp stamp = StampFactory.declared(type, false, true);
         if (stamp() instanceof ObjectStamp && object().stamp() instanceof ObjectStamp) {
             stamp = ((ObjectStamp) object().stamp()).castTo((ObjectStamp) stamp);
         }
@@ -113,7 +113,7 @@
         if (stamp instanceof IllegalStamp) {
             // This is a check cast that will always fail
             condition = LogicConstantNode.contradiction(graph());
-            stamp = StampFactory.declared(type);
+            stamp = StampFactory.declared(type, false, true);
         } else if (StampTool.isObjectNonNull(object)) {
             condition = graph().addWithoutUnique(InstanceOfNode.create(type, object, profile));
         } else {
@@ -146,7 +146,7 @@
     @Override
     public boolean inferStamp() {
         if (object().stamp() instanceof ObjectStamp) {
-            ObjectStamp castStamp = (ObjectStamp) StampFactory.declared(type);
+            ObjectStamp castStamp = (ObjectStamp) StampFactory.declared(type, false, true);
             return updateStamp(((ObjectStamp) object().stamp()).castTo(castStamp));
         }
         return false;
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Fri Sep 19 09:27:01 2014 -0700
@@ -718,7 +718,7 @@
                         ConstantNode nullObject = ConstantNode.defaultForKind(Kind.Object, graph);
                         piNode = graph.unique(PiNode.create(nullObject, StampFactory.forConstant(nullObject.getValue(), metaAccess), replacementAnchor.asNode()));
                     } else {
-                        piNode = graph.unique(PiNode.create(object, StampFactory.declared(type, nonNull), replacementAnchor.asNode()));
+                        piNode = graph.unique(PiNode.create(object, StampFactory.declared(type, nonNull, true), replacementAnchor.asNode()));
                     }
                     checkCast.replaceAtUsages(piNode);
                     graph.removeFixed(checkCast);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/CheckCastReduction.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/CheckCastReduction.java	Fri Sep 19 09:27:01 2014 -0700
@@ -206,7 +206,7 @@
 
         ObjectStamp subjectStamp = (ObjectStamp) subject.stamp();
         final ResolvedJavaType toType = checkCast.type();
-        ObjectStamp resultStamp = (ObjectStamp) StampFactory.declared(toType);
+        ObjectStamp resultStamp = (ObjectStamp) StampFactory.declared(toType, false, true);
         JavaTypeProfile profile = checkCast.profile();
 
         assert FlowUtil.isLegalObjectStamp(subjectStamp);
@@ -214,13 +214,13 @@
 
         /*
          * Depending on what is known about the subject:
-         * 
+         *
          * (a) definitely-non-null
-         * 
+         *
          * (b) null-not-seen-in-profiling
-         * 
+         *
          * (c) runtime-null-check-needed
-         * 
+         *
          * the condition (of the cast-guard to be emitted) and the stamp (of the PiNode to be
          * emitted) are going to be different. Each of the three branches below deals with one of
          * the cases above.
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Fri Sep 19 09:27:01 2014 -0700
@@ -181,7 +181,7 @@
     }
 
     public static GuardedValueNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ResolvedJavaType commonType, ValueNode receiver, boolean exact) {
-        return createAnchoredReceiver(graph, anchor, receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType));
+        return createAnchoredReceiver(graph, anchor, receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType, true));
     }
 
     private static GuardedValueNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ValueNode receiver, Stamp stamp) {
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java	Fri Sep 19 09:27:01 2014 -0700
@@ -25,6 +25,7 @@
 import static com.oracle.graal.api.code.CodeUtil.*;
 import static com.oracle.graal.compiler.GraalCompiler.*;
 import static com.oracle.graal.graph.util.CollectionsAccess.*;
+import static com.oracle.graal.hotspot.meta.HotSpotSuitesProvider.*;
 import static com.oracle.graal.truffle.TruffleCompilerOptions.*;
 
 import java.util.*;
@@ -44,7 +45,6 @@
 import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.nodes.*;
 import com.oracle.graal.java.*;
-import com.oracle.graal.java.GraphBuilderConfiguration.*;
 import com.oracle.graal.lir.asm.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
@@ -262,15 +262,7 @@
 
     private static PhaseSuite<HighTierContext> getGraphBuilderSuite(SuitesProvider suitesProvider) {
         PhaseSuite<HighTierContext> graphBuilderSuite = suitesProvider.getDefaultGraphBuilderSuite();
-        if (HotSpotGraalRuntime.runtime().getCompilerToVM().shouldDebugNonSafepoints()) {
-            // need to tweak the graph builder config
-            graphBuilderSuite = graphBuilderSuite.copy();
-            GraphBuilderPhase graphBuilderPhase = (GraphBuilderPhase) graphBuilderSuite.findPhase(GraphBuilderPhase.class).previous();
-            GraphBuilderConfiguration graphBuilderConfig = graphBuilderPhase.getGraphBuilderConfig();
-            GraphBuilderPhase newGraphBuilderPhase = new GraphBuilderPhase(graphBuilderConfig.withDebugInfoMode(DebugInfoMode.Simple));
-            graphBuilderSuite.findPhase(GraphBuilderPhase.class).set(newGraphBuilderPhase);
-        }
-        return graphBuilderSuite;
+        return withSimpleDebugInfoIfRequested(graphBuilderSuite);
     }
 
     private static void removeInliningPhase(Suites suites) {
@@ -342,11 +334,15 @@
                 }
             }
         };
-        if (mayBeAsynchronous) {
-            Future<?> future = compileQueue.submit(r);
-            this.compilations.put(optimizedCallTarget, future);
-        } else {
-            r.run();
+        Future<?> future = compileQueue.submit(r);
+        this.compilations.put(optimizedCallTarget, future);
+
+        if (!mayBeAsynchronous) {
+            try {
+                future.get();
+            } catch (InterruptedException | ExecutionException e) {
+                // silently ignored
+            }
         }
     }
 
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java	Fri Sep 19 09:27:01 2014 -0700
@@ -273,15 +273,16 @@
             // Compilation was successful.
         } else {
             compilationPolicy.recordCompilationFailure(t);
+
+            if (TruffleCompilationExceptionsAreThrown.getValue()) {
+                throw new OptimizationFailedException(t, rootNode);
+            }
+            logOptimizingFailed(this, t.getMessage());
             if (t instanceof BailoutException) {
-                logOptimizingFailed(this, t.getMessage());
                 // Bailout => move on.
             } else if (TruffleCompilationExceptionsAreFatal.getValue()) {
-                logOptimizingFailed(this, t.getMessage());
                 t.printStackTrace(OUT);
                 System.exit(-1);
-            } else if (TruffleCompilationExceptionsAreThrown.getValue()) {
-                throw new OptimizationFailedException(t, rootNode);
             }
         }
     }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/LoadIndexedFinalNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/LoadIndexedFinalNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -67,7 +67,7 @@
     private static Stamp createStamp(ValueNode array, Kind kind) {
         ResolvedJavaType type = StampTool.typeOrNull(array);
         if (kind == Kind.Object && type != null) {
-            return StampFactory.declared(type.getComponentType());
+            return StampFactory.declared(type.getComponentType(), false, true);
         } else {
             return StampFactory.forKind(kind);
         }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -67,7 +67,7 @@
                 replaceAtUsages(objectArgument);
                 GraphUtil.removeFixedWithUnusedInputs(this);
             } else {
-                Stamp stamp = StampFactory.declared(lookupJavaType, nonNullArgument.asConstant().asInt() != 0);
+                Stamp stamp = StampFactory.declared(lookupJavaType, nonNullArgument.asConstant().asInt() != 0, true);
                 ConditionAnchorNode valueAnchorNode = graph().add(
                                 ConditionAnchorNode.create(CompareNode.createCompareNode(graph(), Condition.EQ, conditionArgument, ConstantNode.forBoolean(true, graph()))));
                 PiNode piCast = graph().unique(PiNode.create(objectArgument, stamp, valueAnchorNode));
--- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/WordBase.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/WordBase.java	Fri Sep 19 09:27:01 2014 -0700
@@ -22,7 +22,9 @@
  */
 package com.oracle.graal.word;
 
-public interface WordBase {
+import com.oracle.graal.api.meta.*;
+
+public interface WordBase extends TrustedInterface {
 
     long rawValue();
 }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultCallTarget.java	Fri Sep 19 09:27:01 2014 -0700
@@ -35,13 +35,11 @@
 public class DefaultCallTarget implements RootCallTarget {
 
     private final RootNode rootNode;
-    private final DefaultTruffleRuntime defaultTruffleRuntime;
 
-    public DefaultCallTarget(RootNode function, DefaultTruffleRuntime defaultTruffleRuntime) {
+    public DefaultCallTarget(RootNode function) {
         this.rootNode = function;
         this.rootNode.adoptChildren();
         this.rootNode.setCallTarget(this);
-        this.defaultTruffleRuntime = defaultTruffleRuntime;
     }
 
     @Override
@@ -56,7 +54,7 @@
     @Override
     public Object call(Object... args) {
         final VirtualFrame frame = new DefaultVirtualFrame(getRootNode().getFrameDescriptor(), args);
-        FrameInstance oldCurrentFrame = defaultTruffleRuntime.setCurrentFrame(new FrameInstance() {
+        FrameInstance oldCurrentFrame = defaultTruffleRuntime().setCurrentFrame(new FrameInstance() {
 
             public Frame getFrame(FrameAccess access, boolean slowPath) {
                 return frame;
@@ -77,7 +75,11 @@
         try {
             return getRootNode().execute(frame);
         } finally {
-            defaultTruffleRuntime.setCurrentFrame(oldCurrentFrame);
+            defaultTruffleRuntime().setCurrentFrame(oldCurrentFrame);
         }
     }
+
+    private static DefaultTruffleRuntime defaultTruffleRuntime() {
+        return (DefaultTruffleRuntime) Truffle.getRuntime();
+    }
 }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultDirectCallNode.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultDirectCallNode.java	Fri Sep 19 09:27:01 2014 -0700
@@ -34,16 +34,14 @@
 public final class DefaultDirectCallNode extends DirectCallNode {
 
     private boolean inliningForced;
-    private final DefaultTruffleRuntime defaultTruffleRuntime;
 
-    public DefaultDirectCallNode(CallTarget target, DefaultTruffleRuntime defaultTruffleRuntime) {
+    public DefaultDirectCallNode(CallTarget target) {
         super(target);
-        this.defaultTruffleRuntime = defaultTruffleRuntime;
     }
 
     @Override
     public Object call(final VirtualFrame frame, Object[] arguments) {
-        final CallTarget currentCallTarget = defaultTruffleRuntime.getCurrentFrame().getCallTarget();
+        final CallTarget currentCallTarget = defaultTruffleRuntime().getCurrentFrame().getCallTarget();
         FrameInstance frameInstance = new FrameInstance() {
 
             public Frame getFrame(FrameAccess access, boolean slowPath) {
@@ -62,11 +60,11 @@
                 return currentCallTarget;
             }
         };
-        defaultTruffleRuntime.pushFrame(frameInstance);
+        defaultTruffleRuntime().pushFrame(frameInstance);
         try {
             return getCurrentCallTarget().call(arguments);
         } finally {
-            defaultTruffleRuntime.popFrame();
+            defaultTruffleRuntime().popFrame();
         }
     }
 
@@ -109,4 +107,8 @@
     public String toString() {
         return (getParent() != null ? getParent().toString() : super.toString()) + " call " + getCurrentCallTarget().toString();
     }
+
+    private static DefaultTruffleRuntime defaultTruffleRuntime() {
+        return (DefaultTruffleRuntime) Truffle.getRuntime();
+    }
 }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultTruffleRuntime.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultTruffleRuntime.java	Fri Sep 19 09:27:01 2014 -0700
@@ -56,13 +56,13 @@
 
     @Override
     public RootCallTarget createCallTarget(RootNode rootNode) {
-        DefaultCallTarget target = new DefaultCallTarget(rootNode, this);
+        DefaultCallTarget target = new DefaultCallTarget(rootNode);
         callTargets.put(target, null);
         return target;
     }
 
     public DirectCallNode createDirectCallNode(CallTarget target) {
-        return new DefaultDirectCallNode(target, this);
+        return new DefaultDirectCallNode(target);
     }
 
     public IndirectCallNode createIndirectCallNode() {
--- a/mx/projects	Fri Sep 19 09:24:16 2014 -0700
+++ b/mx/projects	Fri Sep 19 09:27:01 2014 -0700
@@ -73,6 +73,13 @@
 library@OKRA_WITH_SIM@sourceSha1=7eefd94f16a3e3fd3b8f470cf91e265c6f5e7767
 library@OKRA_WITH_SIM@sourceUrls=http://lafo.ssw.uni-linz.ac.at/graal-external-deps/okra-1.10-with-sim-src.jar,http://cr.openjdk.java.net/~tdeneau/okra-1.10-with-sim-src.jar
 
+library@ASM@path=lib/asm-5.0.3.jar
+library@ASM@urls=http://lafo.ssw.uni-linz.ac.at/graal-external-deps/asm-5.0.3.jar,http://central.maven.org/maven2/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar
+library@ASM@sha1=dcc2193db20e19e1feca8b1240dbbc4e190824fa
+library@ASM@sourcePath=lib/asm-5.0.3-sources.jar
+library@ASM@sourceSha1=f0f24f6666c1a15c7e202e91610476bd4ce59368
+library@ASM@sourceUrls=http://lafo.ssw.uni-linz.ac.at/graal-external-deps/asm-5.0.3-sources.jar,http://central.maven.org/maven2/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar
+
 library@JAVA_ALLOCATION_INSTRUMENTER@path=lib/java-allocation-instrumenter.jar
 library@JAVA_ALLOCATION_INSTRUMENTER@sourcePath=lib/java-allocation-instrumenter.jar
 library@JAVA_ALLOCATION_INSTRUMENTER@urls=http://lafo.ssw.uni-linz.ac.at/java-allocation-instrumenter/java-allocation-instrumenter-8f0db117e64e.jar
@@ -675,7 +682,7 @@
 # graal.jtt
 project@com.oracle.graal.jtt@subDir=graal
 project@com.oracle.graal.jtt@sourceDirs=src
-project@com.oracle.graal.jtt@dependencies=com.oracle.graal.compiler.test
+project@com.oracle.graal.jtt@dependencies=com.oracle.graal.compiler.test,ASM
 project@com.oracle.graal.jtt@checkstyle=com.oracle.graal.graph
 project@com.oracle.graal.jtt@javaCompliance=1.8
 project@com.oracle.graal.jtt@workingSets=Graal,Test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mx/projects.py	Fri Sep 19 09:27:01 2014 -0700
@@ -0,0 +1,1329 @@
+suite = {
+  "mxversion" : "1.0",
+  "name" : "graal",
+  "libraries" : {
+    "JUNIT" : {
+      "path" : "lib/junit-4.11.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/junit-4.11.jar",
+        "http://repo1.maven.org/maven2/junit/junit/4.11/junit-4.11.jar",
+      ],
+      "sha1" : "4e031bb61df09069aeb2bffb4019e7a5034a4ee0",
+      "eclipse.container" : "org.eclipse.jdt.junit.JUNIT_CONTAINER/4",
+      "sourcePath" : "lib/junit-4.11-sources.jar",
+      "sourceUrls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/junit-4.11-sources.jar",
+        "http://repo1.maven.org/maven2/junit/junit/4.11/junit-4.11-sources.jar",
+      ],
+      "sourceSha1" : "28e0ad201304e4a4abf999ca0570b7cffc352c3c",
+      "dependencies" : [
+        "HAMCREST",
+      ],
+    },
+
+    "HAMCREST" : {
+      "path" : "lib/hamcrest-core-1.3.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/hamcrest-core-1.3.jar",
+        "http://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
+      ],
+      "sha1" : "42a25dc3219429f0e5d060061f71acb49bf010a0",
+      "sourcePath" : "lib/hamcrest-core-1.3-sources.jar",
+      "sourceUrls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/hamcrest-core-1.3-sources.jar",
+        "http://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar",
+      ],
+      "sourceSha1" : "1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b",
+    },
+
+    "HCFDIS" : {
+      "path" : "lib/hcfdis-2.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/hcfdis-2.jar",
+      ],
+      "sha1" : "bc8b2253436485e9dbaf81771c259ccfa1a24c80",
+    },
+
+    "FINDBUGS_DIST" : {
+      "path" : "lib/findbugs-dist-3.0.0.zip",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/findbugs-3.0.0.zip",
+        "http://sourceforge.net/projects/findbugs/files/findbugs/3.0.0/findbugs-3.0.0.zip/download",
+      ],
+      "sha1" : "6e56d67f238dbcd60acb88a81655749aa6419c5b",
+    },
+
+    "C1VISUALIZER_DIST" : {
+      "path" : "lib/c1visualizer_2014-04-22.zip",
+      "urls" : [
+        "https://java.net/downloads/c1visualizer/c1visualizer_2014-04-22.zip",
+      ],
+      "sha1" : "220488d87affb569b893c7201f8ce5d2b0e03141",
+    },
+
+    "JOL_INTERNALS" : {
+      "path" : "lib/jol-internals.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/truffle/jol/jol-internals.jar",
+      ],
+      "sha1" : "508bcd26a4d7c4c44048990c6ea789a3b11a62dc",
+    },
+
+    "FINDBUGS" : {
+      "path" : "lib/findbugs-3.0.0.jar",
+      "urls" : [
+        "jar:http://lafo.ssw.uni-linz.ac.at/graal-external-deps/findbugs-3.0.0.zip!/findbugs-3.0.0/lib/findbugs.jar",
+        "jar:http://sourceforge.net/projects/findbugs/files/findbugs/3.0.0/findbugs-3.0.0.zip/download!/findbugs-3.0.0/lib/findbugs.jar",
+      ],
+      "sha1" : "e9a938f0cb34e2ab5853f9ecb1989f6f590ee385",
+    },
+
+    "DACAPO" : {
+      "path" : "lib/dacapo-9.12-bach.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/dacapo-9.12-bach.jar",
+        "http://softlayer.dl.sourceforge.net/project/dacapobench/9.12-bach/dacapo-9.12-bach.jar",
+      ],
+      "sha1" : "2626a9546df09009f6da0df854e6dc1113ef7dd4",
+    },
+
+    "JACOCOAGENT" : {
+      "path" : "lib/jacocoagent.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoagent-0.7.1-1.jar",
+      ],
+      "sha1" : "2f73a645b02e39290e577ce555f00b02004650b0",
+    },
+
+    "JACOCOREPORT" : {
+      "path" : "lib/jacocoreport.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoreport-0.7.1-2.jar",
+      ],
+      "sha1" : "a630436391832d697a12c8f7daef8655d7a1efd2",
+    },
+
+    "DACAPO_SCALA" : {
+      "path" : "lib/dacapo-scala-0.1.0-20120216.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/dacapo-scala-0.1.0-20120216.jar",
+        "http://repo.scalabench.org/snapshots/org/scalabench/benchmarks/scala-benchmark-suite/0.1.0-SNAPSHOT/scala-benchmark-suite-0.1.0-20120216.103539-3.jar",
+      ],
+      "sha1" : "59b64c974662b5cf9dbd3cf9045d293853dd7a51",
+    },
+
+    "OKRA" : {
+      "path" : "lib/okra-1.10.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/okra-1.10.jar",
+        "http://cr.openjdk.java.net/~tdeneau/okra-1.10.jar",
+      ],
+      "sha1" : "96eb3c0ec808ed944ba88d1eb9311058fe0f3d1e",
+      "sourcePath" : "lib/okra-1.10-src.jar",
+      "sourceUrls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/okra-1.10-src.jar",
+        "http://cr.openjdk.java.net/~tdeneau/okra-1.10-src.jar",
+      ],
+      "sourceSha1" : "75751bb148fcebaba78ff590f883a114b2b09176",
+    },
+
+    "OKRA_WITH_SIM" : {
+      "path" : "lib/okra-1.10-with-sim.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/okra-1.10-with-sim.jar",
+        "http://cr.openjdk.java.net/~tdeneau/okra-1.10-with-sim.jar",
+      ],
+      "sha1" : "7b8db879f1dbcf571290add78d9af24e15a2a50d",
+      "sourcePath" : "lib/okra-1.10-with-sim-src.jar",
+      "sourceSha1" : "7eefd94f16a3e3fd3b8f470cf91e265c6f5e7767",
+      "sourceUrls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/okra-1.10-with-sim-src.jar",
+        "http://cr.openjdk.java.net/~tdeneau/okra-1.10-with-sim-src.jar",
+      ],
+    },
+
+    "ASM" : {
+      "path" : "lib/asm-5.0.3.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/asm-5.0.3.jar",
+        "http://central.maven.org/maven2/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar",
+      ],
+      "sha1" : "dcc2193db20e19e1feca8b1240dbbc4e190824fa",
+      "sourcePath" : "lib/asm-5.0.3-sources.jar",
+      "sourceSha1" : "f0f24f6666c1a15c7e202e91610476bd4ce59368",
+      "sourceUrls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/asm-5.0.3-sources.jar",
+        "http://central.maven.org/maven2/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar",
+      ],
+    },
+
+    "JAVA_ALLOCATION_INSTRUMENTER" : {
+      "path" : "lib/java-allocation-instrumenter.jar",
+      "sourcePath" : "lib/java-allocation-instrumenter.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/java-allocation-instrumenter/java-allocation-instrumenter-8f0db117e64e.jar",
+      ],
+      "sha1" : "476d9a44cd19d6b55f81571077dfa972a4f8a083",
+      "bootClassPathAgent" : "true",
+    },
+
+    "VECMATH" : {
+      "path" : "lib/vecmath-1.3.1.jar",
+      "urls" : [
+        "http://lafo.ssw.uni-linz.ac.at/graal-external-deps/vecmath-1.3.1.jar",
+        "http://mirrors.ibiblio.org/pub/mirrors/maven/java3d/jars/vecmath-1.3.1.jar",
+      ],
+      "sha1" : "a0ae4f51da409fa0c20fa0ca59e6bbc9413ae71d",
+    }
+  },
+
+  "jrelibraries" : {
+    "JFR" : {
+      "jar" : "jfr.jar",
+    }
+  },
+
+  "projects" : {
+    "com.oracle.nfi" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.7",
+    },
+
+    "com.oracle.nfi.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "test",
+      "dependencies" : [
+        "com.oracle.nfi",
+        "com.oracle.graal.compiler.common",
+        "JUNIT",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.7",
+    },
+
+    "com.oracle.graal.api.collections" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal",
+    },
+
+    "com.oracle.graal.api.runtime" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal",
+    },
+
+    "com.oracle.graal.api.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.api.runtime",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal,Test",
+    },
+
+    "com.oracle.graal.api.meta" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal",
+    },
+
+    "com.oracle.graal.api.meta.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.runtime",
+        "com.oracle.graal.java",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal,Test",
+    },
+
+    "com.oracle.graal.api.code" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.meta",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal",
+    },
+
+    "com.oracle.graal.api.replacements" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.meta",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal,Replacements",
+    },
+
+    "com.oracle.graal.service.processor" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.runtime",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Codegen,HotSpot",
+    },
+
+    "com.oracle.graal.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.code",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,AMD64",
+    },
+
+    "com.oracle.graal.ptx" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.code",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,PTX",
+    },
+
+    "com.oracle.graal.sparc" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.code",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,SPARC",
+    },
+
+    "com.oracle.graal.hotspotvmconfig" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.common",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot",
+    },
+
+    "com.oracle.graal.hotspot" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.replacements",
+        "com.oracle.graal.runtime",
+        "com.oracle.graal.printer",
+        "com.oracle.graal.baseline",
+        "com.oracle.graal.hotspotvmconfig",
+        "com.oracle.nfi",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.replacements.verifier,com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot",
+    },
+
+    "com.oracle.graal.hotspot.loader" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot",
+    },
+
+    "com.oracle.graal.hotspot.sourcegen" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.hotspot",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot",
+    },
+
+    "com.oracle.graal.hotspot.jfr" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.hotspot",
+        "JFR",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "profile" : "",
+      "workingSets" : "Graal,HotSpot",
+    },
+
+    "com.oracle.graal.hotspot.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.amd64",
+        "com.oracle.graal.hotspot",
+        "com.oracle.graal.replacements.amd64",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot,AMD64",
+    },
+
+    "com.oracle.graal.hotspot.sparc" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.sparc",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot,SPARC",
+    },
+
+    "com.oracle.graal.hotspot.ptx" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.ptx",
+        "com.oracle.graal.compiler.ptx",
+        "com.oracle.graal.hotspot",
+        "com.oracle.graal.gpu",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot,PTX",
+    },
+
+    "com.oracle.graal.hotspot.hsail" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.replacements.hsail",
+        "com.oracle.graal.hotspot",
+        "com.oracle.graal.gpu",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot,PTX",
+    },
+
+    "com.oracle.graal.hotspot.server" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.hotspot",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot",
+    },
+
+    "com.oracle.graal.hotspot.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.replacements.test",
+        "com.oracle.graal.hotspot",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot,Test",
+    },
+
+    "com.oracle.graal.hotspot.amd64.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.asm.amd64",
+        "com.oracle.graal.compiler.test",
+        "com.oracle.graal.hotspot",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,HotSpot,AMD64,Test",
+    },
+
+    "com.oracle.graal.options" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Codegen",
+    },
+
+    "com.oracle.graal.options.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.options",
+        "JUNIT",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal",
+    },
+
+    "com.oracle.graal.nodeinfo" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Graph",
+    },
+
+    "com.oracle.graal.nodeinfo.processor" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "dependencies" : [
+        "com.oracle.graal.nodeinfo",
+        "com.oracle.truffle.dsl.processor",
+      ],
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Graph",
+    },
+
+    "com.oracle.graal.graph" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.nodeinfo",
+        "com.oracle.graal.debug",
+        "com.oracle.graal.compiler.common",
+        "com.oracle.graal.api.collections",
+        "com.oracle.graal.api.runtime",
+        "FINDBUGS",
+      ],
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.nodeinfo.processor",
+      "workingSets" : "Graal,Graph",
+    },
+
+    "com.oracle.graal.graph.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.graph",
+      ],
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Graph,Test",
+    },
+
+    "com.oracle.graal.debug" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Debug",
+    },
+
+    "com.oracle.graal.debug.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.debug",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Debug,Test",
+    },
+
+    "com.oracle.graal.lir" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.common",
+        "com.oracle.graal.asm",
+        "com.oracle.graal.debug",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,LIR",
+    },
+
+    "com.oracle.graal.lir.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.lir",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,LIR",
+    },
+
+    "com.oracle.graal.lir.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.lir",
+        "com.oracle.graal.asm.amd64",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,LIR,AMD64",
+    },
+
+    "com.oracle.graal.lir.ptx" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.asm.ptx",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,LIR,PTX",
+    },
+
+    "com.oracle.graal.lir.sparc" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.asm.sparc",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,LIR,SPARC",
+    },
+
+    "com.oracle.graal.alloc" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.common",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal",
+    },
+
+    "com.oracle.graal.word" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.phases",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "API,Graal",
+    },
+
+    "com.oracle.graal.replacements" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler",
+        "com.oracle.graal.java",
+        "com.oracle.graal.word",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.replacements.verifier,com.oracle.graal.service.processor",
+      "workingSets" : "Graal,Replacements",
+    },
+
+    "com.oracle.graal.replacements.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.replacements",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "workingSets" : "Graal,Replacements,AMD64",
+    },
+
+    "com.oracle.graal.replacements.hsail" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.hsail",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Replacements,HSAIL",
+    },
+
+    "com.oracle.graal.replacements.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.test",
+        "com.oracle.graal.replacements",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Replacements,Test",
+    },
+
+    "com.oracle.graal.replacements.verifier" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.replacements",
+        "com.oracle.graal.graph",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Replacements",
+    },
+
+    "com.oracle.graal.nodes" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.graph",
+        "com.oracle.graal.api.replacements",
+        "com.oracle.graal.lir",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.replacements.verifier",
+      "workingSets" : "Graal,Graph",
+    },
+
+    "com.oracle.graal.nodes.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.test",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Graph",
+    },
+
+    "com.oracle.graal.phases" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.nodes",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Phases",
+    },
+
+    "com.oracle.graal.phases.common" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.phases",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Phases",
+    },
+
+    "com.oracle.graal.virtual" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.phases.common",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Phases",
+    },
+
+    "com.oracle.graal.loop" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.phases.common",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Phases",
+    },
+
+    "com.oracle.graal.compiler" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.virtual",
+        "com.oracle.graal.loop",
+        "com.oracle.graal.alloc",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "workingSets" : "Graal",
+    },
+
+    "com.oracle.graal.compiler.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler",
+        "com.oracle.graal.lir.amd64",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,AMD64",
+    },
+
+    "com.oracle.graal.compiler.amd64.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.test",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,AMD64,Test",
+    },
+
+    "com.oracle.graal.compiler.ptx" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.lir.ptx",
+        "com.oracle.graal.compiler",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,PTX",
+    },
+
+    "com.oracle.graal.compiler.ptx.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.hotspot.ptx",
+        "com.oracle.graal.compiler.test",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,PTX,Test",
+    },
+
+    "com.oracle.graal.compiler.sparc" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.lir.sparc",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,SPARC",
+    },
+
+    "com.oracle.graal.compiler.sparc.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.test",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,SPARC,Test",
+    },
+
+    "com.oracle.graal.runtime" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal",
+    },
+
+    "com.oracle.graal.bytecode" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Java",
+    },
+
+    "com.oracle.graal.java" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.phases",
+        "com.oracle.graal.bytecode",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Java",
+    },
+
+    "com.oracle.graal.compiler.common" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.code",
+        "com.oracle.graal.options",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Java",
+    },
+
+    "com.oracle.graal.baseline" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler",
+        "com.oracle.graal.java",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Java",
+    },
+
+    "com.oracle.graal.java.decompiler" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.java",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal",
+    },
+
+    "com.oracle.graal.java.decompiler.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.printer",
+        "com.oracle.graal.runtime",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Test",
+    },
+
+    "com.oracle.graal.printer" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.java.decompiler",
+        "com.oracle.graal.compiler",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Graph",
+    },
+
+    "com.oracle.graal.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "JUNIT",
+        "com.oracle.graal.debug",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Test",
+    },
+
+    "com.oracle.graal.compiler.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.test",
+        "com.oracle.graal.printer",
+        "com.oracle.graal.runtime",
+        "com.oracle.graal.baseline",
+        "JAVA_ALLOCATION_INSTRUMENTER",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Test",
+    },
+
+    "com.oracle.graal.jtt" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.test",
+        "ASM",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Test",
+    },
+
+    "com.oracle.graal.asm" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.code",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Assembler",
+    },
+
+    "com.oracle.graal.asm.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.test",
+        "com.oracle.graal.runtime",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Assembler,Test",
+    },
+
+    "com.oracle.graal.asm.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.asm",
+        "com.oracle.graal.amd64",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Assembler,AMD64",
+    },
+
+    "com.oracle.graal.asm.amd64.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.asm.test",
+        "com.oracle.graal.asm.amd64",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Assembler,AMD64,Test",
+    },
+
+    "com.oracle.graal.gpu" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.nodes",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.hsail" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.api.code",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.lir.hsail" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.lir",
+        "com.oracle.graal.asm.hsail",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.compiler.hsail" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler",
+        "com.oracle.graal.lir.hsail",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.compiler.hsail.test.infra" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.test",
+        "com.oracle.graal.hotspot.hsail",
+        "OKRA_WITH_SIM",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.compiler.hsail.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.compiler.hsail.test.infra",
+        "com.oracle.graal.compiler.test",
+        "VECMATH",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.asm.hsail" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.hsail",
+        "OKRA",
+        "com.oracle.graal.asm",
+        "com.oracle.graal.compiler.common",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+    },
+
+    "com.oracle.graal.asm.ptx" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.lir",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Assembler,PTX",
+    },
+
+    "com.oracle.graal.asm.sparc" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.hotspot",
+        "com.oracle.graal.sparc",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Assembler,SPARC",
+    },
+
+    "com.oracle.truffle.api" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [],
+      "javaCompliance" : "1.7",
+      "workingSets" : "API,Truffle",
+    },
+
+    "com.oracle.truffle.api.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.api",
+        "JUNIT",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.7",
+      "workingSets" : "API,Truffle,Test",
+    },
+
+    "com.oracle.truffle.api.dsl" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.api",
+      ],
+      "checkstyle" : "com.oracle.truffle.api",
+      "javaCompliance" : "1.7",
+      "workingSets" : "API,Truffle,Codegen",
+    },
+
+    "com.oracle.truffle.api.dsl.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.api.dsl",
+        "JUNIT",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.7",
+      "annotationProcessors" : "com.oracle.truffle.dsl.processor",
+      "workingSets" : "API,Truffle,Codegen,Test",
+    },
+
+    "com.oracle.truffle.dsl.processor" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.api.dsl",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.7",
+      "workingSets" : "Truffle,Codegen",
+    },
+
+    "com.oracle.truffle.sl" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.api.dsl",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.truffle.dsl.processor",
+      "workingSets" : "Truffle,SimpleLanguage",
+    },
+
+    "com.oracle.truffle.sl.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.sl",
+        "JUNIT",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Truffle,SimpleLanguage,Test",
+    },
+
+    "com.oracle.graal.truffle" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.truffle.api",
+        "com.oracle.graal.replacements",
+        "com.oracle.graal.runtime",
+        "com.oracle.graal.printer",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Truffle",
+    },
+
+    "com.oracle.graal.truffle.test" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.truffle",
+        "com.oracle.graal.compiler.test",
+        "com.oracle.truffle.sl.test",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "workingSets" : "Graal,Truffle,Test",
+    },
+
+    "com.oracle.graal.truffle.hotspot" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.truffle",
+        "com.oracle.graal.hotspot",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "workingSets" : "Graal,Truffle",
+    },
+
+    "com.oracle.graal.truffle.hotspot.amd64" : {
+      "subDir" : "graal",
+      "sourceDirs" : "src",
+      "dependencies" : [
+        "com.oracle.graal.truffle.hotspot",
+        "com.oracle.graal.asm.amd64",
+      ],
+      "checkstyle" : "com.oracle.graal.graph",
+      "javaCompliance" : "1.8",
+      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "workingSets" : "Graal,Truffle",
+    }
+  },
+
+  "distributions" : {
+    "GRAAL" : {
+      "path" : "build/graal.jar",
+      "subDir" : "graal",
+      "sourcesPath" : "build/graal.src.zip",
+      "dependencies" : [
+        "com.oracle.graal.hotspot.amd64",
+        "com.oracle.graal.hotspot.ptx",
+        "com.oracle.graal.hotspot.sparc",
+        "com.oracle.graal.hotspot",
+        "com.oracle.graal.hotspot.jfr",
+        "com.oracle.graal.hotspot.hsail",
+      ],
+      "exclude" : "FINDBUGS",
+    },
+
+    "GRAAL_LOADER" : {
+      "path" : "build/graal-loader.jar",
+      "subDir" : "graal",
+      "sourcesPath" : "build/graal-loader.src.zip",
+      "dependencies" : [
+        "com.oracle.graal.hotspot.loader",
+      ],
+    },
+
+    "TRUFFLE" : {
+      "path" : "build/truffle.jar",
+      "subDir" : "graal",
+      "sourcesPath" : "build/truffle.src.zip",
+      "javaCompliance" : "1.7",
+      "dependencies" : [
+        "com.oracle.truffle.api.dsl",
+        "com.oracle.nfi",
+      ],
+    },
+
+    "GRAAL_TRUFFLE" : {
+      "path" : "build/graal-truffle.jar",
+      "subDir" : "graal",
+      "sourcesPath" : "build/graal-truffle.src.zip",
+      "dependencies" : [
+        "com.oracle.graal.truffle",
+        "com.oracle.graal.truffle.hotspot.amd64",
+      ],
+      "exclude" : "FINDBUGS",
+      "distDependencies" : "GRAAL,TRUFFLE",
+    },
+
+    "TRUFFLE-DSL-PROCESSOR" : {
+      "path" : "build/truffle-dsl-processor.jar",
+      "subDir" : "graal",
+      "sourcesPath" : "build/truffle-dsl-processor.src.zip",
+      "javaCompliance" : "1.7",
+      "dependencies" : [
+        "com.oracle.truffle.dsl.processor",
+      ],
+      "distDependencies" : "TRUFFLE",
+    }
+  }
+}
--- a/mxtool/mx.py	Fri Sep 19 09:24:16 2014 -0700
+++ b/mxtool/mx.py	Fri Sep 19 09:27:01 2014 -0700
@@ -43,7 +43,7 @@
 import shutil, re, xml.dom.minidom
 import pipes
 import difflib
-from collections import Callable
+from collections import Callable, OrderedDict
 from threading import Thread
 from argparse import ArgumentParser, REMAINDER
 from os.path import join, basename, dirname, exists, getmtime, isabs, expandvars, isdir, isfile
@@ -787,6 +787,227 @@
             else:
                 return None
 
+# TODO: remove this function once all repos have transitioned
+# to the new project format
+def _read_projects_file(projectsFile):
+    suite = OrderedDict()
+
+    suite['projects'] = OrderedDict()
+    suite['libraries'] = OrderedDict()
+    suite['jrelibraries'] = OrderedDict()
+    suite['distributions'] = OrderedDict()
+
+    with open(projectsFile) as f:
+        prefix = ''
+        lineNum = 0
+
+        def error(message):
+            abort(projectsFile + ':' + str(lineNum) + ': ' + message)
+
+        for line in f:
+            lineNum = lineNum + 1
+            line = line.strip()
+            if line.endswith('\\'):
+                prefix = prefix + line[:-1]
+                continue
+            if len(prefix) != 0:
+                line = prefix + line
+                prefix = ''
+            if len(line) != 0 and line[0] != '#':
+                if '=' not in line:
+                    error('non-comment line does not contain an "=" character')
+                key, value = line.split('=', 1)
+
+                parts = key.split('@')
+
+                if len(parts) == 1:
+                    if parts[0] == 'suite':
+                        suite['name'] = value
+                    elif parts[0] == 'mxversion':
+                        suite['mxversion'] = value
+                    else:
+                        error('Single part property must be "suite": ' + key)
+
+                    continue
+                if len(parts) != 3:
+                    error('Property name does not have 3 parts separated by "@": ' + key)
+                kind, name, attr = parts
+                if kind == 'project':
+                    m = suite['projects']
+                elif kind == 'library':
+                    m = suite['libraries']
+                elif kind == 'jrelibrary':
+                    m = suite['jrelibraries']
+                elif kind == 'distribution':
+                    m = suite['distributions']
+                else:
+                    error('Property name does not start with "project@", "library@" or "distribution@": ' + key)
+
+                attrs = m.get(name)
+                if attrs is None:
+                    attrs = OrderedDict()
+                    m[name] = attrs
+                value = expandvars_in_property(value)
+                attrs[attr] = value
+    return suite
+
+# TODO: remove this command once all repos have transitioned
+# to the new project format
+def convertprojects(args, verbose=True):
+    """convert old style projects file to projects*.py file(s)"""
+
+    class Printer:
+        def __init__(self, fp, indent):
+            self.fp = fp
+            self.indent = indent
+            self.prefix = ''
+        def println(self, s):
+            if len(s) == 0:
+                print >> self.fp, s
+            else:
+                print >> self.fp, self.prefix + s
+        def inc(self):
+            self.prefix = ''.rjust(len(self.prefix) + self.indent)
+        def dec(self):
+            self.prefix = ''.rjust(len(self.prefix) - self.indent)
+
+    for projectsFile in args:
+        suite = _read_projects_file(projectsFile)
+        def print_attrs(p, name, attrs, listKeys, is_last=False):
+            p.println('"' + name + '" : {')
+            p.inc()
+            for n, v in attrs.iteritems():
+                if n in listKeys:
+                    if len(v) == 0:
+                        p.println('"{}" : [],'.format(n))
+                    else:
+                        p.println('"{}" : ['.format(n))
+                        p.inc()
+                        for e in v.split(','):
+                            p.println('"' + e.strip() + '",')
+                        p.dec()
+                        p.println('],')
+                else:
+                    p.println('"{}" : "{}",'.format(n, v))
+            p.dec()
+            if is_last:
+                p.println('}')
+            else:
+                p.println('},')
+                p.println('')
+
+        def print_section(p, sname, suite, is_last=False):
+            section = suite.get(sname)
+            if section:
+                p.println('"' + sname + '" : {')
+                p.inc()
+                i = 0
+                for name, attrs in section.iteritems():
+                    i = i + 1
+                    print_attrs(p, name, attrs, ['urls', 'dependencies', 'sourceUrls'], i == len(section))
+
+                p.dec()
+                if is_last:
+                    p.println('}')
+                else:
+                    p.println('},')
+                    p.println('')
+
+        existing, projectsPyFile = _load_suite_dict(dirname(projectsFile))
+        if existing:
+            assert existing['name'] == suite.pop('name')
+            assert existing['mxversion'] == suite.pop('mxversion')
+            for s in ['projects', 'libraries', 'jrelibraries', 'distributions']:
+                for k in existing[s].iterkeys():
+                    suite[s].pop(k)
+                if len(suite[s]) == 0:
+                    suite.pop(s)
+
+        if len(suite):
+            out = StringIO.StringIO()
+            p = Printer(out, 2)
+            p.println(('extra' if existing else 'suite') + ' = {')
+            p.inc()
+            if not existing:
+                p.println('"mxversion" : "' + suite['mxversion'] + '",')
+                p.println('"name" : "' + suite['name'] + '",')
+            print_section(p, 'libraries', suite)
+            print_section(p, 'jrelibraries', suite)
+            print_section(p, 'projects', suite)
+            print_section(p, 'distributions', suite, is_last=True)
+            p.dec()
+            p.println('}')
+
+            with open(projectsPyFile, 'w') as fp:
+                fp.write(out.getvalue())
+                if verbose:
+                    print 'created: ' + projectsPyFile
+
+def _load_suite_dict(mxDir):
+
+    suffix = 1
+    suite = None
+    dictName = 'suite'
+
+    moduleName = 'projects'
+    modulePath = join(mxDir, moduleName + '.py')
+    while exists(modulePath):
+
+        savedModule = sys.modules.get(moduleName)
+        if savedModule:
+            warn(modulePath + ' conflicts with ' + savedModule.__file__)
+        # temporarily extend the Python path
+        sys.path.insert(0, mxDir)
+
+        snapshot = frozenset(sys.modules.viewkeys())
+        module = __import__(moduleName)
+
+        if savedModule:
+            # restore the old module into the module name space
+            sys.modules[moduleName] = savedModule
+        else:
+            # remove moduleName from the module name space
+            sys.modules.pop(moduleName)
+
+        # For now fail fast if extra modules were loaded.
+        # This can later be relaxed to simply remove the extra modules
+        # from the sys.modules name space if necessary.
+        extraModules = snapshot - sys.modules.viewkeys()
+        assert len(extraModules) == 0, 'loading ' + modulePath + ' caused extra modules to be loaded: ' + ', '.join([m.__file__ for m in extraModules])
+
+        # revert the Python path
+        del sys.path[0]
+
+        if not hasattr(module, dictName):
+            abort(modulePath + ' must define a variable named "' + dictName + '"')
+        d = getattr(module, dictName)
+        sections = ['projects', 'libraries', 'jrelibraries', 'distributions'] + ([] if suite else ['name', 'mxversion'])
+        unknown = d.viewkeys() - sections
+        if unknown:
+            abort(modulePath + ' defines unsupported suite sections: ' + ', '.join(unknown))
+
+        if suite is None:
+            suite = d
+        else:
+            for s in sections:
+                existing = suite.get(s)
+                additional = d.get(s)
+                if additional:
+                    if not existing:
+                        suite[s] = additional
+                    else:
+                        conflicting = additional.viewkeys() & existing.viewkeys()
+                        if conflicting:
+                            abort(modulePath + ' redefines: ' + ', '.join(conflicting))
+                        existing.update(additional)
+
+        dictName = 'extra'
+        moduleName = 'projects' + str(suffix)
+        modulePath = join(mxDir, moduleName + '.py')
+        suffix = suffix + 1
+
+    return suite, modulePath
+
 class Suite:
     def __init__(self, mxDir, primary, load=True):
         self.dir = dirname(mxDir)
@@ -810,73 +1031,35 @@
         return self.name
 
     def _load_projects(self):
-        libsMap = dict()
-        jreLibsMap = dict()
-        projsMap = dict()
-        distsMap = dict()
+        # TODO: remove once mx/projects has been deprecated
         projectsFile = join(self.mxDir, 'projects')
-        if not exists(projectsFile):
+        if exists(projectsFile):
+            convertprojects([projectsFile], verbose=False)
+
+        projectsPyFile = join(self.mxDir, 'projects.py')
+        if not exists(projectsPyFile):
             return
 
-        with open(projectsFile) as f:
-            prefix = ''
-            lineNum = 0
-
-            def error(message):
-                abort(projectsFile + ':' + str(lineNum) + ': ' + message)
-
-            for line in f:
-                lineNum = lineNum + 1
-                line = line.strip()
-                if line.endswith('\\'):
-                    prefix = prefix + line[:-1]
-                    continue
-                if len(prefix) != 0:
-                    line = prefix + line
-                    prefix = ''
-                if len(line) != 0 and line[0] != '#':
-                    if '=' not in line:
-                        error('non-comment line does not contain an "=" character')
-                    key, value = line.split('=', 1)
-
-                    parts = key.split('@')
-
-                    if len(parts) == 1:
-                        if parts[0] == 'suite':
-                            if self.name != value:
-                                error('suite name in project file does not match ' + _suitename(self.mxDir))
-                        elif parts[0] == 'mxversion':
-                            try:
-                                self.requiredMxVersion = VersionSpec(value)
-                            except AssertionError as ae:
-                                error('Exception while parsing "mxversion" in project file: ' + str(ae))
-                        else:
-                            error('Single part property must be "suite": ' + key)
-
-                        continue
-                    if len(parts) != 3:
-                        error('Property name does not have 3 parts separated by "@": ' + key)
-                    kind, name, attr = parts
-                    if kind == 'project':
-                        m = projsMap
-                    elif kind == 'library':
-                        m = libsMap
-                    elif kind == 'jrelibrary':
-                        m = jreLibsMap
-                    elif kind == 'distribution':
-                        m = distsMap
-                    else:
-                        error('Property name does not start with "project@", "library@" or "distribution@": ' + key)
-
-                    attrs = m.get(name)
-                    if attrs is None:
-                        attrs = dict()
-                        m[name] = attrs
-                    value = expandvars_in_property(value)
-                    attrs[attr] = value
+        suiteDict, _ = _load_suite_dict(self.mxDir)
+
+        if suiteDict.get('name') is not None and suiteDict.get('name') != self.name:
+            abort('suite name in project file does not match ' + _suitename(self.mxDir))
+
+        if suiteDict.has_key('mxversion'):
+            try:
+                self.requiredMxVersion = VersionSpec(suiteDict['mxversion'])
+            except AssertionError as ae:
+                abort('Exception while parsing "mxversion" in project file: ' + str(ae))
+
+        libsMap = suiteDict['libraries']
+        jreLibsMap = suiteDict['jrelibraries']
+        projsMap = suiteDict['projects']
+        distsMap = suiteDict['distributions']
 
         def pop_list(attrs, name):
             v = attrs.pop(name, None)
+            if isinstance(v, list):
+                return v
             if v is None or len(v.strip()) == 0:
                 return []
             return [n.strip() for n in v.split(',')]
@@ -896,7 +1079,7 @@
             p.checkstyleProj = attrs.pop('checkstyle', name)
             p.native = attrs.pop('native', '') == 'true'
             if not p.native and p.javaCompliance is None:
-                error('javaCompliance property required for non-native project ' + name)
+                abort('javaCompliance property required for non-native project ' + name)
             if len(ap) > 0:
                 p._declaredAnnotationProcessors = ap
             p.__dict__.update(attrs)
@@ -911,7 +1094,8 @@
 
         for name, attrs in libsMap.iteritems():
             if "|" in name:
-                assert name.count("|") == 2, "syntax: libname|os-platform|architecture"
+                if name.count('|') != 2:
+                    abort("Format error in library name: " + name + "\nsyntax: libname|os-platform|architecture")
                 name, platform, architecture = name.split("|")
                 if platform != get_os() or architecture != get_arch():
                     continue
@@ -2866,61 +3050,60 @@
     return archives
 
 def canonicalizeprojects(args):
-    """process all project files to canonicalize the dependencies
-
-    The exit code of this command reflects how many files were updated."""
-
-    changedFiles = 0
+    """check all project specifications for canonical dependencies
+
+    The exit code of this command reflects how many projects have non-canonical dependencies."""
+
+    nonCanonical = []
     for s in suites(True):
-        projectsFile = join(s.mxDir, 'projects')
-        if not exists(projectsFile):
+        projectsPyFile = join(s.mxDir, 'projects')
+        if not exists(projectsPyFile):
             continue
-        with open(projectsFile) as f:
-            out = StringIO.StringIO()
-            pattern = re.compile('project@([^@]+)@dependencies=.*')
-            lineNo = 1
-            for line in f:
-                line = line.strip()
-                m = pattern.match(line)
-                p = project(m.group(1), fatalIfMissing=False) if m else None
-                if m is None or p is None:
-                    out.write(line + '\n')
-                else:
-                    for pkg in p.defined_java_packages():
-                        if not pkg.startswith(p.name):
-                            abort('package in {0} does not have prefix matching project name: {1}'.format(p, pkg))
-
-                    ignoredDeps = set([name for name in p.deps if project(name, False) is not None])
-                    for pkg in p.imported_java_packages():
-                        for name in p.deps:
-                            dep = project(name, False)
-                            if dep is None:
-                                ignoredDeps.discard(name)
-                            else:
-                                if pkg in dep.defined_java_packages():
-                                    ignoredDeps.discard(name)
-                                if pkg in dep.extended_java_packages():
-                                    ignoredDeps.discard(name)
-                    if len(ignoredDeps) != 0:
-                        candidates = set()
-                        # Compute dependencies based on projects required by p
-                        for d in sorted_deps():
-                            if not d.defined_java_packages().isdisjoint(p.imported_java_packages()):
-                                candidates.add(d)
-                        # Remove non-canonical candidates
-                        for c in list(candidates):
-                            candidates.difference_update(c.all_deps([], False, False))
-                        candidates = [d.name for d in candidates]
-
-                        abort('{0}:{1}: {2} does not use any packages defined in these projects: {3}\nComputed project dependencies: {4}'.format(
-                            projectsFile, lineNo, p, ', '.join(ignoredDeps), ','.join(candidates)))
-
-                    out.write('project@' + m.group(1) + '@dependencies=' + ','.join(p.canonical_deps()) + '\n')
-                lineNo = lineNo + 1
-            content = out.getvalue()
-        if update_file(projectsFile, content):
-            changedFiles += 1
-    return changedFiles
+
+        for p in s.projects:
+            for pkg in p.defined_java_packages():
+                if not pkg.startswith(p.name):
+                    abort('package in {0} does not have prefix matching project name: {1}'.format(p, pkg))
+
+            ignoredDeps = set([name for name in p.deps if project(name, False) is not None])
+            for pkg in p.imported_java_packages():
+                for name in p.deps:
+                    dep = project(name, False)
+                    if dep is None:
+                        ignoredDeps.discard(name)
+                    else:
+                        if pkg in dep.defined_java_packages():
+                            ignoredDeps.discard(name)
+                        if pkg in dep.extended_java_packages():
+                            ignoredDeps.discard(name)
+            if len(ignoredDeps) != 0:
+                candidates = set()
+                # Compute dependencies based on projects required by p
+                for d in sorted_deps():
+                    if not d.defined_java_packages().isdisjoint(p.imported_java_packages()):
+                        candidates.add(d)
+                # Remove non-canonical candidates
+                for c in list(candidates):
+                    candidates.difference_update(c.all_deps([], False, False))
+                candidates = [d.name for d in candidates]
+
+                abort('{} does not use any packages defined in these projects: {}\nComputed project dependencies: {}'.format(
+                    p, ', '.join(ignoredDeps), ','.join(candidates)))
+
+            excess = frozenset(p.deps) - set(p.canonical_deps())
+            if len(excess) != 0:
+                nonCanonical.append(p)
+    if len(nonCanonical) != 0:
+        for p in nonCanonical:
+            canonicalDeps = p.canonical_deps()
+            if len(canonicalDeps) != 0:
+                log('Canonical dependencies for project ' + p.name + ' are: [')
+                for d in canonicalDeps:
+                    log('        "' + d + '",')
+                log('      ],')
+            else:
+                log('Canonical dependencies for project ' + p.name + ' are: []')
+    return len(nonCanonical)
 
 class TimeStampFile:
     def __init__(self, path):
@@ -4952,6 +5135,7 @@
     'about': [about, ''],
     'build': [build, '[options]'],
     'checkstyle': [checkstyle, ''],
+    'convertprojects' : [convertprojects, ''],
     'canonicalizeprojects': [canonicalizeprojects, ''],
     'clean': [clean, ''],
     'eclipseinit': [eclipseinit, ''],
--- a/src/cpu/sparc/vm/c1_globals_sparc.hpp	Fri Sep 19 09:24:16 2014 -0700
+++ b/src/cpu/sparc/vm/c1_globals_sparc.hpp	Fri Sep 19 09:27:01 2014 -0700
@@ -56,6 +56,8 @@
 define_pd_global(intx, NewSizeThreadIncrease,        16*K );
 define_pd_global(uint64_t,MaxRAM,                    1ULL*G);
 define_pd_global(intx, InitialCodeCacheSize,         160*K);
+define_pd_global(intx, TypeProfileWidth,             0);
+define_pd_global(intx, MethodProfileWidth,           0);
 #endif // !TIERED
 
 define_pd_global(bool, UseTypeProfile,               false);
--- a/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java	Fri Sep 19 09:24:16 2014 -0700
+++ b/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java	Fri Sep 19 09:27:01 2014 -0700
@@ -41,7 +41,7 @@
     public static final String VALUE_CHANGED = "changed";
     public static final String VALUE_SAME = "same";
     public static final String VALUE_DELETED = "deleted";
-    public static final String OLD_PREFIX = "OLD_";
+    public static final String NEW_PREFIX = "NEW_";
     public static final String MAIN_PROPERTY = "name";
     public static final double LIMIT = 100.0;
     public static final String[] IGNORE_PROPERTIES = new String[]{"idx", "debug_idx"};
@@ -360,7 +360,7 @@
             String s = firstNode.getProperties().get(p.getName());
             if (!p.getValue().equals(s)) {
                 difference = true;
-                n.getProperties().setProperty(OLD_PREFIX + p.getName(), p.getValue());
+                n.getProperties().setProperty(NEW_PREFIX + p.getName(), p.getValue());
             }
         }
 
@@ -368,7 +368,7 @@
             String s = otherNode.getProperties().get(p.getName());
             if (s == null && p.getValue().length() > 0) {
                 difference = true;
-                n.getProperties().setProperty(OLD_PREFIX + p.getName(), "");
+                n.getProperties().setProperty(NEW_PREFIX + p.getName(), "");
             }
         }
 
--- a/src/share/vm/graal/graalRuntime.cpp	Fri Sep 19 09:24:16 2014 -0700
+++ b/src/share/vm/graal/graalRuntime.cpp	Fri Sep 19 09:27:01 2014 -0700
@@ -104,7 +104,7 @@
   sig_bt[i++] = T_VOID; // long stakes 2 slots
   sig_bt[i++] = T_INT;
   sig_bt[i++] = T_OBJECT;
-  sig_bt[i++] = T_INT; // The number of actual arguments pass to the method.
+  sig_bt[i++] = T_INT; // The number of actual arguments passed to the method.
 
   int comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, false);
 
--- a/src/share/vm/oops/methodData.hpp	Fri Sep 19 09:24:16 2014 -0700
+++ b/src/share/vm/oops/methodData.hpp	Fri Sep 19 09:27:01 2014 -0700
@@ -1910,7 +1910,7 @@
   // Whole-method sticky bits and flags
   enum {
 #ifdef GRAAL
-    _trap_hist_limit    = 18,   // decoupled from Deoptimization::Reason_LIMIT
+    _trap_hist_limit    = 19,   // decoupled from Deoptimization::Reason_LIMIT
 #else
     _trap_hist_limit    = 17,   // decoupled from Deoptimization::Reason_LIMIT
 #endif