[vmkit-commits] [vmkit] r54883 - in /vmkit/trunk/lib/N3/VMCore: Assembly.cpp CLIJit.cpp CLISignature.cpp VMClass.cpp
Tilmann Scheller
tilmann.scheller at googlemail.com
Sun Aug 17 06:27:07 PDT 2008
Author: tilmann
Date: Sun Aug 17 08:27:07 2008
New Revision: 54883
URL: http://llvm.org/viewvc/llvm-project?rev=54883&view=rev
Log:
fix bugs in generics implementation of N3
Modified:
vmkit/trunk/lib/N3/VMCore/Assembly.cpp
vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
vmkit/trunk/lib/N3/VMCore/CLISignature.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.cpp
Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=54883&r1=54882&r2=54883&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sun Aug 17 08:27:07 2008
@@ -1780,16 +1780,28 @@
case 3: VMThread::get()->vm->error("implement me %d", table); break;
case 4: {
VMClass* type = (VMClass*) readTypeSpec(vm, index);
- type->resolveType(false, false);
-
+
VMGenericClass* genClass = dynamic_cast<VMGenericClass*> (type);
if (genClass) {
+ // temporarily store the current generic class, in case it's generic arguments
+ // are referenced in the current method
+ VMGenericClass* old = VMThread::get()->currGenericClass;
+ VMThread::get()->currGenericClass = genClass;
+
+ type->resolveType(false, false);
+
bool virt = extractMethodSignature(offset, type, args);
VMMethod* meth = instantiateGenericMethod(genArgs, type, name, args,
token, virt);
+
+ // restore previous generic class
+ VMThread::get()->currGenericClass = old;
+
return meth;
} else {
+ type->resolveType(false, false);
+
VMMethod* meth = gc_new(VMMethod)() ;
bool virt = extractMethodSignature(offset, type, args);
bool structReturn = false;
Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=54883&r1=54882&r2=54883&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Sun Aug 17 08:27:07 2008
@@ -2237,7 +2237,7 @@
addPass(PM, llvm::createInstructionCombiningPass()); // Clean up after the unroller
//addPass(PM, mvm::createArrayChecksPass());
addPass(PM, llvm::createGVNPass()); // GVN for load instructions
- addPass(PM, llvm::createGCSEPass()); // Remove common subexprs
+ //addPass(PM, llvm::createGCSEPass()); // Remove common subexprs
addPass(PM, llvm::createSCCPPass()); // Constant prop with SCCP
addPass(PM, llvm::createPredicateSimplifierPass());
Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLISignature.cpp?rev=54883&r1=54882&r2=54883&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Sun Aug 17 08:27:07 2008
@@ -142,6 +142,8 @@
static VMCommonClass* METHOD_ElementTypeVar(uint32 op, Assembly* ass, uint32& offset) {
uint32 number = ass->uncompressSignature(offset);
+ assert(VMThread::get()->currGenericClass != NULL && "Current Generic Class not set!");
+
return VMThread::get()->currGenericClass->genericParams[number];
}
@@ -257,6 +259,10 @@
VMClass* cl = gc_new(VMClass)();
cl->token = number;
cl->assembly = NULL;
+ cl->nameSpace = UTF8::asciizConstruct(VMThread::get()->vm, "");
+ char *tmp = (char *) alloca(100);
+ snprintf(tmp, 100, "!!%d", number);
+ cl->name = UTF8::asciizConstruct(VMThread::get()->vm, tmp);
return cl;
} else {
return VMThread::get()->currGenericMethod->genericParams[number];
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=54883&r1=54882&r2=54883&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Sun Aug 17 08:27:07 2008
@@ -474,8 +474,16 @@
}
void VMCommonClass::resolveType(bool stat, bool clinit) {
+ // save previous current generic class to restore it later
+ VMGenericClass* old = VMThread::get()->currGenericClass;
+ // temporarily store the class being compiled in case it is a generic class
+ VMThread::get()->currGenericClass = dynamic_cast<VMGenericClass*>(this);
+
resolveVirtual();
if (stat) resolveStatic(clinit);
+
+ // restore saved class
+ VMThread::get()->currGenericClass = old;
}
void VMCommonClass::resolveStatic(bool clinit) {
More information about the vmkit-commits
mailing list