[llvm-commits] CVS: llvm-java/lib/Compiler/VMClass.h VMClass.cpp Resolver.cpp

Alkis Evlogimenos alkis at cs.uiuc.edu
Sat Apr 2 18:49:55 PST 2005



Changes in directory llvm-java/lib/Compiler:

VMClass.h updated: 1.31 -> 1.32
VMClass.cpp updated: 1.41 -> 1.42
Resolver.cpp updated: 1.20 -> 1.21
---
Log message:

Implement get/set static field for JNI.


---
Diffs of the changes:  (+60 -1)

 Resolver.cpp |    4 ++++
 VMClass.cpp  |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 VMClass.h    |    3 +++
 3 files changed, 60 insertions(+), 1 deletion(-)


Index: llvm-java/lib/Compiler/VMClass.h
diff -u llvm-java/lib/Compiler/VMClass.h:1.31 llvm-java/lib/Compiler/VMClass.h:1.32
--- llvm-java/lib/Compiler/VMClass.h:1.31	Sat Apr  2 19:12:05 2005
+++ llvm-java/lib/Compiler/VMClass.h	Sat Apr  2 20:49:44 2005
@@ -48,6 +48,7 @@
     std::vector<const VMClass*> superClasses_;
     std::vector<const VMClass*> interfaces_;
     std::vector<const VMField*> memberFields_;
+    std::vector<const VMField*> staticFields_;
     std::vector<const VMMethod*> dynamicallyBoundMethods_;
     GlobalVariable* classRecord_;
 
@@ -62,6 +63,8 @@
     llvm::Constant* buildInterfaceClassRecords() const;
     llvm::Constant* buildFieldDescriptors() const;
     llvm::Constant* buildFieldOffsets() const;
+    llvm::Constant* buildStaticFieldDescriptors() const;
+    llvm::Constant* buildStaticFieldPointers() const;
     llvm::Constant* buildClassTypeInfo() const;
 
     const VMField* lookupField(const std::string& name) const;


Index: llvm-java/lib/Compiler/VMClass.cpp
diff -u llvm-java/lib/Compiler/VMClass.cpp:1.41 llvm-java/lib/Compiler/VMClass.cpp:1.42
--- llvm-java/lib/Compiler/VMClass.cpp:1.41	Sat Apr  2 19:12:05 2005
+++ llvm-java/lib/Compiler/VMClass.cpp	Sat Apr  2 20:49:44 2005
@@ -163,7 +163,9 @@
       Field* field = fields[i];
       const std::string& name = field->getName()->str();
       if (field->isStatic()) {
-        fieldMap_.insert(std::make_pair(name, VMField(this, field)));
+        FieldMap::iterator i = fieldMap_.insert(
+          std::make_pair(name, VMField(this, field))).first;
+        staticFields_.push_back(&i->second);
       }
       else {
         unsigned index = memberFields_.size() + 1;
@@ -344,6 +346,54 @@
       resolver_->getModule()));
 }
 
+llvm::Constant* VMClass::buildStaticFieldDescriptors() const
+{
+  std::vector<llvm::Constant*> init;
+  init.reserve(staticFields_.size()+1);
+
+  for (unsigned i = 0, e = staticFields_.size(); i != e; ++i) {
+    const VMField* field = staticFields_[i];
+    init.push_back(field->buildFieldDescriptor());
+  }
+  // Null terminate.
+  init.push_back(llvm::Constant::getNullValue(PointerType::get(Type::SByteTy)));
+
+  const ArrayType* arrayType =
+    ArrayType::get(init.back()->getType(), init.size());
+
+  return ConstantExpr::getPtrPtrFromArrayPtr(
+    new GlobalVariable(
+      arrayType,
+      true,
+      GlobalVariable::ExternalLinkage,
+      ConstantArray::get(arrayType, init),
+      getName() + "<staticfielddescriptors>",
+      resolver_->getModule()));
+}
+
+llvm::Constant* VMClass::buildStaticFieldPointers() const
+{
+  std::vector<llvm::Constant*> init;
+  init.reserve(staticFields_.size());
+
+  const Type* pointerType = PointerType::get(Type::SByteTy);
+  for (unsigned i = 0, e = staticFields_.size(); i != e; ++i) {
+    const VMField* field = staticFields_[i];
+    init.push_back(ConstantExpr::getCast(field->getGlobal(), pointerType));
+  }
+
+  const ArrayType* arrayType = ArrayType::get(pointerType, init.size());
+
+  return ConstantExpr::getPtrPtrFromArrayPtr(
+    new GlobalVariable(
+      arrayType,
+      true,
+      GlobalVariable::ExternalLinkage,
+      ConstantArray::get(arrayType, init),
+      getName() + "<staticfieldpointers>",
+      resolver_->getModule()));
+}
+
 llvm::Constant* VMClass::buildClassTypeInfo() const
 {
   std::vector<llvm::Constant*> init;
@@ -373,6 +423,8 @@
 
   init.push_back(buildFieldDescriptors());
   init.push_back(buildFieldOffsets());
+  init.push_back(buildStaticFieldDescriptors());
+  init.push_back(buildStaticFieldPointers());
 
   return ConstantStruct::get(init);
 }


Index: llvm-java/lib/Compiler/Resolver.cpp
diff -u llvm-java/lib/Compiler/Resolver.cpp:1.20 llvm-java/lib/Compiler/Resolver.cpp:1.21
--- llvm-java/lib/Compiler/Resolver.cpp:1.20	Sat Apr  2 19:12:05 2005
+++ llvm-java/lib/Compiler/Resolver.cpp	Sat Apr  2 20:49:44 2005
@@ -49,6 +49,8 @@
   //   int elementSize;
   //   char** fieldDescriptors;
   //   unsigned* fieldOffsets;
+  //   char** staticFieldDescriptors;
+  //   void** staticFields;
   // };
 
   // Compute the type_info type.
@@ -62,6 +64,8 @@
   elements.push_back(Type::IntTy);
   elements.push_back(PointerType::get(PointerType::get(Type::SByteTy)));
   elements.push_back(PointerType::get(Type::UIntTy));
+  elements.push_back(PointerType::get(PointerType::get(Type::SByteTy)));
+  elements.push_back(PointerType::get(PointerType::get(Type::SByteTy)));
   typeInfoType_ = StructType::get(elements);
 
   module_->addTypeName("struct.llvm_java_typeinfo", getTypeInfoType());






More information about the llvm-commits mailing list