1 /* 2 * Copyright (c) 2023-2024 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_JIT_COMPILER_H 17 #define ECMASCRIPT_COMPILER_JIT_COMPILER_H 18 19 #include "ecmascript/compiler/pass_manager.h" 20 #include "ecmascript/compiler/jit_compilation_env.h" 21 #include "ecmascript/ecma_vm.h" 22 #include "ecmascript/jit/jit_task.h" 23 #include "ecmascript/js_runtime_options.h" 24 #include "ecmascript/pgo_profiler/pgo_profiler.h" 25 #include "ecmascript/compiler/baseline/baseline_compiler.h" 26 27 namespace panda::ecmascript::kungfu { 28 extern "C" { 29 PUBLIC_API void InitJitCompiler(JSRuntimeOptions options); 30 PUBLIC_API void *CreateJitCompilerTask(JitTask *jitTask); 31 PUBLIC_API bool JitCompile(void *compiler, JitTask *jitTask); 32 PUBLIC_API bool JitFinalize(void *compiler, JitTask *jitTask); 33 PUBLIC_API void DeleteJitCompile(void *handle); 34 }; 35 36 struct JitCompilationOptions { 37 JitCompilationOptions(JSRuntimeOptions options); 38 JitCompilationOptions() = default; 39 40 std::string triple_; 41 std::string outputFileName_; 42 size_t optLevel_; 43 size_t relocMode_; 44 std::string logOption_; 45 std::string logMethodsList_; 46 bool compilerLogTime_; 47 bool deviceIsScreenOff_; 48 uint32_t hotnessThreshold_; 49 std::string profilerIn_; 50 bool isEnableArrayBoundsCheckElimination_; 51 bool isEnableTypeLowering_; 52 bool isEnableEarlyElimination_; 53 bool isEnableLaterElimination_; 54 bool isEnableValueNumbering_; 55 bool isEnableOptInlining_; 56 bool isEnableOptString_; 57 bool isEnableOptPGOType_; 58 bool isEnableOptTrackField_; 59 bool isEnableOptLoopPeeling_; 60 bool isEnableOptOnHeapCheck_; 61 bool isEnableOptLoopInvariantCodeMotion_; 62 bool isEnableOptConstantFolding_; 63 bool isEnableLexenvSpecialization_; 64 bool isEnableNativeInline_; 65 bool isEnableLoweringBuiltin_; 66 }; 67 68 class JitCompilerTask final { 69 public: JitCompilerTask(JitTask * jitTask)70 JitCompilerTask(JitTask *jitTask) : jsFunction_(jitTask->GetJsFunction()), offset_(jitTask->GetOffset()), 71 jitCompilationEnv_(new JitCompilationEnv(jitTask->GetCompilerVM(), jitTask->GetHostVM(), jsFunction_)), 72 profileTypeInfo_(jitTask->GetProfileTypeInfo()), 73 compilerTier_(jitTask->GetCompilerTier()), baselineCompiler_(nullptr), 74 passManager_(nullptr), jitCodeGenerator_(nullptr) { }; 75 static JitCompilerTask *CreateJitCompilerTask(JitTask *jitTask); 76 77 bool Compile(); 78 bool Finalize(JitTask *jitTask); 79 80 void ReleaseJitPassManager(); 81 82 private: 83 JSHandle<JSFunction> jsFunction_; 84 int32_t offset_; 85 std::unique_ptr<JitCompilationEnv> jitCompilationEnv_; 86 JSHandle<ProfileTypeInfo> profileTypeInfo_; 87 CompilerTier compilerTier_; 88 std::unique_ptr<BaselineCompiler> baselineCompiler_; 89 std::unique_ptr<JitPassManager> passManager_; 90 // need refact AOTFileGenerator to JitCodeGenerator 91 std::unique_ptr<AOTFileGenerator> jitCodeGenerator_; 92 }; 93 94 class JitCompiler final { 95 public: JitCompiler(JSRuntimeOptions * options)96 explicit JitCompiler(JSRuntimeOptions *options) : jitOptions_(*options), 97 log_(jitOptions_.logOption_), 98 logList_(jitOptions_.logMethodsList_), 99 profilerDecoder_(jitOptions_.profilerIn_, jitOptions_.hotnessThreshold_) { } 100 ~JitCompiler() = default; 101 void Init(JSRuntimeOptions options); 102 103 static JitCompiler *GetInstance(JSRuntimeOptions *options = nullptr); GetJitOptions()104 JitCompilationOptions &GetJitOptions() 105 { 106 return jitOptions_; 107 } 108 GetCompilerLog()109 CompilerLog &GetCompilerLog() 110 { 111 return log_; 112 } 113 GetLogList()114 AotMethodLogList &GetLogList() 115 { 116 return logList_; 117 } 118 GetProfilerDecoder()119 PGOProfilerDecoder &GetProfilerDecoder() 120 { 121 return profilerDecoder_; 122 } GetPassOptions()123 PassOptions &GetPassOptions() 124 { 125 return passOptions_; 126 } 127 void UpdatePassOptions(CompilationEnv *env); 128 129 static ARK_INLINE bool AllocFromFortAndCopy(CompilationEnv &compilationEnv, MachineCodeDesc &desc); 130 private: 131 JitCompilationOptions jitOptions_; 132 CompilerLog log_; 133 AotMethodLogList logList_; 134 PGOProfilerDecoder profilerDecoder_; 135 PassOptions passOptions_; 136 }; 137 138 } // namespace panda::ecmascript::kungfu 139 #endif // ECMASCRIPT_COMPILER_JIT_COMPILER_H 140