[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