[llvm-commits] [vmkit] r50101 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaConstantPool.cpp JavaIsolate.cpp JavaJIT.cpp JavaMetaJIT.cpp JavaUpcalls.cpp Jnjvm.cpp Jnjvm.h JnjvmModuleProvider.cpp JnjvmModuleProvider.h LockedMap.h ServiceDomain.cpp VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Apr 22 08:25:02 PDT 2008
Author: geoffray
Date: Tue Apr 22 10:25:01 2008
New Revision: 50101
URL: http://llvm.org/viewvc/llvm-project?rev=50101&view=rev
Log:
Implement C++-like virtual tables.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h
vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp
vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Apr 22 10:25:01 2008
@@ -208,23 +208,18 @@
else {
classDef->aquire();
if (code == 0) {
- if (isStatic(access)) {
- llvmType = signature->staticType;
- } else {
- llvmType = signature->virtualType;
- }
- if (!methPtr) {
+ if (llvmFunction->hasNotBeenReadFromBitcode()) {
JavaJIT jit;
jit.compilingClass = classDef;
jit.compilingMethod = this;
if (isNative(access)) {
- methPtr = jit.nativeCompile();
+ llvmFunction = jit.nativeCompile();
} else {
- methPtr = jit.javaCompile();
+ llvmFunction = jit.javaCompile();
}
}
// We can compile it, since if we're here, it's for a good reason
- void* val = mvm::jit::executionEngine->getPointerToGlobal(methPtr);
+ void* val = mvm::jit::executionEngine->getPointerToGlobal(llvmFunction);
#ifndef MULTIPLE_GC
mvm::Code* temp = (mvm::Code*)(Collector::begOf(val));
#else
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Tue Apr 22 10:25:01 2008
@@ -104,7 +104,7 @@
JavaState status;
unsigned int access;
Jnjvm *isolate;
-
+ unsigned int virtualTableSize;
static const int MaxDisplay;
static JavaObject* jnjvmClassLoader;
@@ -240,7 +240,8 @@
class JavaMethod : public mvm::Object {
public:
static VirtualTable* VT;
- llvm::Function* methPtr;
+ llvm::Function* llvmFunction;
+ llvm::ConstantInt* offset;
unsigned int access;
Signdef* signature;
std::vector<Attribut*, gc_allocator<Attribut*> > attributs;
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Tue Apr 22 10:25:01 2008
@@ -410,8 +410,11 @@
// lookup the method
meth = cl->lookupMethodDontThrow(utf8, sign->keyName, isStatic(access), false);
if (meth) { // don't throw if no meth, the exception will be thrown just in time
- if (meth->methPtr) {
- ctpRes[index] = (void*)meth->methPtr;
+ if (meth->llvmFunction) {
+ if (meth->llvmFunction->hasNotBeenReadFromBitcode()) {
+ meth->classDef->isolate->functionDefs->hash(meth->llvmFunction, meth);
+ }
+ ctpRes[index] = (void*)meth->llvmFunction;
return (llvm::Function*)ctpRes[index];
}
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Tue Apr 22 10:25:01 2008
@@ -435,10 +435,12 @@
isolate->analyseClasspathEnv(isolate->bootClasspathEnv);
isolate->functions = vm_new(isolate, FunctionMap)();
+ isolate->functionDefs = vm_new(isolate, FunctionDefMap)();
isolate->module = new llvm::Module("Isolate JnJVM");
isolate->protectModule = mvm::Lock::allocNormal();
isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->module,
- isolate->functions);
+ isolate->functions,
+ isolate->functionDefs);
JavaJIT::initialiseJITIsolateVM(isolate);
isolate->bootstrapThread = vm_new(isolate, JavaThread)();
@@ -497,10 +499,12 @@
isolate->analyseClasspathEnv(isolate->bootClasspathEnv);
isolate->functions = vm_new(isolate, FunctionMap)();
+ isolate->functionDefs = vm_new(isolate, FunctionDefMap)();
isolate->protectModule = mvm::Lock::allocNormal();
isolate->module = new llvm::Module("Bootstrap JnJVM");
isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->module,
- isolate->functions);
+ isolate->functions,
+ isolate->functionDefs);
JavaJIT::initialiseJITBootstrapVM(isolate);
isolate->bootstrapThread = vm_new(isolate, JavaThread)();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Tue Apr 22 10:25:01 2008
@@ -120,13 +120,7 @@
- compilingClass->isolate->protectModule->lock();
- Function* func = llvmFunction =
- llvm::Function::Create(funcType, GlobalValue::ExternalLinkage,
- compilingMethod->printString(),
- compilingClass->isolate->module);
- compilingClass->isolate->protectModule->unlock();
-
+ Function* func = llvmFunction = compilingMethod->llvmFunction;
if (jnjvm) {
mvm::jit::executionEngine->addGlobalMapping(func, natPtr);
return llvmFunction;
@@ -207,6 +201,8 @@
PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "end native compile %s\n",
compilingMethod->printString());
+ func->setLinkage(GlobalValue::ExternalLinkage);
+
return llvmFunction;
}
@@ -374,13 +370,8 @@
const FunctionType *funcType = compilingMethod->llvmType;
returnType = funcType->getReturnType();
- compilingClass->isolate->protectModule->lock();
- Function* func = llvmFunction =
- llvm::Function::Create(funcType, GlobalValue::ExternalLinkage,
- compilingMethod->printString(),
- compilingClass->isolate->module);
- compilingClass->isolate->protectModule->unlock();
-
+ Function* func = llvmFunction = compilingMethod->llvmFunction;
+
BasicBlock* startBlock = currentBlock = createBasicBlock("start");
endExceptionBlock = createBasicBlock("endExceptionBlock");
unifiedUnreachable = createBasicBlock("unifiedUnreachable");
@@ -514,6 +505,7 @@
new UnreachableInst(unifiedUnreachable);
}
+ func->setLinkage(GlobalValue::ExternalLinkage);
mvm::jit::runPasses(llvmFunction, JavaThread::get()->perFunctionPasses);
/*
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Tue Apr 22 10:25:01 2008
@@ -171,10 +171,50 @@
va_end(ap);
}
+VirtualTable* allocateVT(Class* cl, std::vector<JavaMethod*>::iterator meths) {
+ if (meths == cl->virtualMethods.end()) {
+ uint64 size = cl->virtualTableSize;
+ VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*));
+ if (cl->super) {
+ memcpy(VT, cl->super->VT, cl->super->virtualTableSize * sizeof(void*));
+ } else {
+ memcpy(VT, JavaObject::VT, VT_SIZE);
+ }
+ return VT;
+ } else {
+ JavaMethod* meth = *meths;
+ JavaMethod* parent = cl->super?
+ cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : 0;
+
+ uint64_t offset = 0;
+ if (!parent) {
+ offset = cl->virtualTableSize++;
+ mvm::jit::protectConstants();
+ meth->offset = ConstantInt::get(Type::Int32Ty, offset);
+ mvm::jit::unprotectConstants();
+ } else {
+ offset = parent->offset->getZExtValue();
+ meth->offset = parent->offset;
+ }
+ VirtualTable* VT = allocateVT(cl, meths + 1);
+ Function* func = meth->llvmFunction;
+ ExecutionEngine* EE = mvm::jit::executionEngine;
+ ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func);
+ return VT;
+ }
+}
+
+
+
VirtualTable* JavaJIT::makeVT(Class* cl, bool stat) {
- VirtualTable * res = malloc(VT_SIZE);
- memcpy(res, JavaObject::VT, VT_SIZE);
+ VirtualTable* res = 0;
+ if (stat) {
+ res = (VirtualTable*)malloc(VT_SIZE);
+ memcpy(res, JavaObject::VT, VT_SIZE);
+ } else {
+ res = allocateVT(cl, cl->virtualMethods.begin());
+ }
#ifdef WITH_TRACER
const Type* type = stat ? cl->staticType : cl->virtualType;
@@ -239,10 +279,10 @@
if (!stat) {
cl->virtualTracer = func;
- cl->codeVirtualTracer = (mvm::Code*)((unsigned*)codePtr - 1);
+ cl->codeVirtualTracer = mvm::Code::getCodeFromPointer(codePtr);
} else {
cl->staticTracer = func;
- cl->codeStaticTracer = (mvm::Code*)((unsigned*)codePtr - 1);
+ cl->codeStaticTracer = mvm::Code::getCodeFromPointer(codePtr);
}
#endif
return res;
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Apr 22 10:25:01 2008
@@ -227,7 +227,7 @@
const llvm::FunctionType* type =
llvm::FunctionType::get(JavaObject::llvmType, args, false);
- Classpath::getCallingClassLoader->methPtr =
+ Classpath::getCallingClassLoader->llvmFunction =
llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
"_ZN5jnjvm7JavaJIT21getCallingClassLoaderEv",
vm->module);
@@ -244,7 +244,7 @@
const llvm::FunctionType* type =
llvm::FunctionType::get(JavaObject::llvmType, args, false);
- internString->methPtr =
+ internString->llvmFunction =
llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
"internString",
vm->module);
@@ -260,7 +260,7 @@
#endif
const llvm::FunctionType* type =
llvm::FunctionType::get(llvm::Type::Int8Ty, args, false);
- isArray->methPtr =
+ isArray->llvmFunction =
llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
"isArray",
vm->module);
@@ -287,7 +287,7 @@
const llvm::FunctionType* type =
llvm::FunctionType::get(JavaObject::llvmType, args, false);
- getCallingClass->methPtr =
+ getCallingClass->llvmFunction =
llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
"getCallingClass",
vm->module);
@@ -302,7 +302,7 @@
const llvm::FunctionType* type =
llvm::FunctionType::get(JavaObject::llvmType, args, false);
- getCallingClassLoader->methPtr =
+ getCallingClassLoader->llvmFunction =
llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
"getCallingClassLoader",
vm->module);
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Apr 22 10:25:01 2008
@@ -176,10 +176,12 @@
if (super == 0) {
cl->depth = 0;
cl->display.push_back(cl);
+ cl->virtualTableSize = VT_SIZE;
} else {
cl->super = loadName(super, classLoader, true, false, true);
int depth = cl->super->depth;
cl->depth = depth + 1;
+ cl->virtualTableSize = cl->super->virtualTableSize;
for (uint32 i = 0; i < cl->super->display.size(); ++i) {
cl->display.push_back(cl->super->display[i]);
}
@@ -760,7 +762,7 @@
JavaField* Jnjvm::constructField(Class* cl, const UTF8* name, const UTF8* type,
uint32 access){
- FieldCmp CC(name, cl, type);
+ FieldCmp CC(name, cl, type, 0);
JavaField* f = loadedFields->lookupOrCreate(CC, this, fieldDup);
f->access = access;
f->offset = 0;
@@ -769,7 +771,7 @@
JavaField* Jnjvm::lookupField(CommonClass* cl, const UTF8* name,
const UTF8* type) {
- FieldCmp CC(name, cl, type);
+ FieldCmp CC(name, cl, type, 0);
JavaField* f = loadedFields->lookup(CC);
return f;
}
@@ -780,16 +782,26 @@
method->type = cmp.type;
method->classDef = (Class*)cmp.classDef;
method->signature = (Signdef*)vm->constructType(method->type);
- method->methPtr = 0;
method->code = 0;
+ method->access = cmp.access;
+ if (isStatic(method->access)) {
+ method->llvmType =method->signature->staticType;
+ } else {
+ method->llvmType = method->signature->virtualType;
+ }
+ method->classDef->isolate->protectModule->lock();
+ method->llvmFunction =
+ llvm::Function::Create(method->llvmType, llvm::GlobalValue::GhostLinkage,
+ method->printString(),
+ method->classDef->isolate->module);
+ method->classDef->isolate->protectModule->unlock();
return method;
}
JavaMethod* Jnjvm::constructMethod(Class* cl, const UTF8* name,
const UTF8* type, uint32 access) {
- FieldCmp CC(name, cl, type);
+ FieldCmp CC(name, cl, type, access);
JavaMethod* f = loadedMethods->lookupOrCreate(CC, this, methodDup);
- f->access = access;
return f;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Tue Apr 22 10:25:01 2008
@@ -53,6 +53,7 @@
class TypeMap;
class FunctionMap;
class FunctionDefMap;
+class FunctionDefMap;
class AllocationMap;
@@ -263,6 +264,7 @@
llvm::Module* module;
JnjvmModuleProvider* TheModuleProvider;
FunctionMap* functions;
+ FunctionDefMap* functionDefs;
#ifndef MULTIPLE_GC
void* allocateObject(unsigned int sz, VirtualTable* VT) {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Tue Apr 22 10:25:01 2008
@@ -40,7 +40,7 @@
meth->compiledPtr();
- ctpInfo->ctpRes[index] = meth->methPtr;
+ ctpInfo->ctpRes[index] = meth->llvmFunction;
return meth;
}
@@ -48,21 +48,24 @@
bool JnjvmModuleProvider::materializeFunction(Function *F,
std::string *ErrInfo) {
- std::pair<Class*, uint32> * p = functions->lookup(F);
- if (!p) {
- // VT methods
+
+ if (mvm::jit::executionEngine->getPointerToGlobalIfAvailable(F))
+ return false;
+
+ if (!(F->hasNotBeenReadFromBitcode()))
return false;
- } else {
- if (mvm::jit::executionEngine->getPointerToGlobalIfAvailable(F)) {
- return false;
- } else {
- JavaMethod* meth = staticLookup(p->first, p->second);
- void* val = meth->compiledPtr();
- if (F->isDeclaration())
- mvm::jit::executionEngine->updateGlobalMapping(F, val);
- return false;
- }
+ JavaMethod* meth = functionDefs->lookup(F);
+
+ if (!meth) {
+ // It's a callback
+ std::pair<Class*, uint32> * p = functions->lookup(F);
+ meth = staticLookup(p->first, p->second);
}
+
+ void* val = meth->compiledPtr();
+ if (F->isDeclaration())
+ mvm::jit::executionEngine->updateGlobalMapping(F, val);
+ return false;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Tue Apr 22 10:25:01 2008
@@ -21,9 +21,11 @@
class JnjvmModuleProvider : public ModuleProvider {
public:
FunctionMap* functions;
- JnjvmModuleProvider(Module *m, FunctionMap* fm) {
+ FunctionDefMap* functionDefs;
+ JnjvmModuleProvider(Module *m, FunctionMap* fm, FunctionDefMap* fdm) {
TheModule = m;
functions = fm;
+ functionDefs= fdm;
}
bool materializeFunction(Function *F, std::string *ErrInfo = 0);
Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Tue Apr 22 10:25:01 2008
@@ -139,9 +139,10 @@
const UTF8* name;
CommonClass* classDef;
const UTF8* type;
+ uint32_t access;
- FieldCmp(const UTF8* n, CommonClass* c, const UTF8* t) : name(n), classDef(c),
- type(t) {}
+ FieldCmp(const UTF8* n, CommonClass* c, const UTF8* t, uint32 a) : name(n), classDef(c),
+ type(t), access(a) {}
inline bool operator<(const FieldCmp &cmp) const {
if (name < cmp.name) return true;
Modified: vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp Tue Apr 22 10:25:01 2008
@@ -71,10 +71,12 @@
#endif
service->functions = vm_new(service, FunctionMap)();
+ service->functionDefs = vm_new(service, FunctionDefMap)();
service->module = new llvm::Module("Service Domain");
service->protectModule = mvm::Lock::allocNormal();
service->TheModuleProvider = new JnjvmModuleProvider(service->module,
- service->functions);
+ service->functions,
+ service->functionDefs);
#ifdef MULTIPLE_GC
mvm::jit::memoryManager->addGCForModule(service->module, service->GC);
Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=50101&r1=50100&r2=50101&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Tue Apr 22 10:25:01 2008
@@ -244,6 +244,7 @@
TRACE_VECTOR(JavaObject*, gc_allocator, globalRefs);
//globalRefsLock->MARK_AND_TRACE;
functions->MARK_AND_TRACE;
+ functionDefs->MARK_AND_TRACE;
#ifdef MULTIPLE_VM
statics->MARK_AND_TRACE;
delegatees->MARK_AND_TRACE;
More information about the llvm-commits
mailing list