in Jit/pyjit.cpp [1668:1777]
void _PyJIT_ProfileCurrentInstr(
PyFrameObject* frame,
PyObject** stack_top,
int opcode,
int oparg) {
auto profile_stack = [&](auto... stack_offsets) {
CodeProfile& code_profile =
jit::codegen::NativeGeneratorFactory::runtime()
->typeProfiles()[Ref<PyCodeObject>{frame->f_code}];
int opcode_offset = frame->f_lasti;
auto pair = code_profile.typed_hits.emplace(opcode_offset, nullptr);
if (pair.second) {
constexpr int kProfilerRows = 4;
pair.first->second =
TypeProfiler::create(kProfilerRows, sizeof...(stack_offsets));
}
auto get_type = [&](int offset) {
PyObject* obj = stack_top[-(offset + 1)];
return obj != nullptr ? Py_TYPE(obj) : nullptr;
};
pair.first->second->recordTypes(get_type(stack_offsets)...);
};
switch (opcode) {
case BEFORE_ASYNC_WITH:
case DELETE_ATTR:
case END_ASYNC_FOR:
case END_FINALLY:
case FOR_ITER:
case GET_AITER:
case GET_ANEXT:
case GET_AWAITABLE:
case GET_ITER:
case GET_YIELD_FROM_ITER:
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
case LOAD_ATTR:
case LOAD_FIELD:
case LOAD_METHOD:
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
case RETURN_VALUE:
case SETUP_WITH:
case STORE_DEREF:
case STORE_GLOBAL:
case UNARY_INVERT:
case UNARY_NEGATIVE:
case UNARY_NOT:
case UNARY_POSITIVE:
case UNPACK_EX:
case UNPACK_SEQUENCE:
case WITH_CLEANUP_START:
case YIELD_FROM:
case YIELD_VALUE: {
profile_stack(0);
break;
}
case BINARY_ADD:
case BINARY_AND:
case BINARY_FLOOR_DIVIDE:
case BINARY_LSHIFT:
case BINARY_MATRIX_MULTIPLY:
case BINARY_MODULO:
case BINARY_MULTIPLY:
case BINARY_OR:
case BINARY_POWER:
case BINARY_RSHIFT:
case BINARY_SUBSCR:
case BINARY_SUBTRACT:
case BINARY_TRUE_DIVIDE:
case BINARY_XOR:
case COMPARE_OP:
case DELETE_SUBSCR:
case INPLACE_ADD:
case INPLACE_AND:
case INPLACE_FLOOR_DIVIDE:
case INPLACE_LSHIFT:
case INPLACE_MATRIX_MULTIPLY:
case INPLACE_MODULO:
case INPLACE_MULTIPLY:
case INPLACE_OR:
case INPLACE_POWER:
case INPLACE_RSHIFT:
case INPLACE_SUBTRACT:
case INPLACE_TRUE_DIVIDE:
case INPLACE_XOR:
case LIST_APPEND:
case MAP_ADD:
case SET_ADD:
case STORE_ATTR:
case STORE_FIELD:
case WITH_CLEANUP_FINISH: {
profile_stack(1, 0);
break;
}
case STORE_SUBSCR: {
profile_stack(2, 1, 0);
break;
}
case CALL_FUNCTION: {
profile_stack(oparg);
break;
};
case CALL_METHOD: {
profile_stack(oparg, oparg + 1);
break;
}
}
}