[llvm-commits] CVS: llvm-java/lib/Compiler/Compiler.cpp
Alkis Evlogimenos
alkis at cs.uiuc.edu
Fri Apr 1 14:43:55 PST 2005
Changes in directory llvm-java/lib/Compiler:
Compiler.cpp updated: 1.274 -> 1.275
---
Log message:
Initialize array classes as well (and their component classes
recursively).
---
Diffs of the changes: (+31 -19)
Compiler.cpp | 50 +++++++++++++++++++++++++++++++-------------------
1 files changed, 31 insertions(+), 19 deletions(-)
Index: llvm-java/lib/Compiler/Compiler.cpp
diff -u llvm-java/lib/Compiler/Compiler.cpp:1.274 llvm-java/lib/Compiler/Compiler.cpp:1.275
--- llvm-java/lib/Compiler/Compiler.cpp:1.274 Fri Apr 1 12:31:25 2005
+++ llvm-java/lib/Compiler/Compiler.cpp Fri Apr 1 16:43:44 2005
@@ -432,28 +432,38 @@
void emitClassInitializers(const VMClass* clazz) {
static SetVector<const VMClass*> toInitClasses;
- const ClassFile* classfile = clazz->getClassFile();
- if (!classfile)
+ // If this is a primitive class we are done.
+ if (clazz->isPrimitive())
+ return;
+
+ // If this class is already initialized, we are done.
+ if (!toInitClasses.insert(clazz))
return;
-
- if (toInitClasses.insert(clazz)) {
- // If this class has a super class, initialize that first.
- if (const VMClass* superClass = clazz->getSuperClass())
- emitClassInitializers(superClass);
-
- // Schedule all its dynamically bound non abstract methods for
- // compilation.
- for (unsigned i = 0, e = clazz->getNumDynamicallyBoundMethods();
- i != e; ++i) {
- const VMMethod* method = clazz->getDynamicallyBoundMethod(i);
- if (!method->isAbstract())
- scheduleMethod(method);
- }
- // Create constant strings for this class.
+ // If this class has a super class, initialize that first.
+ if (const VMClass* superClass = clazz->getSuperClass())
+ emitClassInitializers(superClass);
+
+ // If this class is an array, initialize its component class now.
+ if (const VMClass* componentClass = clazz->getComponentClass())
+ emitClassInitializers(componentClass);
+
+ // Schedule all its dynamically bound non abstract methods for
+ // compilation.
+ for (unsigned i = 0, e = clazz->getNumDynamicallyBoundMethods();
+ i != e; ++i) {
+ const VMMethod* method = clazz->getDynamicallyBoundMethod(i);
+ if (!method->isAbstract())
+ scheduleMethod(method);
+ }
+
+
+ // If this class has a constant pool (was loaded from a
+ // classfile), create constant strings for it.
+ if (const ClassFile* classfile = clazz->getClassFile()) {
Function* stringConstructors = module_->getOrInsertFunction(
- clazz->getName() + "<strinit>",
- FunctionType::get(Type::VoidTy, std::vector<const Type*>(), false));
+ clazz->getName() + "<strinit>",
+ FunctionType::get(Type::VoidTy, std::vector<const Type*>(), false));
Instruction* I =
new ReturnInst(NULL, new BasicBlock("entry", stringConstructors));
for (unsigned i = 0, e = classfile->getNumConstants(); i != e; ++i)
@@ -1168,6 +1178,7 @@
const VMClass* clazz = resolver_->getClass(type);
const VMClass* arrayClass = resolver_->getArrayClass(clazz);
+ emitClassInitializers(arrayClass);
push(allocateArray(arrayClass, count, currentBB_));
}
@@ -1177,6 +1188,7 @@
const VMClass* clazz = class_->getClass(index);
const VMClass* arrayClass = resolver_->getArrayClass(clazz);
+ emitClassInitializers(arrayClass);
push(allocateArray(arrayClass, count, currentBB_));
}
More information about the llvm-commits
mailing list