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