1b1994897Sopenharmony_ci/** 2b1994897Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License. 5b1994897Sopenharmony_ci * You may obtain a copy of the License at 6b1994897Sopenharmony_ci * 7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b1994897Sopenharmony_ci * 9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and 13b1994897Sopenharmony_ci * limitations under the License. 14b1994897Sopenharmony_ci */ 15b1994897Sopenharmony_ci 16b1994897Sopenharmony_ci#ifndef BYTECODE_OPTIMIZER_IR_INTERFACE_H 17b1994897Sopenharmony_ci#define BYTECODE_OPTIMIZER_IR_INTERFACE_H 18b1994897Sopenharmony_ci 19b1994897Sopenharmony_ci#include <string> 20b1994897Sopenharmony_ci 21b1994897Sopenharmony_ci#include "assembler/assembly-emitter.h" 22b1994897Sopenharmony_ci#include "libpandafile/method_data_accessor-inl.h" 23b1994897Sopenharmony_ci#include "compiler/optimizer/ir/constants.h" 24b1994897Sopenharmony_ci 25b1994897Sopenharmony_cinamespace panda::bytecodeopt { 26b1994897Sopenharmony_ciclass BytecodeOptIrInterface { 27b1994897Sopenharmony_cipublic: 28b1994897Sopenharmony_ci explicit BytecodeOptIrInterface(const pandasm::AsmEmitter::PandaFileToPandaAsmMaps *maps, 29b1994897Sopenharmony_ci pandasm::Program *prog = nullptr) 30b1994897Sopenharmony_ci : prog_(prog), maps_(maps) 31b1994897Sopenharmony_ci { 32b1994897Sopenharmony_ci } 33b1994897Sopenharmony_ci 34b1994897Sopenharmony_ci virtual ~BytecodeOptIrInterface() = default; 35b1994897Sopenharmony_ci 36b1994897Sopenharmony_ci virtual std::string GetMethodIdByOffset(uint32_t offset) const 37b1994897Sopenharmony_ci { 38b1994897Sopenharmony_ci auto it = maps_->methods.find(offset); 39b1994897Sopenharmony_ci ASSERT(it != maps_->methods.cend()); 40b1994897Sopenharmony_ci 41b1994897Sopenharmony_ci return std::string(it->second); 42b1994897Sopenharmony_ci } 43b1994897Sopenharmony_ci 44b1994897Sopenharmony_ci virtual std::string GetStringIdByOffset(uint32_t offset) const 45b1994897Sopenharmony_ci { 46b1994897Sopenharmony_ci auto it = maps_->strings.find(offset); 47b1994897Sopenharmony_ci ASSERT(it != maps_->strings.cend()); 48b1994897Sopenharmony_ci 49b1994897Sopenharmony_ci return std::string(it->second); 50b1994897Sopenharmony_ci } 51b1994897Sopenharmony_ci 52b1994897Sopenharmony_ci virtual std::string GetLiteralArrayByOffset(uint32_t offset) const 53b1994897Sopenharmony_ci { 54b1994897Sopenharmony_ci auto it = maps_->literalarrays.find(offset); 55b1994897Sopenharmony_ci ASSERT(it != maps_->strings.cend()); 56b1994897Sopenharmony_ci 57b1994897Sopenharmony_ci return std::string(it->second); 58b1994897Sopenharmony_ci } 59b1994897Sopenharmony_ci 60b1994897Sopenharmony_ci std::optional<std::string> GetLiteralArrayIdByOffset(uint32_t offset) const 61b1994897Sopenharmony_ci { 62b1994897Sopenharmony_ci ASSERT(prog_ != nullptr); 63b1994897Sopenharmony_ci if (prog_ == nullptr) { 64b1994897Sopenharmony_ci return std::nullopt; 65b1994897Sopenharmony_ci } 66b1994897Sopenharmony_ci auto id = std::to_string(offset); 67b1994897Sopenharmony_ci auto it = prog_->literalarray_table.find(id); 68b1994897Sopenharmony_ci ASSERT(it != prog_->literalarray_table.end()); 69b1994897Sopenharmony_ci return it != prog_->literalarray_table.end() ? std::optional<std::string>(id) : std::nullopt; 70b1994897Sopenharmony_ci } 71b1994897Sopenharmony_ci 72b1994897Sopenharmony_ci virtual std::string GetTypeIdByOffset(uint32_t offset) const 73b1994897Sopenharmony_ci { 74b1994897Sopenharmony_ci auto it = maps_->classes.find(offset); 75b1994897Sopenharmony_ci ASSERT(it != maps_->classes.cend()); 76b1994897Sopenharmony_ci 77b1994897Sopenharmony_ci return std::string(it->second); 78b1994897Sopenharmony_ci } 79b1994897Sopenharmony_ci 80b1994897Sopenharmony_ci virtual std::string GetFieldIdByOffset(uint32_t offset) const 81b1994897Sopenharmony_ci { 82b1994897Sopenharmony_ci auto it = maps_->fields.find(offset); 83b1994897Sopenharmony_ci ASSERT(it != maps_->fields.cend()); 84b1994897Sopenharmony_ci 85b1994897Sopenharmony_ci return std::string(it->second); 86b1994897Sopenharmony_ci } 87b1994897Sopenharmony_ci 88b1994897Sopenharmony_ci std::unordered_map<size_t, pandasm::Ins *> *GetPcInsMap() 89b1994897Sopenharmony_ci { 90b1994897Sopenharmony_ci return &pc_ins_map_; 91b1994897Sopenharmony_ci } 92b1994897Sopenharmony_ci 93b1994897Sopenharmony_ci size_t GetLineNumberByPc(size_t pc) const 94b1994897Sopenharmony_ci { 95b1994897Sopenharmony_ci if (pc == compiler::INVALID_PC || pc_ins_map_.size() == 0) { 96b1994897Sopenharmony_ci return 0; 97b1994897Sopenharmony_ci } 98b1994897Sopenharmony_ci auto iter = pc_ins_map_.find(pc); 99b1994897Sopenharmony_ci if (iter == pc_ins_map_.end()) { 100b1994897Sopenharmony_ci return 0; 101b1994897Sopenharmony_ci } 102b1994897Sopenharmony_ci return iter->second->ins_debug.line_number; 103b1994897Sopenharmony_ci } 104b1994897Sopenharmony_ci 105b1994897Sopenharmony_ci uint32_t GetColumnNumberByPc(size_t pc) const 106b1994897Sopenharmony_ci { 107b1994897Sopenharmony_ci if (pc == compiler::INVALID_PC || pc_ins_map_.size() == 0) { 108b1994897Sopenharmony_ci return compiler::INVALID_COLUMN_NUM; 109b1994897Sopenharmony_ci } 110b1994897Sopenharmony_ci auto iter = pc_ins_map_.find(pc); 111b1994897Sopenharmony_ci if (iter == pc_ins_map_.end()) { 112b1994897Sopenharmony_ci return compiler::INVALID_COLUMN_NUM; 113b1994897Sopenharmony_ci } 114b1994897Sopenharmony_ci 115b1994897Sopenharmony_ci return iter->second->ins_debug.column_number; 116b1994897Sopenharmony_ci } 117b1994897Sopenharmony_ci 118b1994897Sopenharmony_ci void ClearPcInsMap() 119b1994897Sopenharmony_ci { 120b1994897Sopenharmony_ci pc_ins_map_.clear(); 121b1994897Sopenharmony_ci } 122b1994897Sopenharmony_ci 123b1994897Sopenharmony_ci void StoreLiteralArray(std::string id, pandasm::LiteralArray &&literalarray) 124b1994897Sopenharmony_ci { 125b1994897Sopenharmony_ci ASSERT(prog_ != nullptr); 126b1994897Sopenharmony_ci if (prog_ == nullptr) { 127b1994897Sopenharmony_ci return; 128b1994897Sopenharmony_ci } 129b1994897Sopenharmony_ci prog_->literalarray_table.emplace(id, std::move(literalarray)); 130b1994897Sopenharmony_ci } 131b1994897Sopenharmony_ci 132b1994897Sopenharmony_ci size_t GetLiteralArrayTableSize() const 133b1994897Sopenharmony_ci { 134b1994897Sopenharmony_ci ASSERT(prog_ != nullptr); 135b1994897Sopenharmony_ci if (prog_ == nullptr) { 136b1994897Sopenharmony_ci return 0; 137b1994897Sopenharmony_ci } 138b1994897Sopenharmony_ci return prog_->literalarray_table.size(); 139b1994897Sopenharmony_ci } 140b1994897Sopenharmony_ci 141b1994897Sopenharmony_ci bool IsMapsSet() const 142b1994897Sopenharmony_ci { 143b1994897Sopenharmony_ci return maps_ != nullptr; 144b1994897Sopenharmony_ci } 145b1994897Sopenharmony_ci 146b1994897Sopenharmony_ci panda_file::SourceLang GetSourceLang() 147b1994897Sopenharmony_ci { 148b1994897Sopenharmony_ci return prog_ != nullptr ? prog_->lang : panda_file::SourceLang::PANDA_ASSEMBLY; 149b1994897Sopenharmony_ci } 150b1994897Sopenharmony_ci 151b1994897Sopenharmony_ci pandasm::Program *GetProgram() const 152b1994897Sopenharmony_ci { 153b1994897Sopenharmony_ci return prog_; 154b1994897Sopenharmony_ci } 155b1994897Sopenharmony_ci 156b1994897Sopenharmony_ciprivate: 157b1994897Sopenharmony_ci pandasm::Program *prog_ {nullptr}; 158b1994897Sopenharmony_ci const pandasm::AsmEmitter::PandaFileToPandaAsmMaps *maps_ {nullptr}; 159b1994897Sopenharmony_ci std::unordered_map<size_t, pandasm::Ins *> pc_ins_map_; 160b1994897Sopenharmony_ci}; 161b1994897Sopenharmony_ci} // namespace panda::bytecodeopt 162b1994897Sopenharmony_ci 163b1994897Sopenharmony_ci#endif // BYTECODE_OPTIMIZER_IR_INTERFACE_H 164