+2007-11-17 Aleksey Demakov <ademakov@gmail.com>
+
+ * jit/jit-insn.c (jit_insn_mark_offset): do not start new block
+ on the bytecode mark. If a mark goes just after another mark then
+ replace the old mark rather than add the new.
+
+ * jit/jit-cache.c (_jit_cache_get_bytecode)
+ (_jit_cache_get_native): fix offset for the last bytecode mark.
+
2007-11-13 Aleksey Demakov <ademakov@gmail.com>
* tools/Makefile.am (noinst_HEADERS): add gen-apply-macosx.h
}
prevNativeOfs = nativeOfs;
}
- return JIT_CACHE_NO_OFFSET;
+
+ return exact ? JIT_CACHE_NO_OFFSET : prevNativeOfs;
}
unsigned long _jit_cache_get_bytecode(jit_cache_t cache, void *start,
}
prevOfs = ofs;
}
- return JIT_CACHE_NO_OFFSET;
+
+ return exact ? JIT_CACHE_NO_OFFSET : prevOfs;
}
unsigned long _jit_cache_get_size(jit_cache_t cache)
@*/
int jit_insn_mark_offset(jit_function_t func, jit_int offset)
{
-#if 1
- if(!jit_insn_new_block(func))
+ jit_block_t block;
+ jit_insn_t last;
+ jit_value_t value;
+
+ /* Ensure that we have a builder for this function */
+ if(!_jit_function_ensure_builder(func))
{
return 0;
}
-#endif
- return create_unary_note(func, JIT_OP_MARK_OFFSET,
- jit_value_create_nint_constant
- (func, jit_type_int, offset));
+
+ value = jit_value_create_nint_constant(func, jit_type_int, offset);
+ if (!value)
+ {
+ return 0;
+ }
+
+ /* If the previous instruction is mark offset too
+ then just replace the offset value in place --
+ we are not interested in bytecodes that produce
+ no real code. */
+ block = func->builder->current_block;
+ last = _jit_block_get_last(block);
+ if (last && last->opcode == JIT_OP_MARK_OFFSET)
+ {
+ last->value1 = value;
+ return 1;
+ }
+
+ return create_unary_note(func, JIT_OP_MARK_OFFSET, value);
}
/* Documentation is in jit-debugger.c */