From d62f022c92fcc3ebe2269273628943a0089683fd Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Thu, 13 Aug 2026 06:19:30 +0800 Subject: [CodeGen] Align MIR parser and printer ownership --- backend/include/rcc/CodeGen/MIRParser/MIParser.h | 107 +++++++++++++ backend/include/rcc/CodeGen/MIRParser/MIRParser.h | 130 ++++++++++++++++ backend/include/rcc/CodeGen/MIRPrinter.h | 45 ++++++ backend/include/rcc/CodeGen/MIRYamlMapping.h | 144 +++++++++++++++++ backend/include/rcc/MIR/MIDebugSyntax.h | 26 ---- backend/include/rcc/MIR/MILexer.h | 181 ---------------------- backend/include/rcc/MIR/MIParser.h | 107 ------------- backend/include/rcc/MIR/MIPrinter.h | 35 ----- backend/include/rcc/MIR/MIRDocument.h | 141 ----------------- backend/include/rcc/Tooling/ArtifactStore.h | 2 +- backend/include/rcc/Tooling/PipelineDriver.h | 2 +- 11 files changed, 428 insertions(+), 492 deletions(-) create mode 100644 backend/include/rcc/CodeGen/MIRParser/MIParser.h create mode 100644 backend/include/rcc/CodeGen/MIRParser/MIRParser.h create mode 100644 backend/include/rcc/CodeGen/MIRPrinter.h create mode 100644 backend/include/rcc/CodeGen/MIRYamlMapping.h delete mode 100644 backend/include/rcc/MIR/MIDebugSyntax.h delete mode 100644 backend/include/rcc/MIR/MILexer.h delete mode 100644 backend/include/rcc/MIR/MIParser.h delete mode 100644 backend/include/rcc/MIR/MIPrinter.h delete mode 100644 backend/include/rcc/MIR/MIRDocument.h (limited to 'backend/include/rcc') diff --git a/backend/include/rcc/CodeGen/MIRParser/MIParser.h b/backend/include/rcc/CodeGen/MIRParser/MIParser.h new file mode 100644 index 0000000..0b888e5 --- /dev/null +++ b/backend/include/rcc/CodeGen/MIRParser/MIParser.h @@ -0,0 +1,107 @@ +// 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 diff --git a/backend/include/rcc/CodeGen/MIRParser/MIRParser.h b/backend/include/rcc/CodeGen/MIRParser/MIRParser.h new file mode 100644 index 0000000..798a747 --- /dev/null +++ b/backend/include/rcc/CodeGen/MIRParser/MIRParser.h @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_CODEGEN_MIRPARSER_MIRPARSER_H +#define RCC_CODEGEN_MIRPARSER_MIRPARSER_H + +#include "rcc/CodeGen/CompilationUnit.h" +#include "rcc/CodeGen/MIRParser/MIParser.h" +#include "rcc/CodeGen/StableID.h" +#include "rcc/MIR/EmbeddedIR.h" +#include "rcc/Support/TextDiagnostic.h" +#include "rcc/Support/YAML.h" + +#include +#include +#include +#include +#include +#include + +namespace rcc { + +class TargetDescription; + +namespace mir { + +struct MIRFunctionDocumentInfo final { + MachineFunctionStableID Function; + std::optional NoPHIs; + std::optional IsSSA; + std::optional NoVRegs; + std::optional HasFakeUses; + + friend bool operator==(const MIRFunctionDocumentInfo &Left, + const MIRFunctionDocumentInfo &Right) = default; +}; + +class MIRDocument final { +public: + MIRDocument(); + explicit MIRDocument(CompilationUnit Unit); + MIRDocument(const MIRDocument &) = delete; + MIRDocument &operator=(const MIRDocument &) = delete; + MIRDocument(MIRDocument &&) noexcept; + MIRDocument &operator=(MIRDocument &&) noexcept; + ~MIRDocument(); + + [[nodiscard]] CompilationUnit &unit() noexcept { + return Unit; + } + + [[nodiscard]] const CompilationUnit &unit() const noexcept { + return Unit; + } + + [[nodiscard]] const EmbeddedIRReferenceIndex *embeddedIR() const noexcept { + return EmbeddedIR ? &*EmbeddedIR : nullptr; + } + + [[nodiscard]] std::span functionDocumentInfo() const noexcept { + return FunctionInfo; + } + + [[nodiscard]] std::span syncScopes() const noexcept { + return SyncScopes; + } + +private: + CompilationUnit Unit; + std::optional EmbeddedIR; + std::vector FunctionInfo; + std::vector SyncScopes; + + friend class MIRDocumentParser; +}; + +struct MIRDocumentParserOptions final { + yaml::ParseOptions YAML; + MIParserOptions MachineInstructions; + std::string DataLayout; + bool VerifyMachineFunctions = true; +}; + +class MIRDocumentParseResult final { +public: + MIRDocumentParseResult(const MIRDocumentParseResult &) = delete; + MIRDocumentParseResult &operator=(const MIRDocumentParseResult &) = delete; + MIRDocumentParseResult(MIRDocumentParseResult &&) noexcept; + MIRDocumentParseResult &operator=(MIRDocumentParseResult &&) noexcept; + ~MIRDocumentParseResult(); + + [[nodiscard]] bool succeeded() const noexcept { + return Document.has_value() && Diagnostics.empty(); + } + + [[nodiscard]] MIRDocument *document() noexcept { + return Document ? &*Document : nullptr; + } + + [[nodiscard]] const MIRDocument *document() const noexcept { + return Document ? &*Document : nullptr; + } + + [[nodiscard]] const TextSource &source() const noexcept { + return Source; + } + + [[nodiscard]] std::span diagnostics() const noexcept { + return Diagnostics; + } + +private: + MIRDocumentParseResult(std::string SourceName, std::string SourceText) + : Source(std::move(SourceName), std::move(SourceText)) {} + + TextSource Source; + std::optional Document; + std::vector Diagnostics; + + friend class MIRDocumentParser; +}; + +[[nodiscard]] MIRDocumentParseResult parseMIRDocument(const TargetDescription &Target, + std::string SourceName, + std::string SourceText, + MIRDocumentParserOptions Options = {}); + +} // namespace mir +} // namespace rcc + +#endif // RCC_CODEGEN_MIRPARSER_MIRPARSER_H diff --git a/backend/include/rcc/CodeGen/MIRPrinter.h b/backend/include/rcc/CodeGen/MIRPrinter.h new file mode 100644 index 0000000..bb87509 --- /dev/null +++ b/backend/include/rcc/CodeGen/MIRPrinter.h @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_CODEGEN_MIRPRINTER_H +#define RCC_CODEGEN_MIRPRINTER_H + +#include "rcc/CodeGen/MIRParser/MIRParser.h" +#include "rcc/Support/Error.h" + +#include + +namespace rcc { + +class MachineFunction; +class TargetDescription; + +namespace mir { + +enum class MIPrintMode : unsigned char { + Complete, + Readable, +}; + +struct MIPrinterOptions final { + MIPrintMode Mode = MIPrintMode::Complete; +}; + +[[nodiscard]] Expected printMachineFunctionBody(const MachineFunction &Function, + const TargetDescription &Target, + const MIParserContext &Context = {}, + MIPrinterOptions Options = {}); + +struct MIRDocumentPrinterOptions final { + MIPrintMode Mode = MIPrintMode::Complete; + bool EmitEmbeddedIR = true; + std::string DataLayout; +}; + +[[nodiscard]] Expected printMIRDocument(const MIRDocument &Document, + const TargetDescription &Target, + MIRDocumentPrinterOptions Options = {}); + +} // namespace mir +} // namespace rcc + +#endif // RCC_CODEGEN_MIRPRINTER_H diff --git a/backend/include/rcc/CodeGen/MIRYamlMapping.h b/backend/include/rcc/CodeGen/MIRYamlMapping.h new file mode 100644 index 0000000..82880ca --- /dev/null +++ b/backend/include/rcc/CodeGen/MIRYamlMapping.h @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_CODEGEN_MIRYAMLMAPPING_H +#define RCC_CODEGEN_MIRYAMLMAPPING_H + +#include "rcc/CodeGen/MIRParser/MIRParser.h" +#include "rcc/CodeGen/MachineDebugInfo.h" +#include "rcc/CodeGen/MachineFrameInfo.h" +#include "rcc/CodeGen/MachineJumpTableInfo.h" +#include "rcc/CodeGen/MachineMetadata.h" +#include "rcc/CodeGen/TargetMIRTextInfo.h" +#include "rcc/MIR/LLVMConstantSyntax.h" +#include "rcc/Support/Error.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace rcc { + +class MachineBasicBlock; +class MachineFunction; +class MachineInstr; + +namespace mir { + +struct PendingJumpTable final { + JumpTableIndex Index; + std::uint32_t TextID = 0; + JumpTableEntryEncoding Encoding = JumpTableEntryEncoding::BlockAddress; + std::uint8_t EntrySize = 8; + std::vector Blocks; +}; + +class MIRDocumentParser final { +public: + MIRDocumentParser(const TargetDescription &Target, std::string SourceName, std::string SourceText, + MIRDocumentParserOptions Options) + : Target(Target), Options(std::move(Options)), + Result(std::move(SourceName), std::move(SourceText)) {} + + [[nodiscard]] MIRDocumentParseResult run(); + +private: + [[nodiscard]] bool fail(const TextRange &Range, std::string Message, + std::string Category = "mir-yaml"); + [[nodiscard]] bool importError(const TextRange &Range, const Error &Failure, + std::string Category = "mir-yaml"); + [[nodiscard]] const yaml::Node *node(yaml::NodeID ID) const noexcept { + return Stream->node(ID); + } + [[nodiscard]] const yaml::Node *mappingValue(const yaml::Node &Mapping, + std::string_view Key) const noexcept; + [[nodiscard]] bool requireKind(const yaml::Node &Node, yaml::NodeKind Kind, + std::string_view Description); + [[nodiscard]] bool validateKeys(const yaml::Node &Mapping, std::span Keys, + std::string_view Description); + [[nodiscard]] bool scalar(const yaml::Node &Node, std::string_view &Value, + std::string_view Description); + [[nodiscard]] bool boolean(const yaml::Node &Node, bool &Value); + [[nodiscard]] bool unsignedValue(const yaml::Node &Node, std::uint64_t &Value, + std::string_view Description); + [[nodiscard]] bool signedValue(const yaml::Node &Node, std::int64_t &Value, + std::string_view Description); + [[nodiscard]] bool alignment(const yaml::Node &Node, Alignment &Value, bool AllowZero); + [[nodiscard]] bool physicalRegister(const yaml::Node &Node, PhysicalRegister &Reg); + [[nodiscard]] bool physicalRegister(std::string_view Text, const TextRange &Range, + PhysicalRegister &Reg); + [[nodiscard]] bool virtualRegister(std::string_view Text, const TextRange &Range, + MachineFunction &Function, MIParserContext &Context, + Register &Reg); + [[nodiscard]] Expected + resolveMetadataReference(const MachineFunction &Function, std::uint32_t Slot) const; + [[nodiscard]] bool parseVariableDebugInfo(const yaml::Node &Entry, MachineFunction &Function, + MachineVariableDebugInfo &DebugInfo); + [[nodiscard]] bool parseFunction(const yaml::Node &Root, MIRDocument &Document); + [[nodiscard]] bool parseFunctionScalars(const yaml::Node &Root, MachineFunction &Function, + MIRFunctionDocumentInfo &DocumentInfo); + [[nodiscard]] bool recomputeProperties(const yaml::Node &Root, MachineFunction &Function, + const MIRFunctionDocumentInfo &DocumentInfo); + [[nodiscard]] bool parseRegisters(const yaml::Node &Root, MachineFunction &Function, + MIParserContext &Context); + [[nodiscard]] bool parseMetadata(const yaml::Node &Root, MachineFunction &Function, + MIParserContext &Context); + [[nodiscard]] bool parseStackObjects(const yaml::Node &Root, MachineFunction &Function, + MIParserContext &Context); + [[nodiscard]] bool parseConstants(const yaml::Node &Root, MachineFunction &Function, + MIParserContext &Context); + [[nodiscard]] bool parseFrameState(const yaml::Node &Root, MachineFunction &Function, + const MIParserContext &Context); + [[nodiscard]] bool reserveJumpTables(const yaml::Node &Root, MachineFunction &Function, + MIParserContext &Context, + std::vector &Pending); + [[nodiscard]] bool defineJumpTables(MachineFunction &Function, + std::span Pending); + [[nodiscard]] bool parseBody(const yaml::Node &Root, MachineFunction &Function, + MIParserContext &Context); + [[nodiscard]] TextRange scalarDiagnosticRange(const yaml::Node &Scalar, + const TextRange &ScalarRange) const noexcept; + [[nodiscard]] bool parseFunctionRecords(const yaml::Node &Root, MachineFunction &Function); + [[nodiscard]] bool parseTargetState(const yaml::Node &Root, MachineFunction &Function); + [[nodiscard]] bool convertTargetNode(const yaml::Node &Source, MIRTargetNode &Destination); + [[nodiscard]] bool validateDocumentReferences(const MachineFunction &Function); + [[nodiscard]] std::string_view effectiveDataLayout() const noexcept; + [[nodiscard]] LLVMConstantSyntaxOptions pointerLayoutOptions() const noexcept; + + [[nodiscard]] MachineBasicBlock *blockAt(MachineFunction &Function, + std::uint32_t Number) const noexcept; + [[nodiscard]] MachineInstr *instructionAt(MachineFunction &Function, std::uint32_t Block, + std::uint32_t Offset) const noexcept; + [[nodiscard]] bool parseBlockReference(std::string_view Text, const TextRange &Range, + MachineFunction &Function, MachineBasicBlock *&Block); + [[nodiscard]] bool parseFrameReference(const yaml::Node &Node, const MIParserContext &Context, + FrameIndex &Index); + [[nodiscard]] bool parseSaveRestorePoints(const yaml::Node &Node, MachineFunction &Function, + std::vector &Points); + + const TargetDescription &Target; + MIRDocumentParserOptions Options; + MIRDocumentParseResult Result; + const yaml::Stream *Stream = nullptr; + MIRDocument *ActiveDocument = nullptr; + MachineFunction *ActiveFunction = nullptr; +}; + +[[nodiscard]] Expected verifyMIRDocumentReferences(const MIRDocument &Document, + const MachineFunction &Function, + bool UseEmbeddedIR); + +[[nodiscard]] std::optional +parseDIExpressionOpcodeName(std::string_view Name) noexcept; +[[nodiscard]] std::optional +parseDIExpressionAttributeEncodingName(std::string_view Name) noexcept; +[[nodiscard]] std::string invalidDIExpressionElementMessage(std::string_view Name); +[[nodiscard]] std::string formatDIExpression(std::span Elements); + +} // namespace mir +} // namespace rcc + +#endif // RCC_CODEGEN_MIRYAMLMAPPING_H diff --git a/backend/include/rcc/MIR/MIDebugSyntax.h b/backend/include/rcc/MIR/MIDebugSyntax.h deleted file mode 100644 index 4952128..0000000 --- a/backend/include/rcc/MIR/MIDebugSyntax.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_MIR_MIDEBUGSYNTAX_H -#define RCC_MIR_MIDEBUGSYNTAX_H - -#include -#include -#include -#include -#include - -namespace rcc::mir { - -[[nodiscard]] std::optional -parseDIExpressionOpcodeName(std::string_view Name) noexcept; - -[[nodiscard]] std::optional -parseDIExpressionAttributeEncodingName(std::string_view Name) noexcept; - -[[nodiscard]] std::string invalidDIExpressionElementMessage(std::string_view Name); - -[[nodiscard]] std::string formatDIExpression(std::span Elements); - -} // namespace rcc::mir - -#endif // RCC_MIR_MIDEBUGSYNTAX_H diff --git a/backend/include/rcc/MIR/MILexer.h b/backend/include/rcc/MIR/MILexer.h deleted file mode 100644 index f54f255..0000000 --- a/backend/include/rcc/MIR/MILexer.h +++ /dev/null @@ -1,181 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_MIR_MILEXER_H -#define RCC_MIR_MILEXER_H - -#include "rcc/Support/TextDiagnostic.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace rcc::mir { - -enum class MITokenKind : std::uint8_t { - EndOfFile, - Error, - Newline, - - Comma, - Equal, - Underscore, - Colon, - DoubleColon, - Dot, - Exclaim, - LeftParen, - RightParen, - LeftBrace, - RightBrace, - Plus, - Minus, - Less, - Greater, - - Keyword, - MetadataKeyword, - Identifier, - NamedRegister, - NamedVirtualRegister, - MachineBasicBlockLabel, - MachineBasicBlock, - StackObject, - FixedStackObject, - NamedGlobalValue, - GlobalValue, - ExternalSymbol, - MCSymbol, - IntegerLiteral, - FloatingPointLiteral, - HexLiteral, - VirtualRegister, - ConstantPoolItem, - JumpTableIndex, - NamedIRBlock, - IRBlock, - NamedIRValue, - IRValue, - QuotedIRValue, - SubRegisterIndex, - StringConstant, -}; - -[[nodiscard]] std::string_view getMITokenKindName(MITokenKind Kind) noexcept; -[[nodiscard]] bool isMIKeyword(std::string_view Spelling) noexcept; -[[nodiscard]] bool isMIMetadataKeyword(std::string_view Spelling) noexcept; - -class MIToken final { -public: - [[nodiscard]] MITokenKind kind() const noexcept { - return Kind; - } - - [[nodiscard]] const TextRange &range() const noexcept { - return Range; - } - - [[nodiscard]] std::string_view spelling() const noexcept { - return Spelling; - } - - [[nodiscard]] bool hasStringValue() const noexcept { - return !std::holds_alternative(StringValue); - } - - [[nodiscard]] std::string_view stringValue() const noexcept; - - [[nodiscard]] bool hasIntegerValue() const noexcept { - return !IntegerValue.empty(); - } - - [[nodiscard]] std::string_view integerValue() const noexcept { - return IntegerValue; - } - - [[nodiscard]] bool is(MITokenKind Expected) const noexcept { - return Kind == Expected; - } - - [[nodiscard]] bool isKeyword(std::string_view Expected) const noexcept { - return Kind == MITokenKind::Keyword && stringValue() == Expected; - } - - [[nodiscard]] bool isMetadataKeyword(std::string_view Expected) const noexcept { - return Kind == MITokenKind::MetadataKeyword && stringValue() == Expected; - } - - [[nodiscard]] bool isNewlineOrEnd() const noexcept { - return Kind == MITokenKind::Newline || Kind == MITokenKind::EndOfFile; - } - - [[nodiscard]] bool isErrorOrEnd() const noexcept { - return Kind == MITokenKind::Error || Kind == MITokenKind::EndOfFile; - } - - [[nodiscard]] bool isRegister() const noexcept; - [[nodiscard]] bool isRegisterFlag() const noexcept; - [[nodiscard]] bool isMemoryOperandFlag() const noexcept; - -private: - using StringValueStorage = std::variant; - - MIToken(MITokenKind Kind, TextRange Range, std::string_view Spelling, - StringValueStorage StringValue = {}, std::string_view IntegerValue = {}) - : Kind(Kind), Range(Range), Spelling(Spelling), StringValue(std::move(StringValue)), - IntegerValue(IntegerValue) {} - - MITokenKind Kind = MITokenKind::Error; - TextRange Range; - std::string_view Spelling; - StringValueStorage StringValue; - std::string_view IntegerValue; - - friend class MILexer; -}; - -struct MILexerOptions final { - std::size_t MaximumTokenLength = std::size_t{1} << 24U; - std::size_t MaximumTokens = std::size_t{1} << 24U; -}; - -class MILexer final { -public: - MILexer(std::string SourceName, std::string SourceText, MILexerOptions Options = {}); - MILexer(const MILexer &) = delete; - MILexer &operator=(const MILexer &) = delete; - MILexer(MILexer &&) noexcept; - MILexer &operator=(MILexer &&) noexcept; - ~MILexer(); - - [[nodiscard]] MIToken next(); - - [[nodiscard]] const TextSource &source() const noexcept; - [[nodiscard]] std::span diagnostics() const noexcept; - [[nodiscard]] bool failed() const noexcept; - [[nodiscard]] std::size_t tokenCount() const noexcept; - -private: - [[nodiscard]] static MIToken makeToken(MITokenKind Kind, TextRange Range, - std::string_view Spelling, - std::string_view IntegerValue = {}); - [[nodiscard]] static MIToken makeStringToken(MITokenKind Kind, TextRange Range, - std::string_view Spelling, - std::string_view StringValue, - std::string_view IntegerValue = {}); - [[nodiscard]] static MIToken makeOwnedStringToken(MITokenKind Kind, TextRange Range, - std::string_view Spelling, - std::string StringValue, - std::string_view IntegerValue = {}); - - class Impl; - std::unique_ptr Implementation; -}; - -} // namespace rcc::mir - -#endif // RCC_MIR_MILEXER_H diff --git a/backend/include/rcc/MIR/MIParser.h b/backend/include/rcc/MIR/MIParser.h deleted file mode 100644 index b660f47..0000000 --- a/backend/include/rcc/MIR/MIParser.h +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_MIR_MIPARSER_H -#define RCC_MIR_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_MIR_MIPARSER_H diff --git a/backend/include/rcc/MIR/MIPrinter.h b/backend/include/rcc/MIR/MIPrinter.h deleted file mode 100644 index 663859e..0000000 --- a/backend/include/rcc/MIR/MIPrinter.h +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_MIR_MIPRINTER_H -#define RCC_MIR_MIPRINTER_H - -#include "rcc/MIR/MIParser.h" -#include "rcc/Support/Error.h" - -#include - -namespace rcc { - -class MachineFunction; -class TargetDescription; - -namespace mir { - -enum class MIPrintMode : unsigned char { - Complete, - Readable, -}; - -struct MIPrinterOptions final { - MIPrintMode Mode = MIPrintMode::Complete; -}; - -[[nodiscard]] Expected printMachineFunctionBody(const MachineFunction &Function, - const TargetDescription &Target, - const MIParserContext &Context = {}, - MIPrinterOptions Options = {}); - -} // namespace mir -} // namespace rcc - -#endif // RCC_MIR_MIPRINTER_H diff --git a/backend/include/rcc/MIR/MIRDocument.h b/backend/include/rcc/MIR/MIRDocument.h deleted file mode 100644 index 6041657..0000000 --- a/backend/include/rcc/MIR/MIRDocument.h +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_MIR_MIRDOCUMENT_H -#define RCC_MIR_MIRDOCUMENT_H - -#include "rcc/CodeGen/CompilationUnit.h" -#include "rcc/CodeGen/StableID.h" -#include "rcc/MIR/EmbeddedIR.h" -#include "rcc/MIR/MIParser.h" -#include "rcc/MIR/MIPrinter.h" -#include "rcc/Support/TextDiagnostic.h" -#include "rcc/Support/YAML.h" - -#include -#include -#include -#include -#include -#include - -namespace rcc { - -class TargetDescription; - -namespace mir { - -struct MIRFunctionDocumentInfo final { - MachineFunctionStableID Function; - std::optional NoPHIs; - std::optional IsSSA; - std::optional NoVRegs; - std::optional HasFakeUses; - - friend bool operator==(const MIRFunctionDocumentInfo &Left, - const MIRFunctionDocumentInfo &Right) = default; -}; - -class MIRDocument final { -public: - MIRDocument(); - explicit MIRDocument(CompilationUnit Unit); - MIRDocument(const MIRDocument &) = delete; - MIRDocument &operator=(const MIRDocument &) = delete; - MIRDocument(MIRDocument &&) noexcept; - MIRDocument &operator=(MIRDocument &&) noexcept; - ~MIRDocument(); - - [[nodiscard]] CompilationUnit &unit() noexcept { - return Unit; - } - - [[nodiscard]] const CompilationUnit &unit() const noexcept { - return Unit; - } - - [[nodiscard]] const EmbeddedIRReferenceIndex *embeddedIR() const noexcept { - return EmbeddedIR ? &*EmbeddedIR : nullptr; - } - - [[nodiscard]] std::span functionDocumentInfo() const noexcept { - return FunctionInfo; - } - - [[nodiscard]] std::span syncScopes() const noexcept { - return SyncScopes; - } - -private: - CompilationUnit Unit; - std::optional EmbeddedIR; - std::vector FunctionInfo; - std::vector SyncScopes; - - friend class MIRDocumentParser; -}; - -struct MIRDocumentParserOptions final { - yaml::ParseOptions YAML; - MIParserOptions MachineInstructions; - std::string DataLayout; - bool VerifyMachineFunctions = true; -}; - -class MIRDocumentParseResult final { -public: - MIRDocumentParseResult(const MIRDocumentParseResult &) = delete; - MIRDocumentParseResult &operator=(const MIRDocumentParseResult &) = delete; - MIRDocumentParseResult(MIRDocumentParseResult &&) noexcept; - MIRDocumentParseResult &operator=(MIRDocumentParseResult &&) noexcept; - ~MIRDocumentParseResult(); - - [[nodiscard]] bool succeeded() const noexcept { - return Document.has_value() && Diagnostics.empty(); - } - - [[nodiscard]] MIRDocument *document() noexcept { - return Document ? &*Document : nullptr; - } - - [[nodiscard]] const MIRDocument *document() const noexcept { - return Document ? &*Document : nullptr; - } - - [[nodiscard]] const TextSource &source() const noexcept { - return Source; - } - - [[nodiscard]] std::span diagnostics() const noexcept { - return Diagnostics; - } - -private: - MIRDocumentParseResult(std::string SourceName, std::string SourceText) - : Source(std::move(SourceName), std::move(SourceText)) {} - - TextSource Source; - std::optional Document; - std::vector Diagnostics; - - friend class MIRDocumentParser; -}; - -[[nodiscard]] MIRDocumentParseResult parseMIRDocument(const TargetDescription &Target, - std::string SourceName, - std::string SourceText, - MIRDocumentParserOptions Options = {}); - -struct MIRDocumentPrinterOptions final { - MIPrintMode Mode = MIPrintMode::Complete; - bool EmitEmbeddedIR = true; - std::string DataLayout; -}; - -[[nodiscard]] Expected printMIRDocument(const MIRDocument &Document, - const TargetDescription &Target, - MIRDocumentPrinterOptions Options = {}); - -} // namespace mir -} // namespace rcc - -#endif // RCC_MIR_MIRDOCUMENT_H diff --git a/backend/include/rcc/Tooling/ArtifactStore.h b/backend/include/rcc/Tooling/ArtifactStore.h index a30f572..f11cd6c 100644 --- a/backend/include/rcc/Tooling/ArtifactStore.h +++ b/backend/include/rcc/Tooling/ArtifactStore.h @@ -3,7 +3,7 @@ #ifndef RCC_TOOLING_ARTIFACTSTORE_H #define RCC_TOOLING_ARTIFACTSTORE_H -#include "rcc/MIR/MIRDocument.h" +#include "rcc/CodeGen/MIRParser/MIRParser.h" #include "rcc/Support/Error.h" #include "rcc/Tooling/BackendManifest.h" diff --git a/backend/include/rcc/Tooling/PipelineDriver.h b/backend/include/rcc/Tooling/PipelineDriver.h index 849b2f7..5fa4fba 100644 --- a/backend/include/rcc/Tooling/PipelineDriver.h +++ b/backend/include/rcc/Tooling/PipelineDriver.h @@ -3,8 +3,8 @@ #ifndef RCC_TOOLING_PIPELINEDRIVER_H #define RCC_TOOLING_PIPELINEDRIVER_H +#include "rcc/CodeGen/MIRParser/MIRParser.h" #include "rcc/CodeGen/MachinePassManager.h" -#include "rcc/MIR/MIRDocument.h" #include "rcc/Tooling/BackendInvocation.h" #include -- cgit v1.2.3