Don't you need to fix java.lang.String also?<br><br>There is a problem if we don't add the extra fields in LLVM's struct: the object will be emitted in the executable, and won't be big enough to contain the two extra fields.<div>
<br></div><div>I think we should drop emitting java.lang.Class instances in AOT, because it does not work with a precise GC. When compiling MMTk (which should be the only user of AOT without a precise GC), we could be able to just emit null there. Could you try and confirm?</div>
<div><br></div><div>If it turns out it does not work, we could also try to put a dummy java.lang.Object or java.lang.Class, following the object layout but without containing any data. In any case, your change in vmjcAddPrecompiledClass should be removed.<br>
<br><div class="gmail_quote">On Thu, Nov 3, 2011 at 3:37 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Inlined below.<br>
<br>
Thanks!<br>
<br>
~Will<br>
<br>
>From b036d7358b9e57da79e71f04e1869bb9e2015718 Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Wed, 2 Nov 2011 22:54:23 -0500<br>
Subject: [PATCH 14/17] Refactor AOT into ClassLib-specific components, add<br>
support for OpenJDK<br>
<br>
* Fix the JavaClass field layout for OpenJDK<br>
* Restore the Class mapping (stored in an 'extra' field). Ignore PD for now,<br>
since in the Classpath port we emit a null constant for it anyway.<br>
---<br>
lib/J3/Compiler/JavaAOTCompiler.cpp | 36 +++------------<br>
lib/J3/Compiler/JavaAOTCompilerClasspath.inc | 39 ++++++++++++++++<br>
lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc | 63 ++++++++++++++++++++++++++<br>
lib/J3/VMCore/Precompiled.cpp | 4 ++<br>
4 files changed, 112 insertions(+), 30 deletions(-)<br>
create mode 100644 lib/J3/Compiler/JavaAOTCompilerClasspath.inc<br>
create mode 100644 lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc<br>
<br>
diff --git a/lib/J3/Compiler/JavaAOTCompiler.cpp<br>
b/lib/J3/Compiler/JavaAOTCompiler.cpp<br>
index d16d57c..11488df 100644<br>
--- a/lib/J3/Compiler/JavaAOTCompiler.cpp<br>
+++ b/lib/J3/Compiler/JavaAOTCompiler.cpp<br>
@@ -687,36 +687,6 @@ Constant*<br>
JavaAOTCompiler::CreateConstantForBaseObject(CommonClass* cl) {<br>
return ConstantStruct::get(STy, Elmts);<br>
}<br>
<br>
-Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {<br>
- assert(!useCooperativeGC());<br>
- Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;<br>
- LLVMClassInfo* LCI = getClassInfo(javaClass);<br>
- StructType* STy =<br>
- dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));<br>
-<br>
- std::vector<Constant*> Elmts;<br>
-<br>
- // JavaObject<br>
- Elmts.push_back(CreateConstantForBaseObject(javaClass));<br>
-<br>
- // signers<br>
- Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
-<br>
- // pd<br>
- Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
-<br>
- // vmdata<br>
- Constant* Cl = getNativeClass(cl);<br>
- Cl = ConstantExpr::getCast(Instruction::BitCast, Cl,<br>
- JavaIntrinsics.JavaObjectType);<br>
- Elmts.push_back(Cl);<br>
-<br>
- // constructor<br>
- Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
-<br>
- return ConstantStruct::get(STy, Elmts);<br>
-}<br>
-<br>
Constant* JavaAOTCompiler::CreateConstantFromJavaObject(JavaObject* obj) {<br>
assert(!useCooperativeGC());<br>
CommonClass* cl = JavaObject::getClass(obj);<br>
@@ -2557,3 +2527,9 @@ CommonClass*<br>
JavaAOTCompiler::getUniqueBaseClass(CommonClass* cl) {<br>
}<br>
return currentClass;<br>
}<br>
+<br>
+#ifdef USE_OPENJDK<br>
+#include "JavaAOTCompilerOpenJDK.inc"<br>
+#else<br>
+#include "JavaAOTCompilerClasspath.inc"<br>
+#endif<br>
diff --git a/lib/J3/Compiler/JavaAOTCompilerClasspath.inc<br>
b/lib/J3/Compiler/JavaAOTCompilerClasspath.inc<br>
new file mode 100644<br>
index 0000000..41199ec<br>
--- /dev/null<br>
+++ b/lib/J3/Compiler/JavaAOTCompilerClasspath.inc<br>
@@ -0,0 +1,39 @@<br>
+//===----- JavaAOTCompilerClasspath.inc - GNUClasspath AOT support<br>
--------===//<br>
+//<br>
+// The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {<br>
+ assert(!useCooperativeGC());<br>
+ Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;<br>
+ LLVMClassInfo* LCI = getClassInfo(javaClass);<br>
+ StructType* STy =<br>
+ dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));<br>
+<br>
+ std::vector<Constant*> Elmts;<br>
+<br>
+ // JavaObject<br>
+ Elmts.push_back(CreateConstantForBaseObject(javaClass));<br>
+<br>
+ // signers<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+<br>
+ // pd<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+<br>
+ // vmdata<br>
+ Constant* Cl = getNativeClass(cl);<br>
+ Cl = ConstantExpr::getCast(Instruction::BitCast, Cl,<br>
+ JavaIntrinsics.JavaObjectType);<br>
+ Elmts.push_back(Cl);<br>
+<br>
+ // constructor<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+<br>
+ return ConstantStruct::get(STy, Elmts);<br>
+}<br>
+<br>
diff --git a/lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc<br>
b/lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc<br>
new file mode 100644<br>
index 0000000..367c56f<br>
--- /dev/null<br>
+++ b/lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc<br>
@@ -0,0 +1,63 @@<br>
+//===----- JavaAOTCompilerOpenJDK.inc - OpenJDK AOT support<br>
---------------===//<br>
+//<br>
+// The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {<br>
+ assert(!useCooperativeGC());<br>
+ Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;<br>
+ LLVMClassInfo* LCI = getClassInfo(javaClass);<br>
+ StructType* STy =<br>
+ dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));<br>
+<br>
+ std::vector<Constant*> Elmts;<br>
+<br>
+ // JavaObject<br>
+ Elmts.push_back(CreateConstantForBaseObject(javaClass));<br>
+<br>
+ // Constructor<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // newInstanceCallerCache<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // Name<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // declaredFields<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // publicFields<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // declaredMethods<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // publicMethods<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // declaredConstructors<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // publicConstructors<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // declaredPublicFields<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // declaredPublicMethods<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // classRedefinedCount<br>
+ Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), 0));<br>
+ // lastRedefinedCount<br>
+ Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), 0));<br>
+ // genericInfo<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // enumConstants<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // enumConstantDictionary<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // annotations<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // declaredAnnotations<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+ // annotationType<br>
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));<br>
+<br>
+ return ConstantStruct::get(STy, Elmts);<br></blockquote><div><br></div><div>There will be a problem here that java.lang.Class objects will not be allocated properly. They won't be able to contain the two extra fields,</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
+}<br>
+<br>
diff --git a/lib/J3/VMCore/Precompiled.cpp b/lib/J3/VMCore/Precompiled.cpp<br>
index e469eaf..8fdd213 100644<br>
--- a/lib/J3/VMCore/Precompiled.cpp<br>
+++ b/lib/J3/VMCore/Precompiled.cpp<br>
@@ -11,6 +11,7 @@<br>
#include <dlfcn.h><br>
#include "mvm/MethodInfo.h"<br>
<br>
+#include "ClasspathReflect.h"<br>
#include "JavaClass.h"<br>
#include "JavaUpcalls.h"<br>
#include "JnjvmClassLoader.h"<br>
@@ -81,6 +82,9 @@ Class* JnjvmClassLoader::loadClassFromSelf(Jnjvm*<br>
vm, const char* name) {<br>
extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,<br>
CommonClass* cl) {<br>
cl->classLoader = JCL;<br>
+ // Ensure the Class mapping field is set properly.<br>
+ // (Needed for OpenJDK, since this mapping isn't part of the Class type)<br>
+ JavaObjectClass::setClass((JavaObjectClass*)cl->getDelegatee(),cl);<br></blockquote><div><br></div><div>Did you actually run some code that failed because of this not being set?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
}<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></span></blockquote></div><br></div>