[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