[vmkit-commits] [vmkit] r198111 - execute on my custom stacks

Gael Thomas gael.thomas at lip6.fr
Sat Dec 28 02:41:15 PST 2013


Author: gthomas
Date: Sat Dec 28 04:41:15 2013
New Revision: 198111

URL: http://llvm.org/viewvc/llvm-project?rev=198111&view=rev
Log:
execute on my custom stacks

Modified:
    vmkit/branches/mcjit/include/vmkit/thread.h
    vmkit/branches/mcjit/lib/vmkit/allocator.cc
    vmkit/branches/mcjit/lib/vmkit/thread.cc
    vmkit/branches/mcjit/lib/vmkit/vmkit.cc

Modified: vmkit/branches/mcjit/include/vmkit/thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/thread.h (original)
+++ vmkit/branches/mcjit/include/vmkit/thread.h Sat Dec 28 04:41:15 2013
@@ -26,10 +26,7 @@ namespace vmkit {
 
 		VMKit* vm() { return _vm; }
 
-		static __thread Thread* _thread;
-
-		static Thread* get()          { return _thread; }
-		static void set(Thread* thread) { _thread = thread; }
+		static Thread* get();
 
 		void start();
 		void join();

Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Sat Dec 28 04:41:15 2013
@@ -46,7 +46,6 @@ void* BumpAllocator::allocate(size_t siz
 		pthread_mutex_lock(&mutex);
 		size_t total = round((uintptr_t)size + sizeof(BumpAllocatorNode), 4096);
 		BumpAllocatorNode* newBucket = (BumpAllocatorNode*)map(total);
-		//memset(newBucket, 0, total);
 		newBucket->next = current->next;
 		current->next = newBucket;
 		newBucket->top  = (uint8_t*)((uintptr_t)newBucket + bucketSize);
@@ -59,11 +58,8 @@ void* BumpAllocator::allocate(size_t siz
 		uint8_t* res = __sync_fetch_and_add(&node->top, (uint8_t*)round(size, 8));
 		uint8_t* end = res + size;
 
-		if(res >= (uint8_t*)node && (res + size) < ((uint8_t*)node) + bucketSize) {
-			//printf("%p -> %lu %lu (%p -> %p)\n", res, size, round((uintptr_t)size, 64), node, ((uint8_t*)node) + bucketSize);
-			//memset(res, 0, size);
+		if(res >= (uint8_t*)node && (res + size) < ((uint8_t*)node) + bucketSize)
 			return res;
-		}
 
 		pthread_mutex_lock(&mutex);
 		BumpAllocatorNode* newBucket = (BumpAllocatorNode*)map(bucketSize);
@@ -78,7 +74,6 @@ void* BumpAllocator::map(size_t n) {
 	void* res = mmap(0, n, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0);
 	if(res == MAP_FAILED)
 		Thread::get()->vm()->internalError(L"unable to map %ld bytes", n);
-	//memset(res, 0, n);
 	return res;
 }
 
@@ -129,7 +124,7 @@ void* ThreadAllocator::allocate() {
 
 		spaces.push_back(space);
 
-		uintptr_t base = (((uintptr_t)space - 1) & -PAGE_SIZE) + PAGE_SIZE;
+		uintptr_t base = (((uintptr_t)space - 1) & -topStack) + topStack;
 		uint32_t n = (base == (uintptr_t)space) ? refill : (refill - 1);
 
 		for(uint32_t i=0; i<n; i++) {
@@ -156,5 +151,5 @@ void* ThreadAllocator::stackAddr(void* t
 }
 
 size_t ThreadAllocator::stackSize(void* thread) {
-	return topStack;
+	return topStack - baseStack;
 }

Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/thread.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sat Dec 28 04:41:15 2013
@@ -4,8 +4,6 @@
 
 using namespace vmkit;
 
-__thread Thread* Thread::_thread = 0;
-
 Thread::Thread(VMKit* vm) { 
 	_vm = vm; 
 }
@@ -18,15 +16,25 @@ void Thread::operator delete(void* p) {
 	ThreadAllocator::allocator()->release(p);
 }
 
+Thread* Thread::get() {
+	return (Thread*)((uintptr_t)__builtin_frame_address(0) & ThreadAllocator::allocator()->magic());
+}
+
 void* Thread::doRun(void* _thread) {
 	Thread* thread = (Thread*)_thread;
-	set(thread);
 	thread->run();
 	return 0;
 }
 
 void Thread::start() {
-	pthread_create(&_tid, 0, doRun, this);
+	pthread_attr_t attr;
+
+	pthread_attr_init(&attr);
+	pthread_attr_setstack(&attr, ThreadAllocator::allocator()->stackAddr(this), ThreadAllocator::allocator()->stackSize(this));
+
+	pthread_create(&_tid, &attr, doRun, this);
+
+	pthread_attr_destroy(&attr);
 }
 
 void Thread::join() {

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sat Dec 28 04:41:15 2013
@@ -100,8 +100,6 @@ void VMKit::addSymbol(llvm::GlobalValue*
 }
 
 void VMKit::vmkitBootstrap(Thread* initialThread, const char* selfBitCodePath) {
-	Thread::set(initialThread);
-
 	std::string err;
 	llvm::OwningPtr<llvm::MemoryBuffer> buf;
 	if (llvm::MemoryBuffer::getFile(selfBitCodePath, buf))





More information about the vmkit-commits mailing list