#pragma once #include #include "common/goos/Object.h" #include "decompiler/Disasm/DecompilerLabel.h" #include "decompiler/ObjectFile/LinkedWord.h" #include "common/type_system/TypeSpec.h" #include "common/type_system/TypeSystem.h" #include "decompiler/config.h" #include "decompiler/util/DecompilerTypeSystem.h" namespace decompiler { std::optional get_type_of_label(const DecompilerLabel& label, const std::vector>& words); goos::Object decompile_string_at_label(const DecompilerLabel& label, const std::vector>& words); goos::Object decompile_at_label(const TypeSpec& type, const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, const TypeSystem& ts); goos::Object decompile_at_label_with_hint(const LabelType& hint, const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, DecompilerTypeSystem& dts); goos::Object decompile_at_label_guess_type(const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, const TypeSystem& ts); goos::Object decompile_structure(const TypeSpec& actual_type, const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, const TypeSystem& ts); goos::Object decompile_pair(const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, const TypeSystem& ts); goos::Object decompile_boxed_array(const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, const TypeSystem& ts); goos::Object decompile_value(const TypeSpec& type, const std::vector& bytes, const TypeSystem& ts); goos::Object decompile_value_array(const TypeSpec& elt_type, const Type* elt_type_info, int length, int stride, int offset, const std::vector& obj_words, const TypeSystem& ts); goos::Object decompile_bitfield(const TypeSpec& type, const BitFieldType* type_info, const DecompilerLabel& label, const std::vector& labels, const std::vector>& words, const TypeSystem& ts); struct BitFieldConstantDef { bool is_signed = false; u64 value = -1; std::optional enum_constant; std::string field_name; }; template T extract_bitfield(T input, int start_bit, int size) { int end_bit = start_bit + size; T left_shifted = input << (64 - end_bit); return left_shifted >> (64 - size); } std::vector decompile_bitfield_from_int(const TypeSpec& type, const TypeSystem& ts, u64 value); std::vector decompile_bitfield_enum_from_int(const TypeSpec& type, const TypeSystem& ts, u64 value); std::string decompile_int_enum_from_int(const TypeSpec& type, const TypeSystem& ts, u64 value); } // namespace decompiler