1/* 2 * Copyright (c) 2022 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#include "ecmascript/compiler/compilation_driver.h" 17 18#include "ecmascript/compiler/file_generators.h" 19#include "ecmascript/compiler/pgo_type/pgo_type_manager.h" 20#include "ecmascript/jspandafile/method_literal.h" 21 22namespace panda::ecmascript::kungfu { 23CompilationDriver::CompilationDriver(PGOProfilerDecoder &profilerDecoder, 24 BytecodeInfoCollector *collector, 25 AOTFileGenerator *fileGenerator, 26 const std::string &fileName, 27 const std::string &triple, 28 LOptions *lOptions, 29 CompilerLog *log, 30 bool outputAsm, 31 size_t maxMethodsInModule) 32 : compilationEnv_(collector->GetCompilationEnv()), 33 jsPandaFile_(collector->GetJSPandaFile()), 34 pfDecoder_(profilerDecoder), 35 collector_(collector), 36 bytecodeInfo_(collector->GetBytecodeInfo()), 37 fileGenerator_(fileGenerator), 38 fileName_(fileName), 39 triple_(triple), 40 lOptions_(lOptions), 41 log_(log), 42 outputAsm_(outputAsm), 43 maxMethodsInModule_(maxMethodsInModule) 44{ 45} 46 47Module *CompilationDriver::GetModule() 48{ 49 return IsCurModuleFull() ? fileGenerator_->AddModule(fileName_, triple_, *lOptions_, outputAsm_) 50 : fileGenerator_->GetLatestModule(); 51} 52 53void CompilationDriver::IncCompiledMethod() 54{ 55 compiledMethodCnt_++; 56} 57 58bool CompilationDriver::IsCurModuleFull() const 59{ 60 return (compiledMethodCnt_ % maxMethodsInModule_ == 0); 61} 62 63void CompilationDriver::CompileModuleThenDestroyIfNeeded(bool isJitAndCodeSign) 64{ 65 if (IsCurModuleFull()) { 66 fileGenerator_->CompileLatestModuleThenDestroy(isJitAndCodeSign); 67 } 68} 69 70void CompilationDriver::CompileLastModuleThenDestroyIfNeeded() 71{ 72 if (!IsCurModuleFull()) { 73 fileGenerator_->CompileLatestModuleThenDestroy(); 74 } 75} 76 77std::vector<std::string> CompilationDriver::SplitString(const std::string &str, const char ch) const 78{ 79 std::vector<std::string> vec {}; 80 std::istringstream sstr(str.c_str()); 81 std::string split; 82 while (getline(sstr, split, ch)) { 83 vec.emplace_back(split); 84 } 85 return vec; 86} 87 88void CompilationDriver::SetCurrentCompilationFile() const 89{ 90 PGOTypeManager *ptManager = compilationEnv_->GetPTManager(); 91 ptManager->SetCurCompilationFile(jsPandaFile_); 92} 93 94void CompilationDriver::StoreConstantPoolInfo() const 95{ 96 auto &methodList = bytecodeInfo_.GetMethodList(); 97 for (auto &x : methodList) { 98 if (!bytecodeInfo_.FindMethodOffsetToRecordName(x.first)) { 99 bytecodeInfo_.AddSkippedMethod(x.first); 100 } 101 } 102 PGOTypeManager *ptManager = compilationEnv_->GetPTManager(); 103 ptManager->GetAOTSnapshot().StoreConstantPoolInfo(collector_); 104} 105 106bool JitCompilationDriver::RunCg() 107{ 108 IncCompiledMethod(); 109 bool enableCodeSign = !compilationEnv_->GetJSOptions().GetDisableCodeSign(); 110 CompileModuleThenDestroyIfNeeded(enableCodeSign); // isJit AND !DisabelCodeSign 111 return true; 112} 113 114Module *JitCompilationDriver::GetModule() 115{ 116 return IsCurModuleFull() ? fileGenerator_->AddModule(fileName_, triple_, *lOptions_, outputAsm_, true) : 117 fileGenerator_->GetLatestModule(); 118} 119} // namespace panda::ecmascript::kungfu 120