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 28 namespace panda::ecmascript::kungfu { 29 class NativeInlineLowering { 30 public: NativeInlineLowering(Circuit * circuit,CompilationConfig * cmpCfg,PassContext * ctx,bool enableLog,const std::string & name,Chunk * chunk)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 enableMutantArray_(ctx->GetCompilationEnv()->GetJSOptions().IsEnableMutantArray()), 42 compilationEnv_(ctx->GetCompilationEnv()), 43 chunk_(chunk) {} 44 ~NativeInlineLowering() = default; 45 void RunNativeInlineLowering(); 46 47 private: 48 enum IncludesOrIndexOf : uint8_t { INCLUDES = 0, INDEXOF }; 49 std::optional<std::pair<size_t, bool>> GetCallInfo(GateRef gate); 50 void TryInlineStringFromCharCode(GateRef gate, size_t argc, bool skipThis); 51 void TryInlineStringCharCodeAt(GateRef gate, size_t argc, bool skipThis); 52 void TryInlineStringSubstring(GateRef gate, size_t argc, bool skipThis); 53 void TryInlineStringSubStr(GateRef gate, size_t argc, bool skipThis); 54 void TryInlineStringSlice(GateRef gate, size_t argc, bool skipThis); 55 void TryInlineNumberIsFinite(GateRef gate, size_t argc, bool skipThis); 56 void TryInlineNumberIsInteger(GateRef gate, size_t argc, bool skipThis); 57 void TryInlineNumberIsNaN(GateRef gate, size_t argc, bool skipThis); 58 void TryInlineNumberParseFloat(GateRef gate, size_t argc, bool skipThis); 59 void TryInlineNumberParseInt(GateRef gate, size_t argc, bool skipThis); 60 void TryInlineNumberIsSafeInteger(GateRef gate, size_t argc, bool skipThis); 61 void TryInlineTypedArrayIteratorBuiltin(GateRef gate, BuiltinsStubCSigns::ID id, 62 const GateMetaData* op, bool skipThis); 63 void TryInlineMathUnaryBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 64 bool skipThis); 65 void TryInlineMathBinaryBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 66 bool skipThis); 67 void TryInlineMathImulBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 68 bool skipThis); 69 void TryInlineGlobalFiniteBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 70 bool skipThis); 71 void TryInlineGlobalNanBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 72 bool skipThis); 73 void TryInlineMathMinMaxBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op, 74 double defaultValue, bool skipThis); 75 void TryInlineMathAbsBuiltin(GateRef gate, size_t argc, bool skipThis); 76 void TryInlineMathClz32Builtin(GateRef gate, size_t argc, bool skipThis); 77 void TryInlineArrayBufferIsView(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 78 void TryInlineBigIntAsIntN(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 79 void TryInlineDataViewGet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 80 void TryInlineDataViewSet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 81 void InlineStubBuiltin(GateRef gate, size_t builtinArgc, size_t realArgc, BuiltinsStubCSigns::ID id, 82 const GateMetaData* op, bool skipThis); 83 void TryInlineDateGetTime(GateRef gate, size_t argc, bool skipThis); 84 void TryInlineWhitoutParamBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, 85 const GateMetaData* op, bool skipThis); 86 void TryInlineObjectIs(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 87 void TryInlineObjectGetPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 88 void TryInlineObjectGetProto(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 89 void TryInlineObjectCreate(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 90 void TryInlineObjectIsPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 91 void TryInlineObjectHasOwnProperty(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 92 void TryInlineReflectGetPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 93 void TryInlineReflectGet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 94 void TryInlineReflectHas(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 95 void TryInlineReflectConstruct(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 96 void TryInlineReflectApply(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 97 void TryInlineFunctionPrototypeApply(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 98 void TryInlineFunctionPrototypeBind(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 99 void TryInlineFunctionPrototypeCall(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 100 void TryInlineFunctionPrototypeHasInstance(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 101 102 void TryInlineBigIntConstructor(GateRef gate, size_t argc, bool skipThis); 103 void ReplaceGateWithPendingException(GateRef hirGate, GateRef value); 104 void AddTraceLogs(GateRef gate, BuiltinsStubCSigns::ID id); 105 void TryInlineIndexOfIncludes(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 106 void TryInlineArrayIterator(GateRef gate, BuiltinsStubCSigns::ID id, bool skipThis); 107 void TryInlineArrayForEach(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 108 void TryInlineArrayFindOrFindIndex(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 109 void TryInlineArrayFilter(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 110 void TryInlineArrayMap(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 111 void TryInlineArraySome(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 112 void TryInlineArrayEvery(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 113 void TryInlineArrayPop(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 114 void TryInlineArrayPush(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 115 void TryInlineArraySlice(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 116 void TryInlineArraySort(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis); 117 EnableLog()118 bool EnableLog() const 119 { 120 return enableLog_; 121 } 122 GetMethodName()123 const std::string& GetMethodName() const 124 { 125 return methodName_; 126 } 127 Uncheck()128 bool Uncheck() const 129 { 130 return nocheck_; 131 } 132 EnableTrace()133 bool EnableTrace() const 134 { 135 return traceInline_; 136 } 137 138 private: 139 Circuit *circuit_ {nullptr}; 140 CircuitBuilder builder_; 141 GateAccessor acc_; 142 GateRef glue_; 143 bool enableLog_; 144 std::string methodName_; 145 bool nocheck_; 146 bool traceInline_; 147 bool enableMutantArray_; 148 const CompilationEnv *compilationEnv_ {nullptr}; 149 Chunk* chunk_ {nullptr}; 150 }; 151 } 152 #endif // ECMASCRIPT_COMPILER_BUILTIN_INLINE_H 153