1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef ECMASCRIPT_COMPILER_BUILTIN_INLINE_H 17#define ECMASCRIPT_COMPILER_BUILTIN_INLINE_H 18 19#include "ecmascript/compiler/builtins/builtins_call_signature.h" 20#include "ecmascript/compiler/circuit_builder.h" 21#include "ecmascript/compiler/gate_accessor.h" 22#include "ecmascript/compiler/graph_linearizer.h" 23#include "ecmascript/compiler/pass_manager.h" 24#include "ecmascript/compiler/share_gate_meta_data.h" 25#include "ecmascript/compiler/type_info_accessors.h" 26#include "ecmascript/js_dataview.h" 27 28namespace panda::ecmascript::kungfu { 29class NativeInlineLowering { 30public: 31 explicit NativeInlineLowering(Circuit *circuit, CompilationConfig* cmpCfg, PassContext *ctx, bool enableLog, 32 const std::string& name, Chunk *chunk) 33 : circuit_(circuit), 34 builder_(circuit, cmpCfg), 35 acc_(circuit), 36 glue_(acc_.GetGlueFromArgList()), 37 enableLog_(enableLog), 38 methodName_(name), 39 nocheck_(ctx->GetCompilationEnv()->GetJSOptions().IsCompilerNoCheck()), 40 traceInline_(ctx->GetCompilationEnv()->GetJSOptions().GetTraceInline()), 41 compilationEnv_(ctx->GetCompilationEnv()), 42 chunk_(chunk) {} 43 ~NativeInlineLowering() = default; 44 void RunNativeInlineLowering(); 45 46private: 47 enum IncludesOrIndexOf : uint8_t { INCLUDES = 0, INDEXOF }; 48 std::optional<std::pair<size_t, bool>> GetCallInfo(GateRef gate); 49 void TryInlineStringFromCharCode(GateRef gate, size_t argc, bool skipThis); 50 void TryInlineStringCharCodeAt(GateRef gate, size_t argc, bool skipThis); 51 void TryInlineStringSubstring(GateRef gate, size_t argc, bool skipThis); 52 void TryInlineStringSubStr(GateRef gate, size_t argc, bool skipThis); 53 void TryInlineStringSlice(GateRef gate, size_t argc, bool skipThis); 54 void TryInlineNumberIsFinite(GateRef gate, size_t argc, bool skipThis); 55 void TryInlineNumberIsInteger(GateRef gate, size_t argc, bool skipThis); 56 void TryInlineNumberIsNaN(GateRef gate, size_t argc, bool skipThis); 57 void TryInlineNumberParseFloat(GateRef gate, size_t argc, bool skipThis); 58 void TryInlineNumberParseInt(GateRef gate, size_t argc, bool skipThis); 59 void TryInlineNumberIsSafeInteger(GateRef gate, size_t argc, bool skipThis); 60 void TryInlineTypedArrayIteratorBuiltin(GateRef gate, BuiltinsStubCSigns::ID id, 61 const GateMetaData* op, bool skipThis); 62 void TryInlineMathUnaryBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 63 bool skipThis); 64 void TryInlineMathBinaryBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 65 bool skipThis); 66 void TryInlineMathImulBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 67 bool skipThis); 68 void TryInlineGlobalFiniteBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 69 bool skipThis); 70 void TryInlineGlobalNanBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 71 bool skipThis); 72 void TryInlineMathMinMaxBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 73 double defaultValue, bool skipThis); 74 void TryInlineMathAbsBuiltin(GateRef gate, size_t argc, bool skipThis); 75 void TryInlineMathClz32Builtin(GateRef gate, size_t argc, bool skipThis); 76 void TryInlineArrayBufferIsView(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 77 void TryInlineBigIntAsIntN(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 78 void TryInlineDataViewGet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 79 void TryInlineDataViewSet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 80 void InlineStubBuiltin(GateRef gate, size_t builtinArgc, size_t realArgc, BuiltinsStubCSigns::ID id, 81 const GateMetaData* op, bool skipThis); 82 void TryInlineDateGetTime(GateRef gate, size_t argc, bool skipThis); 83 void TryInlineWhitoutParamBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, 84 const GateMetaData* op, bool skipThis); 85 void TryInlineObjectIs(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 86 void TryInlineObjectGetPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 87 void TryInlineObjectGetProto(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 88 void TryInlineObjectCreate(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 89 void TryInlineObjectIsPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 90 void TryInlineObjectHasOwnProperty(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 91 void TryInlineReflectGetPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 92 void TryInlineReflectGet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 93 void TryInlineReflectHas(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 94 void TryInlineReflectConstruct(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 95 void TryInlineReflectApply(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 96 void TryInlineFunctionPrototypeApply(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 97 void TryInlineFunctionPrototypeBind(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 98 void TryInlineFunctionPrototypeCall(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 99 void TryInlineFunctionPrototypeHasInstance(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 100 101 void TryInlineBigIntConstructor(GateRef gate, size_t argc, bool skipThis); 102 void ReplaceGateWithPendingException(GateRef hirGate, GateRef value); 103 void AddTraceLogs(GateRef gate, BuiltinsStubCSigns::ID id); 104 void TryInlineIndexOfIncludes(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 105 void TryInlineArrayIterator(GateRef gate, BuiltinsStubCSigns::ID id, bool skipThis); 106 void TryInlineArrayForEach(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 107 void TryInlineArrayFindOrFindIndex(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 108 void TryInlineArrayFilter(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 109 void TryInlineArrayMap(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 110 void TryInlineArraySome(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 111 void TryInlineArrayEvery(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 112 void TryInlineArrayPop(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 113 void TryInlineArraySlice(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 114 void TryInlineArraySort(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 115 116 bool EnableLog() const 117 { 118 return enableLog_; 119 } 120 121 const std::string& GetMethodName() const 122 { 123 return methodName_; 124 } 125 126 bool Uncheck() const 127 { 128 return nocheck_; 129 } 130 131 bool EnableTrace() const 132 { 133 return traceInline_; 134 } 135 136private: 137 Circuit *circuit_ {nullptr}; 138 CircuitBuilder builder_; 139 GateAccessor acc_; 140 GateRef glue_; 141 bool enableLog_; 142 std::string methodName_; 143 bool nocheck_; 144 bool traceInline_; 145 const CompilationEnv *compilationEnv_ {nullptr}; 146 Chunk* chunk_ {nullptr}; 147}; 148} 149#endif // ECMASCRIPT_COMPILER_BUILTIN_INLINE_H 150