# HG changeset patch # User Thomas Wuerthinger # Date 1360081192 -3600 # Node ID fad3f591580c769fa95ece74fb1742afcdda51eb # Parent f07cafa29db11f267dc7e1174d9b35101aa75fc6# Parent c1f63bbdf7b151027cb8f6b00a6589cb91fcde24 Merge. diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java Tue Feb 05 17:18:57 2013 +0100 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java Tue Feb 05 17:19:52 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(); } diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.api.test/src/com/oracle/graal/api/test/GraalAPITest.java --- /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:19:52 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()); + } +} diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.api.test/src/com/oracle/graal/api/test/GraalTest.java --- a/graal/com.oracle.graal.api.test/src/com/oracle/graal/api/test/GraalTest.java Tue Feb 05 17:18:57 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()); - } -} diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.asm.amd64.test/src/com/oracle/graal/asm/amd64/test/AMD64AssemblerTest.java --- /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:19:52 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); + } +} diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.asm.amd64.test/src/com/oracle/graal/asm/amd64/test/SimpleAssemblerTest.java --- /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:19:52 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; + } +} diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Tue Feb 05 17:18:57 2013 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Tue Feb 05 17:19:52 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 @@ *

* 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; /** diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Tue Feb 05 17:18:57 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Tue Feb 05 17:19:52 2013 +0100 @@ -196,4 +196,8 @@ return new AMD64HotSpotRegisterConfig(config, globalStubConfig); } + @Override + public TargetDescription getTarget() { + return graalRuntime.getTarget(); + } } diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Tue Feb 05 17:18:57 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Tue Feb 05 17:19:52 2013 +0100 @@ -258,7 +258,7 @@ @SuppressWarnings("unchecked") @Override public T getCapability(Class 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) { diff -r f07cafa29db1 -r fad3f591580c graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTest.java --- /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:19:52 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. + *

+ * 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); + } + } +} diff -r f07cafa29db1 -r fad3f591580c mx/projects --- a/mx/projects Tue Feb 05 17:18:57 2013 +0100 +++ b/mx/projects Tue Feb 05 17:19:52 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 diff -r f07cafa29db1 -r fad3f591580c src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Tue Feb 05 17:18:57 2013 +0100 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Tue Feb 05 17:19:52 2013 +0100 @@ -291,8 +291,15 @@ GrowableArray* get_leaf_graph_ids(Handle& comp_result) { arrayOop leafGraphArray = (arrayOop) CompilationResult::leafGraphIds(HotSpotCompilationResult::comp(comp_result)); - GrowableArray* result = new GrowableArray(leafGraphArray->length()); - for (int i = 0; i < leafGraphArray->length(); i++) { + jint length; + if (leafGraphArray == NULL) { + length = 0; + } else { + length = leafGraphArray->length(); + } + + GrowableArray* result = new GrowableArray(length); + for (int i = 0; i < length; i++) { result->append(((jlong*) leafGraphArray->base(T_LONG))[i]); }