[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