[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