14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci#include "ecmascript/compiler/aot_file/aot_file_manager.h" 164514f5e3Sopenharmony_ci 174514f5e3Sopenharmony_ci#include <utility> 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/compiler/aot_snapshot/aot_snapshot_constants.h" 204514f5e3Sopenharmony_ci#include "ecmascript/js_file_path.h" 214514f5e3Sopenharmony_ci#include "ecmascript/ohos/framework_helper.h" 224514f5e3Sopenharmony_ci#include "ecmascript/ohos/ohos_preload_app_info.h" 234514f5e3Sopenharmony_ci#include "ecmascript/snapshot/mem/snapshot.h" 244514f5e3Sopenharmony_ci#include "ecmascript/stackmap/ark_stackmap_parser.h" 254514f5e3Sopenharmony_ci 264514f5e3Sopenharmony_cinamespace panda::ecmascript { 274514f5e3Sopenharmony_ciusing CommonStubCSigns = kungfu::CommonStubCSigns; 284514f5e3Sopenharmony_ciusing BytecodeStubCSigns = kungfu::BytecodeStubCSigns; 294514f5e3Sopenharmony_ciusing SnapshotGlobalData = kungfu::SnapshotGlobalData; 304514f5e3Sopenharmony_ci 314514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM) 324514f5e3Sopenharmony_ciJsAotReaderCallback AOTFileManager::jsAotReader_ = nullptr; 334514f5e3Sopenharmony_ci#endif 344514f5e3Sopenharmony_ci 354514f5e3Sopenharmony_civoid AOTLiteralInfo::InitializeWithSpecialValue(JSTaggedValue initValue, uint32_t capacity, uint32_t extraLength) 364514f5e3Sopenharmony_ci{ 374514f5e3Sopenharmony_ci TaggedArray::InitializeWithSpecialValue(initValue, capacity + RESERVED_LENGTH, extraLength); 384514f5e3Sopenharmony_ci SetIhc(JSTaggedValue::Undefined()); 394514f5e3Sopenharmony_ci SetChc(JSTaggedValue::Undefined()); 404514f5e3Sopenharmony_ci SetLiteralType(JSTaggedValue(INVALID_LITERAL_TYPE)); 414514f5e3Sopenharmony_ci} 424514f5e3Sopenharmony_ci 434514f5e3Sopenharmony_civoid AOTLiteralInfo::SetObjectToCache(JSThread *thread, uint32_t index, JSTaggedValue value) 444514f5e3Sopenharmony_ci{ 454514f5e3Sopenharmony_ci Set(thread, index, value); 464514f5e3Sopenharmony_ci} 474514f5e3Sopenharmony_ci 484514f5e3Sopenharmony_civoid AOTFileManager::Iterate(const RootVisitor &v) 494514f5e3Sopenharmony_ci{ 504514f5e3Sopenharmony_ci for (auto &iter : aiDatum_) { 514514f5e3Sopenharmony_ci auto &aiData = iter.second; 524514f5e3Sopenharmony_ci for (auto &eachFileData : aiData) { 534514f5e3Sopenharmony_ci auto &cpMap = eachFileData.second.multiCpsMap_; 544514f5e3Sopenharmony_ci for (auto &eachCpPair : cpMap) { 554514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&eachCpPair.second))); 564514f5e3Sopenharmony_ci } 574514f5e3Sopenharmony_ci } 584514f5e3Sopenharmony_ci } 594514f5e3Sopenharmony_ci} 604514f5e3Sopenharmony_ci 614514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM) 624514f5e3Sopenharmony_civoid AOTFileManager::SetJsAotReader(JsAotReaderCallback cb) 634514f5e3Sopenharmony_ci{ 644514f5e3Sopenharmony_ci jsAotReader_ = cb; 654514f5e3Sopenharmony_ci} 664514f5e3Sopenharmony_ci 674514f5e3Sopenharmony_ciJsAotReaderCallback AOTFileManager::GetJsAotReader() 684514f5e3Sopenharmony_ci{ 694514f5e3Sopenharmony_ci return jsAotReader_; 704514f5e3Sopenharmony_ci} 714514f5e3Sopenharmony_ci#endif 724514f5e3Sopenharmony_ci 734514f5e3Sopenharmony_cibool AOTFileManager::AOTFileExist(const std::string &aotFileName, const std::string &extension) 744514f5e3Sopenharmony_ci{ 754514f5e3Sopenharmony_ci std::string realPath; 764514f5e3Sopenharmony_ci std::string filename = aotFileName + extension; 774514f5e3Sopenharmony_ci if (!RealPath(filename, realPath, false)) { 784514f5e3Sopenharmony_ci return false; 794514f5e3Sopenharmony_ci } 804514f5e3Sopenharmony_ci return FileExist(realPath.c_str()); 814514f5e3Sopenharmony_ci} 824514f5e3Sopenharmony_ci 834514f5e3Sopenharmony_civoid AOTFileManager::DumpAOTInfo() 844514f5e3Sopenharmony_ci{ 854514f5e3Sopenharmony_ci AnFileDataManager *m = AnFileDataManager::GetInstance(); 864514f5e3Sopenharmony_ci m->Dump(); 874514f5e3Sopenharmony_ci} 884514f5e3Sopenharmony_ci 894514f5e3Sopenharmony_civoid AOTFileManager::LoadStubFile(const std::string &fileName) 904514f5e3Sopenharmony_ci{ 914514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 924514f5e3Sopenharmony_ci if (!anFileDataManager->SafeLoad(fileName, AnFileDataManager::Type::STUB)) { 934514f5e3Sopenharmony_ci return; 944514f5e3Sopenharmony_ci } 954514f5e3Sopenharmony_ci auto info = anFileDataManager->SafeGetStubFileInfo(); 964514f5e3Sopenharmony_ci auto stubs = info->GetStubs(); 974514f5e3Sopenharmony_ci InitializeStubEntries(stubs); 984514f5e3Sopenharmony_ci} 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_cibool AOTFileManager::LoadAnFile(const std::string &fileName) 1014514f5e3Sopenharmony_ci{ 1024514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 1034514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM) 1044514f5e3Sopenharmony_ci return anFileDataManager->SafeLoad(fileName, AnFileDataManager::Type::AOT, GetJsAotReader()); 1054514f5e3Sopenharmony_ci#else 1064514f5e3Sopenharmony_ci return anFileDataManager->SafeLoad(fileName, AnFileDataManager::Type::AOT); 1074514f5e3Sopenharmony_ci#endif 1084514f5e3Sopenharmony_ci} 1094514f5e3Sopenharmony_ci 1104514f5e3Sopenharmony_cibool AOTFileManager::LoadAiFile([[maybe_unused]] const std::string &filename) 1114514f5e3Sopenharmony_ci{ 1124514f5e3Sopenharmony_ci Snapshot snapshot(vm_); 1134514f5e3Sopenharmony_ci#if !WIN_OR_MAC_OR_IOS_PLATFORM 1144514f5e3Sopenharmony_ci #if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM) 1154514f5e3Sopenharmony_ci return snapshot.Deserialize(SnapshotType::AI, filename.c_str(), GetJsAotReader()); 1164514f5e3Sopenharmony_ci #else 1174514f5e3Sopenharmony_ci return snapshot.Deserialize(SnapshotType::AI, filename.c_str()); 1184514f5e3Sopenharmony_ci #endif 1194514f5e3Sopenharmony_ci#else 1204514f5e3Sopenharmony_ci return true; 1214514f5e3Sopenharmony_ci#endif 1224514f5e3Sopenharmony_ci} 1234514f5e3Sopenharmony_ci 1244514f5e3Sopenharmony_cibool AOTFileManager::LoadAiFile(const JSPandaFile *jsPandaFile) 1254514f5e3Sopenharmony_ci{ 1264514f5e3Sopenharmony_ci uint32_t anFileInfoIndex = jsPandaFile->GetAOTFileInfoIndex(); 1274514f5e3Sopenharmony_ci // this abc file does not have corresponding an file 1284514f5e3Sopenharmony_ci if (anFileInfoIndex == INVALID_INDEX) { 1294514f5e3Sopenharmony_ci return false; 1304514f5e3Sopenharmony_ci } 1314514f5e3Sopenharmony_ci 1324514f5e3Sopenharmony_ci auto iter = aiDatum_.find(anFileInfoIndex); 1334514f5e3Sopenharmony_ci // already loaded 1344514f5e3Sopenharmony_ci if (iter != aiDatum_.end()) { 1354514f5e3Sopenharmony_ci return false; 1364514f5e3Sopenharmony_ci } 1374514f5e3Sopenharmony_ci 1384514f5e3Sopenharmony_ci std::string aiFilename = ""; 1394514f5e3Sopenharmony_ci // device side aot compile success 1404514f5e3Sopenharmony_ci if (AnFileDataManager::GetInstance()->IsEnable()) { 1414514f5e3Sopenharmony_ci std::string moduleName(vm_->GetModuleName()); 1424514f5e3Sopenharmony_ci std::string aotFileName; 1434514f5e3Sopenharmony_ci JSNApi::LoadAotFileInternal(vm_, moduleName, aotFileName); 1444514f5e3Sopenharmony_ci aiFilename = aotFileName + FILE_EXTENSION_AI; 1454514f5e3Sopenharmony_ci } else { 1464514f5e3Sopenharmony_ci std::string moduleName = JSFilePath::GetHapName(jsPandaFile); 1474514f5e3Sopenharmony_ci std::string hapPath = jsPandaFile->GetJSPandaFileHapPath().c_str(); 1484514f5e3Sopenharmony_ci aiFilename = OhosPreloadAppInfo::GetPreloadAOTFileName(hapPath, moduleName) + FILE_EXTENSION_AI; 1494514f5e3Sopenharmony_ci } 1504514f5e3Sopenharmony_ci 1514514f5e3Sopenharmony_ci if (aiFilename.empty()) { 1524514f5e3Sopenharmony_ci LOG_ECMA(INFO) << "current thread can not find ai file"; 1534514f5e3Sopenharmony_ci return false; 1544514f5e3Sopenharmony_ci } 1554514f5e3Sopenharmony_ci 1564514f5e3Sopenharmony_ci LoadAiFile(aiFilename); 1574514f5e3Sopenharmony_ci return true; 1584514f5e3Sopenharmony_ci} 1594514f5e3Sopenharmony_ci 1604514f5e3Sopenharmony_ciconst std::shared_ptr<AnFileInfo> AOTFileManager::GetAnFileInfo(const JSPandaFile *jsPandaFile) const 1614514f5e3Sopenharmony_ci{ 1624514f5e3Sopenharmony_ci uint32_t index = jsPandaFile->GetAOTFileInfoIndex(); 1634514f5e3Sopenharmony_ci if (index == INVALID_INDEX) { 1644514f5e3Sopenharmony_ci return nullptr; 1654514f5e3Sopenharmony_ci } 1664514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 1674514f5e3Sopenharmony_ci return anFileDataManager->SafeGetAnFileInfo(index); 1684514f5e3Sopenharmony_ci} 1694514f5e3Sopenharmony_ci 1704514f5e3Sopenharmony_ciuint32_t AOTFileManager::GetFileIndex(uint32_t anFileInfoIndex, CString abcNormalizedName) const 1714514f5e3Sopenharmony_ci{ 1724514f5e3Sopenharmony_ci auto fileIndex = INVALID_INDEX; 1734514f5e3Sopenharmony_ci if (abcNormalizedName.find(JSFilePath::GetBaseName(STUB_AN_FILE)) == std::string::npos) { 1744514f5e3Sopenharmony_ci auto aiDatumIter = aiDatum_.find(anFileInfoIndex); 1754514f5e3Sopenharmony_ci if (aiDatumIter == aiDatum_.end()) { 1764514f5e3Sopenharmony_ci return INVALID_INDEX; 1774514f5e3Sopenharmony_ci } 1784514f5e3Sopenharmony_ci 1794514f5e3Sopenharmony_ci auto fileIter = aiDatumIter->second.find(abcNormalizedName); 1804514f5e3Sopenharmony_ci if (fileIter == aiDatumIter->second.end()) { 1814514f5e3Sopenharmony_ci return INVALID_INDEX; 1824514f5e3Sopenharmony_ci } 1834514f5e3Sopenharmony_ci fileIndex = fileIter->second.fileIndex_; 1844514f5e3Sopenharmony_ci } else { 1854514f5e3Sopenharmony_ci fileIndex = STUB_FILE_INDEX; 1864514f5e3Sopenharmony_ci } 1874514f5e3Sopenharmony_ci return fileIndex; 1884514f5e3Sopenharmony_ci} 1894514f5e3Sopenharmony_ci 1904514f5e3Sopenharmony_cibool AOTFileManager::IsLoadMain(const JSPandaFile *jsPandaFile, const CString &entry) const 1914514f5e3Sopenharmony_ci{ 1924514f5e3Sopenharmony_ci if (!jsPandaFile->IsLoadedAOT()) { 1934514f5e3Sopenharmony_ci return false; 1944514f5e3Sopenharmony_ci } 1954514f5e3Sopenharmony_ci 1964514f5e3Sopenharmony_ci const std::shared_ptr<AnFileInfo> anFileInfo = GetAnFileInfo(jsPandaFile); 1974514f5e3Sopenharmony_ci if (anFileInfo == nullptr) { 1984514f5e3Sopenharmony_ci return false; 1994514f5e3Sopenharmony_ci } 2004514f5e3Sopenharmony_ci 2014514f5e3Sopenharmony_ci auto fileIndex = GetFileIndex(jsPandaFile->GetAOTFileInfoIndex(), jsPandaFile->GetNormalizedFileDesc().c_str()); 2024514f5e3Sopenharmony_ci if (fileIndex == INVALID_INDEX) { 2034514f5e3Sopenharmony_ci return false; 2044514f5e3Sopenharmony_ci } 2054514f5e3Sopenharmony_ci return anFileInfo->IsLoadMain(fileIndex, jsPandaFile, entry); 2064514f5e3Sopenharmony_ci} 2074514f5e3Sopenharmony_ci 2084514f5e3Sopenharmony_cistd::list<CString> AOTFileManager::GetPandaFiles(uint32_t aotFileInfoIndex) 2094514f5e3Sopenharmony_ci{ 2104514f5e3Sopenharmony_ci std::list<CString> abcFilesList {}; 2114514f5e3Sopenharmony_ci auto aiDatumIter = aiDatum_.find(aotFileInfoIndex); 2124514f5e3Sopenharmony_ci if (aiDatumIter == aiDatum_.end()) { 2134514f5e3Sopenharmony_ci return abcFilesList; 2144514f5e3Sopenharmony_ci } 2154514f5e3Sopenharmony_ci for (const auto& nameIter : aiDatumIter->second) { 2164514f5e3Sopenharmony_ci abcFilesList.push_back(nameIter.first); 2174514f5e3Sopenharmony_ci } 2184514f5e3Sopenharmony_ci return abcFilesList; 2194514f5e3Sopenharmony_ci} 2204514f5e3Sopenharmony_ci 2214514f5e3Sopenharmony_civoid AOTFileManager::BindPreloadedPandaFilesInAotFile(const std::string &moduleName) 2224514f5e3Sopenharmony_ci{ 2234514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 2244514f5e3Sopenharmony_ci uint32_t aotFileInfoIndex = anFileDataManager->SafeGetFileInfoIndex(moduleName + FILE_EXTENSION_AN); 2254514f5e3Sopenharmony_ci if (aotFileInfoIndex == INVALID_INDEX) { 2264514f5e3Sopenharmony_ci return; 2274514f5e3Sopenharmony_ci } 2284514f5e3Sopenharmony_ci auto abcFiles = GetPandaFiles(aotFileInfoIndex); 2294514f5e3Sopenharmony_ci for (const auto &abcNormalizedName : abcFiles) { 2304514f5e3Sopenharmony_ci const auto abcFile = JSPandaFileManager::GetInstance()->FindJSPandaFileByNormalizedName(abcNormalizedName); 2314514f5e3Sopenharmony_ci if (!abcFile) { 2324514f5e3Sopenharmony_ci LOG_ECMA(WARN) << "Can not find file: " << abcNormalizedName << " in module: " << moduleName; 2334514f5e3Sopenharmony_ci continue; 2344514f5e3Sopenharmony_ci } 2354514f5e3Sopenharmony_ci if (!abcFile->IsLoadedAOT()) { 2364514f5e3Sopenharmony_ci abcFile->SetAOTFileInfoIndex(aotFileInfoIndex); 2374514f5e3Sopenharmony_ci LOG_ECMA(INFO) << "Bind file: " << abcNormalizedName << ", aotFileInfoIndex: " << aotFileInfoIndex 2384514f5e3Sopenharmony_ci << " in module: " << moduleName; 2394514f5e3Sopenharmony_ci } 2404514f5e3Sopenharmony_ci } 2414514f5e3Sopenharmony_ci} 2424514f5e3Sopenharmony_ci 2434514f5e3Sopenharmony_cibool AOTFileManager::HasPandaFile(uint32_t aotFileInfoIndex, const CString &abcNormalizedName) const 2444514f5e3Sopenharmony_ci{ 2454514f5e3Sopenharmony_ci auto aiDatumIter = aiDatum_.find(aotFileInfoIndex); 2464514f5e3Sopenharmony_ci if (aiDatumIter == aiDatum_.end()) { 2474514f5e3Sopenharmony_ci return false; 2484514f5e3Sopenharmony_ci } 2494514f5e3Sopenharmony_ci auto pandaCPIter = aiDatumIter->second.find(abcNormalizedName); 2504514f5e3Sopenharmony_ci return pandaCPIter != aiDatumIter->second.end(); 2514514f5e3Sopenharmony_ci} 2524514f5e3Sopenharmony_ci 2534514f5e3Sopenharmony_civoid AOTFileManager::BindPandaFileInAotFile(const std::string &aotFileBaseName, JSPandaFile *jsPandaFile) const 2544514f5e3Sopenharmony_ci{ 2554514f5e3Sopenharmony_ci if (jsPandaFile->IsLoadedAOT()) { 2564514f5e3Sopenharmony_ci // already loaded. 2574514f5e3Sopenharmony_ci return; 2584514f5e3Sopenharmony_ci } 2594514f5e3Sopenharmony_ci 2604514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 2614514f5e3Sopenharmony_ci if (!anFileDataManager->IsEnable()) { 2624514f5e3Sopenharmony_ci return; 2634514f5e3Sopenharmony_ci } 2644514f5e3Sopenharmony_ci uint32_t aotFileInfoIndex = anFileDataManager->SafeGetFileInfoIndex(aotFileBaseName + FILE_EXTENSION_AN); 2654514f5e3Sopenharmony_ci if (aotFileInfoIndex == INVALID_INDEX) { 2664514f5e3Sopenharmony_ci LOG_ECMA(WARN) << "Bind panda file to AOT failed. AOT file not found for " << aotFileBaseName; 2674514f5e3Sopenharmony_ci return; 2684514f5e3Sopenharmony_ci } 2694514f5e3Sopenharmony_ci CString abcNormalizedName(jsPandaFile->GetNormalizedFileDesc()); 2704514f5e3Sopenharmony_ci if (!HasPandaFile(aotFileInfoIndex, abcNormalizedName)) { 2714514f5e3Sopenharmony_ci // not existed in an file. 2724514f5e3Sopenharmony_ci LOG_ECMA(WARN) << "Bind panda file to AOT failed. " << abcNormalizedName << " not found for " 2734514f5e3Sopenharmony_ci << aotFileBaseName; 2744514f5e3Sopenharmony_ci return; 2754514f5e3Sopenharmony_ci } 2764514f5e3Sopenharmony_ci jsPandaFile->SetAOTFileInfoIndex(aotFileInfoIndex); 2774514f5e3Sopenharmony_ci LOG_ECMA(INFO) << "Bind file: " << abcNormalizedName << ", aotFileInfoIndex: " << aotFileInfoIndex 2784514f5e3Sopenharmony_ci << " in aotFileBaseName: " << aotFileBaseName; 2794514f5e3Sopenharmony_ci} 2804514f5e3Sopenharmony_ci 2814514f5e3Sopenharmony_ciuint32_t AOTFileManager::GetAnFileIndex(const JSPandaFile *jsPandaFile) const 2824514f5e3Sopenharmony_ci{ 2834514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 2844514f5e3Sopenharmony_ci 2854514f5e3Sopenharmony_ci // run via command line 2864514f5e3Sopenharmony_ci if (vm_->GetJSOptions().WasAOTOutputFileSet()) { 2874514f5e3Sopenharmony_ci std::string jsPandaFileDesc = jsPandaFile->GetJSPandaFileDesc().c_str(); 2884514f5e3Sopenharmony_ci std::string baseName = JSFilePath::GetFileName(jsPandaFileDesc); 2894514f5e3Sopenharmony_ci if (baseName.empty()) { 2904514f5e3Sopenharmony_ci return INVALID_INDEX; 2914514f5e3Sopenharmony_ci } 2924514f5e3Sopenharmony_ci std::string anFileName = baseName + FILE_EXTENSION_AN; 2934514f5e3Sopenharmony_ci return anFileDataManager->SafeGetFileInfoIndex(anFileName); 2944514f5e3Sopenharmony_ci } 2954514f5e3Sopenharmony_ci 2964514f5e3Sopenharmony_ci // run from app hap 2974514f5e3Sopenharmony_ci std::string hapName = JSFilePath::GetHapName(jsPandaFile); 2984514f5e3Sopenharmony_ci if (hapName.empty()) { 2994514f5e3Sopenharmony_ci return INVALID_INDEX; 3004514f5e3Sopenharmony_ci } 3014514f5e3Sopenharmony_ci std::string anFileName = hapName + FILE_EXTENSION_AN; 3024514f5e3Sopenharmony_ci return anFileDataManager->SafeGetFileInfoIndex(anFileName); 3034514f5e3Sopenharmony_ci} 3044514f5e3Sopenharmony_ci 3054514f5e3Sopenharmony_cibool AOTFileManager::TryReadLock() 3064514f5e3Sopenharmony_ci{ 3074514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3084514f5e3Sopenharmony_ci return anFileDataManager->SafeTryReadLock(); 3094514f5e3Sopenharmony_ci} 3104514f5e3Sopenharmony_ci 3114514f5e3Sopenharmony_cibool AOTFileManager::IsEnableAOT() const 3124514f5e3Sopenharmony_ci{ 3134514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3144514f5e3Sopenharmony_ci return anFileDataManager->IsEnable(); 3154514f5e3Sopenharmony_ci} 3164514f5e3Sopenharmony_ci 3174514f5e3Sopenharmony_cibool AOTFileManager::InsideStub(uintptr_t pc) 3184514f5e3Sopenharmony_ci{ 3194514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3204514f5e3Sopenharmony_ci return anFileDataManager->SafeInsideStub(pc); 3214514f5e3Sopenharmony_ci} 3224514f5e3Sopenharmony_ci 3234514f5e3Sopenharmony_cibool AOTFileManager::InsideAOT(uintptr_t pc) 3244514f5e3Sopenharmony_ci{ 3254514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3264514f5e3Sopenharmony_ci return anFileDataManager->SafeInsideAOT(pc); 3274514f5e3Sopenharmony_ci} 3284514f5e3Sopenharmony_ci 3294514f5e3Sopenharmony_ciAOTFileInfo::CallSiteInfo AOTFileManager::CalCallSiteInfo(uintptr_t retAddr, bool isDeopt) 3304514f5e3Sopenharmony_ci{ 3314514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3324514f5e3Sopenharmony_ci return anFileDataManager->SafeCalCallSiteInfo(retAddr, isDeopt); 3334514f5e3Sopenharmony_ci} 3344514f5e3Sopenharmony_ci 3354514f5e3Sopenharmony_civoid AOTFileManager::PrintAOTEntry(const JSPandaFile *file, const Method *method, uintptr_t entry) 3364514f5e3Sopenharmony_ci{ 3374514f5e3Sopenharmony_ci uint32_t mId = method->GetMethodId().GetOffset(); 3384514f5e3Sopenharmony_ci std::string mName = method->GetMethodName(file); 3394514f5e3Sopenharmony_ci auto &fileName = file->GetJSPandaFileDesc(); 3404514f5e3Sopenharmony_ci LOG_COMPILER(INFO) << "Bind " << mName << "@" << mId << "@" << fileName 3414514f5e3Sopenharmony_ci << " -> AOT-Entry = " << reinterpret_cast<void *>(entry); 3424514f5e3Sopenharmony_ci} 3434514f5e3Sopenharmony_ci 3444514f5e3Sopenharmony_civoid AOTFileManager::SetAOTMainFuncEntry(JSHandle<JSFunction> mainFunc, const JSPandaFile *jsPandaFile, 3454514f5e3Sopenharmony_ci std::string_view entryPoint) 3464514f5e3Sopenharmony_ci{ 3474514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3484514f5e3Sopenharmony_ci uint32_t anFileInfoIndex = jsPandaFile->GetAOTFileInfoIndex(); 3494514f5e3Sopenharmony_ci const std::shared_ptr<AnFileInfo> anFileInfo = anFileDataManager->SafeGetAnFileInfo(anFileInfoIndex); 3504514f5e3Sopenharmony_ci auto aiDatumIter = aiDatum_.find(anFileInfoIndex); 3514514f5e3Sopenharmony_ci if (aiDatumIter == aiDatum_.end()) { 3524514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "can not find aiData by anFileInfoIndex " << anFileInfoIndex; 3534514f5e3Sopenharmony_ci UNREACHABLE(); 3544514f5e3Sopenharmony_ci } 3554514f5e3Sopenharmony_ci uint32_t fileIndex = GetFileIndex(jsPandaFile->GetAOTFileInfoIndex(), jsPandaFile->GetNormalizedFileDesc().c_str()); 3564514f5e3Sopenharmony_ci if (fileIndex == INVALID_INDEX) { 3574514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "can not find aiData by anFileInfoIndex " << anFileInfoIndex 3584514f5e3Sopenharmony_ci << ", normalizedDesc: " << jsPandaFile->GetNormalizedFileDesc(); 3594514f5e3Sopenharmony_ci UNREACHABLE(); 3604514f5e3Sopenharmony_ci } 3614514f5e3Sopenharmony_ci // get main func method 3624514f5e3Sopenharmony_ci auto mainFuncMethodId = jsPandaFile->GetMainMethodIndex(entryPoint.data()); 3634514f5e3Sopenharmony_ci MainFuncEntry mainFuncEntry = anFileInfo->GetMainFuncEntry(fileIndex, mainFuncMethodId); 3644514f5e3Sopenharmony_ci uint64_t mainEntry = mainFuncEntry.mainEntry; 3654514f5e3Sopenharmony_ci int32_t fpDelta = mainFuncEntry.fpDelta; 3664514f5e3Sopenharmony_ci bool isFastCall = mainFuncEntry.isFastCall; 3674514f5e3Sopenharmony_ci MethodLiteral *mainMethod = jsPandaFile->FindMethodLiteral(mainFuncMethodId); 3684514f5e3Sopenharmony_ci if (mainMethod == nullptr) { 3694514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "empty main method literal"; 3704514f5e3Sopenharmony_ci UNREACHABLE(); 3714514f5e3Sopenharmony_ci } 3724514f5e3Sopenharmony_ci mainMethod->SetAotCodeBit(true); 3734514f5e3Sopenharmony_ci mainMethod->SetNativeBit(false); 3744514f5e3Sopenharmony_ci Method *method = mainFunc->GetCallTarget(); 3754514f5e3Sopenharmony_ci method->SetDeoptThreshold(vm_->GetJSOptions().GetDeoptThreshold()); 3764514f5e3Sopenharmony_ci method->SetCodeEntryAndMarkAOTWhenBinding(static_cast<uintptr_t>(mainEntry)); 3774514f5e3Sopenharmony_ci method->SetFpDelta(fpDelta); 3784514f5e3Sopenharmony_ci method->SetIsFastCall(isFastCall); 3794514f5e3Sopenharmony_ci mainFunc->SetCompiledFuncEntry(static_cast<uintptr_t>(mainEntry), isFastCall); 3804514f5e3Sopenharmony_ci#ifndef NDEBUG 3814514f5e3Sopenharmony_ci PrintAOTEntry(jsPandaFile, method, mainEntry); 3824514f5e3Sopenharmony_ci#endif 3834514f5e3Sopenharmony_ci 3844514f5e3Sopenharmony_ci MethodLiteral *methodLiteral = method->GetMethodLiteral(); 3854514f5e3Sopenharmony_ci ASSERT(methodLiteral != nullptr); 3864514f5e3Sopenharmony_ci methodLiteral->SetAotCodeBit(true); 3874514f5e3Sopenharmony_ci methodLiteral->SetIsFastCall(isFastCall); 3884514f5e3Sopenharmony_ci} 3894514f5e3Sopenharmony_ci 3904514f5e3Sopenharmony_civoid AOTFileManager::SetAOTFuncEntry(const JSPandaFile *jsPandaFile, JSFunction *function, 3914514f5e3Sopenharmony_ci Method *method, uint32_t entryIndex, bool *canFastCall) 3924514f5e3Sopenharmony_ci{ 3934514f5e3Sopenharmony_ci uint64_t methodCodeEntry = method->GetCodeEntryOrLiteral(); 3944514f5e3Sopenharmony_ci if (function != nullptr && methodCodeEntry != reinterpret_cast<uintptr_t>(nullptr)) { 3954514f5e3Sopenharmony_ci function->SetCompiledFuncEntry(methodCodeEntry, method->IsFastCall()); 3964514f5e3Sopenharmony_ci return; 3974514f5e3Sopenharmony_ci } 3984514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 3994514f5e3Sopenharmony_ci uint32_t anFileInfoIndex = jsPandaFile->GetAOTFileInfoIndex(); 4004514f5e3Sopenharmony_ci const std::shared_ptr<AnFileInfo> anFileInfo = anFileDataManager->SafeGetAnFileInfo(anFileInfoIndex); 4014514f5e3Sopenharmony_ci const AOTFileInfo::FuncEntryDes &entry = anFileInfo->GetStubDes(entryIndex); 4024514f5e3Sopenharmony_ci uint64_t codeEntry = entry.codeAddr_; 4034514f5e3Sopenharmony_ci#ifndef NDEBUG 4044514f5e3Sopenharmony_ci PrintAOTEntry(jsPandaFile, method, codeEntry); 4054514f5e3Sopenharmony_ci#endif 4064514f5e3Sopenharmony_ci if (!codeEntry) { 4074514f5e3Sopenharmony_ci return; 4084514f5e3Sopenharmony_ci } 4094514f5e3Sopenharmony_ci method->SetDeoptThreshold(vm_->GetJSOptions().GetDeoptThreshold()); 4104514f5e3Sopenharmony_ci method->SetCodeEntryAndMarkAOTWhenBinding(codeEntry); 4114514f5e3Sopenharmony_ci method->SetIsFastCall(entry.isFastCall_); 4124514f5e3Sopenharmony_ci method->SetFpDelta(entry.fpDeltaPrevFrameSp_); 4134514f5e3Sopenharmony_ci if (canFastCall != nullptr) { 4144514f5e3Sopenharmony_ci *canFastCall = entry.isFastCall_; 4154514f5e3Sopenharmony_ci } 4164514f5e3Sopenharmony_ci 4174514f5e3Sopenharmony_ci MethodLiteral *methodLiteral = method->GetMethodLiteral(); 4184514f5e3Sopenharmony_ci ASSERT(methodLiteral != nullptr); 4194514f5e3Sopenharmony_ci methodLiteral->SetAotCodeBit(true); 4204514f5e3Sopenharmony_ci methodLiteral->SetIsFastCall(entry.isFastCall_); 4214514f5e3Sopenharmony_ci} 4224514f5e3Sopenharmony_ci 4234514f5e3Sopenharmony_cikungfu::ArkStackMapParser *AOTFileManager::GetStackMapParser() const 4244514f5e3Sopenharmony_ci{ 4254514f5e3Sopenharmony_ci return arkStackMapParser_; 4264514f5e3Sopenharmony_ci} 4274514f5e3Sopenharmony_ci 4284514f5e3Sopenharmony_civoid AOTFileManager::AdjustBCStubAndDebuggerStubEntries(JSThread *thread, 4294514f5e3Sopenharmony_ci const std::vector<AOTFileInfo::FuncEntryDes> &stubs, 4304514f5e3Sopenharmony_ci const AsmInterParsedOption &asmInterOpt) 4314514f5e3Sopenharmony_ci{ 4324514f5e3Sopenharmony_ci auto defaultBCStubDes = stubs[BytecodeStubCSigns::SingleStepDebugging]; 4334514f5e3Sopenharmony_ci auto defaultBCDebuggerStubDes = stubs[BytecodeStubCSigns::BCDebuggerEntry]; 4344514f5e3Sopenharmony_ci auto defaultBCDebuggerExceptionStubDes = stubs[BytecodeStubCSigns::BCDebuggerExceptionEntry]; 4354514f5e3Sopenharmony_ci ASSERT(defaultBCStubDes.kind_ == kungfu::CallSignature::TargetKind::BYTECODE_HELPER_HANDLER); 4364514f5e3Sopenharmony_ci if (asmInterOpt.handleStart >= 0 && asmInterOpt.handleStart <= asmInterOpt.handleEnd) { 4374514f5e3Sopenharmony_ci for (int i = asmInterOpt.handleStart; i <= asmInterOpt.handleEnd; i++) { 4384514f5e3Sopenharmony_ci thread->SetBCStubEntry(static_cast<size_t>(i), defaultBCStubDes.codeAddr_); 4394514f5e3Sopenharmony_ci } 4404514f5e3Sopenharmony_ci#define DISABLE_SINGLE_STEP_DEBUGGING(name) \ 4414514f5e3Sopenharmony_ci thread->SetBCStubEntry(BytecodeStubCSigns::ID_##name, stubs[BytecodeStubCSigns::ID_##name].codeAddr_); 4424514f5e3Sopenharmony_ci INTERPRETER_DISABLE_SINGLE_STEP_DEBUGGING_BC_STUB_LIST(DISABLE_SINGLE_STEP_DEBUGGING) 4434514f5e3Sopenharmony_ci#undef DISABLE_SINGLE_STEP_DEBUGGING 4444514f5e3Sopenharmony_ci } 4454514f5e3Sopenharmony_ci for (size_t i = 0; i < BCStubEntries::EXISTING_BC_HANDLER_STUB_ENTRIES_COUNT; i++) { 4464514f5e3Sopenharmony_ci if (i == BytecodeStubCSigns::ID_ExceptionHandler) { 4474514f5e3Sopenharmony_ci thread->SetBCDebugStubEntry(i, defaultBCDebuggerExceptionStubDes.codeAddr_); 4484514f5e3Sopenharmony_ci continue; 4494514f5e3Sopenharmony_ci } 4504514f5e3Sopenharmony_ci thread->SetBCDebugStubEntry(i, defaultBCDebuggerStubDes.codeAddr_); 4514514f5e3Sopenharmony_ci } 4524514f5e3Sopenharmony_ci} 4534514f5e3Sopenharmony_ci 4544514f5e3Sopenharmony_civoid AOTFileManager::InitializeStubEntries(const std::vector<AnFileInfo::FuncEntryDes> &stubs) 4554514f5e3Sopenharmony_ci{ 4564514f5e3Sopenharmony_ci auto thread = vm_->GetAssociatedJSThread(); 4574514f5e3Sopenharmony_ci size_t len = stubs.size(); 4584514f5e3Sopenharmony_ci for (size_t i = 0; i < len; i++) { 4594514f5e3Sopenharmony_ci auto des = stubs[i]; 4604514f5e3Sopenharmony_ci if (des.IsCommonStub()) { 4614514f5e3Sopenharmony_ci thread->SetFastStubEntry(des.indexInKindOrMethodId_, des.codeAddr_); 4624514f5e3Sopenharmony_ci } else if (des.IsBCStub()) { 4634514f5e3Sopenharmony_ci thread->SetBCStubEntry(des.indexInKindOrMethodId_, des.codeAddr_); 4644514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_ASM_FILE_LOAD_LOG 4654514f5e3Sopenharmony_ci auto start = GET_MESSAGE_STRING_ID(HandleLdundefined); 4664514f5e3Sopenharmony_ci std::string format = MessageString::GetMessageString(des.indexInKindOrMethodId_ + start); 4674514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "bytecode index: " << des.indexInKindOrMethodId_ << " :" << format << " addr: 0x" 4684514f5e3Sopenharmony_ci << std::hex << des.codeAddr_; 4694514f5e3Sopenharmony_ci#endif 4704514f5e3Sopenharmony_ci } else if (des.IsBuiltinsStub()) { 4714514f5e3Sopenharmony_ci thread->SetBuiltinStubEntry(des.indexInKindOrMethodId_, des.codeAddr_); 4724514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_ASM_FILE_LOAD_LOG 4734514f5e3Sopenharmony_ci int start = GET_MESSAGE_STRING_ID(StringCharCodeAt); 4744514f5e3Sopenharmony_ci std::string format = MessageString::GetMessageString(des.indexInKindOrMethodId_ + start - 1); // -1: NONE 4754514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "builtins index: " << std::dec << des.indexInKindOrMethodId_ << " :" << format 4764514f5e3Sopenharmony_ci << " addr: 0x" << std::hex << des.codeAddr_; 4774514f5e3Sopenharmony_ci#endif 4784514f5e3Sopenharmony_ci } else if (des.IsBaselineStub()) { 4794514f5e3Sopenharmony_ci thread->SetBaselineStubEntry(des.indexInKindOrMethodId_, des.codeAddr_); 4804514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_ASM_FILE_LOAD_LOG 4814514f5e3Sopenharmony_ci int start = GET_MESSAGE_STRING_ID(BaselineTryLdGLobalByNameImm8ID16); 4824514f5e3Sopenharmony_ci std::string format = MessageString::GetMessageString(des.indexInKindOrMethodId_ + start - 1); // -1: NONE 4834514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "baseline stub index: " << std::dec << des.indexInKindOrMethodId_ << " :" << format 4844514f5e3Sopenharmony_ci << " addr: 0x" << std::hex << des.codeAddr_; 4854514f5e3Sopenharmony_ci#endif 4864514f5e3Sopenharmony_ci } else { 4874514f5e3Sopenharmony_ci thread->RegisterRTInterface(des.indexInKindOrMethodId_, des.codeAddr_); 4884514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_ASM_FILE_LOAD_LOG 4894514f5e3Sopenharmony_ci int start = GET_MESSAGE_STRING_ID(CallRuntime); 4904514f5e3Sopenharmony_ci std::string format = MessageString::GetMessageString(des.indexInKindOrMethodId_ + start); 4914514f5e3Sopenharmony_ci LOG_ECMA(DEBUG) << "runtime index: " << std::dec << des.indexInKindOrMethodId_ << " :" << format 4924514f5e3Sopenharmony_ci << " addr: 0x" << std::hex << des.codeAddr_; 4934514f5e3Sopenharmony_ci#endif 4944514f5e3Sopenharmony_ci } 4954514f5e3Sopenharmony_ci } 4964514f5e3Sopenharmony_ci thread->CheckOrSwitchPGOStubs(); 4974514f5e3Sopenharmony_ci AsmInterParsedOption asmInterOpt = vm_->GetJSOptions().GetAsmInterParsedOption(); 4984514f5e3Sopenharmony_ci AdjustBCStubAndDebuggerStubEntries(thread, stubs, asmInterOpt); 4994514f5e3Sopenharmony_ci} 5004514f5e3Sopenharmony_ci 5014514f5e3Sopenharmony_cibool AOTFileManager::RewriteDataSection(uintptr_t dataSec, size_t size, uintptr_t newData, size_t newSize) 5024514f5e3Sopenharmony_ci{ 5034514f5e3Sopenharmony_ci if (memcpy_s(reinterpret_cast<void *>(dataSec), size, reinterpret_cast<void *>(newData), newSize) != EOK) { 5044514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "memset failed"; 5054514f5e3Sopenharmony_ci return false; 5064514f5e3Sopenharmony_ci } 5074514f5e3Sopenharmony_ci return true; 5084514f5e3Sopenharmony_ci} 5094514f5e3Sopenharmony_ci 5104514f5e3Sopenharmony_civoid AOTFileManager::ParseDeserializedData(const CString &snapshotFileName, JSTaggedValue deserializedData) 5114514f5e3Sopenharmony_ci{ 5124514f5e3Sopenharmony_ci AnFileDataManager *anFileDataManager = AnFileDataManager::GetInstance(); 5134514f5e3Sopenharmony_ci std::string baseName = JSFilePath::GetFileName(snapshotFileName.c_str()); 5144514f5e3Sopenharmony_ci uint32_t anFileInfoIndex = anFileDataManager->SafeGetFileInfoIndex(baseName + FILE_EXTENSION_AN); 5154514f5e3Sopenharmony_ci 5164514f5e3Sopenharmony_ci JSThread *thread = vm_->GetJSThread(); 5174514f5e3Sopenharmony_ci FrameworkHelper frameworkHelper(thread); 5184514f5e3Sopenharmony_ci JSHandle<TaggedArray> aiData(thread, deserializedData); 5194514f5e3Sopenharmony_ci uint32_t aiDataLen = aiData->GetLength(); 5204514f5e3Sopenharmony_ci ASSERT(aiDataLen % AOTSnapshotConstants::SNAPSHOT_DATA_ITEM_SIZE == 0); 5214514f5e3Sopenharmony_ci auto aiDatumResult = aiDatum_.try_emplace(anFileInfoIndex); 5224514f5e3Sopenharmony_ci FileNameToMultiConstantPoolMap &fileNameToMulCpMap = aiDatumResult.first->second; 5234514f5e3Sopenharmony_ci 5244514f5e3Sopenharmony_ci JSMutableHandle<TaggedArray> fileInfo(thread, JSTaggedValue::Undefined()); 5254514f5e3Sopenharmony_ci JSMutableHandle<TaggedArray> cpList(thread, JSTaggedValue::Undefined()); 5264514f5e3Sopenharmony_ci for (uint32_t i = 0; i < aiDataLen; i += AOTSnapshotConstants::SNAPSHOT_DATA_ITEM_SIZE) { 5274514f5e3Sopenharmony_ci // handle file info 5284514f5e3Sopenharmony_ci fileInfo.Update(aiData->Get(i + SnapshotGlobalData::Cast(SnapshotGlobalData::CP_TOP_ITEM::PANDA_INFO_ID))); 5294514f5e3Sopenharmony_ci auto nameOffset = SnapshotGlobalData::Cast(SnapshotGlobalData::CP_PANDA_INFO_ITEM::NAME_ID); 5304514f5e3Sopenharmony_ci auto indexOffset = SnapshotGlobalData::Cast(SnapshotGlobalData::CP_PANDA_INFO_ITEM::INDEX_ID); 5314514f5e3Sopenharmony_ci CString fileNameCStr = EcmaStringAccessor(fileInfo->Get(nameOffset)).ToCString(); 5324514f5e3Sopenharmony_ci std::string fileNameStr = EcmaStringAccessor(fileInfo->Get(nameOffset)).ToStdString(); 5334514f5e3Sopenharmony_ci uint32_t fileIndex = static_cast<uint32_t>(fileInfo->Get(indexOffset).GetInt()); 5344514f5e3Sopenharmony_ci // handle constant pool 5354514f5e3Sopenharmony_ci cpList.Update(aiData->Get(i + SnapshotGlobalData::Cast(SnapshotGlobalData::CP_TOP_ITEM::CP_ARRAY_ID))); 5364514f5e3Sopenharmony_ci uint32_t cpLen = cpList->GetLength(); 5374514f5e3Sopenharmony_ci ASSERT(cpLen % AOTSnapshotConstants::SNAPSHOT_CP_ARRAY_ITEM_SIZE == 0); 5384514f5e3Sopenharmony_ci auto &PandaCpInfoInserted = fileNameToMulCpMap.try_emplace(fileNameCStr).first->second; 5394514f5e3Sopenharmony_ci PandaCpInfoInserted.fileIndex_ = fileIndex; 5404514f5e3Sopenharmony_ci MultiConstantPoolMap &cpMap = PandaCpInfoInserted.multiCpsMap_; 5414514f5e3Sopenharmony_ci auto context = thread->GetCurrentEcmaContext(); 5424514f5e3Sopenharmony_ci if (cpLen > 0) { 5434514f5e3Sopenharmony_ci JSTaggedValue cp = cpList->Get(AOTSnapshotConstants::SNAPSHOT_CP_ARRAY_ITEM_SIZE - 1); // first constpool 5444514f5e3Sopenharmony_ci context->LoadProtoTransitionTable(cp); 5454514f5e3Sopenharmony_ci } 5464514f5e3Sopenharmony_ci JSMutableHandle<ConstantPool> cpHandle(thread, JSTaggedValue::Undefined()); 5474514f5e3Sopenharmony_ci for (uint32_t pos = 0; pos < cpLen; pos += AOTSnapshotConstants::SNAPSHOT_CP_ARRAY_ITEM_SIZE) { 5484514f5e3Sopenharmony_ci int32_t constantPoolID = cpList->Get(pos).GetInt(); 5494514f5e3Sopenharmony_ci cpHandle.Update(cpList->Get(pos + 1)); 5504514f5e3Sopenharmony_ci context->ResetProtoTransitionTableOnConstpool(cpHandle.GetTaggedValue()); 5514514f5e3Sopenharmony_ci cpMap.insert({constantPoolID, cpHandle.GetTaggedValue()}); 5524514f5e3Sopenharmony_ci // the arkui framework abc file constpool was patched here 5534514f5e3Sopenharmony_ci if (frameworkHelper.IsFrameworkAbcFile(fileNameStr)) { 5544514f5e3Sopenharmony_ci context->UpdateConstpoolWhenDeserialAI(fileNameStr, cpHandle, constantPoolID); 5554514f5e3Sopenharmony_ci } 5564514f5e3Sopenharmony_ci } 5574514f5e3Sopenharmony_ci } 5584514f5e3Sopenharmony_ci} 5594514f5e3Sopenharmony_ci 5604514f5e3Sopenharmony_ciJSHandle<JSTaggedValue> AOTFileManager::GetDeserializedConstantPool(const JSPandaFile *jsPandaFile, int32_t cpID) 5614514f5e3Sopenharmony_ci{ 5624514f5e3Sopenharmony_ci // The deserialization of the 'ai' data used by the multi-work 5634514f5e3Sopenharmony_ci // is not implemented yet, so there may be a case where 5644514f5e3Sopenharmony_ci // aiDatum_ is empty, in which case the Hole will be returned 5654514f5e3Sopenharmony_ci if (aiDatum_.empty()) { 5664514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(vm_->GetJSThread(), JSTaggedValue::Hole()); 5674514f5e3Sopenharmony_ci } 5684514f5e3Sopenharmony_ci uint32_t anFileInfoIndex = jsPandaFile->GetAOTFileInfoIndex(); 5694514f5e3Sopenharmony_ci auto aiDatumIter = aiDatum_.find(anFileInfoIndex); 5704514f5e3Sopenharmony_ci if (aiDatumIter == aiDatum_.end()) { 5714514f5e3Sopenharmony_ci LOG_COMPILER(FATAL) << "can not find aiData by anFileInfoIndex " << anFileInfoIndex; 5724514f5e3Sopenharmony_ci UNREACHABLE(); 5734514f5e3Sopenharmony_ci } 5744514f5e3Sopenharmony_ci const auto &fileNameToMulCpMap = aiDatumIter->second; 5754514f5e3Sopenharmony_ci auto cpMapIter = fileNameToMulCpMap.find(jsPandaFile->GetNormalizedFileDesc()); 5764514f5e3Sopenharmony_ci if (cpMapIter == fileNameToMulCpMap.end()) { 5774514f5e3Sopenharmony_ci LOG_COMPILER(FATAL) << "can not find constpools by fileName " << jsPandaFile->GetNormalizedFileDesc().c_str(); 5784514f5e3Sopenharmony_ci UNREACHABLE(); 5794514f5e3Sopenharmony_ci } 5804514f5e3Sopenharmony_ci const CMap<int32_t, JSTaggedValue> &cpMap = cpMapIter->second.multiCpsMap_; 5814514f5e3Sopenharmony_ci auto iter = cpMap.find(cpID); 5824514f5e3Sopenharmony_ci if (iter == cpMap.end()) { 5834514f5e3Sopenharmony_ci LOG_COMPILER(FATAL) << "can not find deserialized constantpool in anFileInfo, constantPoolID is " << cpID; 5844514f5e3Sopenharmony_ci UNREACHABLE(); 5854514f5e3Sopenharmony_ci } 5864514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(uintptr_t(&iter->second)); 5874514f5e3Sopenharmony_ci} 5884514f5e3Sopenharmony_ci 5894514f5e3Sopenharmony_ciAOTFileManager::~AOTFileManager() 5904514f5e3Sopenharmony_ci{ 5914514f5e3Sopenharmony_ci if (arkStackMapParser_ != nullptr) { 5924514f5e3Sopenharmony_ci delete arkStackMapParser_; 5934514f5e3Sopenharmony_ci arkStackMapParser_ = nullptr; 5944514f5e3Sopenharmony_ci } 5954514f5e3Sopenharmony_ci} 5964514f5e3Sopenharmony_ci 5974514f5e3Sopenharmony_ciAOTFileManager::AOTFileManager(EcmaVM *vm) : vm_(vm), factory_(vm->GetFactory()) 5984514f5e3Sopenharmony_ci{ 5994514f5e3Sopenharmony_ci bool enableLog = vm->GetJSOptions().WasSetCompilerLogOption(); 6004514f5e3Sopenharmony_ci arkStackMapParser_ = new kungfu::ArkStackMapParser(enableLog); 6014514f5e3Sopenharmony_ci} 6024514f5e3Sopenharmony_ci 6034514f5e3Sopenharmony_ciJSTaggedValue AOTFileManager::GetAbsolutePath(JSThread *thread, JSTaggedValue relativePathVal) 6044514f5e3Sopenharmony_ci{ 6054514f5e3Sopenharmony_ci ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); 6064514f5e3Sopenharmony_ci CString relativePath = ConvertToString(relativePathVal); 6074514f5e3Sopenharmony_ci CString absPath; 6084514f5e3Sopenharmony_ci if (!GetAbsolutePath(relativePath, absPath)) { 6094514f5e3Sopenharmony_ci LOG_FULL(FATAL) << "Get Absolute Path failed"; 6104514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 6114514f5e3Sopenharmony_ci } 6124514f5e3Sopenharmony_ci JSTaggedValue absPathVal = factory->NewFromUtf8(absPath).GetTaggedValue(); 6134514f5e3Sopenharmony_ci return absPathVal; 6144514f5e3Sopenharmony_ci} 6154514f5e3Sopenharmony_ci 6164514f5e3Sopenharmony_cibool AOTFileManager::GetAbsolutePath(const CString &relativePathCstr, CString &absPathCstr) 6174514f5e3Sopenharmony_ci{ 6184514f5e3Sopenharmony_ci std::string relativePath = ConvertToStdString(relativePathCstr); 6194514f5e3Sopenharmony_ci std::string absPath; 6204514f5e3Sopenharmony_ci if (RealPath(relativePath, absPath)) { 6214514f5e3Sopenharmony_ci absPathCstr = ConvertToString(absPath); 6224514f5e3Sopenharmony_ci return true; 6234514f5e3Sopenharmony_ci } 6244514f5e3Sopenharmony_ci return false; 6254514f5e3Sopenharmony_ci} 6264514f5e3Sopenharmony_ci 6274514f5e3Sopenharmony_ciconst Heap *AOTFileManager::GetHeap() 6284514f5e3Sopenharmony_ci{ 6294514f5e3Sopenharmony_ci if (vm_ == nullptr) { 6304514f5e3Sopenharmony_ci return nullptr; 6314514f5e3Sopenharmony_ci } 6324514f5e3Sopenharmony_ci return vm_->GetHeap(); 6334514f5e3Sopenharmony_ci} 6344514f5e3Sopenharmony_ci} // namespace panda::ecmascript 635