// 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