[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