[llvm-commits] CVS: llvm-java/lib/Compiler/VMClass.h VMClass.cpp Resolver.cpp
Alkis Evlogimenos
alkis at cs.uiuc.edu
Fri Apr 1 14:59:31 PST 2005
Changes in directory llvm-java/lib/Compiler:
VMClass.h updated: 1.27 -> 1.28
VMClass.cpp updated: 1.37 -> 1.38
Resolver.cpp updated: 1.12 -> 1.13
---
Log message:
Implement instanceof for arrays. Now we pass ArrayInstanceOf.java.
---
Diffs of the changes: (+52 -20)
Resolver.cpp | 1
VMClass.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++-----------------
VMClass.h | 4 ++-
3 files changed, 52 insertions(+), 20 deletions(-)
Index: llvm-java/lib/Compiler/VMClass.h
diff -u llvm-java/lib/Compiler/VMClass.h:1.27 llvm-java/lib/Compiler/VMClass.h:1.28
--- llvm-java/lib/Compiler/VMClass.h:1.27 Fri Apr 1 12:31:25 2005
+++ llvm-java/lib/Compiler/VMClass.h Fri Apr 1 16:59:20 2005
@@ -48,7 +48,9 @@
std::vector<const VMClass*> interfaces_;
std::vector<const VMField*> memberFields_;
std::vector<const VMMethod*> dynamicallyBoundMethods_;
- llvm::Constant* classRecord_;
+ GlobalVariable* classRecord_;
+
+ void init();
void computeLayout();
void computeClassRecord();
Index: llvm-java/lib/Compiler/VMClass.cpp
diff -u llvm-java/lib/Compiler/VMClass.cpp:1.37 llvm-java/lib/Compiler/VMClass.cpp:1.38
--- llvm-java/lib/Compiler/VMClass.cpp:1.37 Fri Apr 1 16:56:20 2005
+++ llvm-java/lib/Compiler/VMClass.cpp Fri Apr 1 16:59:20 2005
@@ -15,17 +15,32 @@
//
//===----------------------------------------------------------------------===//
+#define DEBUG_TYPE "javaclass"
+
#include "VMClass.h"
#include "Resolver.h"
#include <llvm/DerivedTypes.h>
#include <llvm/Constants.h>
#include <llvm/Java/ClassFile.h>
-
-#define LLVM_JAVA_OBJECT_BASE "struct.llvm_java_object_base"
+#include <llvm/Support/Debug.h>
using namespace llvm;
using namespace llvm::Java;
+// On initialization we create a placeholder global for the class
+// record that will be patched later when the class record is
+// computed.
+void VMClass::init()
+{
+ classRecord_ = new GlobalVariable(
+ OpaqueType::get(),
+ false,
+ GlobalVariable::ExternalLinkage,
+ NULL,
+ getName() + "<classRecord>",
+ resolver_->getModule());
+}
+
VMClass::VMClass(Resolver* resolver, const std::string& className)
: name_(Resolver::canonicalizeClassName(className)),
resolver_(resolver),
@@ -34,10 +49,9 @@
layoutType_(OpaqueType::get()),
type_(PointerType::get(layoutType_)),
interfaceIndex_(INVALID_INTERFACE_INDEX),
- resolvedConstantPool_(classFile_->getNumConstants()),
- classRecord_(NULL)
+ resolvedConstantPool_(classFile_->getNumConstants())
{
-
+ init();
}
VMClass::VMClass(Resolver* resolver, const VMClass* componentClass)
@@ -47,10 +61,9 @@
componentClass_(componentClass),
layoutType_(OpaqueType::get()),
type_(PointerType::get(layoutType_)),
- interfaceIndex_(INVALID_INTERFACE_INDEX),
- classRecord_(NULL)
+ interfaceIndex_(INVALID_INTERFACE_INDEX)
{
-
+ init();
}
VMClass::VMClass(Resolver* resolver, const Type* type)
@@ -67,10 +80,9 @@
componentClass_(NULL),
layoutType_(const_cast<Type*>(type)),
type_(type),
- interfaceIndex_(INVALID_INTERFACE_INDEX),
- classRecord_(NULL)
+ interfaceIndex_(INVALID_INTERFACE_INDEX)
{
-
+ init();
}
const VMField* VMClass::lookupField(const std::string& name) const
@@ -116,9 +128,12 @@
void VMClass::computeLayout()
{
+ DEBUG(std::cerr << "Computing layout for: " << getName() << '\n');
// The layout of primitive classes is already computed.
- if (isPrimitive())
+ if (isPrimitive()) {
+ DEBUG(std::cerr << "Computed layout for: " << getName() << '\n');
return;
+ }
std::vector<const Type*> layout;
if (isArray()) {
@@ -156,6 +171,8 @@
cast<OpaqueType>(layoutType_)->refineAbstractTypeTo(resolvedType);
layoutType_ = holder.get();
type_ = PointerType::get(layoutType_);
+
+ DEBUG(std::cerr << "Computed layout for: " << getName() << '\n');
}
llvm::Constant* VMClass::buildSuperClassRecords() const
@@ -266,6 +283,12 @@
init.push_back(ConstantSInt::get(Type::IntTy, getInterfaceIndex()));
init.push_back(buildInterfaceClassRecords());
if (isArray())
+ init.push_back(ConstantExpr::getCast(getComponentClass()->getClassRecord(),
+ resolver_->getClassRecordPtrType()));
+ else
+ init.push_back(
+ llvm::Constant::getNullValue(resolver_->getClassRecordPtrType()));
+ if (isArray())
init.push_back(
ConstantExpr::getCast(
ConstantExpr::getSizeOf(getComponentClass()->getType()), Type::IntTy));
@@ -281,6 +304,7 @@
void VMClass::computeClassRecord()
{
+ DEBUG(std::cerr << "Computing class record for: " << getName() << '\n');
// Find dynamically bound methods.
if (!isPrimitive()) {
if (const VMClass* superClass = getSuperClass())
@@ -344,13 +368,18 @@
llvm::Constant* classRecordInit = ConstantStruct::get(init);
resolver_->getModule()->addTypeName("classRecord." + getName(),
classRecordInit->getType());
- classRecord_ = new GlobalVariable(
- classRecordInit->getType(),
- true,
- GlobalVariable::ExternalLinkage,
- classRecordInit,
- getName() + "<classRecord>",
- resolver_->getModule());
+
+ // Now resolve the opaque type of the placeholder class record.
+ const Type* classRecordType =
+ cast<PointerType>(classRecord_->getType())->getElementType();
+ OpaqueType* opaqueType = cast<OpaqueType>(const_cast<Type*>(classRecordType));
+ opaqueType->refineAbstractTypeTo(classRecordInit->getType());
+ // Set the initializer of the class record.
+ classRecord_->setInitializer(classRecordInit);
+ // Mark the class record as constant.
+ classRecord_->setConstant(true);
+
+ DEBUG(std::cerr << "Computed class record for: " << getName() << '\n');
}
void VMClass::link()
Index: llvm-java/lib/Compiler/Resolver.cpp
diff -u llvm-java/lib/Compiler/Resolver.cpp:1.12 llvm-java/lib/Compiler/Resolver.cpp:1.13
--- llvm-java/lib/Compiler/Resolver.cpp:1.12 Fri Apr 1 12:31:25 2005
+++ llvm-java/lib/Compiler/Resolver.cpp Fri Apr 1 16:59:20 2005
@@ -55,6 +55,7 @@
elements.push_back(PointerType::get(PointerType::get(classRecordType_)));
elements.push_back(Type::IntTy);
elements.push_back(PointerType::get(PointerType::get(classRecordType_)));
+ elements.push_back(PointerType::get(classRecordType_));
elements.push_back(Type::IntTy);
typeInfoType_ = StructType::get(elements);
More information about the llvm-commits
mailing list