[vmkit-commits] [vmkit] r198129 - add an extractor tool to only keep the interesting runtime part of j3
Gael Thomas
gael.thomas at lip6.fr
Sat Dec 28 14:08:51 PST 2013
Author: gthomas
Date: Sat Dec 28 16:08:51 2013
New Revision: 198129
URL: http://llvm.org/viewvc/llvm-project?rev=198129&view=rev
Log:
add an extractor tool to only keep the interesting runtime part of j3
Added:
vmkit/branches/mcjit/include/j3/j3meta.def
vmkit/branches/mcjit/tools/vmkit-extract/ (with props)
vmkit/branches/mcjit/tools/vmkit-extract/Makefile
vmkit/branches/mcjit/tools/vmkit-extract/main.cc
Modified:
vmkit/branches/mcjit/Makefile
vmkit/branches/mcjit/Makefile.rules
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/vmkit/compiler.cc
vmkit/branches/mcjit/lib/vmkit/vmkit.cc
vmkit/branches/mcjit/tools/j3/Makefile
Modified: vmkit/branches/mcjit/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile?rev=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/Makefile (original)
+++ vmkit/branches/mcjit/Makefile Sat Dec 28 16:08:51 2013
@@ -5,6 +5,6 @@
LEVEL := .
-DIRS := lib tools
+DIRS := tools/vmkit-extract lib tools
include $(LEVEL)/Makefile.rules
Modified: vmkit/branches/mcjit/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/Makefile.rules (original)
+++ vmkit/branches/mcjit/Makefile.rules Sat Dec 28 16:08:51 2013
@@ -228,18 +228,40 @@ endif
ifdef TOOL
TOOL_OUT=$(BIN_DIR)/$(TOOL)$(EXEEXT)
-GEN_MODULE=$(LIB_DIR)/libjvm
-SONAME=$(GEN_MODULE)
+FINAL_MODULE=$(LIB_DIR)/libjvm
+STRIP_MODULE=$(BUILD_DIR)/libjvm
+GEN_MODULE=$(BUILD_DIR)/libjvm-no-strip
+SONAME=$(FINAL_MODULE)
BC_FILES+=$(addsuffix .bc,$(addprefix $(LIB_DIR)/,$(LIBS)))
SO_FILES=$(addsuffix .a,$(addprefix $(LIB_DIR)/,$(LIBS)))
SO_LIBS=$(LLVM_LIBS)
-all:: $(BIN_DIR)/.dir $(TOOL_OUT) $(GEN_MODULE).bc
+TOOL_ALL=$(BIN_DIR)/.dir $(TOOL_OUT)
+TOOL_DEP=$(OBJ_FILES)
-$(TOOL_OUT): $(OBJ_FILES) $(SONAME)$(SHLIBEXT)
+ifdef WITH_DYLIB
+TOOL_ALL+=$(FINAL_MODULE).bc
+TOOL_DEP+=$(SONAME)$(SHLIBEXT)
+else
+TOOL_DEP+=$(SO_FILES)
+TOOL_FLAGS=$(LLVM_LDFLAGS) $(SHFLAGS)
+LDFLAGS=$(SO_LIBS)
+endif
+
+all:: $(TOOL_ALL)
+
+$(TOOL_OUT): $(TOOL_DEP)
$(Echo) "Linking '$(notdir $@)'"
- $(Verb) $(CLANGXX) -o $@ -Wl,-rpath,$(LIB_DIR) $(LDFLAGS) $^
+ $(Verb) $(CLANGXX) $(TOOL_FLAGS) -o $@ -Wl,-rpath,$(LIB_DIR) $(LDFLAGS) $^
+
+$(FINAL_MODULE).bc: $(STRIP_MODULE).bc $(BIN_DIR)/vmkit-extract $(PROJ_SRC_ROOT)/$(EXTRACTOR)
+ $(Echo) "Extracting runtime function to '$(notdir $@)'"
+ $(Verb) $(BIN_DIR)/vmkit-extract $< $(PROJ_SRC_ROOT)/$(EXTRACTOR) > $@
+
+$(STRIP_MODULE).bc: $(GEN_MODULE).bc
+ $(Echo) "Strip debug info from '$(notdir $<)'"
+ $(Verb) $(LLOPT) -strip-debug $< -o $@
endif
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sat Dec 28 16:08:51 2013
@@ -118,6 +118,8 @@ namespace j3 {
static void arrayIndexOutOfBoundsException() __attribute__((noreturn));
static void printStackTrace();
+
+ void forceSymbolDefinition();
};
}
Added: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=198129&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (added)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Sat Dec 28 16:08:51 2013
@@ -0,0 +1,27 @@
+_x(funcJ3MethodIndex, "j3::J3Method::index()")
+_x(funcJ3TypeVT, "j3::J3Type::vt()")
+_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()")
+_x(funcJ3TypeInitialise, "j3::J3Type::initialise()")
+_x(funcJ3ClassSize, "j3::J3Class::size()")
+_x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()")
+_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short)")
+_x(funcJ3ObjectTypeJavaClass, "j3::J3ObjectType::javaClass()")
+_x(funcJniEnv, "j3::J3::jniEnv()")
+_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)")
+_x(funcThrowException, "vmkit::VMKit::throwException(void*)")
+_x(funcClassCastException, "j3::J3::classCastException()")
+_x(funcNullPointerException, "j3::J3::nullPointerException()")
+_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)")
+_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)")
+_x(funcJ3ThreadTell, "j3::J3Thread::tell()")
+_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)")
+_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)")
+_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)")
+_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)")
+_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)")
+_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)")
+_x(funcGXXPersonality, "__gxx_personality_v0")
+_x(funcCXABeginCatch, "__cxa_begin_catch")
+_x(funcCXAEndCatch, "__cxa_end_catch")
+_x(gvTypeInfo, "typeinfo for void*")
+_x(funcFake, "j3::J3::forceSymbolDefinition()")
\ No newline at end of file
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=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Dec 28 16:08:51 2013
@@ -221,3 +221,13 @@ void J3::printStackTrace() {
}
}
}
+
+void J3::forceSymbolDefinition() {
+ J3ArrayObject a; a.length(); /* J3ArrayObject */
+ try {
+ throw (void*)0;
+ } catch(void* e) {
+ }
+}
+
+
Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sat Dec 28 16:08:51 2013
@@ -13,6 +13,7 @@
#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/ExecutionEngine/JIT.h"
+#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Target/TargetOptions.h"
Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sat Dec 28 16:08:51 2013
@@ -164,6 +164,8 @@ void VMKit::internalError(const wchar_t*
abort();
}
+static int fake = 0;
+
void VMKit::throwException(void* obj) {
#if 0
void** exception = (void**)abi::__cxa_allocate_exception(sizeof(void*));
@@ -171,5 +173,7 @@ void VMKit::throwException(void* obj) {
abi::__cxa_throw(exception, (std::type_info*)Thread::get()->vm()->ptrTypeInfo, 0);
#endif
fprintf(stderr, " throw exception...\n");
+ if(fake)
+ throw (void*)0; /* force the symbol typeinfo for void* to be conserved in the bc file */
abort();
}
Modified: vmkit/branches/mcjit/tools/j3/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/j3/Makefile?rev=198129&r1=198128&r2=198129&view=diff
==============================================================================
--- vmkit/branches/mcjit/tools/j3/Makefile (original)
+++ vmkit/branches/mcjit/tools/j3/Makefile Sat Dec 28 16:08:51 2013
@@ -7,5 +7,7 @@ LEVEL := ../..
LIBS := vmkit j3 openjdk
TOOL := j3
+WITH_DYLIB=1
+EXTRACTOR=include/j3/j3meta.def
include $(LEVEL)/Makefile.rules
Propchange: vmkit/branches/mcjit/tools/vmkit-extract/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Sat Dec 28 16:08:51 2013
@@ -0,0 +1 @@
+Debug+Asserts
Added: vmkit/branches/mcjit/tools/vmkit-extract/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/vmkit-extract/Makefile?rev=198129&view=auto
==============================================================================
--- vmkit/branches/mcjit/tools/vmkit-extract/Makefile (added)
+++ vmkit/branches/mcjit/tools/vmkit-extract/Makefile Sat Dec 28 16:08:51 2013
@@ -0,0 +1,11 @@
+#===- ./Makefile -------------------------------------------*- Makefile -*--===#
+#
+# The vmkit project
+#===------------------------------------------------------------------------===#
+
+LEVEL := ../..
+
+LIBS :=
+TOOL := vmkit-extract
+
+include $(LEVEL)/Makefile.rules
Added: vmkit/branches/mcjit/tools/vmkit-extract/main.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/vmkit-extract/main.cc?rev=198129&view=auto
==============================================================================
--- vmkit/branches/mcjit/tools/vmkit-extract/main.cc (added)
+++ vmkit/branches/mcjit/tools/vmkit-extract/main.cc Sat Dec 28 16:08:51 2013
@@ -0,0 +1,107 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <cxxabi.h>
+
+#include "llvm/IR/LLVMContext.h"
+//#include "llvm/ADT/SetVector.h"
+//#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/Assembly/PrintModulePass.h"
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IRReader/IRReader.h"
+#include "llvm/PassManager.h"
+//#include "llvm/Support/CommandLine.h"
+//#include "llvm/Support/ManagedStatic.h"
+//#include "llvm/Support/PrettyStackTrace.h"
+//#include "llvm/Support/Regex.h"
+//#include "llvm/Support/Signals.h"
+#include "llvm/Support/SourceMgr.h"
+//#include "llvm/Support/SystemUtils.h"
+#include "llvm/Support/ToolOutputFile.h"
+#include "llvm/Transforms/IPO.h"
+//#include <memory>
+
+void add(std::map<std::string, llvm::GlobalValue*>& mangler, llvm::GlobalValue* cur) {
+ const char* id = cur->getName().data();
+ int status;
+ char* realname;
+ realname = abi::__cxa_demangle(id, 0, 0, &status);
+ const char* tmp = realname ? realname : id;
+ mangler[std::string(tmp)] = cur;
+}
+
+int main(int argc, char** argv) {
+ if(argc != 3) {
+ fprintf(stderr, "usage: %s input.bc file.def\n", argv[0]);
+ abort();
+ }
+
+ llvm::LLVMContext& context = llvm::getGlobalContext();
+ llvm::SMDiagnostic err;
+ llvm::OwningPtr<llvm::Module> module;
+ module.reset(llvm::getLazyIRFileModule(argv[1], err, context));
+
+ std::map<std::string, llvm::GlobalValue*> mangler;
+ std::vector<llvm::GlobalValue*> extracted;
+
+ for(llvm::Module::iterator cur=module->begin(); cur!=module->end(); cur++)
+ add(mangler, cur);
+
+ for(llvm::Module::global_iterator cur=module->global_begin(); cur!=module->global_end(); cur++)
+ add(mangler, cur);
+
+ FILE* fp = fopen(argv[2], "r");
+ size_t linecapp = 0;
+ char* buf;
+
+ while(getline(&buf, &linecapp, fp) > 0) {
+ char* p = strchr(buf, '"') + 1;
+ char* e = strchr(p, '"');
+ *e = 0;
+ llvm::GlobalValue* gv = mangler[p];
+
+ if(gv) {
+ extracted.push_back(gv);
+ if (gv->isMaterializable()) {
+ std::string ErrInfo;
+ if(gv->Materialize(&ErrInfo)) {
+ fprintf(stderr, "%s: error reading input: %s\n", argv[0], ErrInfo.c_str());
+ return 1;
+ }
+ }
+ //fprintf(stderr, "extracting: %s (%s)\n", p, gv->getName().data());
+ //gv->dump();
+ } else {
+ fprintf(stderr, "unable to find symbol %s\n", p);
+ return 1;
+ }
+ }
+
+ // directly from llvm-extract
+ llvm::PassManager Passes;
+ Passes.add(new llvm::DataLayout(module.get())); // Use correct DataLayout
+
+ Passes.add(llvm::createGVExtractionPass(extracted, 0));
+ Passes.add(llvm::createGlobalDCEPass()); // Delete unreachable globals
+ Passes.add(llvm::createStripDeadDebugInfoPass()); // Remove dead debug info
+ Passes.add(llvm::createStripDeadPrototypesPass()); // Remove dead func decls
+
+ std::string ErrorInfo;
+ llvm::tool_output_file Out("-", ErrorInfo, llvm::sys::fs::F_Binary);
+ if (!ErrorInfo.empty()) {
+ llvm::errs() << ErrorInfo << '\n';
+ return 1;
+ }
+
+ //Passes.add(llvm::createPrintModulePass(&Out.os()));
+ Passes.add(createBitcodeWriterPass(Out.os()));
+
+ Passes.run(*module.get());
+
+ // Declare success.
+ Out.keep();
+
+ return 0;
+}
More information about the vmkit-commits
mailing list