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>