[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