[llvm-commits] CVS: llvm-java/lib/Compiler/Compiler.cpp
Alkis Evlogimenos
alkis at cs.uiuc.edu
Wed Nov 3 20:11:08 PST 2004
Changes in directory llvm-java/lib/Compiler:
Compiler.cpp updated: 1.135 -> 1.136
---
Log message:
Create globals for static fields of a class even if it doesn't have a
class initialization method.
---
Diffs of the changes: (+46 -43)
Index: llvm-java/lib/Compiler/Compiler.cpp
diff -u llvm-java/lib/Compiler/Compiler.cpp:1.135 llvm-java/lib/Compiler/Compiler.cpp:1.136
--- llvm-java/lib/Compiler/Compiler.cpp:1.135 Tue Nov 2 14:38:48 2004
+++ llvm-java/lib/Compiler/Compiler.cpp Wed Nov 3 22:10:56 2004
@@ -987,50 +987,53 @@
/// Emits static initializers for this class if not done already.
void emitStaticInitializers(const ClassFile* classfile) {
- const Method* method = classfile->getMethod("<clinit>()V");
- if (!method)
- return;
+ typedef SetVector<const ClassFile*> ClassFileSet;
+ static ClassFileSet toInitClasses;
- std::string name = classfile->getThisClass()->getName()->str();
- name += '/';
- name += method->getName()->str();
- name += method->getDescriptor()->str();
-
- Function* hook = module_.getOrInsertFunction(LLVM_JAVA_STATIC_INIT,
- Type::VoidTy, 0);
- Function* init = module_.getOrInsertFunction(name, Type::VoidTy, 0);
-
- // If this is the first time we scheduled this function
- // for compilation insert a call to it right before the
- // terminator of the only basic block in
- // llvm_java_static_init/
- if (toCompileFunctions_.insert(init)) {
- assert(hook->front().getTerminator() &&
- LLVM_JAVA_STATIC_INIT " should have a terminator!");
- new CallInst(init, "", hook->front().getTerminator());
- // We also create the global variables of this class.
- const Fields& fields = classfile->getFields();
- for (unsigned i = 0, e = fields.size(); i != e; ++i) {
- Field* field = fields[i];
- if (field->isStatic()) {
- llvm::Constant* init = NULL;
- if (ConstantValueAttribute* cv = field->getConstantValueAttribute())
- init = getConstant(cv->getValue());
-
- std::string globalName =
- classfile->getThisClass()->getName()->str() + '/' +
- field->getName()->str();
- DEBUG(std::cerr << "Adding global: " << globalName << '\n');
- new GlobalVariable(getType(field->getDescriptor()),
- field->isFinal(),
- (field->isPrivate() & bool(init) ?
- GlobalVariable::InternalLinkage :
- GlobalVariable::ExternalLinkage),
- init,
- globalName,
- &module_);
- }
- }
+ if (toInitClasses.insert(classfile)) {
+ // Create the global variables of this class.
+ const Fields& fields = classfile->getFields();
+ for (unsigned i = 0, e = fields.size(); i != e; ++i) {
+ Field* field = fields[i];
+ if (field->isStatic()) {
+ llvm::Constant* init = NULL;
+ if (ConstantValueAttribute* cv = field->getConstantValueAttribute())
+ init = getConstant(cv->getValue());
+
+ std::string globalName =
+ classfile->getThisClass()->getName()->str() + '/' +
+ field->getName()->str();
+ DEBUG(std::cerr << "Adding global: " << globalName << '\n');
+ new GlobalVariable(getType(field->getDescriptor()),
+ field->isFinal(),
+ (field->isPrivate() & bool(init) ?
+ GlobalVariable::InternalLinkage :
+ GlobalVariable::ExternalLinkage),
+ init,
+ globalName,
+ &module_);
+ }
+ }
+
+ // Call its class initialization method if it exists.
+ if (const Method* method = classfile->getMethod("<clinit>()V")) {
+ std::string name = classfile->getThisClass()->getName()->str();
+ name += '/';
+ name += method->getName()->str();
+ name += method->getDescriptor()->str();
+
+ Function* hook = module_.getOrInsertFunction(LLVM_JAVA_STATIC_INIT,
+ Type::VoidTy, 0);
+ Function* init = module_.getOrInsertFunction(name, Type::VoidTy, 0);
+
+ // Insert a call to it right before the terminator of the only
+ // basic block in llvm_java_static_init.
+ bool inserted = toCompileFunctions_.insert(init);
+ assert(inserted && "Class initialization method already called!");
+ assert(hook->front().getTerminator() &&
+ LLVM_JAVA_STATIC_INIT " should have a terminator!");
+ new CallInst(init, "", hook->front().getTerminator());
+ }
}
}
More information about the llvm-commits
mailing list