14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_COMPILER_PROFILER_OPERATION_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_PROFILER_OPERATION_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include <functional> 204514f5e3Sopenharmony_ci#include <initializer_list> 214514f5e3Sopenharmony_ci 224514f5e3Sopenharmony_ci#include "ecmascript/compiler/share_gate_meta_data.h" 234514f5e3Sopenharmony_ci 244514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu { 254514f5e3Sopenharmony_cienum class OperationType : uint8_t { 264514f5e3Sopenharmony_ci CALL, 274514f5e3Sopenharmony_ci NATIVE_CALL, 284514f5e3Sopenharmony_ci GETTER_SETTER_CALL, 294514f5e3Sopenharmony_ci OPERATION_TYPE, 304514f5e3Sopenharmony_ci DEFINE_CLASS, 314514f5e3Sopenharmony_ci CREATE_OBJECT, 324514f5e3Sopenharmony_ci TRUE_BRANCH, 334514f5e3Sopenharmony_ci FALSE_BRANCH, 344514f5e3Sopenharmony_ci TRY_DUMP, 354514f5e3Sopenharmony_ci TRY_PREDUMP, 364514f5e3Sopenharmony_ci ITERATOR_FUNC_KIND, 374514f5e3Sopenharmony_ci TRY_JIT, 384514f5e3Sopenharmony_ci}; 394514f5e3Sopenharmony_ci 404514f5e3Sopenharmony_ciusing SlotIDFormat = BytecodeInstruction::Format; 414514f5e3Sopenharmony_ci 424514f5e3Sopenharmony_ci#define COMBINE_TYPE_CALL_BACK(curType, type) \ 434514f5e3Sopenharmony_ci callback.ProfileCombineOpType( \ 444514f5e3Sopenharmony_ci *(curType), type, [this](GateRef curType, GateRef type)->GateRef{ return Int64Or(curType, type); }) 454514f5e3Sopenharmony_ci 464514f5e3Sopenharmony_ciusing Callback = std::function<void(const std::initializer_list<GateRef> &, OperationType)>; 474514f5e3Sopenharmony_ciclass ProfileOperation { 484514f5e3Sopenharmony_cipublic: 494514f5e3Sopenharmony_ci ProfileOperation() : callback_(nullptr), jitCallback_(nullptr) {} 504514f5e3Sopenharmony_ci explicit ProfileOperation(Callback callback, Callback jitCallback) : callback_(callback), 514514f5e3Sopenharmony_ci jitCallback_(jitCallback) {} 524514f5e3Sopenharmony_ci 534514f5e3Sopenharmony_ci inline bool IsEmpty() const 544514f5e3Sopenharmony_ci { 554514f5e3Sopenharmony_ci return callback_ == nullptr; 564514f5e3Sopenharmony_ci } 574514f5e3Sopenharmony_ci 584514f5e3Sopenharmony_ci inline bool IsJitEmpty() const 594514f5e3Sopenharmony_ci { 604514f5e3Sopenharmony_ci return jitCallback_ == nullptr; 614514f5e3Sopenharmony_ci } 624514f5e3Sopenharmony_ci 634514f5e3Sopenharmony_ci inline void ProfileCall(GateRef func) const 644514f5e3Sopenharmony_ci { 654514f5e3Sopenharmony_ci if (callback_) { 664514f5e3Sopenharmony_ci callback_({ func }, OperationType::CALL); 674514f5e3Sopenharmony_ci } 684514f5e3Sopenharmony_ci } 694514f5e3Sopenharmony_ci 704514f5e3Sopenharmony_ci inline void ProfileNativeCall(GateRef func) const 714514f5e3Sopenharmony_ci { 724514f5e3Sopenharmony_ci if (callback_) { 734514f5e3Sopenharmony_ci callback_({ func }, OperationType::NATIVE_CALL); 744514f5e3Sopenharmony_ci } 754514f5e3Sopenharmony_ci } 764514f5e3Sopenharmony_ci 774514f5e3Sopenharmony_ci inline void ProfileGetterSetterCall(GateRef func) const 784514f5e3Sopenharmony_ci { 794514f5e3Sopenharmony_ci if (callback_) { 804514f5e3Sopenharmony_ci callback_({ func }, OperationType::GETTER_SETTER_CALL); 814514f5e3Sopenharmony_ci } 824514f5e3Sopenharmony_ci } 834514f5e3Sopenharmony_ci 844514f5e3Sopenharmony_ci inline void ProfileOpType(GateRef type) const 854514f5e3Sopenharmony_ci { 864514f5e3Sopenharmony_ci if (callback_) { 874514f5e3Sopenharmony_ci callback_({ type }, OperationType::OPERATION_TYPE); 884514f5e3Sopenharmony_ci } 894514f5e3Sopenharmony_ci } 904514f5e3Sopenharmony_ci 914514f5e3Sopenharmony_ci template <typename TypeCombine> 924514f5e3Sopenharmony_ci inline void ProfileCombineOpType(GateRef curType, GateRef type, TypeCombine combine) const 934514f5e3Sopenharmony_ci { 944514f5e3Sopenharmony_ci if (callback_) { 954514f5e3Sopenharmony_ci GateRef ret = combine(curType, type); 964514f5e3Sopenharmony_ci callback_({ ret }, OperationType::OPERATION_TYPE); 974514f5e3Sopenharmony_ci } 984514f5e3Sopenharmony_ci } 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_ci inline void ProfileDefineClass(GateRef constructor) const 1014514f5e3Sopenharmony_ci { 1024514f5e3Sopenharmony_ci if (callback_) { 1034514f5e3Sopenharmony_ci callback_({ constructor }, OperationType::DEFINE_CLASS); 1044514f5e3Sopenharmony_ci } 1054514f5e3Sopenharmony_ci } 1064514f5e3Sopenharmony_ci 1074514f5e3Sopenharmony_ci inline void ProfileCreateObject(GateRef newObj) const 1084514f5e3Sopenharmony_ci { 1094514f5e3Sopenharmony_ci if (callback_) { 1104514f5e3Sopenharmony_ci callback_({ newObj }, OperationType::CREATE_OBJECT); 1114514f5e3Sopenharmony_ci } 1124514f5e3Sopenharmony_ci } 1134514f5e3Sopenharmony_ci 1144514f5e3Sopenharmony_ci inline void TryDump() const 1154514f5e3Sopenharmony_ci { 1164514f5e3Sopenharmony_ci if (callback_) { 1174514f5e3Sopenharmony_ci callback_({ }, OperationType::TRY_DUMP); 1184514f5e3Sopenharmony_ci } 1194514f5e3Sopenharmony_ci } 1204514f5e3Sopenharmony_ci 1214514f5e3Sopenharmony_ci inline void TryJitCompile() const 1224514f5e3Sopenharmony_ci { 1234514f5e3Sopenharmony_ci if (callback_) { 1244514f5e3Sopenharmony_ci callback_({ }, OperationType::TRY_JIT); 1254514f5e3Sopenharmony_ci } else if (jitCallback_) { 1264514f5e3Sopenharmony_ci jitCallback_({ }, OperationType::TRY_JIT); 1274514f5e3Sopenharmony_ci } 1284514f5e3Sopenharmony_ci } 1294514f5e3Sopenharmony_ci 1304514f5e3Sopenharmony_ci inline void TryPreDump() const 1314514f5e3Sopenharmony_ci { 1324514f5e3Sopenharmony_ci if (callback_) { 1334514f5e3Sopenharmony_ci callback_({ }, OperationType::TRY_PREDUMP); 1344514f5e3Sopenharmony_ci } 1354514f5e3Sopenharmony_ci } 1364514f5e3Sopenharmony_ci 1374514f5e3Sopenharmony_ci inline void ProfileBranch(bool isTrue) const 1384514f5e3Sopenharmony_ci { 1394514f5e3Sopenharmony_ci if (callback_) { 1404514f5e3Sopenharmony_ci callback_({}, isTrue ? OperationType::TRUE_BRANCH : OperationType::FALSE_BRANCH); 1414514f5e3Sopenharmony_ci } 1424514f5e3Sopenharmony_ci } 1434514f5e3Sopenharmony_ci 1444514f5e3Sopenharmony_ci inline void ProfileGetIterator(GateRef iterator) const 1454514f5e3Sopenharmony_ci { 1464514f5e3Sopenharmony_ci if (callback_) { 1474514f5e3Sopenharmony_ci callback_({ iterator }, OperationType::ITERATOR_FUNC_KIND); 1484514f5e3Sopenharmony_ci } 1494514f5e3Sopenharmony_ci } 1504514f5e3Sopenharmony_ci 1514514f5e3Sopenharmony_ciprivate: 1524514f5e3Sopenharmony_ci Callback callback_; 1534514f5e3Sopenharmony_ci Callback jitCallback_; 1544514f5e3Sopenharmony_ci}; 1554514f5e3Sopenharmony_ci} // namespace panda::ecmascript::kungfu 1564514f5e3Sopenharmony_ci#endif // ECMASCRIPT_COMPILER_PROFILER_OPERATION_H 157