changeset 7729:926635ea20ce

Merge
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 05 Feb 2013 17:59:25 +0100
parents 77c86cf33685 (current diff) fad3f591580c (diff)
children cf27135ccf5b
files graal/com.oracle.graal.api.test/src/com/oracle/graal/api/test/GraalTest.java
diffstat 19 files changed, 310 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java	Tue Feb 05 17:59:25 2013 +0100
@@ -103,4 +103,9 @@
      * {@link CompilationResult}. A data patch is always created for an object constant.
      */
     boolean needsDataPatch(Constant constant);
+
+    /**
+     * Gets a description of the target architecture.
+     */
+    TargetDescription getTarget();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.api.test/src/com/oracle/graal/api/test/GraalAPITest.java	Tue Feb 05 17:59:25 2013 +0100
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2012, 2012, 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.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.*;
+
+import com.oracle.graal.api.runtime.*;
+
+public class GraalAPITest {
+
+    @Test
+    public void testRuntimeAvailable() {
+        assertNotNull(Graal.getRuntime());
+        System.out.println(Graal.getRuntime().getClass());
+    }
+
+    @Test
+    public void testRuntimeNamed() {
+        assertNotNull(Graal.getRuntime().getName());
+        System.out.println(Graal.getRuntime().getName());
+    }
+}
--- a/graal/com.oracle.graal.api.test/src/com/oracle/graal/api/test/GraalTest.java	Tue Feb 05 17:41:15 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2012, 2012, 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.test;
-
-import static org.junit.Assert.*;
-
-import org.junit.*;
-
-import com.oracle.graal.api.runtime.*;
-
-public class GraalTest {
-
-    @Test
-    public void testRuntimeAvailable() {
-        assertNotNull(Graal.getRuntime());
-        System.out.println(Graal.getRuntime().getClass());
-    }
-
-    @Test
-    public void testRuntimeNamed() {
-        assertNotNull(Graal.getRuntime().getName());
-        System.out.println(Graal.getRuntime().getName());
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.asm.amd64.test/src/com/oracle/graal/asm/amd64/test/AMD64AssemblerTest.java	Tue Feb 05 17:59:25 2013 +0100
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2013, 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.asm.amd64.test;
+
+import java.lang.reflect.*;
+
+import org.junit.*;
+
+import com.oracle.graal.api.code.*;
+import com.oracle.graal.api.meta.*;
+import com.oracle.graal.api.runtime.*;
+import com.oracle.graal.asm.amd64.*;
+import com.oracle.graal.test.*;
+
+public abstract class AMD64AssemblerTest extends GraalTest {
+
+    protected final CodeCacheProvider codeCache;
+
+    public interface CodeGenTest {
+
+        void generateCode(CompilationResult compResult, AMD64MacroAssembler asm, RegisterConfig registerConfig);
+    }
+
+    public AMD64AssemblerTest() {
+        this.codeCache = Graal.getRequiredCapability(CodeCacheProvider.class);
+    }
+
+    protected InstalledCode assembleMethod(Method m, CodeGenTest test) {
+        ResolvedJavaMethod method = codeCache.lookupJavaMethod(m);
+        RegisterConfig registerConfig = codeCache.lookupRegisterConfig(method);
+
+        CompilationResult compResult = new CompilationResult();
+        AMD64MacroAssembler asm = new AMD64MacroAssembler(codeCache.getTarget(), registerConfig);
+
+        test.generateCode(compResult, asm, registerConfig);
+
+        compResult.setTargetCode(asm.codeBuffer.close(true), asm.codeBuffer.position());
+        InstalledCode code = codeCache.addMethod(method, compResult, null);
+
+        return code;
+    }
+
+    protected void assertReturn(String methodName, CodeGenTest test, Object expected, Object... args) {
+        Method method = getMethod(methodName);
+        InstalledCode code = assembleMethod(method, test);
+
+        Object actual = code.executeVarargs(args);
+        Assert.assertEquals("unexpected return value: " + actual, actual, expected);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.asm.amd64.test/src/com/oracle/graal/asm/amd64/test/SimpleAssemblerTest.java	Tue Feb 05 17:59:25 2013 +0100
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2013, 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.asm.amd64.test;
+
+import org.junit.*;
+
+import com.oracle.graal.api.code.*;
+import com.oracle.graal.api.meta.*;
+import com.oracle.graal.asm.amd64.*;
+
+public class SimpleAssemblerTest extends AMD64AssemblerTest {
+
+    @Test
+    public void intTest() {
+        CodeGenTest test = new CodeGenTest() {
+
+            @Override
+            public void generateCode(CompilationResult compResult, AMD64MacroAssembler asm, RegisterConfig registerConfig) {
+                Register ret = registerConfig.getReturnRegister(Kind.Int);
+                asm.movl(ret, 8472);
+                asm.ret(0);
+            }
+        };
+        assertReturn("intStub", test, 8472);
+    }
+
+    @Test
+    public void doubleTest() {
+        CodeGenTest test = new CodeGenTest() {
+
+            @Override
+            public void generateCode(CompilationResult compResult, AMD64MacroAssembler asm, RegisterConfig registerConfig) {
+                Register ret = registerConfig.getReturnRegister(Kind.Double);
+                compResult.recordDataReference(asm.codeBuffer.position(), Constant.forDouble(84.72), 8, false);
+                asm.movdbl(ret, Address.Placeholder);
+                asm.ret(0);
+            }
+        };
+        assertReturn("doubleStub", test, 84.72);
+    }
+
+    public static int intStub() {
+        return 0;
+    }
+
+    public static double doubleStub() {
+        return 0.0;
+    }
+}
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java	Tue Feb 05 17:59:25 2013 +0100
@@ -43,6 +43,7 @@
 import com.oracle.graal.phases.PhasePlan.PhasePosition;
 import com.oracle.graal.phases.schedule.*;
 import com.oracle.graal.printer.*;
+import com.oracle.graal.test.*;
 
 /**
  * Base class for Graal compiler unit tests.
@@ -63,7 +64,7 @@
  * <p>
  * These tests will be run by the {@code mx unittest} command.
  */
-public abstract class GraalCompilerTest {
+public abstract class GraalCompilerTest extends GraalTest {
 
     protected final GraalCodeCacheProvider runtime;
     protected final GraalCompiler graalCompiler;
@@ -146,21 +147,6 @@
         return parse(getMethod(methodName));
     }
 
-    protected Method getMethod(String methodName) {
-        Method found = null;
-        for (Method m : this.getClass().getMethods()) {
-            if (m.getName().equals(methodName)) {
-                Assert.assertNull(found);
-                found = m;
-            }
-        }
-        if (found != null) {
-            return found;
-        } else {
-            throw new RuntimeException("method not found: " + methodName);
-        }
-    }
-
     private static int compilationId = 0;
 
     /**
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java	Tue Feb 05 17:59:25 2013 +0100
@@ -196,4 +196,8 @@
         return new AMD64HotSpotRegisterConfig(config, globalStubConfig);
     }
 
+    @Override
+    public TargetDescription getTarget() {
+        return graalRuntime.getTarget();
+    }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Tue Feb 05 17:59:25 2013 +0100
@@ -258,7 +258,7 @@
     @SuppressWarnings("unchecked")
     @Override
     public <T> T getCapability(Class<T> clazz) {
-        if (clazz == GraalCodeCacheProvider.class || clazz == MetaAccessProvider.class || clazz == SnippetProvider.class) {
+        if (clazz == GraalCodeCacheProvider.class || clazz == CodeCacheProvider.class || clazz == MetaAccessProvider.class || clazz == SnippetProvider.class) {
             return (T) getRuntime();
         }
         if (clazz == GraalCompiler.class) {
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Feb 05 17:59:25 2013 +0100
@@ -123,7 +123,6 @@
 
         for (Node n : workList) {
             processNode(n, graph);
-            Debug.dump(graph, "After processing %s", n);
         }
 
         graph.stopTrackingInputChange();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTest.java	Tue Feb 05 17:59:25 2013 +0100
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2013, 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.test;
+
+import java.lang.reflect.*;
+
+import org.junit.*;
+
+/**
+ * Base class for Graal tests.
+ * <p>
+ * This contains common utility methods that are used in multiple test projects.
+ */
+public class GraalTest {
+
+    protected Method getMethod(String methodName) {
+        Method found = null;
+        for (Method m : this.getClass().getMethods()) {
+            if (m.getName().equals(methodName)) {
+                Assert.assertNull(found);
+                found = m;
+            }
+        }
+        if (found != null) {
+            return found;
+        } else {
+            throw new RuntimeException("method not found: " + methodName);
+        }
+    }
+}
--- a/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java	Tue Feb 05 17:59:25 2013 +0100
@@ -35,7 +35,7 @@
  * The frame is the preferred data structure for passing values between nodes. It can in particular
  * be used for storing the values of local variables of the guest language. The
  * {@link FrameDescriptor} represents the current structure of the frame. The method
- * {@link FrameDescriptor#addFrameSlot(String, Class)} can be used to create predefined frame slots.
+ * {@link FrameDescriptor#addFrameSlot(Object, Class)} can be used to create predefined frame slots.
  * The setter and getter methods in the {@link Frame} class can be used to access the current value
  * of a particular frame slot.
  * </p>
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/Frame.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/Frame.java	Tue Feb 05 17:59:25 2013 +0100
@@ -31,6 +31,11 @@
 public interface Frame {
 
     /**
+     * @return the object describing the layout of this frame
+     */
+    FrameDescriptor getFrameDescriptor();
+
+    /**
      * @return the arguments used when calling this method
      */
     Arguments getArguments();
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java	Tue Feb 05 17:59:25 2013 +0100
@@ -33,7 +33,7 @@
     protected final TypeConversion typeConversion;
     private final ArrayList<FrameSlotImpl> slots;
     private FrameVersionImpl lastVersion;
-    private final HashMap<String, FrameSlotImpl> nameToSlotMap;
+    private final HashMap<Object, FrameSlotImpl> identifierToSlotMap;
 
     public FrameDescriptor() {
         this(DefaultTypeConversion.getInstance());
@@ -42,32 +42,32 @@
     public FrameDescriptor(TypeConversion typeConversion) {
         this.typeConversion = typeConversion;
         slots = new ArrayList<>();
-        nameToSlotMap = new HashMap<>();
+        identifierToSlotMap = new HashMap<>();
         lastVersion = new FrameVersionImpl();
     }
 
-    public FrameSlot addFrameSlot(String name) {
-        return addFrameSlot(name, typeConversion.getTopType());
+    public FrameSlot addFrameSlot(Object identifier) {
+        return addFrameSlot(identifier, typeConversion.getTopType());
     }
 
-    public FrameSlot addFrameSlot(String name, Class<?> type) {
-        assert !nameToSlotMap.containsKey(name);
-        FrameSlotImpl slot = new FrameSlotImpl(this, name, slots.size(), type);
+    public FrameSlot addFrameSlot(Object identifier, Class<?> type) {
+        assert !identifierToSlotMap.containsKey(identifier);
+        FrameSlotImpl slot = new FrameSlotImpl(this, identifier, slots.size(), type);
         slots.add(slot);
-        nameToSlotMap.put(name, slot);
+        identifierToSlotMap.put(identifier, slot);
         return slot;
     }
 
-    public FrameSlot findFrameSlot(String name) {
-        return nameToSlotMap.get(name);
+    public FrameSlot findFrameSlot(Object identifier) {
+        return identifierToSlotMap.get(identifier);
     }
 
-    public FrameSlot findOrAddFrameSlot(String name) {
-        FrameSlot result = findFrameSlot(name);
+    public FrameSlot findOrAddFrameSlot(Object identifier) {
+        FrameSlot result = findFrameSlot(identifier);
         if (result != null) {
             return result;
         }
-        return addFrameSlot(name);
+        return addFrameSlot(identifier);
     }
 
     public FrameVersion getCurrentVersion() {
@@ -120,21 +120,21 @@
 class FrameSlotImpl implements FrameSlot {
 
     private final FrameDescriptor descriptor;
-    private final String name;
+    private final Object identifier;
     private final int index;
     private Class<?> type;
     private ArrayList<FrameSlotTypeListener> listeners;
 
-    protected FrameSlotImpl(FrameDescriptor descriptor, String name, int index, Class<?> type) {
+    protected FrameSlotImpl(FrameDescriptor descriptor, Object identifier, int index, Class<?> type) {
         this.descriptor = descriptor;
-        this.name = name;
+        this.identifier = identifier;
         this.index = index;
         this.type = type;
         assert type != null;
     }
 
-    public String getName() {
-        return name;
+    public Object getIdentifier() {
+        return identifier;
     }
 
     public int getIndex() {
@@ -189,7 +189,7 @@
 
     @Override
     public String toString() {
-        return "[" + index + "," + name + "]";
+        return "[" + index + "," + identifier + "]";
     }
 
     @Override
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlot.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlot.java	Tue Feb 05 17:59:25 2013 +0100
@@ -27,7 +27,7 @@
  */
 public interface FrameSlot {
 
-    String getName();
+    Object getIdentifier();
 
     int getIndex();
 
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/NativeFrame.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/NativeFrame.java	Tue Feb 05 17:59:25 2013 +0100
@@ -126,4 +126,9 @@
     @Override
     public void updateToLatestVersion() {
     }
+
+    @Override
+    public FrameDescriptor getFrameDescriptor() {
+        throw new UnsupportedOperationException("native frame");
+    }
 }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultMaterializedFrame.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultMaterializedFrame.java	Tue Feb 05 17:59:25 2013 +0100
@@ -117,4 +117,9 @@
     public Frame unpack() {
         return this;
     }
+
+    @Override
+    public FrameDescriptor getFrameDescriptor() {
+        return wrapped.getFrameDescriptor();
+    }
 }
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultVirtualFrame.java	Tue Feb 05 17:41:15 2013 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultVirtualFrame.java	Tue Feb 05 17:59:25 2013 +0100
@@ -192,4 +192,9 @@
         }
         currentVersion = version;
     }
+
+    @Override
+    public FrameDescriptor getFrameDescriptor() {
+        return this.descriptor;
+    }
 }
--- a/mx/projects	Tue Feb 05 17:41:15 2013 +0100
+++ b/mx/projects	Tue Feb 05 17:59:25 2013 +0100
@@ -220,10 +220,17 @@
 project@com.oracle.graal.printer@checkstyle=com.oracle.graal.graph
 project@com.oracle.graal.printer@javaCompliance=1.7
 
+# graal.test
+project@com.oracle.graal.test@subDir=graal
+project@com.oracle.graal.test@sourceDirs=src
+project@com.oracle.graal.test@dependencies=JUNIT
+project@com.oracle.graal.test@checkstyle=com.oracle.graal.graph
+project@com.oracle.graal.test@javaCompliance=1.7
+
 # graal.compiler.test
 project@com.oracle.graal.compiler.test@subDir=graal
 project@com.oracle.graal.compiler.test@sourceDirs=src
-project@com.oracle.graal.compiler.test@dependencies=com.oracle.graal.api.runtime,com.oracle.graal.printer,JUNIT
+project@com.oracle.graal.compiler.test@dependencies=com.oracle.graal.api.runtime,com.oracle.graal.printer,com.oracle.graal.test
 project@com.oracle.graal.compiler.test@checkstyle=com.oracle.graal.graph
 project@com.oracle.graal.compiler.test@javaCompliance=1.7
 
@@ -248,6 +255,13 @@
 project@com.oracle.graal.asm.amd64@checkstyle=com.oracle.graal.graph
 project@com.oracle.graal.asm.amd64@javaCompliance=1.7
 
+# graal.asm.amd64.test
+project@com.oracle.graal.asm.amd64.test@subDir=graal
+project@com.oracle.graal.asm.amd64.test@sourceDirs=src
+project@com.oracle.graal.asm.amd64.test@dependencies=com.oracle.graal.api.runtime,com.oracle.graal.test,com.oracle.graal.asm.amd64
+project@com.oracle.graal.asm.amd64.test@checkstyle=com.oracle.graal.graph
+project@com.oracle.graal.asm.amd64.test@javaCompliance=1.7
+
 # truffle.api
 project@com.oracle.truffle.api@subDir=graal
 project@com.oracle.truffle.api@sourceDirs=src
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Tue Feb 05 17:41:15 2013 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Tue Feb 05 17:59:25 2013 +0100
@@ -291,8 +291,15 @@
 GrowableArray<jlong>* get_leaf_graph_ids(Handle& comp_result) {
   arrayOop leafGraphArray = (arrayOop) CompilationResult::leafGraphIds(HotSpotCompilationResult::comp(comp_result));
 
-  GrowableArray<jlong>* result = new GrowableArray<jlong>(leafGraphArray->length());
-  for (int i = 0; i < leafGraphArray->length(); i++) {
+  jint length;
+  if (leafGraphArray == NULL) {
+    length = 0;
+  } else {
+    length = leafGraphArray->length();
+  }
+
+  GrowableArray<jlong>* result = new GrowableArray<jlong>(length);
+  for (int i = 0; i < length; i++) {
     result->append(((jlong*) leafGraphArray->base(T_LONG))[i]);
   }