Exemple #1
0
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
}
Exemple #2
0
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);
}
Exemple #3
0
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
}
Exemple #4
0
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);
}