void hipe_set_call_trap(Uint *bfun, void *nfun, int is_closure) { HIPE_ASSERT(bfun[-5] == BeamOpCode(op_i_func_info_IaaI)); bfun[0] = is_closure ? BeamOpCode(op_hipe_trap_call_closure) : BeamOpCode(op_hipe_trap_call); bfun[-4] = (Uint)nfun; }
void hipe_set_call_trap(ErtsCodeInfo* ci, void *nfun, int is_closure) { BeamInstr* bfun = erts_codeinfo_to_code(ci); HIPE_ASSERT(ci->op == BeamOpCode(op_i_func_info_IaaI)); bfun[0] = is_closure ? BeamOpCode(op_hipe_trap_call_closure) : BeamOpCode(op_hipe_trap_call); ci->u.ncallee = (void (*)(void)) nfun; }
void hipe_mode_switch_init(void) { hipe_arch_glue_init(); hipe_beam_pc_return[0] = BeamOpCode(op_hipe_trap_return); hipe_beam_pc_throw[0] = BeamOpCode(op_hipe_trap_throw); hipe_beam_pc_resume[0] = BeamOpCode(op_hipe_trap_resume); hipe_beam_catch_throw = make_catch(beam_catches_cons(hipe_beam_pc_throw, BEAM_CATCHES_NIL)); hipe_mfa_info_table_init(); }
BIF_RETTYPE hipe_bifs_call_count_get_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; pc = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] != BeamOpCode(op_hipe_call_count)) BIF_RET(am_false); hcc = (struct hipe_call_count*)pc[-4]; BIF_RET(make_small(hcc->count)); }
BIF_RETTYPE hipe_bifs_call_count_clear_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; unsigned count; pc = hipe_bifs_find_pc_from_mfa(&loader_target_self, BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] != BeamOpCode(op_hipe_call_count)) BIF_RET(am_false); hcc = (struct hipe_call_count*)pc[-4]; count = hcc->count; hcc->count = 0; BIF_RET(make_small(count)); }
BIF_RETTYPE hipe_bifs_call_count_off_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; unsigned count; pc = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] != BeamOpCode(op_hipe_call_count)) BIF_RET(am_false); hcc = (struct hipe_call_count*)pc[-4]; count = hcc->count; pc[0] = hcc->opcode; pc[-4] = (Eterm)NULL; erts_free(ERTS_ALC_T_HIPE, hcc); BIF_RET(make_small(count)); }
BIF_RETTYPE hipe_bifs_call_count_on_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; pc = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] == BeamOpCode(op_hipe_trap_call)) BIF_ERROR(BIF_P, BADARG); if (pc[0] == BeamOpCode(op_hipe_call_count)) BIF_RET(NIL); hcc = erts_alloc(ERTS_ALC_T_HIPE, sizeof(*hcc)); hcc->count = 0; hcc->opcode = pc[0]; pc[-4] = (Eterm)hcc; pc[0] = BeamOpCode(op_hipe_call_count); BIF_RET(am_true); }