// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_GLOBALISEL_LEGALIZERINFO_H #define RCC_CODEGEN_GLOBALISEL_LEGALIZERINFO_H #include "rcc/Support/Error.h" #include namespace rcc { class MachineFunction; class MachineInstr; class TargetDescription; enum class LegalizationAction : std::uint8_t { Legal, Unsupported, Custom, Lower, Libcall, WidenScalar, NarrowScalar, MoreElements, FewerElements, Bitcast, ChangeElementType, ChangeAddressSpace, }; class LegalizerInfo { public: virtual ~LegalizerInfo() = default; [[nodiscard]] virtual Expected classify(const MachineInstr &Instruction, const MachineFunction &Function, const TargetDescription &Target) const = 0; [[nodiscard]] virtual Expected lower(MachineInstr &Instruction, MachineFunction &Function, const TargetDescription &Target, LegalizationAction Action) const = 0; // This hook performs read-only target checks before a lowering mutation is committed. [[nodiscard]] virtual Expected validateLowering(const MachineInstr &, const MachineFunction &, const TargetDescription &, LegalizationAction) const { return {}; } }; } // namespace rcc #endif // RCC_CODEGEN_GLOBALISEL_LEGALIZERINFO_H