RewriterVar* JitFragmentWriter::emitPPCall(void* func_addr, llvm::ArrayRef<RewriterVar*> args, int num_slots, int slot_size, AST* ast_node, TypeRecorder* type_recorder) { RewriterVar::SmallVector args_vec(args.begin(), args.end()); #if ENABLE_BASELINEJIT_ICS RewriterVar* result = createNewVar(); int args_size = args.size(); RewriterVar** _args = (RewriterVar**)regionAlloc(sizeof(RewriterVar*) * args_size); memcpy(_args, args.begin(), sizeof(RewriterVar*) * args_size); addAction([=]() { this->_emitPPCall(result, func_addr, llvm::ArrayRef<RewriterVar*>(_args, args_size), num_slots, slot_size, ast_node); }, args, ActionType::NORMAL); if (type_recorder) { RewriterVar* type_recorder_var = imm(type_recorder); RewriterVar* obj_cls_var = result->getAttr(offsetof(Box, cls)); addAction([=]() { _emitRecordType(type_recorder_var, obj_cls_var); }, { type_recorder_var, obj_cls_var }, ActionType::NORMAL); return result; } return result; #else assert(args_vec.size() < 7); return call(false, func_addr, args_vec); #endif }
JitFragmentWriter::JitFragmentWriter(CFGBlock* block, std::unique_ptr<ICInfo> ic_info, std::unique_ptr<ICSlotRewrite> rewrite, int code_offset, int num_bytes_overlapping, void* entry_code, JitCodeBlock& code_block) : Rewriter(std::move(rewrite), 0, {}), block(block), code_offset(code_offset), num_bytes_exit(0), num_bytes_overlapping(num_bytes_overlapping), entry_code(entry_code), code_block(code_block), interp(0), ic_info(std::move(ic_info)) { interp = createNewVar(); addLocationToVar(interp, assembler::R12); interp->setAttr(ASTInterpreterJitInterface::getCurrentBlockOffset(), imm(block)); vregs_array = createNewVar(); addLocationToVar(vregs_array, assembler::R14); addAction([=]() { vregs_array->bumpUse(); }, vregs_array, ActionType::NORMAL); }
RewriterVar* JitFragmentWriter::emitPPCall(void* func_addr, llvm::ArrayRef<RewriterVar*> args, int num_slots, int slot_size, TypeRecorder* type_recorder) { RewriterVar::SmallVector args_vec(args.begin(), args.end()); #if ENABLE_BASELINEJIT_ICS RewriterVar* result = createNewVar(); addAction([=]() { this->_emitPPCall(result, func_addr, args_vec, num_slots, slot_size); }, args, ActionType::NORMAL); if (type_recorder) return call(false, (void*)recordType, imm(type_recorder), result); return result; #else assert(args_vec.size() < 7); return call(false, func_addr, args_vec); #endif }
void JitFragmentWriter::emitOSRPoint(AST_Jump* node) { RewriterVar* node_var = imm(node); RewriterVar* result = createNewVar(); addAction([=]() { _emitOSRPoint(result, node_var); }, { result, node_var, getInterp() }, ActionType::NORMAL); }