[vmkit-commits] [vmkit] r199002 - Try a new trampoline (partially implemented).

Gael Thomas gael.thomas at lip6.fr
Sat Jan 11 02:54:50 PST 2014


Author: gthomas
Date: Sat Jan 11 04:54:50 2014
New Revision: 199002

URL: http://llvm.org/viewvc/llvm-project?rev=199002&view=rev
Log:
Try a new trampoline (partially implemented).

Added:
    vmkit/branches/mcjit/include/j3/j3arch-dep.h
    vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s
Modified:
    vmkit/branches/mcjit/Makefile.rules
    vmkit/branches/mcjit/include/j3/j3thread.h
    vmkit/branches/mcjit/include/j3/j3trampoline.h
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc

Modified: vmkit/branches/mcjit/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=199002&r1=199001&r2=199002&view=diff
==============================================================================
--- vmkit/branches/mcjit/Makefile.rules (original)
+++ vmkit/branches/mcjit/Makefile.rules Sat Jan 11 04:54:50 2014
@@ -144,7 +144,7 @@ ifndef BASE_OBJ_FILES
 	BASE_OBJ_FILES=$(call find-sources,.cc)
 endif
 BC_FILES+=$(addsuffix .bc,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES)))
-OBJ_FILES+=$(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES)))
+OBJ_FILES+=$(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES)	$(basename $(notdir $(wildcard $(PROJ_SRC_CWD)/*.s)))))
 DEP_FILES=$(addsuffix .d,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES)))
 
 check::
@@ -312,21 +312,22 @@ $(GEN_MODULE).a: $(GC_OBJ_FILES)
 	$(Echo) "Assembling '$(notdir $<)'"
 	$(Verb) $(LLC) $(LLCFLAGS) $(GC_LLCFLAGS) -filetype=obj $< -o $@
 
+$(BUILD_DIR)/%.o: %.s $(SELF) $(BUILD_DIR)/.dir
+	$(Echo) "Assembling '$(notdir $<)'"
+	$(Verb) if $(CLANGXX) $(CXXFLAGS) $(DEPEND_OPTIONS) -c "$<" -o $@; $(DOM)
+
 %-gc.bc: %.bc
 	$(Echo) "Preparing GC '$(notdir $<)'"
 	$(Verb) $(LLOPT) -load=$(STATIC_GC_PASS_LIB) $(OPTFLAGS) -StaticGCPass $< -o $@
 
 define define_compile_rule
-$(BUILD_DIR)/%.bc: %$1 $(SELF) $(BUILD_DIR)/.dir
-	$(Echo) "Compiling '$$(notdir $$<)'"
-	$(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM)
-
-$(BUILD_DIR)/%.bc: $(BUILD_DIR)/%$1 $(SELF) $(BUILD_DIR)/.dir
+$(BUILD_DIR)/%.bc: $4%$1 $(SELF) $(BUILD_DIR)/.dir
 	$(Echo) "Compiling '$$(notdir $$<)'"
 	$(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM)
 endef
 
-$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS)))
+$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS),))
+$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS),$(BUILD_DIR)/))
 
 %/.dir:
 	$(Verb) mkdir -p $(dir $@) && touch $@

Added: vmkit/branches/mcjit/include/j3/j3arch-dep.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3arch-dep.h?rev=199002&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3arch-dep.h (added)
+++ vmkit/branches/mcjit/include/j3/j3arch-dep.h Sat Jan 11 04:54:50 2014
@@ -0,0 +1,6 @@
+#ifndef _J3_ARCH_DEP_H_
+#define _J3_ARCH_DEP_H_
+
+#define TRAMPOLINE_SAVE_ZONE (8*16 + 6*8 + 2*8)
+
+#endif

Modified: vmkit/branches/mcjit/include/j3/j3thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=199002&r1=199001&r2=199002&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3thread.h (original)
+++ vmkit/branches/mcjit/include/j3/j3thread.h Sat Jan 11 04:54:50 2014
@@ -5,6 +5,7 @@
 #include "vmkit/allocator.h"
 #include "j3/j3object.h"
 #include "j3/j3jni.h"
+#include "j3/j3arch-dep.h"
 
 namespace vmkit {
 	class Safepoint;
@@ -16,6 +17,7 @@ namespace j3 {
 	class J3Thread : public vmkit::Thread {
 		friend class J3Monitor;
 		friend class J3CodeGen;
+		friend class J3Trampoline;
 
 		static const uint32_t gepInterfaceMethodIndex = 1;
 		uint32_t              _interfaceMethodIndex;
@@ -26,6 +28,7 @@ namespace j3 {
 		J3LocalReferences          _localReferences;
 		J3ObjectHandle*            _pendingException;
 		J3ObjectHandle             _javaThread;
+		char                       _trampolineSaveZone[TRAMPOLINE_SAVE_ZONE];
 
 		virtual void run();
 		static void doRun();

Modified: vmkit/branches/mcjit/include/j3/j3trampoline.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3trampoline.h?rev=199002&r1=199001&r2=199002&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3trampoline.h (original)
+++ vmkit/branches/mcjit/include/j3/j3trampoline.h Sat Jan 11 04:54:50 2014
@@ -1,6 +1,18 @@
 #ifndef _J3_TRAMPOLINE_H_
 #define _J3_TRAMPOLINE_H_
 
+#include <stdint.h>
+
+extern "C" uintptr_t  trampoline_mask;
+extern "C" uintptr_t  trampoline_offset;
+extern "C" char       trampoline_generic;
+extern "C" char       trampoline_generic_save;
+extern "C" char       trampoline_generic_method;
+extern "C" char       trampoline_generic_resolver; 
+extern "C" char       trampoline_generic_end;
+extern "C" char       trampoline_save;
+extern "C" void       trampoline_restart(void* ptr, void* saveZone);
+
 namespace vmkit {
 	class BumpAllocator;
 }
@@ -16,6 +28,8 @@ namespace j3 {
 
 		static void* buildTrampoline(vmkit::BumpAllocator* allocator, J3Method* method, void* tra);
 	public:
+		static void  initialize(uintptr_t mask);
+
 		static void* buildStaticTrampoline(vmkit::BumpAllocator* allocator, J3Method* target);
 		static void* buildVirtualTrampoline(vmkit::BumpAllocator* allocator, J3Method* target);
 		static void* buildInterfaceTrampoline(vmkit::BumpAllocator* allocator);

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=199002&r1=199001&r2=199002&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 11 04:54:50 2014
@@ -70,6 +70,7 @@ void J3::start(int argc, char** argv) {
 	_options.process(argc, argv);
 
 	vmkit::ThreadAllocator::initialize(sizeof(J3Thread), options()->stackSize);
+	J3Trampoline::initialize(vmkit::Thread::getThreadMask());
 
 	J3Thread* thread = new J3ThreadBootstrap(this);
 
@@ -159,7 +160,7 @@ void J3::run() {
 
 	options()->debugExecute = 0;
 
-#if 1
+#if 0
 	J3Class* loaderClass = z_class("java/lang/ClassLoader");
 	J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC, 
 																			 loaderClass,
@@ -311,7 +312,7 @@ void J3::printStackTrace() {
 		} else {
 			Dl_info info;
 			
-			if(dladdr(walker.ip(), &info)) {
+			if(dladdr((void*)((uintptr_t)walker.ip()-1), &info)) {
 				int   status;
 				const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status);
 				const char* name = demangled ? demangled : info.dli_sname;

Added: vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s?rev=199002&view=auto
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s (added)
+++ vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Sat Jan 11 04:54:50 2014
@@ -0,0 +1,85 @@
+	.section	__DATA,__data
+	.globl	_trampoline_mask, _trampoline_offset
+	
+_trampoline_mask:
+	.quad	0
+_trampoline_offset:
+	.quad 0
+
+	.section	__TEXT,__text,regular,pure_instructions
+	.globl _trampoline_generic, _trampoline_generic_save, _trampoline_save, _trampoline_generic_method
+	.globl _trampoline_generic_resolver, _trampoline_generic_end, _trampoline_restart
+	.align	4
+
+_trampoline_generic:
+	.byte  0x48, 0xb8     			/* mov _trampoline_save, %rax */
+_trampoline_generic_save:	
+	.quad   0
+	callq		*%rax
+	mov			%rsp,  184(%rax)
+	.byte 0x48, 0xbe  					/* mov _trampoline_generic_method, %rsi */
+_trampoline_generic_method:
+	.quad 0
+	.byte 0x48, 0xb8  					/* mov _trampoline_generic_resolver, %rax */
+_trampoline_generic_resolver:	
+	.quad 0
+	jmpq *%rax
+_trampoline_generic_end:	
+	
+	/* compute the adress of the save zone area */
+	/* and return the adress in %rax */
+_trampoline_get_save_zone:	
+	push 		%rbx
+	mov 		%rsp, %rax
+	movq 		_trampoline_mask(%rip), %rbx
+	and 		%rbx, %rax
+	movq 		_trampoline_offset(%rip), %rbx
+	add			%rbx, %rax
+	pop			%rbx
+	ret
+	
+_trampoline_save:
+	call    _trampoline_get_save_zone
+
+	mov 		%xmm0, 0(%rax)
+	mov 		%xmm1, 16(%rax)
+	mov 		%xmm2, 32(%rax)
+	mov 		%xmm3, 48(%rax)
+	mov 		%xmm4, 64(%rax)
+	mov 		%xmm5, 80(%rax)
+	mov 		%xmm6, 96(%rax)
+	mov 		%xmm7, 112(%rax)
+	mov		 	%rdi,  128(%rax)
+	mov 		%rsi,  136(%rax)
+	mov 		%rdx,  144(%rax)
+	mov 		%rcx,  152(%rax)
+	mov 		%r8,   160(%rax)
+	mov 		%r9,   168(%rax)
+	mov 		%rbp,  176(%rax)
+
+	ret
+
+	/* %rdi contains the function */
+	/* %rsi contains the save zone area */
+_trampoline_restart:
+	mov     %rdi, %rax
+
+	mov 		0(%rsi), %xmm0
+	mov 		16(%rsi), %xmm1
+	mov 		32(%rsi), %xmm2
+	mov 		48(%rsi), %xmm3
+	mov 		64(%rsi), %xmm4
+	mov 		80(%rsi), %xmm5
+	mov 		96(%rsi), %xmm6
+	mov 		112(%rsi), %xmm7
+	mov		 	128(%rsi), %rdi
+	mov 		144(%rsi), %rdx
+	mov 		152(%rsi), %rcx
+	mov 		160(%rsi), %r8
+	mov 		168(%rsi), %r9
+	mov			176(%rsi), %rbp
+	mov			184(%rsi), %rsp
+	
+	mov 		136(%rsi), %rsi
+
+	jmpq		*%rax

Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199002&r1=199001&r2=199002&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 11 04:54:50 2014
@@ -5,9 +5,11 @@
 #include "j3/j3class.h"
 #include "j3/j3.h"
 
+
 using namespace j3;
 
 void* J3Trampoline::interfaceTrampoline(J3Object* obj) {
+	J3::internalError("implement me it");
 	J3ObjectHandle* prev = J3Thread::get()->tell();
 	J3ObjectHandle* handle = J3Thread::get()->push(obj);
 	J3ObjectType* type = obj->vt()->type()->asObjectType();
@@ -32,11 +34,16 @@ void* J3Trampoline::interfaceTrampoline(
 }
 
 void* J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) {
+	char saveZone[TRAMPOLINE_SAVE_ZONE];
+	memcpy(saveZone, J3Thread::get()->_trampolineSaveZone, TRAMPOLINE_SAVE_ZONE);
 	target->ensureCompiled(0);
-	return target->fnPtr();
+	//return target->fnPtr();
+	trampoline_restart(target->fnPtr(), saveZone);
+	return 0;
 }
 	
 void* J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) {
+	J3::internalError("implement me vt");
 	J3ObjectHandle* prev = J3Thread::get()->tell();
 	J3ObjectHandle* handle = J3Thread::get()->push(obj);
 	J3ObjectType* cl = handle->vt()->type()->asObjectType();
@@ -52,50 +59,14 @@ void* J3Trampoline::virtualTrampoline(J3
 }
 
 void* J3Trampoline::buildTrampoline(vmkit::BumpAllocator* allocator, J3Method* m, void* tra) {	
-	size_t trampolineSize = 148;
-	void* res = allocator->allocate(trampolineSize);
+	size_t trampolineSize = &trampoline_generic_end - &trampoline_generic;
+	char* res = (char*)allocator->allocate(trampolineSize);
 
-#define dd(p, n) ((((uintptr_t)p) >> n) & 0xff)
-	uint8_t code[] = {
-		0x57, // 0: push %rdi
-		0x56, // 1: push %rsi
-		0x52, // 2: push %rdx
-		0x51, // 3: push %rcx
-		0x41, 0x50, // 4: push %r8
-		0x41, 0x51, // 6: push %r9
-		0x48, 0x81, 0xec, 0x88, 0x00, 0x00, 0x00, // 8: sub $128+8, %esp
-		0xf3, 0x0f, 0x11, 0x04, 0x24,             // 15: movss %xmm0, (%rsp)
-		0xf3, 0x0f, 0x11, 0x4c, 0x24, 0x10,       // 20: movss %xmm1, 16(%rsp)
-		0xf3, 0x0f, 0x11, 0x54, 0x24, 0x20,       // 26: movss %xmm2, 32(%rsp)
-		0xf3, 0x0f, 0x11, 0x5c, 0x24, 0x30,       // 32: movss %xmm3, 48(%rsp)
-		0xf3, 0x0f, 0x11, 0x64, 0x24, 0x40,       // 38: movss %xmm4, 64(%rsp)
-		0xf3, 0x0f, 0x11, 0x6c, 0x24, 0x50,       // 44: movss %xmm5, 80(%rsp)
-		0xf3, 0x0f, 0x11, 0x74, 0x24, 0x60,       // 50: movss %xmm6, 96(%rsp)
-		0xf3, 0x0f, 0x11, 0x7c, 0x24, 0x70,       // 56: movss %xmm7, 112(%rsp)
-		0x48, 0xbe, dd(m, 0), dd(m, 8), dd(m, 16), dd(m, 24), dd(m, 32), dd(m, 40), dd(m, 48), dd(m, 56), // 62: mov -> %rsi
-		0x48, 0xb8, dd(tra, 0), dd(tra, 8), dd(tra, 16), dd(tra, 24), dd(tra, 32), dd(tra, 40), dd(tra, 48), dd(tra, 56), // 72: mov -> %rax
-		0xff, 0xd0, // 82: call %rax
-		0xf3, 0x0f, 0x10, 0x04, 0x24,             // 84: movss (%rsp), %xmm0
-		0xf3, 0x0f, 0x10, 0x4c, 0x24, 0x10,       // 89: movss 16(%rsp), %xmm1
-		0xf3, 0x0f, 0x10, 0x54, 0x24, 0x20,       // 95: movss 32(%rsp), %xmm2
-		0xf3, 0x0f, 0x10, 0x5c, 0x24, 0x30,       // 101: movss 48(%rsp), %xmm3
-		0xf3, 0x0f, 0x10, 0x64, 0x24, 0x40,       // 107: movss 64(%rsp), %xmm4
-		0xf3, 0x0f, 0x10, 0x6c, 0x24, 0x50,       // 113: movss 80(%rsp), %xmm5
-		0xf3, 0x0f, 0x10, 0x74, 0x24, 0x60,       // 119: movss 96(%rsp), %xmm6
-		0xf3, 0x0f, 0x10, 0x7c, 0x24, 0x70,       // 125: movss 112(%rsp), %xmm7
-		0x48, 0x81, 0xc4, 0x88, 0x00, 0x00, 0x00, // 131: add $128+8, %esp
-		0x41, 0x59, // 138: pop %r9
-		0x41, 0x58, // 140: pop %r8
-		0x59, // 142: pop %rcx
-		0x5a, // 143: pop %rdx
-		0x5e, // 144: pop %rsi
-		0x5f, // 145: pop %rdi
-		0xff, 0xe0 // 146: jmp %rax
-		// total: 148
-	};
-#undef dd
+	memcpy(res, &trampoline_generic, trampolineSize);
 
-	memcpy(res, code, trampolineSize);
+	*((char**)(res + (&trampoline_generic_save - &trampoline_generic))) = &trampoline_save;
+	*((void**)(res + (&trampoline_generic_method - &trampoline_generic))) = (void*)m;
+	*((void**)(res + (&trampoline_generic_resolver - &trampoline_generic))) = tra;
 
 	return res;
 }
@@ -111,3 +82,10 @@ void* J3Trampoline::buildVirtualTrampoli
 void* J3Trampoline::buildInterfaceTrampoline(vmkit::BumpAllocator* allocator) {
 	return buildTrampoline(allocator, 0, (void*)interfaceTrampoline);
 }
+
+void J3Trampoline::initialize(uintptr_t mask) {
+	J3Thread* thread = J3Thread::get();
+	trampoline_mask = mask;
+	trampoline_offset = (uintptr_t)&thread->_trampolineSaveZone - (uintptr_t)thread;
+}
+





More information about the vmkit-commits mailing list