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/jit_compilation_env.h" 20 #include "ecmascript/compiler/pass_manager.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 DeleteJitCompilerTask(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 int32_t deviceThermalLevel_; 50 std::string profilerIn_; 51 bool isEnableArrayBoundsCheckElimination_; 52 bool isEnableTypeLowering_; 53 bool isEnableEarlyElimination_; 54 bool isEnableLaterElimination_; 55 bool isEnableValueNumbering_; 56 bool isEnableOptInlining_; 57 bool isEnableOptString_; 58 bool isEnableOptPGOType_; 59 bool isEnableOptTrackField_; 60 bool isEnableOptLoopPeeling_; 61 bool isEnableOptOnHeapCheck_; 62 bool isEnableOptLoopInvariantCodeMotion_; 63 bool isEnableOptConstantFolding_; 64 bool isEnableLexenvSpecialization_; 65 bool isEnableNativeInline_; 66 bool isEnableLoweringBuiltin_; 67 bool isEnableLazyDeopt_; 68 }; 69 70 class JitCompilerTask final { 71 public: JitCompilerTask(JitTask * jitTask)72 JitCompilerTask(JitTask *jitTask) : jsFunction_(jitTask->GetJsFunction()), offset_(jitTask->GetOffset()), 73 jitCompilationEnv_(new JitCompilationEnv(jitTask->GetCompilerVM(), 74 jitTask->GetHostVM(), jsFunction_, jitTask->GetDependencies())), 75 profileTypeInfo_(jitTask->GetProfileTypeInfo()), 76 compilerTier_(jitTask->GetCompilerTier()), 77 baselineCompiler_(nullptr), passManager_(nullptr), jitCodeGenerator_(nullptr) { }; 78 static JitCompilerTask *CreateJitCompilerTask(JitTask *jitTask); 79 80 bool Compile(); 81 bool Finalize(JitTask *jitTask); 82 83 void ReleaseJitPassManager(); 84 85 private: 86 JSHandle<JSFunction> jsFunction_; 87 int32_t offset_; 88 std::unique_ptr<JitCompilationEnv> jitCompilationEnv_; 89 JSHandle<ProfileTypeInfo> profileTypeInfo_; 90 CompilerTier compilerTier_; 91 std::unique_ptr<BaselineCompiler> baselineCompiler_; 92 std::unique_ptr<JitPassManager> passManager_; 93 // need refact AOTFileGenerator to JitCodeGenerator 94 std::unique_ptr<AOTFileGenerator> jitCodeGenerator_; 95 }; 96 97 class JitCompiler final { 98 public: JitCompiler(JSRuntimeOptions * options)99 explicit JitCompiler(JSRuntimeOptions *options) : jitOptions_(*options), 100 log_(jitOptions_.logOption_), 101 logList_(jitOptions_.logMethodsList_), 102 profilerDecoder_(jitOptions_.profilerIn_, jitOptions_.hotnessThreshold_) { } 103 ~JitCompiler() = default; 104 void Init(JSRuntimeOptions options); 105 106 static JitCompiler *GetInstance(JSRuntimeOptions *options = nullptr); GetJitOptions()107 JitCompilationOptions &GetJitOptions() 108 { 109 return jitOptions_; 110 } 111 GetCompilerLog()112 CompilerLog &GetCompilerLog() 113 { 114 return log_; 115 } 116 GetLogList()117 AotMethodLogList &GetLogList() 118 { 119 return logList_; 120 } 121 GetProfilerDecoder()122 PGOProfilerDecoder &GetProfilerDecoder() 123 { 124 return profilerDecoder_; 125 } GetPassOptions()126 PassOptions &GetPassOptions() 127 { 128 return passOptions_; 129 } 130 void UpdatePassOptions(CompilationEnv *env); 131 132 static ARK_INLINE bool AllocFromFortAndCopy(CompilationEnv &compilationEnv, MachineCodeDesc &desc); 133 private: 134 JitCompilationOptions jitOptions_; 135 CompilerLog log_; 136 AotMethodLogList logList_; 137 PGOProfilerDecoder profilerDecoder_; 138 PassOptions passOptions_; 139 }; 140 141 } // namespace panda::ecmascript::kungfu 142 #endif // ECMASCRIPT_COMPILER_JIT_COMPILER_H 143