Fixing stack alignment in release mode.
This commit is contained in:
parent
a547a6e696
commit
96c27b3b51
|
@ -86,11 +86,6 @@ manually execute commands have fun, nothing is stopping you.
|
||||||
|
|
||||||
## Known Issues
|
## Known Issues
|
||||||
|
|
||||||
### Release Mode Crashes
|
|
||||||
|
|
||||||
There are some stack alignment issues with the JITed code, so release mode
|
|
||||||
dies on an unaligned SSE operation.
|
|
||||||
|
|
||||||
### Use of stdout
|
### Use of stdout
|
||||||
|
|
||||||
Currently everything is traced to stdout, which is slow and silly. A better
|
Currently everything is traced to stdout, which is slow and silly. A better
|
||||||
|
|
|
@ -144,8 +144,8 @@ int X64Emitter::PrepareFunction(FunctionSymbol* symbol) {
|
||||||
#if STACK_ALIGNMENT_CHECK
|
#if STACK_ALIGNMENT_CHECK
|
||||||
assembler_.mov(rax, rsp);
|
assembler_.mov(rax, rsp);
|
||||||
assembler_.and_(rax, imm(0xF));
|
assembler_.and_(rax, imm(0xF));
|
||||||
assembler_.test(rax, rax);
|
assembler_.cmp(rax, imm(0x8));
|
||||||
assembler_.jz(l);
|
assembler_.je(l);
|
||||||
assembler_.int3();
|
assembler_.int3();
|
||||||
assembler_.bind(l);
|
assembler_.bind(l);
|
||||||
#endif // STACK_ALIGNMENT_CHECK
|
#endif // STACK_ALIGNMENT_CHECK
|
||||||
|
@ -155,11 +155,11 @@ int X64Emitter::PrepareFunction(FunctionSymbol* symbol) {
|
||||||
// Arguments passed as RCX, RDX, R8, R9
|
// Arguments passed as RCX, RDX, R8, R9
|
||||||
assembler_.push(rcx); // ppc_state
|
assembler_.push(rcx); // ppc_state
|
||||||
assembler_.push(rdx); // lr
|
assembler_.push(rdx); // lr
|
||||||
assembler_.sub(rsp, imm(0x20));
|
assembler_.sub(rsp, imm(0x18));
|
||||||
assembler_.mov(rcx, imm((uint64_t)this));
|
assembler_.mov(rcx, imm((uint64_t)this));
|
||||||
assembler_.mov(rdx, imm((uint64_t)symbol));
|
assembler_.mov(rdx, imm((uint64_t)symbol));
|
||||||
assembler_.call(X64Emitter::OnDemandCompileTrampoline);
|
assembler_.call(X64Emitter::OnDemandCompileTrampoline);
|
||||||
assembler_.add(rsp, imm(0x20));
|
assembler_.add(rsp, imm(0x18));
|
||||||
assembler_.pop(rdx); // lr
|
assembler_.pop(rdx); // lr
|
||||||
assembler_.pop(rcx); // ppc_state
|
assembler_.pop(rcx); // ppc_state
|
||||||
assembler_.jmp(rax);
|
assembler_.jmp(rax);
|
||||||
|
@ -168,11 +168,11 @@ int X64Emitter::PrepareFunction(FunctionSymbol* symbol) {
|
||||||
// Arguments passed as RDI, RSI, RDX, RCX, R8, R9
|
// Arguments passed as RDI, RSI, RDX, RCX, R8, R9
|
||||||
assembler_.push(rdi); // ppc_state
|
assembler_.push(rdi); // ppc_state
|
||||||
assembler_.push(rsi); // lr
|
assembler_.push(rsi); // lr
|
||||||
assembler_.sub(rsp, imm(0x20));
|
assembler_.sub(rsp, imm(0x18));
|
||||||
assembler_.mov(rdi, imm((uint64_t)this));
|
assembler_.mov(rdi, imm((uint64_t)this));
|
||||||
assembler_.mov(rsi, imm((uint64_t)symbol));
|
assembler_.mov(rsi, imm((uint64_t)symbol));
|
||||||
assembler_.call(X64Emitter::OnDemandCompileTrampoline);
|
assembler_.call(X64Emitter::OnDemandCompileTrampoline);
|
||||||
assembler_.add(rsp, imm(0x20));
|
assembler_.add(rsp, imm(0x18));
|
||||||
assembler_.pop(rsi); // lr
|
assembler_.pop(rsi); // lr
|
||||||
assembler_.pop(rdi); // ppc_state
|
assembler_.pop(rdi); // ppc_state
|
||||||
assembler_.jmp(rax);
|
assembler_.jmp(rax);
|
||||||
|
@ -326,6 +326,17 @@ int X64Emitter::MakeFunction(FunctionSymbol* symbol) {
|
||||||
// Perform final assembly/relocation.
|
// Perform final assembly/relocation.
|
||||||
symbol->impl_value = assembler_.make();
|
symbol->impl_value = assembler_.make();
|
||||||
|
|
||||||
|
// TODO(benvanik): figure this out
|
||||||
|
//RUNTIME_FUNCTION* fn_table =
|
||||||
|
// (RUNTIME_FUNCTION*)xe_malloc(sizeof(RUNTIME_FUNCTION));
|
||||||
|
//UNWIND_INFO* unwind_info =
|
||||||
|
// (UNWIND_INFO*)xe_malloc(sizeof(UNWIND_INFO));
|
||||||
|
//fn_table[0].BeginAddress = 0;
|
||||||
|
//fn_table[0].EndAddress = assembler_.getCodeSize();
|
||||||
|
//fn_table[0].UnwindInfoAddress = ;
|
||||||
|
//fn_table[0].UnwindData = 0;
|
||||||
|
//RtlAddFunctionTable(fn_table, 1, (DWORD64)symbol->impl_value);
|
||||||
|
|
||||||
if (FLAGS_log_codegen) {
|
if (FLAGS_log_codegen) {
|
||||||
XELOGCPU("Compile(%s): compiled to 0x%p (%db)",
|
XELOGCPU("Compile(%s): compiled to 0x%p (%db)",
|
||||||
symbol->name(),
|
symbol->name(),
|
||||||
|
|
Loading…
Reference in New Issue