[llvm-commits] CVS: llvm-java/lib/Compiler/VMClass.h VMClass.cpp
Alkis Evlogimenos
alkis at cs.uiuc.edu
Mon Mar 28 18:49:57 PST 2005
Changes in directory llvm-java/lib/Compiler:
VMClass.h updated: 1.17 -> 1.18
VMClass.cpp updated: 1.20 -> 1.21
---
Log message:
Resolve fields when computing the layout type of the object.
---
Diffs of the changes: (+37 -32)
VMClass.cpp | 62 ++++++++++++++++++++++++++++++++----------------------------
VMClass.h | 7 ++----
2 files changed, 37 insertions(+), 32 deletions(-)
Index: llvm-java/lib/Compiler/VMClass.h
diff -u llvm-java/lib/Compiler/VMClass.h:1.17 llvm-java/lib/Compiler/VMClass.h:1.18
--- llvm-java/lib/Compiler/VMClass.h:1.17 Mon Mar 28 20:47:41 2005
+++ llvm-java/lib/Compiler/VMClass.h Mon Mar 28 20:49:46 2005
@@ -15,6 +15,7 @@
#ifndef LLVM_JAVA_VMCLASS_H
#define LLVM_JAVA_VMCLASS_H
+#include "VMField.h"
#include <llvm/Constant.h>
#include <llvm/Module.h>
#include <llvm/Type.h>
@@ -39,14 +40,12 @@
unsigned interfaceIndex_;
typedef std::map<std::string, int> Field2IndexMap;
Field2IndexMap f2iMap_;
- typedef std::vector<const Type*> ElementTypes;
- ElementTypes elementTypes_;
mutable std::vector<void*> resolvedConstantPool_;
std::vector<const VMClass*> superClasses_;
std::vector<const VMClass*> interfaces_;
+ std::vector<const VMField*> memberFields_;
- void addField(const std::string& name, const Type* type);
- void resolveType();
+ void computeLayout();
friend class Resolver;
Index: llvm-java/lib/Compiler/VMClass.cpp
diff -u llvm-java/lib/Compiler/VMClass.cpp:1.20 llvm-java/lib/Compiler/VMClass.cpp:1.21
--- llvm-java/lib/Compiler/VMClass.cpp:1.20 Mon Mar 28 19:01:16 2005
+++ llvm-java/lib/Compiler/VMClass.cpp Mon Mar 28 20:49:46 2005
@@ -70,20 +70,44 @@
}
-void VMClass::addField(const std::string& name, const Type* type)
-{
- f2iMap_.insert(std::make_pair(name, elementTypes_.size()));
- elementTypes_.push_back(type);
-}
-
int VMClass::getFieldIndex(const std::string& name) const {
Field2IndexMap::const_iterator it = f2iMap_.find(name);
return it == f2iMap_.end() ? -1 : it->second;
}
-void VMClass::resolveType() {
+void VMClass::computeLayout() {
+ std::vector<const Type*> layout;
+ if (isArray()) {
+ layout.reserve(3);
+ layout.push_back(resolver_->getClass("java/lang/Object")->getLayoutType());
+ layout.push_back(Type::UIntTy);
+ layout.push_back(ArrayType::get(componentClass_->getType(), 0));
+ }
+ else if (isInterface()) {
+ layout.reserve(1);
+ layout.push_back(resolver_->getClass("java/lang/Object")->getLayoutType());
+ }
+ else {
+ if (const VMClass* superClass = getSuperClass())
+ layout.push_back(superClass->getLayoutType());
+ else // This is java/lang/Object
+ layout.push_back(resolver_->getObjectBaseLayoutType());
+ // Now add the fields.
+ const Fields& fields = classFile_->getFields();
+ for (unsigned i = 0, e = fields.size(); i != e; ++i) {
+ Field* field = fields[i];
+ if (!field->isStatic()) {
+ memberFields_.push_back(NULL);
+ f2iMap_.insert(std::make_pair(field->getName()->str(),
+ memberFields_.size()));
+ layout.push_back(
+ getClassForDescriptor(field->getDescriptorIndex())->getType());
+ }
+ }
+ }
+
PATypeHolder holder = layoutType_;
- Type* resolvedType = StructType::get(elementTypes_);
+ Type* resolvedType = StructType::get(layout);
cast<OpaqueType>(layoutType_)->refineAbstractTypeTo(resolvedType);
layoutType_ = holder.get();
type_ = PointerType::get(layoutType_);
@@ -98,20 +122,14 @@
if (isArray()) {
superClasses_.reserve(1);
superClasses_.push_back(resolver_->getClass("java/lang/Object"));
- addField("super", superClasses_[0]->getLayoutType());
- addField("<length>", Type::UIntTy);
- addField("<data>", ArrayType::get(componentClass_->getType(), 0));
interfaces_.reserve(2);
interfaces_.push_back(resolver_->getClass("java/lang/Cloneable"));
interfaces_.push_back(resolver_->getClass("java/io/Serializable"));
}
else {
- // This is java/lang/Object.
- if (!classFile_->getSuperClass())
- addField("base", resolver_->getObjectBaseLayoutType());
// This is any class but java/lang/Object.
- else {
+ if (classFile_->getSuperClass()) {
// Our direct super class.
const VMClass* superClass =
getClassForClass(classFile_->getSuperClassIndex());
@@ -120,9 +138,6 @@
for (unsigned i = 0, e = superClass->getNumInterfaces(); i != e; ++i)
interfaces_.push_back(superClass->getInterface(i));
- // We first add the struct of the super class.
- addField("super", superClass->getLayoutType());
-
// Although we can safely assume that all interfaces inherit
// from java/lang/Object, java/lang/Class.getSuperclass()
// returns null on interface types. So we only set the
@@ -155,18 +170,9 @@
std::sort(interfaces_.begin(), interfaces_.end());
interfaces_.erase(std::unique(interfaces_.begin(), interfaces_.end()),
interfaces_.end());
-
- // Now add the rest of the fields.
- const Fields& fields = classFile_->getFields();
- for (unsigned i = 0, e = fields.size(); i != e; ++i) {
- Field* field = fields[i];
- if (!field->isStatic())
- addField(field->getName()->str(),
- getClassForDescriptor(field->getDescriptorIndex())->getType());
- }
}
- resolveType();
+ computeLayout();
assert(!isa<OpaqueType>(getLayoutType()) &&"Class not initialized properly!");
}
More information about the llvm-commits
mailing list