14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2023 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#ifndef ECMASCRIPT_COMPILER_AOT_SNAPSHOT_SNAPSHOT_GLOBAL_DATA_H 164514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_AOT_SNAPSHOT_SNAPSHOT_GLOBAL_DATA_H 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h" 194514f5e3Sopenharmony_ci#include "ecmascript/object_factory.h" 204514f5e3Sopenharmony_ci 214514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu { 224514f5e3Sopenharmony_ciclass SnapshotGlobalData; 234514f5e3Sopenharmony_ci/* 244514f5e3Sopenharmony_ci * The information that needs to be revised before saving the 'ai' file is recorded in SnapshotReviseData. 254514f5e3Sopenharmony_ci * Currently, the revised information includes the entry index of each method in the 'an' file. 264514f5e3Sopenharmony_ci */ 274514f5e3Sopenharmony_ciclass ReviseData { 284514f5e3Sopenharmony_cipublic: 294514f5e3Sopenharmony_ci struct ItemData { 304514f5e3Sopenharmony_ci uint32_t dataIdx_; 314514f5e3Sopenharmony_ci uint32_t cpArrayIdx_; 324514f5e3Sopenharmony_ci int32_t constpoolIdx_; 334514f5e3Sopenharmony_ci }; 344514f5e3Sopenharmony_ci 354514f5e3Sopenharmony_ci ReviseData() = default; 364514f5e3Sopenharmony_ci virtual ~ReviseData() = default; 374514f5e3Sopenharmony_ci 384514f5e3Sopenharmony_ci void Record(ItemData data) 394514f5e3Sopenharmony_ci { 404514f5e3Sopenharmony_ci data_.emplace_back(data); 414514f5e3Sopenharmony_ci } 424514f5e3Sopenharmony_ci 434514f5e3Sopenharmony_ci void PUBLIC_API Resolve(JSThread *thread, const SnapshotGlobalData *globalData, 444514f5e3Sopenharmony_ci const CMap<std::pair<std::string, uint32_t>, uint32_t> &methodToEntryIndexMap); 454514f5e3Sopenharmony_ci 464514f5e3Sopenharmony_ciprotected: 474514f5e3Sopenharmony_ci JSHandle<ConstantPool> GetConstantPoolFromSnapshotData(JSThread *thread, const SnapshotGlobalData *globalData, 484514f5e3Sopenharmony_ci uint32_t dataIdx, uint32_t cpArrayIdx); 494514f5e3Sopenharmony_ci std::vector<ItemData> data_; 504514f5e3Sopenharmony_ci}; 514514f5e3Sopenharmony_ci 524514f5e3Sopenharmony_ciclass SnapshotReviseInfo { 534514f5e3Sopenharmony_cipublic: 544514f5e3Sopenharmony_ci SnapshotReviseInfo() = default; 554514f5e3Sopenharmony_ci ~SnapshotReviseInfo() = default; 564514f5e3Sopenharmony_ci 574514f5e3Sopenharmony_ci void Record(ReviseData::ItemData data) 584514f5e3Sopenharmony_ci { 594514f5e3Sopenharmony_ci reviseData_.Record(data); 604514f5e3Sopenharmony_ci } 614514f5e3Sopenharmony_ci 624514f5e3Sopenharmony_ci void ResolveData(JSThread *thread, const SnapshotGlobalData *globalData, 634514f5e3Sopenharmony_ci const CMap<std::pair<std::string, uint32_t>, uint32_t> &methodToEntryIndexMap) 644514f5e3Sopenharmony_ci { 654514f5e3Sopenharmony_ci reviseData_.Resolve(thread, globalData, methodToEntryIndexMap); 664514f5e3Sopenharmony_ci } 674514f5e3Sopenharmony_ci 684514f5e3Sopenharmony_ciprivate: 694514f5e3Sopenharmony_ci ReviseData reviseData_ {}; 704514f5e3Sopenharmony_ci}; 714514f5e3Sopenharmony_ci 724514f5e3Sopenharmony_ciclass SnapshotGlobalData { 734514f5e3Sopenharmony_cipublic: 744514f5e3Sopenharmony_ci // top level specified field 754514f5e3Sopenharmony_ci enum class CP_TOP_ITEM : int8_t { 764514f5e3Sopenharmony_ci PANDA_INFO_ID = 0, 774514f5e3Sopenharmony_ci CP_ARRAY_ID, 784514f5e3Sopenharmony_ci COUNT 794514f5e3Sopenharmony_ci }; 804514f5e3Sopenharmony_ci 814514f5e3Sopenharmony_ci // file specified field 824514f5e3Sopenharmony_ci enum class CP_PANDA_INFO_ITEM : int8_t { 834514f5e3Sopenharmony_ci NAME_ID = 0, 844514f5e3Sopenharmony_ci INDEX_ID, 854514f5e3Sopenharmony_ci COUNT 864514f5e3Sopenharmony_ci }; 874514f5e3Sopenharmony_ci 884514f5e3Sopenharmony_ci static int8_t Cast(CP_TOP_ITEM value) 894514f5e3Sopenharmony_ci { 904514f5e3Sopenharmony_ci return static_cast<int8_t>(value); 914514f5e3Sopenharmony_ci } 924514f5e3Sopenharmony_ci 934514f5e3Sopenharmony_ci static int8_t Cast(CP_PANDA_INFO_ITEM value) 944514f5e3Sopenharmony_ci { 954514f5e3Sopenharmony_ci return static_cast<int8_t>(value); 964514f5e3Sopenharmony_ci } 974514f5e3Sopenharmony_ci 984514f5e3Sopenharmony_ci SnapshotGlobalData() = default; 994514f5e3Sopenharmony_ci ~SnapshotGlobalData() = default; 1004514f5e3Sopenharmony_ci 1014514f5e3Sopenharmony_ci void Iterate(const RootVisitor &v) 1024514f5e3Sopenharmony_ci { 1034514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&data_))); 1044514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&curSnapshotCpArray_))); 1054514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&symbolInfo_))); 1064514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&hclassInfo_))); 1074514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&arrayInfo_))); 1084514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&constantIndexInfo_))); 1094514f5e3Sopenharmony_ci v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&protoTransTableInfo_))); 1104514f5e3Sopenharmony_ci } 1114514f5e3Sopenharmony_ci 1124514f5e3Sopenharmony_ci void SetData(JSTaggedValue data) 1134514f5e3Sopenharmony_ci { 1144514f5e3Sopenharmony_ci data_ = data; 1154514f5e3Sopenharmony_ci } 1164514f5e3Sopenharmony_ci 1174514f5e3Sopenharmony_ci JSTaggedValue GetData() const 1184514f5e3Sopenharmony_ci { 1194514f5e3Sopenharmony_ci return data_; 1204514f5e3Sopenharmony_ci } 1214514f5e3Sopenharmony_ci 1224514f5e3Sopenharmony_ci uint32_t GetCurDataIdx() const 1234514f5e3Sopenharmony_ci { 1244514f5e3Sopenharmony_ci return curDataIdx_; 1254514f5e3Sopenharmony_ci } 1264514f5e3Sopenharmony_ci 1274514f5e3Sopenharmony_ci JSTaggedValue GetCurSnapshotCpArray() const 1284514f5e3Sopenharmony_ci { 1294514f5e3Sopenharmony_ci return curSnapshotCpArray_; 1304514f5e3Sopenharmony_ci } 1314514f5e3Sopenharmony_ci 1324514f5e3Sopenharmony_ci void AddSnapshotCpArrayToData(JSThread *thread, CString fileName, uint32_t fileIndex, 1334514f5e3Sopenharmony_ci JSHandle<TaggedArray> snapshotCpArray); 1344514f5e3Sopenharmony_ci 1354514f5e3Sopenharmony_ci CString GetFileNameByDataIdx(uint32_t dataIdx) const; 1364514f5e3Sopenharmony_ci 1374514f5e3Sopenharmony_ci void RecordReviseData(ReviseData::ItemData data) 1384514f5e3Sopenharmony_ci { 1394514f5e3Sopenharmony_ci reviseInfo_.Record(data); 1404514f5e3Sopenharmony_ci } 1414514f5e3Sopenharmony_ci 1424514f5e3Sopenharmony_ci void ResolveSnapshotData(JSThread *thread, 1434514f5e3Sopenharmony_ci const CMap<std::pair<std::string, uint32_t>, uint32_t> &methodToEntryIndexMap) 1444514f5e3Sopenharmony_ci { 1454514f5e3Sopenharmony_ci reviseInfo_.ResolveData(thread, this, methodToEntryIndexMap); 1464514f5e3Sopenharmony_ci } 1474514f5e3Sopenharmony_ci 1484514f5e3Sopenharmony_ci void RecordCpArrIdx(int32_t constantPoolId, uint32_t cpArrIdx) 1494514f5e3Sopenharmony_ci { 1504514f5e3Sopenharmony_ci dataIdxToCpArrIdxMap_[curDataIdx_][constantPoolId] = cpArrIdx; 1514514f5e3Sopenharmony_ci } 1524514f5e3Sopenharmony_ci 1534514f5e3Sopenharmony_ci uint32_t GetCpArrIdxByConstanPoolId(int32_t constantPoolId) 1544514f5e3Sopenharmony_ci { 1554514f5e3Sopenharmony_ci return GetCpIdToCpArrIdxMap().at(constantPoolId); 1564514f5e3Sopenharmony_ci } 1574514f5e3Sopenharmony_ci 1584514f5e3Sopenharmony_ci const CUnorderedMap<int32_t, uint32_t>& GetCpIdToCpArrIdxMap() 1594514f5e3Sopenharmony_ci { 1604514f5e3Sopenharmony_ci return dataIdxToCpArrIdxMap_.at(curDataIdx_); 1614514f5e3Sopenharmony_ci } 1624514f5e3Sopenharmony_ci 1634514f5e3Sopenharmony_ci JSTaggedValue GetHClassInfo() 1644514f5e3Sopenharmony_ci { 1654514f5e3Sopenharmony_ci return hclassInfo_; 1664514f5e3Sopenharmony_ci } 1674514f5e3Sopenharmony_ci 1684514f5e3Sopenharmony_ci JSTaggedValue GetArrayInfo() 1694514f5e3Sopenharmony_ci { 1704514f5e3Sopenharmony_ci return arrayInfo_; 1714514f5e3Sopenharmony_ci } 1724514f5e3Sopenharmony_ci 1734514f5e3Sopenharmony_ci JSTaggedValue GetSymbolInfo() const 1744514f5e3Sopenharmony_ci { 1754514f5e3Sopenharmony_ci return symbolInfo_; 1764514f5e3Sopenharmony_ci } 1774514f5e3Sopenharmony_ci 1784514f5e3Sopenharmony_ci JSTaggedValue GetConstantIndexInfo() 1794514f5e3Sopenharmony_ci { 1804514f5e3Sopenharmony_ci return constantIndexInfo_; 1814514f5e3Sopenharmony_ci } 1824514f5e3Sopenharmony_ci 1834514f5e3Sopenharmony_ci JSTaggedValue GetProtoTransTableInfo() const 1844514f5e3Sopenharmony_ci { 1854514f5e3Sopenharmony_ci return protoTransTableInfo_; 1864514f5e3Sopenharmony_ci } 1874514f5e3Sopenharmony_ci 1884514f5e3Sopenharmony_ci JSTaggedValue GetObjectLiteralHClassCache() const 1894514f5e3Sopenharmony_ci { 1904514f5e3Sopenharmony_ci if (hclassInfo_.IsTaggedArray()) { 1914514f5e3Sopenharmony_ci auto hclassInfoArr = TaggedArray::Cast(hclassInfo_); 1924514f5e3Sopenharmony_ci ASSERT(hclassInfoArr->GetLength() > 0); 1934514f5e3Sopenharmony_ci return hclassInfoArr->Get(hclassInfoArr->GetLength() - 1); 1944514f5e3Sopenharmony_ci } 1954514f5e3Sopenharmony_ci return JSTaggedValue::Undefined(); 1964514f5e3Sopenharmony_ci } 1974514f5e3Sopenharmony_ci 1984514f5e3Sopenharmony_ci void StoreHClassInfo(JSHandle<TaggedArray> info) 1994514f5e3Sopenharmony_ci { 2004514f5e3Sopenharmony_ci hclassInfo_ = info.GetTaggedValue(); 2014514f5e3Sopenharmony_ci } 2024514f5e3Sopenharmony_ci 2034514f5e3Sopenharmony_ci void StoreArrayInfo(JSHandle<TaggedArray> info) 2044514f5e3Sopenharmony_ci { 2054514f5e3Sopenharmony_ci arrayInfo_ = info.GetTaggedValue(); 2064514f5e3Sopenharmony_ci } 2074514f5e3Sopenharmony_ci 2084514f5e3Sopenharmony_ci void StoreSymbolInfo(JSHandle<TaggedArray> info) 2094514f5e3Sopenharmony_ci { 2104514f5e3Sopenharmony_ci symbolInfo_ = info.GetTaggedValue(); 2114514f5e3Sopenharmony_ci } 2124514f5e3Sopenharmony_ci 2134514f5e3Sopenharmony_ci void StoreConstantIndexInfo(JSHandle<TaggedArray> info) 2144514f5e3Sopenharmony_ci { 2154514f5e3Sopenharmony_ci constantIndexInfo_ = info.GetTaggedValue(); 2164514f5e3Sopenharmony_ci } 2174514f5e3Sopenharmony_ci 2184514f5e3Sopenharmony_ci void StoreProtoTransTableInfo(JSHandle<JSTaggedValue> info) 2194514f5e3Sopenharmony_ci { 2204514f5e3Sopenharmony_ci protoTransTableInfo_ = info.GetTaggedValue(); 2214514f5e3Sopenharmony_ci } 2224514f5e3Sopenharmony_ci 2234514f5e3Sopenharmony_ciprivate: 2244514f5e3Sopenharmony_ci using CpIdToCpArrIdxMap = CUnorderedMap<int32_t, uint32_t>; 2254514f5e3Sopenharmony_ci 2264514f5e3Sopenharmony_ci bool isFirstData_ {true}; 2274514f5e3Sopenharmony_ci uint32_t curDataIdx_ {0}; 2284514f5e3Sopenharmony_ci JSTaggedValue data_ {JSTaggedValue::Hole()}; 2294514f5e3Sopenharmony_ci JSTaggedValue curSnapshotCpArray_ {JSTaggedValue::Hole()}; 2304514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, CpIdToCpArrIdxMap> dataIdxToCpArrIdxMap_; 2314514f5e3Sopenharmony_ci CUnorderedMap<uint32_t, CString> dataIdxToFileNameMap_ {}; 2324514f5e3Sopenharmony_ci 2334514f5e3Sopenharmony_ci SnapshotReviseInfo reviseInfo_; 2344514f5e3Sopenharmony_ci JSTaggedValue hclassInfo_ {JSTaggedValue::Hole()}; 2354514f5e3Sopenharmony_ci JSTaggedValue arrayInfo_ {JSTaggedValue::Hole()}; 2364514f5e3Sopenharmony_ci JSTaggedValue symbolInfo_ {JSTaggedValue::Hole()}; 2374514f5e3Sopenharmony_ci JSTaggedValue constantIndexInfo_ {JSTaggedValue::Hole()}; 2384514f5e3Sopenharmony_ci JSTaggedValue protoTransTableInfo_ {JSTaggedValue::Hole()}; 2394514f5e3Sopenharmony_ci}; 2404514f5e3Sopenharmony_ci} // panda::ecmascript::kungfu 2414514f5e3Sopenharmony_ci#endif // ECMASCRIPT_COMPILER_AOT_SNAPSHOT_SNAPSHOT_GLOBAL_DATA_H 242