// 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; std::vector SuperClassSymbols; 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::optional TypeIndex; 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::uint32_t SizeInBytes = 0; std::string AssemblyFormatSymbol; bool RequiresMemoryOperands = false; std::string Owner = "none"; std::string Deadline = "emission"; TextRange Range; }; struct SourceSelectionTypePredicate final { std::string Kind; std::uint32_t Bits = 0; TextRange Range; }; struct SourceSelectionOperandTypePredicate final { std::uint32_t OperandIndex = 0; SourceSelectionTypePredicate Type; TextRange Range; }; struct SourceSelectionOperandBankPredicate final { std::uint32_t OperandIndex = 0; std::string BankSymbol; TextRange Range; }; struct SourceSelectionOperandClassPredicate final { std::uint32_t OperandIndex = 0; std::string ClassSymbol; TextRange Range; }; struct SourceSelectionIntegerPredicate final { std::uint32_t OperandIndex = 0; std::string Predicate; TextRange Range; }; struct SourceSelectionFloatingPredicate final { std::uint32_t OperandIndex = 0; std::string Predicate; TextRange Range; }; struct SourceSelectionTargetPredicate final { std::string Symbol; TextRange Range; }; struct SourceSelectionConstantRange final { std::int64_t Minimum = 0; std::int64_t Maximum = 0; TextRange SourceRange; }; struct SourceSelectionOperandImmediatePredicate final { std::uint32_t OperandIndex = 0; std::vector Ranges; TextRange Range; }; struct SourceSelectionOperandDefConstantPredicate final { std::uint32_t OperandIndex = 0; std::vector Ranges; TextRange Range; }; struct SourceSelectionDefUseCapture final { std::string Symbol; std::uint32_t OperandIndex = 0; TextRange Range; }; struct SourceSelectionDefUsePredicate final { std::uint32_t RootOperandIndex = 0; std::string OpcodeSymbol; std::optional IntegerPredicate; std::vector Captures; std::vector OperandDefConstants; TextRange Range; }; struct SourceSelectionTemporary final { std::string Symbol; std::uint32_t TypeFromOperand = 0; TextRange Range; }; struct SourceSelectionOperandRenderer final { std::optional OperandIndex; std::optional ComplexOperandIndex; std::string PhysicalRegisterSymbol; std::string ComplexRendererSymbol; std::string TemporarySymbol; std::string CapturedOperandSymbol; std::optional CapturedImmediateOperand; std::optional Immediate; std::string ImmediateTransform; std::vector Flags; TextRange Range; }; struct SourceSelectionAction final { std::string ResultOpcodeSymbol; bool ReplacesRoot = false; std::vector OperandRenderers; TextRange Range; }; struct SourceSelectionRule final { std::string Symbol; std::uint32_t Priority = 0; std::string MatchOpcodeSymbol; std::optional ResultType; std::optional IntegerPredicate; std::optional FloatingPredicate; std::vector TargetPredicates; std::vector OperandTypes; std::vector OperandBanks; std::vector OperandClasses; std::vector OperandImmediates; std::vector OperandDefConstants; std::vector DefUsePredicates; std::vector Temporaries; std::vector Actions; std::vector EraseOperandDefinitions; 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; std::vector SelectionRules; }; [[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