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