[vmkit-commits] [vmkit] r60118 - in /vmkit/trunk: include/mvm/Allocator.h include/mvm/JIT.h include/mvm/Threads/Locks.h include/mvm/Threads/Thread.h lib/JnJVM/Classpath/ClasspathVMObject.cpp lib/JnJVM/VMCore/JavaObject.cpp lib/JnJVM/VMCore/JavaObject.h lib/JnJVM/VMCore/JavaRuntimeJIT.cpp lib/JnJVM/VMCore/JnjvmModule.h lib/Mvm/Runtime/JIT.cpp lib/N3/VMCore/VMClass.cpp tools/vmkit/Launcher.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Nov 26 13:46:39 PST 2008
Author: geoffray
Date: Wed Nov 26 15:46:39 2008
New Revision: 60118
URL: http://llvm.org/viewvc/llvm-project?rev=60118&view=rev
Log:
Reorganize thin lock implementation. Now the implementation is in
Mvm and virtual machines can specialize the thin lock to be inflated
in a virtual machine specific object.
Modified:
vmkit/trunk/include/mvm/Allocator.h
vmkit/trunk/include/mvm/JIT.h
vmkit/trunk/include/mvm/Threads/Locks.h
vmkit/trunk/include/mvm/Threads/Thread.h
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
vmkit/trunk/lib/Mvm/Runtime/JIT.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.cpp
vmkit/trunk/tools/vmkit/Launcher.cpp
Modified: vmkit/trunk/include/mvm/Allocator.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Allocator.h?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Allocator.h (original)
+++ vmkit/trunk/include/mvm/Allocator.h Wed Nov 26 15:46:39 2008
@@ -93,6 +93,13 @@
}
};
+/// JITInfo - This class can be derived from to hold private JIT-specific
+/// information. Objects of type are accessed/created with
+/// <Class>::getInfo and destroyed when the <Class> object is destroyed.
+struct JITInfo : public mvm::PermanentObject {
+ virtual ~JITInfo() {}
+};
+
} // end namespace mvm
#endif // MVM_ALLOCATOR_H
Modified: vmkit/trunk/include/mvm/JIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/JIT.h (original)
+++ vmkit/trunk/include/mvm/JIT.h Wed Nov 26 15:46:39 2008
@@ -24,21 +24,12 @@
#include "types.h"
-#include "mvm/Allocator.h"
-#include "mvm/MvmMemoryManager.h"
-#include "mvm/Threads/Locks.h"
-
namespace mvm {
+class LockNormal;
+class MvmMemoryManager;
class Thread;
-/// JITInfo - This class can be derived from to hold private JIT-specific
-/// information. Objects of type are accessed/created with
-/// <Class>::getInfo and destroyed when the <Class> object is destroyed.
-struct JITInfo : public mvm::PermanentObject {
- virtual ~JITInfo() {}
-};
-
const double MaxDouble = +INFINITY; //1.0 / 0.0;
const double MinDouble = -INFINITY;//-1.0 / 0.0;
const double MaxLongDouble = 9223372036854775807.0;
Modified: vmkit/trunk/include/mvm/Threads/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Locks.h?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/Locks.h (original)
+++ vmkit/trunk/include/mvm/Threads/Locks.h Wed Nov 26 15:46:39 2008
@@ -12,6 +12,9 @@
#include <pthread.h>
+#include "mvm/JIT.h"
+#include "mvm/Threads/Thread.h"
+
namespace mvm {
class Cond;
@@ -65,6 +68,165 @@
void lockAll(int count);
};
+#if (__WORDSIZE == 64)
+ static const uint64_t FatMask = 0x8000000000000000;
+#else
+ static const uint64_t FatMask = 0x80000000;
+#endif
+
+ static const uint64_t ThinMask = 0x7FFFFF00;
+ static const uint64_t ReservedMask = 0X7FFFFFFF;
+ static const uint64_t ThinCountMask = 0xFF;
+
+
+/// ThinLock - This class is an implementation of thin locks with reservation.
+/// The creator of the lock reserves this lock so that a lock only needs
+/// a comparison and not an expensive compare and swap. The template class
+/// TFatLock is a virtual machine specific fat lock.
+///
+template <class TFatLock>
+class ThinLock {
+ uintptr_t lock;
+
+public:
+ /// overflowThinlock - Change the lock of this object to a fat lock because
+ /// we have reached 0xFF locks.
+ void overflowThinLock() {
+ TFatLock* obj = TFatLock::allocate();
+ obj->acquireAll(256);
+ lock = ((uintptr_t)obj >> 1) | FatMask;
+ }
+
+ /// initialise - Initialise the value of the lock to the thread ID that is
+ /// creating this lock.
+ ///
+ void initialise() {
+ lock = (uintptr_t)mvm::Thread::get()->getThreadID();
+ }
+
+ /// ThinLock - Calls initialize.
+ ThinLock() {
+ initialise();
+ }
+
+
+ /// changeToFatlock - Change the lock of this object to a fat lock. The lock
+ /// may be in a thin lock or fat lock state.
+ TFatLock* changeToFatlock() {
+ if (!(lock & FatMask)) {
+ TFatLock* obj = TFatLock::allocate();
+ uintptr_t val = ((uintptr_t)obj >> 1) | FatMask;
+ uint32 count = lock & ThinCountMask;
+ obj->acquireAll(count);
+ lock = val;
+ return obj;
+ } else {
+ return (TFatLock*)(lock << 1);
+ }
+ }
+
+
+ /// acquire - Acquire the lock.
+ void acquire() {
+ uint64_t id = mvm::Thread::get()->getThreadID();
+ if ((lock & ReservedMask) == id) {
+ lock |= 1;
+ } else if ((lock & ThinMask) == id) {
+ if ((lock & ThinCountMask) == ThinCountMask) {
+ overflowThinLock();
+ } else {
+ ++lock;
+ }
+ } else {
+ uintptr_t currentLock = lock & ThinMask;
+ uintptr_t val =
+ (uintptr_t)__sync_val_compare_and_swap((uintptr_t)&lock, currentLock,
+ (id + 1));
+ if (val != currentLock) {
+ if (val & FatMask) {
+end:
+ //fat lock!
+ TFatLock* obj = (TFatLock*)(lock << 1);
+ obj->acquire();
+ } else {
+ TFatLock* obj = TFatLock::allocate();
+ val = ((uintptr_t)obj >> 1) | FatMask;
+ uint32 count = 0;
+loop:
+ if (lock & FatMask) goto end;
+
+ while ((lock & ThinCountMask) != 0) {
+ if (lock & FatMask) {
+#ifdef USE_GC_BOEHM
+ delete obj;
+#endif
+ goto end;
+ }
+ else {
+ mvm::Thread::yield(&count);
+ }
+ }
+
+ currentLock = lock & ThinMask;
+ uintptr_t test =
+ (uintptr_t)__sync_val_compare_and_swap((uintptr_t)&lock, currentLock,
+ val);
+ if (test != currentLock) goto loop;
+ obj->acquire();
+ }
+ }
+ }
+ }
+
+ /// release - Release the lock.
+ void release() {
+ uint64 id = mvm::Thread::get()->getThreadID();
+ if ((lock & ThinMask) == id) {
+ --lock;
+ } else {
+ TFatLock* obj = (TFatLock*)(lock << 1);
+ obj->release();
+ }
+ }
+
+ /// broadcast - Wakes up all threads waiting for this lock.
+ ///
+ void broadcast() {
+ if (lock & FatMask) {
+ TFatLock* obj = (TFatLock*)(lock << 1);
+ obj->broadcast();
+ }
+ }
+
+ /// signal - Wakes up one thread waiting for this lock.
+ void signal() {
+ if (lock & FatMask) {
+ TFatLock* obj = (TFatLock*)(lock << 1);
+ obj->signal();
+ }
+ }
+
+ /// owner - Returns true if the curren thread is the owner of this object's
+ /// lock.
+ bool owner() {
+ uint64 id = mvm::Thread::get()->getThreadID();
+ if ((lock & ThinMask) == id) return true;
+ if (lock & FatMask) {
+ TFatLock* obj = (TFatLock*)(lock << 1);
+ return obj->owner();
+ }
+ return false;
+ }
+
+ /// getFatLock - Get the fat lock is the lock is a fat lock, 0 otherwise.
+ TFatLock* getFatLock() {
+ if (lock & FatMask) {
+ return (TFatLock*)(lock << 1);
+ } else {
+ return 0;
+ }
+ }
+};
} // end namespace mvm
Modified: vmkit/trunk/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Wed Nov 26 15:46:39 2008
@@ -13,8 +13,6 @@
#include "types.h"
#include "MvmGC.h"
-#include "mvm/JIT.h"
-#include "mvm/Object.h"
class Collector;
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp Wed Nov 26 15:46:39 2008
@@ -43,7 +43,7 @@
JavaObject* res = (JavaObject*)
vm->gcAllocator.allocateManagedObject(size, src->getVirtualTable());
memcpy(res, src, size);
- res->lock = JavaThread::get()->getThreadID();
+ res->lock.initialise();
return (jobject)res;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Wed Nov 26 15:46:39 2008
@@ -74,94 +74,6 @@
return res;
}
-bool JavaObject::owner() {
- uint64 id = mvm::Thread::get()->getThreadID();
- if ((lock & ThinMask) == id) return true;
- if (lock & FatMask) {
- LockObj* obj = (LockObj*)(lock << 1);
- return obj->owner();
- }
- return false;
-}
-
-void JavaObject::overflowThinlock() {
- LockObj* obj = LockObj::allocate();
- obj->lock.lockAll(256);
- lock = ((uintptr_t)obj >> 1) | FatMask;
-}
-
-void JavaObject::release() {
- uint64 id = mvm::Thread::get()->getThreadID();
- if ((lock & ThinMask) == id) {
- --lock;
- } else {
- LockObj* obj = (LockObj*)(lock << 1);
- obj->release();
- }
-}
-
-void JavaObject::acquire() {
- uint64_t id = mvm::Thread::get()->getThreadID();
- if ((lock & ReservedMask) == id) {
- lock |= 1;
- } else if ((lock & ThinMask) == id) {
- if ((lock & ThinCountMask) == ThinCountMask) {
- overflowThinlock();
- } else {
- ++lock;
- }
- } else {
- uintptr_t currentLock = lock & ThinMask;
- uintptr_t val =
- (uintptr_t)__sync_val_compare_and_swap((uintptr_t)&lock, currentLock,
- (id + 1));
- if (val != currentLock) {
- if (val & FatMask) {
-end:
- //fat lock!
- LockObj* obj = (LockObj*)(lock << 1);
- obj->acquire();
- } else {
- LockObj* obj = LockObj::allocate();
- val = ((uintptr_t)obj >> 1) | FatMask;
- uint32 count = 0;
-loop:
- while ((lock & ThinCountMask) != 0) {
- if (lock & FatMask) {
-#ifdef USE_GC_BOEHM
- delete obj;
-#endif
- goto end;
- }
- else {
- mvm::Thread::yield(&count);
- }
- }
-
- currentLock = lock & ThinMask;
- uintptr_t test =
- (uintptr_t)__sync_val_compare_and_swap((uintptr_t)&lock, currentLock,
- val);
- if (test != currentLock) goto loop;
- obj->acquire();
- }
- }
- }
-}
-
-LockObj* JavaObject::changeToFatlock() {
- if (!(lock & FatMask)) {
- LockObj* obj = LockObj::allocate();
- uintptr_t val = ((uintptr_t)obj >> 1) | FatMask;
- uint32 count = lock & ThinCountMask;
- obj->lock.lockAll(count);
- lock = val;
- return obj;
- } else {
- return (LockObj*)(lock << 1);
- }
-}
-
void JavaObject::print(mvm::PrintBuffer* buf) const {
buf->write("JavaObject<");
CommonClass::printClassName(classOf->getName(), buf);
@@ -171,7 +83,7 @@
void JavaObject::waitIntern(struct timeval* info, bool timed) {
if (owner()) {
- LockObj * l = changeToFatlock();
+ LockObj * l = lock.changeToFatlock();
JavaThread* thread = JavaThread::get();
mvm::Lock& mutexThread = thread->lock;
mvm::Cond& varcondThread = thread->varcond;
@@ -225,8 +137,8 @@
void JavaObject::notify() {
if (owner()) {
- LockObj * l = changeToFatlock();
- l->getCond()->notify();
+ LockObj * l = lock.getFatLock();
+ if (l) l->getCond()->notify();
} else {
JavaThread::get()->getJVM()->illegalMonitorStateException(this);
}
@@ -234,8 +146,8 @@
void JavaObject::notifyAll() {
if (owner()) {
- LockObj * l = changeToFatlock();
- l->getCond()->notifyAll();
+ LockObj * l = lock.getFatLock();
+ if (l) l->getCond()->notifyAll();
} else {
JavaThread::get()->getJVM()->illegalMonitorStateException(this);
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Wed Nov 26 15:46:39 2008
@@ -60,9 +60,7 @@
/// LockObj - This class represents a Java monitor.
///
class LockObj : public mvm::Object {
-
friend class JavaObject;
-
private:
@@ -74,20 +72,21 @@
///
JavaCond varcond;
+public:
/// allocate - Allocates a lock object. Only the internal lock is allocated.
///
static LockObj* allocate();
- /// myLock - Returns the lock object of this object, allocating it if
- /// non-existant. This uses the big lock to make the object lock unique.
- ///
- static LockObj* myLock(JavaObject* obj);
-
/// acquire - Acquires the lock.
///
void acquire() {
lock.lock();
}
+
+ /// acquireAll - Acquires the lock nb times.
+ void acquireAll(uint32 nb) {
+ lock.lockAll(nb);
+ }
/// release - Releases the lock.
///
@@ -108,8 +107,6 @@
return &varcond;
}
-public:
-
static VirtualTable* VT;
~LockObj() {}
@@ -136,7 +133,7 @@
/// lock - The monitor of this object. Most of the time null.
///
- uintptr_t lock;
+ mvm::ThinLock<LockObj> lock;
/// wait - Java wait. Makes the current thread waiting on a monitor.
///
@@ -156,12 +153,17 @@
/// the monitor.
///
void notifyAll();
-
+
+ /// overflowThinLokc - Notify that the thin lock has overflowed.
+ ///
+ void overflowThinLock() {
+ lock.overflowThinLock();
+ }
+
/// initialise - Initialises the object.
///
void initialise(UserCommonClass* cl) {
this->classOf = cl;
- this->lock = (uintptr_t)mvm::Thread::get();
}
/// instanceOf - Is this object's class of type the given class?
@@ -172,22 +174,20 @@
}
/// acquire - Acquire the lock on this object.
- void acquire();
+ void acquire() {
+ lock.acquire();
+ }
/// release - Release the lock on this object
- void release();
-
- /// changeToFatlock - Change the lock of this object to a fat lock. The lock
- /// may be in thin lock or in fat lock.
- LockObj* changeToFatlock();
+ void release() {
+ lock.release();
+ }
- /// overflowThinlock -Change the lock of this object to a fat lock because
- /// we have reached 0xFF locks.
- void overflowThinlock();
-
- /// owner - Returns true if the curren thread is the owner of this object's
+ /// owner - Returns true if the current thread is the owner of this object's
/// lock.
- bool owner();
+ bool owner() {
+ return lock.owner();
+ }
#ifdef SIGSEGV_THROW_NULL
#define verifyNull(obj) {}
@@ -200,22 +200,9 @@
virtual void TRACER;
-#if (__WORDSIZE == 64)
- static const uint64_t FatMask = 0x8000000000000000;
-#else
- static const uint64_t FatMask = 0x80000000;
-#endif
-
- static const uint64_t ThinMask = 0x7FFFFF00;
- static const uint64_t ReservedMask = 0X7FFFFFFF;
- static const uint64_t ThinCountMask = 0xFF;
-
+ /// lockObj - Get the LockObj if the lock is a fat lock.
LockObj* lockObj() {
- if (lock & FatMask) {
- return (LockObj*)(lock << 1);
- } else {
- return 0;
- }
+ return lock.getFatLock();
}
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Nov 26 15:46:39 2008
@@ -363,7 +363,6 @@
obj->acquire();
}
-
extern "C" void JavaObjectRelease(JavaObject* obj) {
obj->release();
}
@@ -406,7 +405,7 @@
}
extern "C" void overflowThinLock(JavaObject* obj) {
- obj->overflowThinlock();
+ obj->overflowThinLock();
}
#ifdef SERVICE
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Nov 26 15:46:39 2008
@@ -97,7 +97,7 @@
LLVMMethodInfo(JavaMethod* M);
- static JavaMethod* get(const Function* F);
+ static JavaMethod* get(const llvm::Function* F);
};
class LLVMFieldInfo : public mvm::JITInfo {
Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Nov 26 15:46:39 2008
@@ -25,6 +25,7 @@
#include "mvm/JIT.h"
#include "mvm/MvmMemoryManager.h"
#include "mvm/Object.h"
+#include "mvm/Threads/Locks.h"
#include "mvm/Threads/Thread.h"
using namespace mvm;
@@ -140,8 +141,8 @@
constantDoubleMinusZero = ConstantFP::get(Type::DoubleTy, -0.0);
constantFloatMinusZero = ConstantFP::get(Type::FloatTy, -0.0f);
constantThreadIDMask = ConstantInt::get(pointerSizeType, mvm::Thread::IDMask);
- constantLockedMask = ConstantInt::get(pointerSizeType, 0x7FFFFF00);
- constantThreadFreeMask = ConstantInt::get(pointerSizeType, 0x7FFFFFFF);
+ constantLockedMask = ConstantInt::get(pointerSizeType, ThinMask);
+ constantThreadFreeMask = ConstantInt::get(pointerSizeType, ReservedMask);
constantPtrOne = ConstantInt::get(pointerSizeType, 1);
constantPtrNull = Constant::getNullValue(ptrType);
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Wed Nov 26 15:46:39 2008
@@ -303,7 +303,7 @@
}
void VMClass::unifyTypes(VMGenericClass* genClass, VMGenericMethod* genMethod) {
- PATypeHolder PA = naturalType;
+ llvm::PATypeHolder PA = naturalType;
for (std::vector<VMField*>::iterator i = virtualFields.begin(),
e = virtualFields.end(); i!= e; ++i) {
(*i)->signature->resolveVirtual(genClass, genMethod);
@@ -323,7 +323,7 @@
virtualFields[0]->offset = mvm::MvmModule::constantZero;
ResultTy = virtualFields[0]->signature->naturalType;
} else if (size == 0) {
- ResultTy = Type::VoidTy;
+ ResultTy = llvm::Type::VoidTy;
} else {
std::vector<const llvm::Type*> Elts;
uint32 offset = -1;
@@ -336,7 +336,7 @@
ResultTy = llvm::StructType::get(Elts);
}
} else if (super == MSCorlib::pEnum) {
- ResultTy = Type::Int32Ty; // TODO find max
+ ResultTy = llvm::Type::Int32Ty; // TODO find max
} else {
std::vector<const llvm::Type*> Elts;
Elts.push_back(super->naturalType->getContainedType(0));
@@ -355,9 +355,10 @@
if (naturalType->isAbstract()) {
- const OpaqueType *OldTy = dyn_cast_or_null<OpaqueType>(this->naturalType);
+ const llvm::OpaqueType *OldTy =
+ llvm::dyn_cast_or_null<llvm::OpaqueType>(this->naturalType);
if (OldTy) {
- const_cast<OpaqueType*>(OldTy)->refineAbstractTypeTo(ResultTy);
+ const_cast<llvm::OpaqueType*>(OldTy)->refineAbstractTypeTo(ResultTy);
}
naturalType = ResultTy;
}
Modified: vmkit/trunk/tools/vmkit/Launcher.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=60118&r1=60117&r2=60118&view=diff
==============================================================================
--- vmkit/trunk/tools/vmkit/Launcher.cpp (original)
+++ vmkit/trunk/tools/vmkit/Launcher.cpp Wed Nov 26 15:46:39 2008
@@ -24,6 +24,8 @@
#include "CommandLine.h"
+using namespace llvm;
+
enum VMType {
Interactive, RunJava, RunNet
};
More information about the vmkit-commits
mailing list