[vmkit-commits] [vmkit] r197835 - pretty stack traces

Gael Thomas gael.thomas at lip6.fr
Fri Dec 20 13:07:51 PST 2013


Author: gthomas
Date: Fri Dec 20 15:07:51 2013
New Revision: 197835

URL: http://llvm.org/viewvc/llvm-project?rev=197835&view=rev
Log:
pretty stack traces

Modified:
    vmkit/branches/mcjit/include/j3/j3.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/vmkit.h
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.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/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Fri Dec 20 15:07:51 2013
@@ -94,6 +94,8 @@ namespace j3 {
 
 		void                       start(int argc, char** argv);
 
+		void                       vinternalError(const wchar_t* msg, va_list va) __attribute__((noreturn));
+
 		static JNIEnv* jniEnv();
 
 		static void    noClassDefFoundError(J3Class* cl) __attribute__((noreturn));

Modified: vmkit/branches/mcjit/include/j3/j3thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3thread.h (original)
+++ vmkit/branches/mcjit/include/j3/j3thread.h Fri Dec 20 15:07:51 2013
@@ -23,7 +23,7 @@ namespace j3 {
 	public:
 		static J3Thread*  create(J3* j3);
 
-		vmkit::Safepoint* getJavaCaller(uint32_t level=0);
+		J3Method*         getJavaCaller(uint32_t level=0);
 
 		void              ensureCapacity(uint32_t capacity);
 		J3ObjectHandle*   pendingException() { return _pendingException; }

Modified: vmkit/branches/mcjit/include/vmkit/compiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/compiler.h (original)
+++ vmkit/branches/mcjit/include/vmkit/compiler.h Fri Dec 20 15:07:51 2013
@@ -58,7 +58,7 @@ namespace vmkit {
 		VMKit*                  vm() const { return _vmkit; }
 
 		void                    addSymbol(const char* id, vmkit::Symbol* symbol);
-		Symbol*                 getSymbol(const std::string &Name);
+		Symbol*                 getSymbol(const char* id);
 		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=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/safepoint.h (original)
+++ vmkit/branches/mcjit/include/vmkit/safepoint.h Fri Dec 20 15:07:51 2013
@@ -18,16 +18,17 @@ namespace vmkit {
 		uint32_t         _nbLives;
 
 	public:
-		void        setUnit(CompilationUnit* unit) { _unit = unit; }
+		void              setUnit(CompilationUnit* unit) { _unit = unit; }
 
-		void*       addr() { return _addr; }
-		const char* functionName() { return _functionName; }
-		uint32_t    sourceIndex() { return _sourceIndex; }
-		uint32_t    nbLives() { return _nbLives; }
-		uint32_t    liveAt(uint32_t i) { return ((uint32_t*)(this + 1))[i]; }
+		CompilationUnit*  unit() { return _unit; }
+		void*             addr() { return _addr; }
+		const char*       functionName() { return _functionName; }
+		uint32_t          sourceIndex() { return _sourceIndex; }
+		uint32_t          nbLives() { return _nbLives; }
+		uint32_t          liveAt(uint32_t i) { return ((uint32_t*)(this + 1))[i]; }
 
-		Safepoint*  getNext();
-		void        dump();
+		Safepoint*        getNext();
+		void              dump();
 
 		static Safepoint* get(CompilationUnit* unit, llvm::Module* module);
 	};

Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Fri Dec 20 15:07:51 2013
@@ -66,7 +66,7 @@ namespace vmkit {
 
 		void log(const wchar_t* msg, ...);
 
-		virtual void internalError(const wchar_t* msg, va_list va) __attribute__((noreturn));
+		virtual void vinternalError(const wchar_t* msg, va_list va) __attribute__((noreturn));
 
 		static void internalError(const wchar_t* msg, ...) __attribute__((noreturn));		
 		static void throwException(void* obj) __attribute__((noreturn));

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Fri Dec 20 15:07:51 2013
@@ -1,4 +1,5 @@
 #include <stdio.h>
+#include <dlfcn.h>
 #include <cxxabi.h>
 
 #include "j3/j3class.h"
@@ -11,6 +12,8 @@
 #include "llvm/IR/Type.h"
 #include "llvm/IR/DerivedTypes.h"
 
+#include "vmkit/safepoint.h"
+
 using namespace j3;
 
 vmkit::T_ptr_less_t<J3ObjectHandle*> J3::charArrayLess;
@@ -171,3 +174,34 @@ void J3::classFormatError(J3Class* cl, c
 void J3::linkageError(J3Method* method) {
 	internalError(L"unable to find native method '%ls::%ls%ls'", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr());
 }
+
+void J3::vinternalError(const wchar_t* msg, va_list va) {
+	vmkit::Safepoint* sf = 0;
+	vmkit::StackWalker walker;
+
+	fprintf(stderr, "Internal error: ");
+	vfwprintf(stderr, msg, va);
+	fprintf(stderr, "\n");
+
+	while(walker.next()) {
+		vmkit::Safepoint* sf = getSafepoint(walker.ip());
+
+		if(sf) {
+			J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self;
+			fprintf(stderr, "    in %ls %ls::%ls index %d\n", m->sign()->cStr(), m->cl()->name()->cStr(), m->name()->cStr(),
+							sf->sourceIndex());
+		} else {
+			Dl_info info;
+			
+			if(dladdr(walker.ip(), &info)) {
+				int   status;
+				const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status);
+				const char* name = demangled ? demangled : info.dli_sname;
+				fprintf(stderr, "    in %s + %lu\n", name, (uintptr_t)walker.ip() - (uintptr_t)info.dli_saddr);
+			} else {
+				fprintf(stderr, "    in %p\n", walker.ip()); 
+			}
+		}
+	}
+	abort();
+}

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=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Fri Dec 20 15:07:51 2013
@@ -10,7 +10,7 @@
 #define enterJVM() try {
 #define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); }
 
-#define NYI() { fprintf(stderr, "-- not yet implemented: %s --\n", __PRETTY_FUNCTION__); abort(); }
+#define NYI() { J3Thread::get()->vm()->internalError(L"not yet implemented: '%s'", __PRETTY_FUNCTION__); }
 
 namespace j3 {
 
@@ -18,15 +18,17 @@ 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();
+	jclass res;
 
-	printf("---> %p\n", sf);
-	//jclass res;
 	enterJVM();
-	//J3Class* cl = 
-	fprintf(stderr, "find class: %s\n", name);
+	J3Method* m = J3Thread::get()->getJavaCaller();
+	J3ClassLoader* loader = m ? m->cl()->loader() : J3Thread::get()->vm()->initialClassLoader;
+	J3Class* cl = loader->getClass(loader->vm()->names()->get(name));
+	cl->initialise();
+	res = cl->javaClass();
 	leaveJVM(); 
-	NYI(); 
+	
+	return res;
 }
 
 jmethodID JNICALL FromReflectedMethod(JNIEnv* env, jobject method) { enterJVM(); leaveJVM(); NYI(); }

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=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Fri Dec 20 15:07:51 2013
@@ -1,6 +1,10 @@
 #include "j3/j3thread.h"
+#include "j3/j3method.h"
 #include "j3/j3.h"
 
+#include "vmkit/safepoint.h"
+#include "vmkit/compiler.h"
+
 using namespace j3;
 
 J3Thread::J3Thread(J3* vm, vmkit::BumpAllocator* allocator) : 
@@ -14,17 +18,15 @@ J3Thread* J3Thread::create(J3* j3) {
 	return new(allocator) J3Thread(j3, allocator);
 }
 
-vmkit::Safepoint* J3Thread::getJavaCaller(uint32_t level) {
+J3Method* 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;
-		}
+		if(sf && !level--)
+			return ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self;
 	}
 
 	return 0;

Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Fri Dec 20 15:07:51 2013
@@ -107,9 +107,8 @@ void CompilationUnit::addSymbol(const ch
 	pthread_mutex_unlock(&_mutexSymbolTable);
 }
 
-Symbol* CompilationUnit::getSymbol(const std::string &Name) {
+Symbol* CompilationUnit::getSymbol(const char* id) {
 	pthread_mutex_lock(&_mutexSymbolTable);
-	const char* id = Name.c_str() + 1;
 
 	std::map<const char*, vmkit::Symbol*>::iterator it = _symbolTable.find(id);
 	vmkit::Symbol* res;
@@ -131,7 +130,7 @@ Symbol* CompilationUnit::getSymbol(const
 }
 
 uint64_t CompilationUnit::getSymbolAddress(const std::string &Name) {
-	return (uint64_t)(uintptr_t)getSymbol(Name)->getSymbolAddress();
+	return (uint64_t)(uintptr_t)getSymbol(Name.c_str() + 1)->getSymbolAddress();
 }
 
 void CompilationUnit::compileModule(llvm::Module* module) {
@@ -148,7 +147,7 @@ void CompilationUnit::compileModule(llvm
 		sf->setUnit(this);
 		vm()->addSafepoint(sf);
 
-		vm()->getSafepoint(sf->addr())->dump();
+		//vm()->getSafepoint(sf->addr())->dump();
 		sf = sf->getNext();
 	}
 }

Modified: vmkit/branches/mcjit/lib/vmkit/safpoint.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safpoint.cc?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/safpoint.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/safpoint.cc Fri Dec 20 15:07:51 2013
@@ -118,7 +118,6 @@ void VmkitGCMetadataPrinter::finishAssem
 
 	AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
 
-	fprintf(stderr, "generating frame tables for: %s\n", getModule().getModuleIdentifier().c_str());
 	llvm::SmallString<256> symName("_");
 	symName += getModule().getModuleIdentifier();
 	symName += "__frametable";
@@ -128,7 +127,7 @@ void VmkitGCMetadataPrinter::finishAssem
 
 	AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
 
-	AP.OutStreamer.AddComment("--- module frame tables ---");
+	AP.OutStreamer.AddComment("--- frame tables ---");
 	AP.OutStreamer.AddBlankLine();
 	AP.OutStreamer.EmitLabel(sym);		
 

Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/thread.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/thread.cc Fri Dec 20 15:07:51 2013
@@ -20,10 +20,10 @@ StackWalker::StackWalker(uint32_t initia
 
 bool StackWalker::next(uint32_t nbPop) {
 	while(nbPop--) {
-		void* next = framePointer[0];
-		if(!next)
+		void** next = (void**)framePointer[0];
+		if(!next || !next[0])
 			return 0;
-		framePointer = (void**)next;
+		framePointer = next;
 	}
 	return 1;
 }

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=197835&r1=197834&r2=197835&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Fri Dec 20 15:07:51 2013
@@ -140,7 +140,7 @@ void VMKit::log(const wchar_t* msg, ...)
 	va_end(va);
 }
 
-void VMKit::internalError(const wchar_t* msg, va_list va) {
+void VMKit::vinternalError(const wchar_t* msg, va_list va) {
 	defaultInternalError(msg, va);
 }
 
@@ -155,7 +155,7 @@ void VMKit::internalError(const wchar_t*
 	va_list va;
 	va_start(va, msg);
 	if(Thread::get() && Thread::get()->vm())
-		Thread::get()->vm()->internalError(msg, va);
+		Thread::get()->vm()->vinternalError(msg, va);
 	else
 		defaultInternalError(msg, va);
 	va_end(va);





More information about the vmkit-commits mailing list