[vmkit-commits] [PATCH] Refactor AOT into ClassLib-specific components, add support for OpenJDK
Will Dietz
wdietz2 at illinois.edu
Thu Nov 3 07:37:40 PDT 2011
Inlined below.
Thanks!
~Will
>From b036d7358b9e57da79e71f04e1869bb9e2015718 Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Wed, 2 Nov 2011 22:54:23 -0500
Subject: [PATCH 14/17] Refactor AOT into ClassLib-specific components, add
support for OpenJDK
* Fix the JavaClass field layout for OpenJDK
* Restore the Class mapping (stored in an 'extra' field). Ignore PD for now,
since in the Classpath port we emit a null constant for it anyway.
---
lib/J3/Compiler/JavaAOTCompiler.cpp | 36 +++------------
lib/J3/Compiler/JavaAOTCompilerClasspath.inc | 39 ++++++++++++++++
lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc | 63 ++++++++++++++++++++++++++
lib/J3/VMCore/Precompiled.cpp | 4 ++
4 files changed, 112 insertions(+), 30 deletions(-)
create mode 100644 lib/J3/Compiler/JavaAOTCompilerClasspath.inc
create mode 100644 lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc
diff --git a/lib/J3/Compiler/JavaAOTCompiler.cpp
b/lib/J3/Compiler/JavaAOTCompiler.cpp
index d16d57c..11488df 100644
--- a/lib/J3/Compiler/JavaAOTCompiler.cpp
+++ b/lib/J3/Compiler/JavaAOTCompiler.cpp
@@ -687,36 +687,6 @@ Constant*
JavaAOTCompiler::CreateConstantForBaseObject(CommonClass* cl) {
return ConstantStruct::get(STy, Elmts);
}
-Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {
- assert(!useCooperativeGC());
- Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;
- LLVMClassInfo* LCI = getClassInfo(javaClass);
- StructType* STy =
- dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));
-
- std::vector<Constant*> Elmts;
-
- // JavaObject
- Elmts.push_back(CreateConstantForBaseObject(javaClass));
-
- // signers
- Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
-
- // pd
- Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
-
- // vmdata
- Constant* Cl = getNativeClass(cl);
- Cl = ConstantExpr::getCast(Instruction::BitCast, Cl,
- JavaIntrinsics.JavaObjectType);
- Elmts.push_back(Cl);
-
- // constructor
- Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
-
- return ConstantStruct::get(STy, Elmts);
-}
-
Constant* JavaAOTCompiler::CreateConstantFromJavaObject(JavaObject* obj) {
assert(!useCooperativeGC());
CommonClass* cl = JavaObject::getClass(obj);
@@ -2557,3 +2527,9 @@ CommonClass*
JavaAOTCompiler::getUniqueBaseClass(CommonClass* cl) {
}
return currentClass;
}
+
+#ifdef USE_OPENJDK
+#include "JavaAOTCompilerOpenJDK.inc"
+#else
+#include "JavaAOTCompilerClasspath.inc"
+#endif
diff --git a/lib/J3/Compiler/JavaAOTCompilerClasspath.inc
b/lib/J3/Compiler/JavaAOTCompilerClasspath.inc
new file mode 100644
index 0000000..41199ec
--- /dev/null
+++ b/lib/J3/Compiler/JavaAOTCompilerClasspath.inc
@@ -0,0 +1,39 @@
+//===----- JavaAOTCompilerClasspath.inc - GNUClasspath AOT support
--------===//
+//
+// The VMKit project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {
+ assert(!useCooperativeGC());
+ Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;
+ LLVMClassInfo* LCI = getClassInfo(javaClass);
+ StructType* STy =
+ dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));
+
+ std::vector<Constant*> Elmts;
+
+ // JavaObject
+ Elmts.push_back(CreateConstantForBaseObject(javaClass));
+
+ // signers
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+
+ // pd
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+
+ // vmdata
+ Constant* Cl = getNativeClass(cl);
+ Cl = ConstantExpr::getCast(Instruction::BitCast, Cl,
+ JavaIntrinsics.JavaObjectType);
+ Elmts.push_back(Cl);
+
+ // constructor
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+
+ return ConstantStruct::get(STy, Elmts);
+}
+
diff --git a/lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc
b/lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc
new file mode 100644
index 0000000..367c56f
--- /dev/null
+++ b/lib/J3/Compiler/JavaAOTCompilerOpenJDK.inc
@@ -0,0 +1,63 @@
+//===----- JavaAOTCompilerOpenJDK.inc - OpenJDK AOT support
---------------===//
+//
+// The VMKit project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {
+ assert(!useCooperativeGC());
+ Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;
+ LLVMClassInfo* LCI = getClassInfo(javaClass);
+ StructType* STy =
+ dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));
+
+ std::vector<Constant*> Elmts;
+
+ // JavaObject
+ Elmts.push_back(CreateConstantForBaseObject(javaClass));
+
+ // Constructor
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // newInstanceCallerCache
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // Name
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // declaredFields
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // publicFields
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // declaredMethods
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // publicMethods
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // declaredConstructors
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // publicConstructors
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // declaredPublicFields
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // declaredPublicMethods
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // classRedefinedCount
+ Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), 0));
+ // lastRedefinedCount
+ Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), 0));
+ // genericInfo
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // enumConstants
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // enumConstantDictionary
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // annotations
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // declaredAnnotations
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+ // annotationType
+ Elmts.push_back(Constant::getNullValue(JavaIntrinsics.JavaObjectType));
+
+ return ConstantStruct::get(STy, Elmts);
+}
+
diff --git a/lib/J3/VMCore/Precompiled.cpp b/lib/J3/VMCore/Precompiled.cpp
index e469eaf..8fdd213 100644
--- a/lib/J3/VMCore/Precompiled.cpp
+++ b/lib/J3/VMCore/Precompiled.cpp
@@ -11,6 +11,7 @@
#include <dlfcn.h>
#include "mvm/MethodInfo.h"
+#include "ClasspathReflect.h"
#include "JavaClass.h"
#include "JavaUpcalls.h"
#include "JnjvmClassLoader.h"
@@ -81,6 +82,9 @@ Class* JnjvmClassLoader::loadClassFromSelf(Jnjvm*
vm, const char* name) {
extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,
CommonClass* cl) {
cl->classLoader = JCL;
+ // Ensure the Class mapping field is set properly.
+ // (Needed for OpenJDK, since this mapping isn't part of the Class type)
+ JavaObjectClass::setClass((JavaObjectClass*)cl->getDelegatee(),cl);
}
--
1.7.5.1
More information about the vmkit-commits
mailing list