fix: rare conditional jump with double fallthrough doesn't set eip correctly
This commit is contained in:
parent
1588687e2a
commit
3bcd997904
|
@ -1674,6 +1674,13 @@ fn jit_generate_module(
|
||||||
let next_block_branch_taken_addr =
|
let next_block_branch_taken_addr =
|
||||||
next_block_branch_taken_addr.unwrap();
|
next_block_branch_taken_addr.unwrap();
|
||||||
|
|
||||||
|
dbg_log!(
|
||||||
|
"Conditional control flow: fallthrough in both cases, page_switch={} next_is_multi={}",
|
||||||
|
Page::page_of(next_block_branch_taken_addr)
|
||||||
|
!= Page::page_of(block.addr),
|
||||||
|
next_addr.as_ref().unwrap().len() > 1,
|
||||||
|
);
|
||||||
|
|
||||||
dbg_assert!(
|
dbg_assert!(
|
||||||
Page::page_of(next_block_addr) == Page::page_of(block.addr)
|
Page::page_of(next_block_addr) == Page::page_of(block.addr)
|
||||||
); // currently not possible
|
); // currently not possible
|
||||||
|
@ -1681,6 +1688,9 @@ fn jit_generate_module(
|
||||||
if Page::page_of(next_block_branch_taken_addr)
|
if Page::page_of(next_block_branch_taken_addr)
|
||||||
!= Page::page_of(block.addr)
|
!= Page::page_of(block.addr)
|
||||||
{
|
{
|
||||||
|
codegen::gen_condition_fn(ctx, condition);
|
||||||
|
ctx.builder.if_void();
|
||||||
|
|
||||||
if jump_offset_is_32 {
|
if jump_offset_is_32 {
|
||||||
codegen::gen_set_eip_low_bits_and_jump_rel32(
|
codegen::gen_set_eip_low_bits_and_jump_rel32(
|
||||||
ctx.builder,
|
ctx.builder,
|
||||||
|
@ -1713,9 +1723,24 @@ fn jit_generate_module(
|
||||||
block.addr,
|
block.addr,
|
||||||
next_block_branch_taken_addr,
|
next_block_branch_taken_addr,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
if next_addr.unwrap().len() > 1 {
|
dbg_assert!(next_addr.unwrap().len() > 1);
|
||||||
|
|
||||||
|
let target_index_taken =
|
||||||
|
*index_for_addr.get(&next_block_branch_taken_addr).unwrap();
|
||||||
|
let target_index_not_taken =
|
||||||
|
*index_for_addr.get(&next_block_addr).unwrap();
|
||||||
|
|
||||||
|
ctx.builder.const_i32(target_index_taken);
|
||||||
|
ctx.builder.set_local(target_block);
|
||||||
|
|
||||||
|
ctx.builder.else_();
|
||||||
|
ctx.builder.const_i32(target_index_not_taken);
|
||||||
|
ctx.builder.set_local(target_block);
|
||||||
|
|
||||||
|
ctx.builder.block_end();
|
||||||
|
}
|
||||||
|
else if next_addr.unwrap().len() > 1 {
|
||||||
let target_index_taken =
|
let target_index_taken =
|
||||||
*index_for_addr.get(&next_block_branch_taken_addr).unwrap();
|
*index_for_addr.get(&next_block_branch_taken_addr).unwrap();
|
||||||
let target_index_not_taken =
|
let target_index_not_taken =
|
||||||
|
|
Loading…
Reference in a new issue