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 ¶m, 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