1b1994897Sopenharmony_ci/*
2b1994897Sopenharmony_ci * Copyright (c) 2024 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 ABC2PROGRAM_PROGRANM_DUMPER_PROGRAM_DUMP_H
17b1994897Sopenharmony_ci#define ABC2PROGRAM_PROGRANM_DUMPER_PROGRAM_DUMP_H
18b1994897Sopenharmony_ci
19b1994897Sopenharmony_ci#include <iostream>
20b1994897Sopenharmony_ci#include <assembly-program.h>
21b1994897Sopenharmony_ci#include "dump_utils.h"
22b1994897Sopenharmony_ci
23b1994897Sopenharmony_cinamespace panda::abc2program {
24b1994897Sopenharmony_ci
25b1994897Sopenharmony_ciclass PandasmProgramDumper {
26b1994897Sopenharmony_cipublic:
27b1994897Sopenharmony_ci    PandasmProgramDumper() {}
28b1994897Sopenharmony_ci    PandasmProgramDumper(bool is_normalized, bool is_debug) : is_normalized_(is_normalized), is_debug_(is_debug) {}
29b1994897Sopenharmony_ci    void Dump(std::ostream &os, const pandasm::Program &program);
30b1994897Sopenharmony_ci    void SetAbcFilePath(const std::string &abc_file_path);
31b1994897Sopenharmony_ci
32b1994897Sopenharmony_ciprivate:
33b1994897Sopenharmony_ci    void DumpAbcFilePath(std::ostream &os) const;
34b1994897Sopenharmony_ci    void DumpProgramLanguage(std::ostream &os) const;
35b1994897Sopenharmony_ci    void DumpLiteralArrayTable(std::ostream &os) const;
36b1994897Sopenharmony_ci    void DumpRecordTable(std::ostream &os) const;
37b1994897Sopenharmony_ci    void DumpRecord(std::ostream &os, const pandasm::Record &record) const;
38b1994897Sopenharmony_ci    bool DumpRecordMetaData(std::ostream &os, const pandasm::Record &record) const;
39b1994897Sopenharmony_ci    void DumpFieldList(std::ostream &os, const pandasm::Record &record) const;
40b1994897Sopenharmony_ci    void DumpField(std::ostream &os, const pandasm::Field &field) const;
41b1994897Sopenharmony_ci    void DumpFieldMetaData(std::ostream &os, const pandasm::Field &field) const;
42b1994897Sopenharmony_ci    void DumpRecordSourceFile(std::ostream &os, const pandasm::Record &record) const;
43b1994897Sopenharmony_ci    void DumpFunctionTable(std::ostream &os);
44b1994897Sopenharmony_ci    void DumpFunction(std::ostream &os, const pandasm::Function &function);
45b1994897Sopenharmony_ci    void DumpFunctionKind(std::ostream &os, const pandasm::Function &function) const;
46b1994897Sopenharmony_ci    void DumpFunctionAnnotations(std::ostream &os, const pandasm::Function &function) const;
47b1994897Sopenharmony_ci    void DumpFunctionHead(std::ostream &os, const pandasm::Function &function) const;
48b1994897Sopenharmony_ci    void DumpFunctionReturnType(std::ostream &os, const pandasm::Function &function) const;
49b1994897Sopenharmony_ci    void DumpFunctionName(std::ostream &os, const pandasm::Function &function) const;
50b1994897Sopenharmony_ci    void DumpFunctionParams(std::ostream &os, const pandasm::Function &function) const;
51b1994897Sopenharmony_ci    void DumpFunctionParamAtIndex(std::ostream &os, const pandasm::Function::Parameter &param, size_t idx) const;
52b1994897Sopenharmony_ci    void DumpFunctionAttributes(std::ostream &os, const pandasm::Function &function) const;
53b1994897Sopenharmony_ci    void DumpFunctionBody(std::ostream &os, const pandasm::Function &function);
54b1994897Sopenharmony_ci    void DumpFunctionIns(std::ostream &os, const pandasm::Function &function);
55b1994897Sopenharmony_ci    void DumpOriginalFunctionIns(std::ostream &os, const pandasm::Function &function);
56b1994897Sopenharmony_ci    void DumpNormalizedFunctionIns(std::ostream &os, const pandasm::Function &function);
57b1994897Sopenharmony_ci    void DumpFunctionDebugInfo(std::ostream &os, const pandasm::Function &function);
58b1994897Sopenharmony_ci    void UpdateLocalVarMap(const pandasm::Function &function,
59b1994897Sopenharmony_ci        std::map<int32_t, panda::pandasm::debuginfo::LocalVariable>& local_variable_table);
60b1994897Sopenharmony_ci    void DumpAnnotationData(std::ostream &os, const pandasm::AnnotationData &anno) const;
61b1994897Sopenharmony_ci    void DumpArrayValue(std::ostream &os, const pandasm::ArrayValue &array) const;
62b1994897Sopenharmony_ci    void DumpScalarValue(std::ostream &os, const pandasm::ScalarValue &scalar) const;
63b1994897Sopenharmony_ci    void GetOriginalDumpIns(const pandasm::Function &function);
64b1994897Sopenharmony_ci    void GetFinalDumpIns();
65b1994897Sopenharmony_ci    void GetInvalidOpLabelMap();
66b1994897Sopenharmony_ci    void HandleInvalidopInsLabel(size_t invalid_op_idx, pandasm::Ins &invalid_op_ins);
67b1994897Sopenharmony_ci    pandasm::Ins *GetNearestValidopIns4InvalidopIns(size_t invalid_op_ins_idx);
68b1994897Sopenharmony_ci    void GetFinalLabelMap();
69b1994897Sopenharmony_ci    void UpdateLabels4DumpIns(std::vector<pandasm::Ins*> &dump_ins, const LabelMap &label_map) const;
70b1994897Sopenharmony_ci    void UpdateLabels4DumpInsAtIndex(size_t idx, std::vector<pandasm::Ins*> &dump_ins,
71b1994897Sopenharmony_ci                                     const LabelMap &label_map) const;
72b1994897Sopenharmony_ci    std::string GetMappedLabel(const std::string &label, const LabelMap &label_map) const;
73b1994897Sopenharmony_ci    void HandleFinalLabelAtIndex(size_t idx);
74b1994897Sopenharmony_ci    void DumpFinalIns(std::ostream &os);
75b1994897Sopenharmony_ci    void DumpFunctionCatchBlocks(std::ostream &os, const pandasm::Function &function) const;
76b1994897Sopenharmony_ci    void DumpOriginalFunctionCatchBlocks(std::ostream &os, const pandasm::Function &function) const;
77b1994897Sopenharmony_ci    void DumpNormalizedFunctionCatchBlocks(std::ostream &os, const pandasm::Function &function) const;
78b1994897Sopenharmony_ci    void DumpCatchBlock(std::ostream &os, const pandasm::Function::CatchBlock &catch_block) const;
79b1994897Sopenharmony_ci    void UpdateCatchBlock(pandasm::Function::CatchBlock &catch_block) const;
80b1994897Sopenharmony_ci    std::string GetUpdatedCatchBlockLabel(const std::string &orignal_label) const;
81b1994897Sopenharmony_ci    void ReplaceLiteralId4Ins(pandasm::Ins &pa_ins) const;
82b1994897Sopenharmony_ci    void DumpStrings(std::ostream &os) const;
83b1994897Sopenharmony_ci    std::string SerializeLiteralArray(const pandasm::LiteralArray &lit_array, uint32_t id) const;
84b1994897Sopenharmony_ci    void SerializeLiterals(const pandasm::LiteralArray &lit_array, std::stringstream &os) const;
85b1994897Sopenharmony_ci    void SerializeLiteralsAtIndex(const pandasm::LiteralArray &lit_array, std::stringstream &os, size_t i) const;
86b1994897Sopenharmony_ci    void SerializeNestedLiteralArrayById(std::stringstream &os, const std::string &literal_array_id_name) const;
87b1994897Sopenharmony_ci    // True when the option 'dump-normalized-asm-program' is enabled. See option description for details
88b1994897Sopenharmony_ci    bool is_normalized_ = false;
89b1994897Sopenharmony_ci    // True when the option 'debug-info' is enabled. When both it and is_normalized_ are true, skip dump
90b1994897Sopenharmony_ci    // of function annotation and the record with name '_ESSlotNumberAnnotation'
91b1994897Sopenharmony_ci    bool is_debug_ = false;
92b1994897Sopenharmony_ci    std::string abc_file_path_;
93b1994897Sopenharmony_ci    std::vector<pandasm::Ins> original_dump_ins_;
94b1994897Sopenharmony_ci    std::vector<pandasm::Ins*> original_dump_ins_ptrs_;
95b1994897Sopenharmony_ci    std::vector<pandasm::Ins*> final_dump_ins_ptrs_;
96b1994897Sopenharmony_ci    LabelMap invalid_op_label_map_;
97b1994897Sopenharmony_ci    LabelMap final_label_map_;
98b1994897Sopenharmony_ci    const pandasm::Program *program_ = nullptr;
99b1994897Sopenharmony_ci    size_t regs_num_ = 0;
100b1994897Sopenharmony_ci    std::unordered_map<pandasm::Ins*, uint32_t> original_ins_index_map_;
101b1994897Sopenharmony_ci    std::unordered_map<pandasm::Ins*, uint32_t> final_ins_index_map_;
102b1994897Sopenharmony_ci    mutable std::unordered_set<uint32_t> processing_literal_array_id_set_;
103b1994897Sopenharmony_ci};
104b1994897Sopenharmony_ci
105b1994897Sopenharmony_ci}  // namespace panda::abc2program
106b1994897Sopenharmony_ci
107b1994897Sopenharmony_ci#endif  // ABC2PROGRAM_PROGRANM_DUMPER_PROGRAM_DUMP_H
108