[vmkit-commits] [vmkit] r197830 - begin the implementation of stack walker

Gael Thomas gael.thomas at lip6.fr
Fri Dec 20 12:07:28 PST 2013


Author: gthomas
Date: Fri Dec 20 14:07:27 2013
New Revision: 197830

URL: http://llvm.org/viewvc/llvm-project?rev=197830&view=rev
Log:
begin the implementation of stack walker

Modified:
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3method.h
    vmkit/branches/mcjit/include/j3/j3thread.h
    vmkit/branches/mcjit/include/vmkit/compiler.h
    vmkit/branches/mcjit/include/vmkit/safepoint.h
    vmkit/branches/mcjit/include/vmkit/thread.h
    vmkit/branches/mcjit/include/vmkit/vmkit.h
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3thread.cc
    vmkit/branches/mcjit/lib/vmkit/compiler.cc
    vmkit/branches/mcjit/lib/vmkit/safpoint.cc
    vmkit/branches/mcjit/lib/vmkit/thread.cc
    vmkit/branches/mcjit/lib/vmkit/vmkit.cc

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Fri Dec 20 14:07:27 2013
@@ -52,7 +52,7 @@ namespace j3 {
 	public:
 		J3Type(J3ClassLoader* loader, const vmkit::Name* name);
 
-		uint8_t*                    getSymbolAddress();
+		void*                       getSymbolAddress();
 
 		virtual llvm::GlobalValue*  llvmDescriptor(llvm::Module* module) { return 0; }
 

Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Fri Dec 20 14:07:27 2013
@@ -52,7 +52,7 @@ namespace j3 {
 
 		J3MethodCode(J3Method* _self) { self = _self; }
 
-		uint8_t* getSymbolAddress();
+		void* getSymbolAddress();
 	};
 
 	class J3Method : public vmkit::Symbol {
@@ -66,7 +66,7 @@ namespace j3 {
 		J3Attributes*                _attributes;
 		uint32_t                     _index;
 		llvm::Function*              _llvmFunction;
-		uint8_t*                     _fnPtr;
+		void*                        _fnPtr;
 		char* volatile               _llvmAllNames; /* stub + _ + native_name */
 		void*                        _nativeFnPtr;
 
@@ -83,7 +83,7 @@ namespace j3 {
 	public:
 		J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign);
 
-		uint8_t*            getSymbolAddress();
+		void*               getSymbolAddress();
 
 		static J3Method*    newMethod(vmkit::BumpAllocator* allocator, 
 																	uint16_t access, 
@@ -128,8 +128,8 @@ namespace j3 {
 		J3Value             invokeVirtual(J3ObjectHandle* obj, J3Value* args);
 		J3Value             invokeVirtual(J3ObjectHandle* obj, va_list va);
 
-		uint8_t*            fnPtr();
-		uint8_t*            functionPointerOrTrampoline();
+		void*               fnPtr();
+		void*               functionPointerOrTrampoline();
 
 		void                dump();
 	};

Modified: vmkit/branches/mcjit/include/j3/j3thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3thread.h (original)
+++ vmkit/branches/mcjit/include/j3/j3thread.h Fri Dec 20 14:07:27 2013
@@ -6,6 +6,10 @@
 #include "j3/j3object.h"
 #include "j3/j3jni.h"
 
+namespace vmkit {
+	class Safepoint;
+}
+
 namespace j3 {
 	class J3;
 
@@ -17,17 +21,19 @@ namespace j3 {
 
 		J3Thread(J3* vm, vmkit::BumpAllocator* allocator);
 	public:
-		static J3Thread* create(J3* j3);
+		static J3Thread*  create(J3* j3);
+
+		vmkit::Safepoint* getJavaCaller(uint32_t level=0);
 
-		void             ensureCapacity(uint32_t capacity);
-		J3ObjectHandle*  pendingException() { return _pendingException; }
-		void             setPendingException(J3ObjectHandle* handle) { _pendingException = handle; }
-		J3FixedPoint*    fixedPoint() { return &_fixedPoint; }
-
-		J3ObjectHandle* push(J3ObjectHandle* handle);
-		J3ObjectHandle* push(J3Object* obj);
-		J3ObjectHandle* tell();
-		void            restore(J3ObjectHandle* obj);
+		void              ensureCapacity(uint32_t capacity);
+		J3ObjectHandle*   pendingException() { return _pendingException; }
+		void              setPendingException(J3ObjectHandle* handle) { _pendingException = handle; }
+		J3FixedPoint*     fixedPoint() { return &_fixedPoint; }
+
+		J3ObjectHandle*   push(J3ObjectHandle* handle);
+		J3ObjectHandle*   push(J3Object* obj);
+		J3ObjectHandle*   tell();
+		void              restore(J3ObjectHandle* obj);
 
 		J3* vm() { return (J3*)Thread::vm(); }
 

Modified: vmkit/branches/mcjit/include/vmkit/compiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/compiler.h (original)
+++ vmkit/branches/mcjit/include/vmkit/compiler.h Fri Dec 20 14:07:27 2013
@@ -22,15 +22,15 @@ namespace vmkit {
 
 	class Symbol : public PermanentObject {
 	public:
-		virtual uint8_t* getSymbolAddress();
+		virtual void* getSymbolAddress();
 	};
 
 	class NativeSymbol : public Symbol {
-		uint8_t* addr;
+		void* addr;
 	public:
-		NativeSymbol(uint8_t* _addr) { addr = _addr; }
+		NativeSymbol(void* _addr) { addr = _addr; }
 
-		uint8_t* getSymbolAddress() { return addr; }
+		void* getSymbolAddress() { return addr; }
 	};
 
 	class CompilationUnit  : public llvm::SectionMemoryManager {
@@ -58,6 +58,7 @@ namespace vmkit {
 		VMKit*                  vm() const { return _vmkit; }
 
 		void                    addSymbol(const char* id, vmkit::Symbol* symbol);
+		Symbol*                 getSymbol(const std::string &Name);
 		uint64_t                getSymbolAddress(const std::string &Name);
 
 		BumpAllocator*          allocator() { return _allocator; }

Modified: vmkit/branches/mcjit/include/vmkit/safepoint.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/safepoint.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/safepoint.h (original)
+++ vmkit/branches/mcjit/include/vmkit/safepoint.h Fri Dec 20 14:07:27 2013
@@ -11,7 +11,7 @@ namespace vmkit {
 	class CompilationUnit;
 
 	class Safepoint { /* directly in the data sections */
-		uintptr_t        _addr;
+		void*            _addr;
 		const char*      _functionName;
 		CompilationUnit* _unit;
 		uint32_t         _sourceIndex;
@@ -20,7 +20,7 @@ namespace vmkit {
 	public:
 		void        setUnit(CompilationUnit* unit) { _unit = unit; }
 
-		uintptr_t   addr() { return _addr; }
+		void*       addr() { return _addr; }
 		const char* functionName() { return _functionName; }
 		uint32_t    sourceIndex() { return _sourceIndex; }
 		uint32_t    nbLives() { return _nbLives; }

Modified: vmkit/branches/mcjit/include/vmkit/thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/thread.h (original)
+++ vmkit/branches/mcjit/include/vmkit/thread.h Fri Dec 20 14:07:27 2013
@@ -26,13 +26,13 @@ namespace vmkit {
 	};
 
 	class StackWalker {
-		uintptr_t framePointer;
+		void** framePointer;
 
 	public:
-		StackWalker(uint32_t initialPop=1);
+		StackWalker(uint32_t initialPop=0) __attribute__((noinline));
 
-		void      next(uint32_t nbPop=1);
-		uintptr_t ip();
+		bool  next(uint32_t nbPop=1);
+		void* ip();
 	};
 }
 

Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Fri Dec 20 14:07:27 2013
@@ -29,7 +29,7 @@ namespace vmkit {
 		typedef std::map<const char*, llvm::GlobalValue*, Util::char_less_t, 
 										 StdAllocator<std::pair<const char*, llvm::GlobalValue*> > > MangleMap;
 
-		std::map<uintptr_t, Safepoint*>            safepointMap;    
+		std::map<void*, Safepoint*>                safepointMap;    
 		pthread_mutex_t                            safepointMapLock;
 		std::map<uintptr_t, ExceptionDescriptor*>  exceptionTable;   /* managed with malloc/free */
 		MangleMap                       mangleMap;
@@ -50,7 +50,7 @@ namespace vmkit {
 		VMKit(BumpAllocator* allocator);
 
 		void                       addSafepoint(Safepoint* sf);
-		Safepoint*                 getSafepoint(uintptr_t addr);
+		Safepoint*                 getSafepoint(void* addr);
 
 		BumpAllocator*             allocator() { return _allocator; }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Fri Dec 20 14:07:27 2013
@@ -30,8 +30,8 @@ J3Type::J3Type(J3ClassLoader* loader, co
 	_name = name; 
 }
 
-uint8_t* J3Type::getSymbolAddress() {
-	return (uint8_t*)this;
+void* J3Type::getSymbolAddress() {
+	return this;
 }
 
 J3VirtualTable* J3Type::vt() { 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Fri Dec 20 14:07:27 2013
@@ -18,9 +18,13 @@ jint JNICALL GetVersion(JNIEnv* env) { e
 
 jclass JNICALL DefineClass(JNIEnv* env, const char* name, jobject loader, const jbyte* buf, jsize len) { enterJVM(); leaveJVM(); NYI(); }
 jclass JNICALL FindClass(JNIEnv* env, const char* name) { 
+	vmkit::Safepoint* sf = J3Thread::get()->getJavaCaller();
+
+	printf("---> %p\n", sf);
 	//jclass res;
 	enterJVM();
 	//J3Class* cl = 
+	fprintf(stderr, "find class: %s\n", name);
 	leaveJVM(); 
 	NYI(); 
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Dec 20 14:07:27 2013
@@ -44,7 +44,7 @@ uint32_t J3Method::index()  {
 	return _index; 
 }
 
-uint8_t* J3Method::fnPtr() {
+void* J3Method::fnPtr() {
 	if(!_fnPtr) {
 		//fprintf(stderr, "materializing: %ls::%ls%ls\n", cl()->name()->cStr(), name()->cStr(), sign()->cStr());
 		if(!isResolved()) {
@@ -63,22 +63,22 @@ uint8_t* J3Method::fnPtr() {
 
 		cl()->loader()->compileModule(module);
 
-		_fnPtr = (uint8_t*)cl()->loader()->ee()->getFunctionAddress(_llvmFunction->getName().data());
+		_fnPtr = (void*)cl()->loader()->ee()->getFunctionAddress(_llvmFunction->getName().data());
  	}
 
 	return _fnPtr;
 }
 
-uint8_t* J3Method::functionPointerOrTrampoline() {
+void* J3Method::functionPointerOrTrampoline() {
 	return _fnPtr ? _fnPtr : _trampoline;
 }
 
-uint8_t* J3MethodCode::getSymbolAddress() {
+void* J3MethodCode::getSymbolAddress() {
 	return self->functionPointerOrTrampoline();
 }
 
-uint8_t* J3Method::getSymbolAddress() {
-	return (uint8_t*)this;
+void* J3Method::getSymbolAddress() {
+	return this;
 }
 
 void J3Method::setResolved(uint32_t index) { 
@@ -437,7 +437,7 @@ llvm::Function* J3Method::nativeLLVMFunc
 																							 buf,
 																							 module);
 
-	cl()->loader()->addSymbol(buf, new(cl()->loader()->allocator()) vmkit::NativeSymbol((uint8_t*)fnPtr));
+	cl()->loader()->addSymbol(buf, new(cl()->loader()->allocator()) vmkit::NativeSymbol(fnPtr));
 
 	return res;
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3thread.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Fri Dec 20 14:07:27 2013
@@ -14,6 +14,22 @@ J3Thread* J3Thread::create(J3* j3) {
 	return new(allocator) J3Thread(j3, allocator);
 }
 
+vmkit::Safepoint* J3Thread::getJavaCaller(uint32_t level) {
+	vmkit::Safepoint* sf = 0;
+	vmkit::StackWalker walker;
+
+	while(walker.next()) {
+		vmkit::Safepoint* sf = vm()->getSafepoint(walker.ip());
+
+		if(sf && !level--) {
+			//((J3ClassLoader*)sf->unit())->
+			return sf;
+		}
+	}
+
+	return 0;
+}
+
 void J3Thread::ensureCapacity(uint32_t capacity) {
 	_fixedPoint.unsyncEnsureCapacity(capacity);
 }

Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Fri Dec 20 14:07:27 2013
@@ -14,7 +14,7 @@
 
 using namespace vmkit;
 
-uint8_t* Symbol::getSymbolAddress() {
+void* Symbol::getSymbolAddress() {
 	Thread::get()->vm()->internalError(L"implement me: getSymbolAddress");
 }
 
@@ -107,7 +107,7 @@ void CompilationUnit::addSymbol(const ch
 	pthread_mutex_unlock(&_mutexSymbolTable);
 }
 
-uint64_t CompilationUnit::getSymbolAddress(const std::string &Name) {
+Symbol* CompilationUnit::getSymbol(const std::string &Name) {
 	pthread_mutex_lock(&_mutexSymbolTable);
 	const char* id = Name.c_str() + 1;
 
@@ -127,7 +127,11 @@ uint64_t CompilationUnit::getSymbolAddre
 		res = it->second;
 
 	pthread_mutex_unlock(&_mutexSymbolTable);
-	return (uint64_t)(uintptr_t)res->getSymbolAddress();
+	return res;
+}
+
+uint64_t CompilationUnit::getSymbolAddress(const std::string &Name) {
+	return (uint64_t)(uintptr_t)getSymbol(Name)->getSymbolAddress();
 }
 
 void CompilationUnit::compileModule(llvm::Module* module) {

Modified: vmkit/branches/mcjit/lib/vmkit/safpoint.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safpoint.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/safpoint.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/safpoint.cc Fri Dec 20 14:07:27 2013
@@ -192,7 +192,7 @@ Safepoint* Safepoint::get(CompilationUni
 }
 
 void Safepoint::dump() {
-	fprintf(stderr, "  [%p] safepoint at 0x%lx for %s::%d\n", this, addr(), functionName(), sourceIndex());
+	fprintf(stderr, "  [%p] safepoint at %p for %s::%d\n", this, addr(), functionName(), sourceIndex());
 	for(uint32_t i=0; i<nbLives(); i++)
 		fprintf(stderr, "    live at %d\n", liveAt(i));
 }

Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/thread.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/thread.cc Fri Dec 20 14:07:27 2013
@@ -13,3 +13,21 @@ void Thread::destroy(Thread* thread) {
 	BumpAllocator::destroy(thread->allocator());
 }
 
+StackWalker::StackWalker(uint32_t initialPop) {
+	framePointer = (void**)__builtin_frame_address(1);
+	next(initialPop);
+}
+
+bool StackWalker::next(uint32_t nbPop) {
+	while(nbPop--) {
+		void* next = framePointer[0];
+		if(!next)
+			return 0;
+		framePointer = (void**)next;
+	}
+	return 1;
+}
+	
+void* StackWalker::ip() {
+	return framePointer[1];
+}

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=197830&r1=197829&r2=197830&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Fri Dec 20 14:07:27 2013
@@ -53,7 +53,7 @@ void VMKit::addSafepoint(Safepoint* sf)
 	pthread_mutex_unlock(&safepointMapLock);
 }
 
-Safepoint* VMKit::getSafepoint(uintptr_t addr) {
+Safepoint* VMKit::getSafepoint(void* addr) {
 	pthread_mutex_lock(&safepointMapLock);
 	Safepoint* res = safepointMap[addr];
 	pthread_mutex_unlock(&safepointMapLock);





More information about the vmkit-commits mailing list