From 444db30751380e8fe459bfeae4c5bb2a93c596eb Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Thu, 13 Aug 2026 13:10:47 +0800 Subject: [TableGen] Split the target description generator --- backend/include/rcc/TableGen/Parser.h | 24 ++++ backend/include/rcc/TableGen/Record.h | 231 ++++++++++++++++++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 backend/include/rcc/TableGen/Parser.h create mode 100644 backend/include/rcc/TableGen/Record.h (limited to 'backend/include/rcc/TableGen') diff --git a/backend/include/rcc/TableGen/Parser.h b/backend/include/rcc/TableGen/Parser.h new file mode 100644 index 0000000..ff10aa7 --- /dev/null +++ b/backend/include/rcc/TableGen/Parser.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_TABLEGEN_PARSER_H +#define RCC_TABLEGEN_PARSER_H + +#include "rcc/TableGen/Record.h" + +#include +#include +#include + +namespace rcc::targetgen { + +struct DescriptionParseResult final { + std::optional Records; + std::vector Diagnostics; +}; + +[[nodiscard]] DescriptionParseResult parseDescription(std::string SourceName, + std::string SourceText); + +} // namespace rcc::targetgen + +#endif // RCC_TABLEGEN_PARSER_H diff --git a/backend/include/rcc/TableGen/Record.h b/backend/include/rcc/TableGen/Record.h new file mode 100644 index 0000000..a3f8a5c --- /dev/null +++ b/backend/include/rcc/TableGen/Record.h @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_TABLEGEN_RECORD_H +#define RCC_TABLEGEN_RECORD_H + +#include "rcc/Support/TextDiagnostic.h" + +#include +#include +#include +#include +#include +#include + +namespace rcc::targetgen { + +struct SourceTarget final { + std::string Namespace; + std::string Name; + std::string Triple; + std::string CPU; + std::string ABI; + std::string DataLayout; + std::vector Features; + TextRange Range; +}; + +struct SourceRegisterUnit final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + TextRange Range; +}; + +struct SourceRegisterUnitLane final { + std::string UnitSymbol; + std::uint64_t Lanes = 0; + TextRange Range; +}; + +struct SourceRegister final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::uint32_t Encoding = 0; + std::uint32_t DwarfRegister = 0; + std::vector Units; + bool IsConstant = false; + bool IsArtificial = false; + bool IsReserved = false; + std::vector AlternativeNames; + TextRange Range; +}; + +struct SourceRegisterBank final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::uint32_t MaximumSizeInBits = 0; + TextRange Range; +}; + +struct SourceRegisterClass final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::string BankSymbol; + std::uint32_t SizeInBits = 0; + std::uint32_t SpillSizeInBits = 0; + std::uint32_t SpillAlignmentInBits = 0; + std::uint64_t Lanes = 0; + std::vector RegisterSymbols; + std::vector AllocationOrderSymbols; + bool Allocatable = true; + std::uint32_t CopyCost = 1; + TextRange Range; +}; + +struct SourceRegisterMask final { + std::string Name; + std::vector PreservedRegisterSymbols; + TextRange Range; +}; + +struct SourceMIROperandFlag final { + std::string Name; + std::uint32_t Value = 0; + TextRange Range; +}; + +struct SourceMIROperandFlags final { + std::uint32_t DirectMask = 0; + std::vector Direct; + std::vector Bitmask; + TextRange Range; +}; + +struct SourceCallingConvention final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::string IntegerRegisterClassSymbol; + std::string FloatingRegisterClassSymbol; + std::vector IntegerArgumentRegisterSymbols; + std::vector FloatingArgumentRegisterSymbols; + std::vector IntegerReturnRegisterSymbols; + std::vector FloatingReturnRegisterSymbols; + std::string PreservedMaskName; + std::uint32_t StackAlignmentBytes = 0; + std::uint32_t StackArgumentAlignmentBytes = 0; + std::uint32_t ShadowSpaceBytes = 0; + bool SupportsVarArgs = false; + bool SupportsTailCalls = false; + TextRange Range; +}; + +struct SourceNamedOperand final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + TextRange Range; +}; + +struct SourceImmediatePredicate final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::string Kind; + std::uint32_t Bits = 0; + std::uint64_t Alignment = 1; + bool NonZero = false; + std::vector AllowedValues; + TextRange Range; +}; + +struct SourceSchedulingClass final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::uint32_t MicroOps = 0; + std::uint32_t Latency = 0; + TextRange Range; +}; + +struct SourceEncodingCategory final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::uint32_t SizeInBytes = 0; + TextRange Range; +}; + +struct SourceAssemblyFormat final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + TextRange Range; +}; + +struct SourceOperand final { + std::vector Kinds; + std::string RegisterRole = "none"; + std::optional RegisterClassSymbol; + std::optional RegisterBankSymbol; + std::optional ImmediatePredicateSymbol; + std::string MemoryRole = "none"; + std::optional DefaultTiedOperand; + bool EarlyClobber = false; + bool Optional = false; + bool VariadicGroup = false; + bool AllowSubReg = false; + std::optional NameSymbol; + std::uint32_t AllowedTargetFlags = 0; + TextRange Range; +}; + +struct SourceImplicitRegister final { + std::string RegisterSymbol; + bool EarlyClobber = false; + bool Renamable = false; + TextRange Range; +}; + +struct SourceInstruction final { + std::uint32_t ID = 0; + std::string Symbol; + std::string Name; + std::string AssemblyMnemonic; + std::optional BinaryEncoding; + std::vector Operands; + std::uint32_t NumExplicitDefs = 0; + bool Variadic = false; + std::vector ImplicitDefs; + std::vector ImplicitUses; + bool AllowExtraImplicitOperands = false; + std::vector Flags; + std::string SchedulingClassSymbol; + std::string EncodingCategorySymbol; + std::string AssemblyFormatSymbol; + bool RequiresMemoryOperands = false; + std::string Owner = "none"; + std::string Deadline = "emission"; + TextRange Range; +}; + +struct DescriptionAST final { + SourceTarget Target; + std::vector RegisterUnits; + std::vector Registers; + std::vector RegisterBanks; + std::vector RegisterClasses; + std::vector RegisterMasks; + SourceMIROperandFlags MIROperandFlags; + std::vector CallingConventions; + std::vector NamedOperands; + std::vector ImmediatePredicates; + std::vector SchedulingClasses; + std::vector EncodingCategories; + std::vector AssemblyFormats; + std::vector Instructions; +}; + +[[nodiscard]] std::string lowerASCII(std::string_view Value); +[[nodiscard]] bool isIdentifier(std::string_view Value) noexcept; +[[nodiscard]] bool isAssemblyMnemonic(std::string_view Value) noexcept; +[[nodiscard]] std::string upperIdentifier(std::string_view Value); +void appendQuoted(std::ostream &Output, std::string_view Value); + +} // namespace rcc::targetgen + +#endif // RCC_TABLEGEN_RECORD_H -- cgit v1.2.3