// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_MIRPARSER_MIPARSER_H #define RCC_CODEGEN_MIRPARSER_MIPARSER_H #include "rcc/CodeGen/MachineIRTypes.h" #include "rcc/CodeGen/MachineMetadata.h" #include "rcc/CodeGen/Register.h" #include "rcc/Support/Error.h" #include "rcc/Support/TextDiagnostic.h" #include #include #include #include #include #include #include #include #include namespace rcc { class MachineFunction; class TargetDescription; namespace mir { struct MIVirtualRegisterSlot final { std::uint32_t TextID = 0; Register Reg; }; struct MIFrameObjectSlot final { std::uint32_t TextID = 0; FrameIndex Index; std::optional Name; }; struct MIConstantPoolSlot final { std::uint32_t TextID = 0; ConstantPoolIndex Index; }; struct MIJumpTableSlot final { std::uint32_t TextID = 0; JumpTableIndex Index; }; struct MIMetadataSlot final { std::uint32_t TextID = 0; MachineMetadataReference Reference; }; struct MISyncScopeSlot final { std::string Name; SyncScopeID ID; }; struct MIParserContext final { std::vector VirtualRegisters; std::vector StackObjects; std::vector FixedStackObjects; std::vector ConstantPoolItems; std::vector JumpTables; std::vector Metadata; std::vector SyncScopes; std::function HasIRBlock; std::function(std::string_view)> InternSyncScope; std::function(std::uint32_t)> PointerSizeInBits; }; struct MIParserOptions final { std::size_t MaximumTokens = std::size_t{1} << 24U; std::size_t MaximumTokenLength = std::size_t{1} << 24U; std::size_t MaximumBlocks = std::size_t{1} << 20U; std::size_t MaximumInstructions = std::size_t{1} << 24U; std::size_t MaximumOperandsPerInstruction = std::size_t{1} << 20U; std::size_t MaximumMemoryOperandsPerInstruction = std::size_t{1} << 20U; bool VerifyAfterParse = true; }; class MIParser final { public: MIParser(MachineFunction &Function, const TargetDescription &Target, std::string SourceName, std::string SourceText, MIParserContext Context = {}, MIParserOptions Options = {}); MIParser(const MIParser &) = delete; MIParser &operator=(const MIParser &) = delete; MIParser(MIParser &&) noexcept; MIParser &operator=(MIParser &&) noexcept; ~MIParser(); [[nodiscard]] Expected parse(); [[nodiscard]] const TextSource &source() const noexcept; [[nodiscard]] std::span diagnostics() const noexcept; [[nodiscard]] bool failed() const noexcept; private: class Impl; std::unique_ptr Implementation; }; } // namespace mir } // namespace rcc #endif // RCC_CODEGEN_MIRPARSER_MIPARSER_H