[vmkit-commits] [PATCH] Add support for extra VM-only fields, use this to add fields to j.l.Class in OpenJDK

Nicolas Geoffray nicolas.geoffray at gmail.com
Fri Oct 28 15:31:02 PDT 2011


Hi Will!

I think this patch could work, but I would definitely try a more 'localized'
approach before doing it this way.

I think that in the bootstrap process of OpenJDK, you should update the
Class::virtualSize field for java.lang.Class to include these two new
fields, and that would be it. No need to extend the JavaField array (the
Java side of things does not have to know we added new fields).

Of course, you need to make sure no java.lang.Class objects are allocated
*before* you change the size.

Thanks, and let me know if that worked!
Nicolas

On Fri, Oct 28, 2011 at 10:49 PM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below.
>
> Misc comments:
> There was a trade-off regarding the dynamic nature of nbExtraFields()
> (that in the OpenJDK means a string comparison) versus adding an extra
> field to the "Class" type.
> Same for extraFields() method, but since it's just doing simple
> pointer arithmetic adding a field for it seems unnecessary regardless.
>
> AOT won't work for arbitrarily added fields using this method, but
> since these fields are VM-specific it seemed that handling that on a
> case-by-case seemed most appropriate (rather than teaching the AOT
> compiler to try to auto-emit these things).
> But then again AOT needs a few patches to support OpenJDK regardless,
> so have work there anyway :).
>
> Thanks, and enjoy your weekend! :)
>
> ~Will
>
> >From ca20223a1d73f78311bd48207250f8631f0d73d2 Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Fri, 28 Oct 2011 12:23:58 -0500
> Subject: [PATCH] Add support for extra 'hidden' fields, add fields to OJ's
>  j.l.Class
>
> ---
>  lib/J3/ClassLib/OpenJDK/ClasspathReflect.h |   13 +++++----
>  lib/J3/Compiler/LLVMInfo.cpp               |    7 +++++
>  lib/J3/VMCore/JavaClass.cpp                |   24 ++++++++++++++++-
>  lib/J3/VMCore/JavaClass.h                  |   11 ++++++++
>  lib/J3/VMCore/JavaClassClasspath.inc       |   16 ++++++++++++
>  lib/J3/VMCore/JavaClassOpenJDK.inc         |   37
> ++++++++++++++++++++++++++++
>  6 files changed, 100 insertions(+), 8 deletions(-)
>  create mode 100644 lib/J3/VMCore/JavaClassClasspath.inc
>  create mode 100644 lib/J3/VMCore/JavaClassOpenJDK.inc
>
> diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> index 75d35a7..e931705 100644
> --- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> +++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> @@ -38,30 +38,31 @@ private:
>   JavaObject* annotations;
>   JavaObject* declaredAnnotations;
>   JavaObject* annotationType;
> +  // Extra fields added by VM
> +  UserCommonClass* internalClass;
> +  JavaObject* pd;
>
>  public:
>
>   static UserCommonClass* getClass(JavaObjectClass* cl) {
>     llvm_gcroot(cl, 0);
> -    UNIMPLEMENTED();
> -    return NULL;
> +    return cl->internalClass;
>   }
>
>   static void setClass(JavaObjectClass* cl, UserCommonClass* vmdata) {
>     llvm_gcroot(cl, 0);
> -    UNIMPLEMENTED();
> +    cl->internalClass = vmdata;
>   }
>
>   static void setProtectionDomain(JavaObjectClass* cl, JavaObject* pd) {
>     llvm_gcroot(cl, 0);
>     llvm_gcroot(pd, 0);
> -    UNIMPLEMENTED();
> +    cl->pd = pd;
>   }
>
>   static JavaObject* getProtectionDomain(JavaObjectClass* cl) {
>     llvm_gcroot(cl, 0);
> -    UNIMPLEMENTED();
> -    return NULL;
> +    return cl->pd;
>   }
>
>   static void staticTracer(JavaObjectClass* obj, word_t closure) {
> diff --git a/lib/J3/Compiler/LLVMInfo.cpp b/lib/J3/Compiler/LLVMInfo.cpp
> index aa5a32a..a3836c3 100644
> --- a/lib/J3/Compiler/LLVMInfo.cpp
> +++ b/lib/J3/Compiler/LLVMInfo.cpp
> @@ -54,6 +54,13 @@ Type* LLVMClassInfo::getVirtualType() {
>         LLVMAssessorInfo& LAI = Compiler->getTypedefInfo(type);
>         fields.push_back(LAI.llvmType);
>       }
> +
> +      for (uint32 i = 0; i < classDef->nbExtraFields(); ++i) {
> +        JavaField& field = classDef->extraFields()[i];
> +        Typedef* type = field.getSignature();
> +        LLVMAssessorInfo& LAI = Compiler->getTypedefInfo(type);
> +        fields.push_back(LAI.llvmType);
> +      }
>
>
>       structType = StructType::get(context, fields, false);
> diff --git a/lib/J3/VMCore/JavaClass.cpp b/lib/J3/VMCore/JavaClass.cpp
> index 7daf125..caead3d 100644
> --- a/lib/J3/VMCore/JavaClass.cpp
> +++ b/lib/J3/VMCore/JavaClass.cpp
> @@ -101,6 +101,12 @@ Class::~Class() {
>     cur->~JavaField();
>     classLoader->allocator.Deallocate(cur);
>   }
> +
> +  for (uint32 i = 0; i < nbExtraFields(); ++i) {
> +    JavaField* cur = &(extraFields()[i]);
> +    cur->~JavaField();
> +    classLoader->allocator.Deallocate(cur);
> +  }
>
>   for (uint32 i = 0; i < nbVirtualMethods; ++i) {
>     JavaMethod* cur = &(virtualMethods[i]);
> @@ -726,8 +732,9 @@ Attribut* Class::readAttributs(Reader& reader,
> uint16& size) {
>
>  void Class::readFields(Reader& reader) {
>   uint16 nbFields = reader.readU2();
> -  virtualFields = new (classLoader->allocator, "Fields")
> JavaField[nbFields];
> -  staticFields = virtualFields + nbFields;
> +  uint16 extraFields = nbExtraFields();
> +  virtualFields = new (classLoader->allocator, "Fields")
> JavaField[nbFields+extraFields];
> +  staticFields = virtualFields + nbFields + extraFields;
>   for (int i = 0; i < nbFields; i++) {
>     uint16 access = reader.readU2();
>     const UTF8* name = ctpInfo->UTF8At(reader.readU2());
> @@ -745,6 +752,8 @@ void Class::readFields(Reader& reader) {
>     }
>     field->attributs = readAttributs(reader, field->nbAttributs);
>   }
> +
> +  initializeExtraVMFields();
>  }
>
>  void Class::fillIMT(std::set<JavaMethod*>* meths) {
> @@ -1774,3 +1783,14 @@ void JavaField::setStaticObjectField(JavaObject*
> val) {
>   JavaObject** ptr =
> (JavaObject**)((uint64)classDef->getStaticInstance() + ptrOffset);
>   mvm::Collector::objectReferenceNonHeapWriteBarrier((gc**)ptr, (gc*)val);
>  }
> +
> +JavaField* Class::extraFields() {
> +  return virtualFields + nbVirtualFields;
> +}
> +
> +#ifdef USE_OPENJDK
> +#include "JavaClassOpenJDK.inc"
> +#else
> +#include "JavaClassClasspath.inc"
> +#endif
> +
> diff --git a/lib/J3/VMCore/JavaClass.h b/lib/J3/VMCore/JavaClass.h
> index 1fa9b77..593a26c 100644
> --- a/lib/J3/VMCore/JavaClass.h
> +++ b/lib/J3/VMCore/JavaClass.h
> @@ -778,6 +778,17 @@ public:
>   ///
>   void makeVT();
>
> +  /// nbExtraFields -- Number of hidden VM-only 'extra' fields
> +  ///
> +  uint16 nbExtraFields();
> +
> +  /// extraFields -- Pointer to array of the extra fields
> +  JavaField * extraFields();
> +
> +private:
> +  /// initializeExtraVMFields -- Initializes the extra VM fields (if any)
> +  ///
> +  void initializeExtraVMFields();
>  };
>
>  /// ClassArray - This class represents Java array classes.
> diff --git a/lib/J3/VMCore/JavaClassClasspath.inc
> b/lib/J3/VMCore/JavaClassClasspath.inc
> new file mode 100644
> index 0000000..1704150
> --- /dev/null
> +++ b/lib/J3/VMCore/JavaClassClasspath.inc
> @@ -0,0 +1,16 @@
> +//===-------- JavaClassClasspath.inc - Java class details for
> Classpath ---===//
> +//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +uint16 Class::nbExtraFields() {
> +  return 0;
> +}
> +
> +void Class::initializeExtraVMFields() {
> +  // Nothing
> +}
> diff --git a/lib/J3/VMCore/JavaClassOpenJDK.inc
> b/lib/J3/VMCore/JavaClassOpenJDK.inc
> new file mode 100644
> index 0000000..b85aa98
> --- /dev/null
> +++ b/lib/J3/VMCore/JavaClassOpenJDK.inc
> @@ -0,0 +1,37 @@
> +//===-------- JavaClassOpenJDK.inc - Java class details for OpenJDK
> -------===//
> +//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +bool isClass(const UTF8* name) {
> +  return !strcmp(UTF8Buffer(name).cString(), "java/lang/Class");
> +}
> +
> +uint16 Class::nbExtraFields() {
> +  return ::isClass(name) ? 2 : 0;
> +}
> +
> +void Class::initializeExtraVMFields() {
> +  if (!::isClass(name)) return;
> +
> +  JavaField * vmFields = extraFields();
> +
> +  JavaField & classField = vmFields[0];
> +  JavaField & pdField = vmFields[1];
> +
> +  uint32 access = ACC_PRIVATE | ACC_FINAL | ACC_TRANSIENT;
> +
> +  const UTF8* objType =
> +    classLoader->asciizConstructUTF8("Ljava/lang/Object;");
> +  const UTF8* className =
> +    classLoader->asciizConstructUTF8("internalClass");
> +  const UTF8* pdName =
> +    classLoader->asciizConstructUTF8("pd");
> +
> +  classField.initialise(this, className, objType, access);
> +  pdField.initialise(this, pdName, objType, access);
> +}
> --
> 1.7.5.1
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111029/790dfa39/attachment.html>


More information about the vmkit-commits mailing list