From 3341938bb644e6fc39afa6a8fcb1306604999e42 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Wed, 12 Aug 2026 22:37:49 +0800 Subject: [RISCV] Split the GlobalISel target components --- backend/include/rcc/CodeGen/InlineAsm.h | 12 ++---- .../include/rcc/Target/RISCV/RISCVCallLowering.h | 43 ---------------------- backend/include/rcc/Target/RISCV/RISCVCodeGen.h | 36 ------------------ .../include/rcc/Target/RISCV/RISCVFunctionInfo.h | 13 +++---- backend/include/rcc/Target/RISCV/RISCVPipeline.h | 10 ++--- backend/include/rcc/Target/RISCV/RISCVSubtarget.h | 40 +++++++++++++++++++- 6 files changed, 50 insertions(+), 104 deletions(-) delete mode 100644 backend/include/rcc/Target/RISCV/RISCVCallLowering.h delete mode 100644 backend/include/rcc/Target/RISCV/RISCVCodeGen.h (limited to 'backend/include') diff --git a/backend/include/rcc/CodeGen/InlineAsm.h b/backend/include/rcc/CodeGen/InlineAsm.h index 492161f..15c0de6 100644 --- a/backend/include/rcc/CodeGen/InlineAsm.h +++ b/backend/include/rcc/CodeGen/InlineAsm.h @@ -28,8 +28,7 @@ enum class InlineAsmExtraInfoFlag : std::uint32_t { class InlineAsmExtraInfo final { public: - explicit constexpr InlineAsmExtraInfo(std::uint32_t RawValue = 0) noexcept - : Value(RawValue) {} + explicit constexpr InlineAsmExtraInfo(std::uint32_t RawValue = 0) noexcept : Value(RawValue) {} [[nodiscard]] constexpr std::uint32_t rawValue() const noexcept { return Value; @@ -193,8 +192,7 @@ public: } [[nodiscard]] constexpr std::optional matchingOperand() const noexcept { - return isMatched() ? std::optional((Value >> PayloadShift) & MatchedOperandMask) - : std::nullopt; + return isMatched() ? std::optional((Value >> PayloadShift) & MatchedOperandMask) : std::nullopt; } [[nodiscard]] constexpr std::optional registerClass() const noexcept { @@ -226,8 +224,7 @@ public: return true; } - [[nodiscard]] constexpr bool - setMemoryConstraint(InlineAsmMemoryConstraint Constraint) noexcept { + [[nodiscard]] constexpr bool setMemoryConstraint(InlineAsmMemoryConstraint Constraint) noexcept { const std::uint32_t Encoded = static_cast(Constraint); if (Encoded == 0 || Encoded > MatchedOperandMask || isMatched()) return false; @@ -253,8 +250,7 @@ public: return std::nullopt; } - [[nodiscard]] static constexpr std::string_view - kindName(InlineAsmOperandKind Kind) noexcept { + [[nodiscard]] static constexpr std::string_view kindName(InlineAsmOperandKind Kind) noexcept { switch (Kind) { case InlineAsmOperandKind::RegisterUse: return "reguse"; diff --git a/backend/include/rcc/Target/RISCV/RISCVCallLowering.h b/backend/include/rcc/Target/RISCV/RISCVCallLowering.h deleted file mode 100644 index 445c922..0000000 --- a/backend/include/rcc/Target/RISCV/RISCVCallLowering.h +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_TARGET_RISCV_RISCVCALLLOWERING_H -#define RCC_TARGET_RISCV_RISCVCALLLOWERING_H - -#include "rcc/CodeGen/TargetCallLowering.h" -#include "rcc/Target/RISCV/RISCVInstructions.h" - -#include - -namespace rcc::riscv { - -enum class CallTargetFlag : std::uint32_t { - DirectCall = 1U << 0U, -}; - -enum class CallStackObjectFlag : std::uint64_t { - IncomingArgument = 1ULL << 0U, - OutgoingArgument = 1ULL << 1U, - ByValCopy = 1ULL << 2U, - VarArgSaveArea = 1ULL << 3U, - VarArgAlignmentPadding = 1ULL << 4U, -}; - -enum class CallValueTransform : std::uint8_t { - Full, - AnyExtend, - SignExtend, - ZeroExtend, - Truncate, - Bitcast, -}; - -[[nodiscard]] constexpr CallingConventionID -callingConventionID(CallingConvention Convention) noexcept { - return CallingConventionID::fromValue(static_cast(Convention)); -} - -[[nodiscard]] const TargetCallLowering &callLowering() noexcept; - -} // namespace rcc::riscv - -#endif // RCC_TARGET_RISCV_RISCVCALLLOWERING_H diff --git a/backend/include/rcc/Target/RISCV/RISCVCodeGen.h b/backend/include/rcc/Target/RISCV/RISCVCodeGen.h deleted file mode 100644 index 37f1c97..0000000 --- a/backend/include/rcc/Target/RISCV/RISCVCodeGen.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_TARGET_RISCV_RISCVCODEGEN_H -#define RCC_TARGET_RISCV_RISCVCODEGEN_H - -#include "rcc/CodeGen/GlobalISel/InstructionSelector.h" -#include "rcc/CodeGen/GlobalISel/LegalizerInfo.h" -#include "rcc/CodeGen/MachineCombinerPattern.h" -#include "rcc/CodeGen/MachineOptimizationPipeline.h" -#include "rcc/CodeGen/RegisterBankInfo.h" -#include "rcc/CodeGen/TargetFrameLowering.h" -#include "rcc/CodeGen/TargetMemoryFolding.h" -#include "rcc/CodeGen/TargetPseudoExpansion.h" -#include "rcc/CodeGen/TargetRegisterAllocationInfo.h" -#include "rcc/CodeGen/TargetSchedulingModel.h" -#include "rcc/Target/RISCV/RISCVSubtarget.h" - -#include - -namespace rcc::riscv { - -[[nodiscard]] const LegalizerInfo &legalizerInfo() noexcept; -[[nodiscard]] std::unique_ptr createLegalizerInfo(RISCVSubtargetFeatures Features); -[[nodiscard]] const RegisterBankInfo ®isterBankInfo() noexcept; -[[nodiscard]] const InstructionSelector &instructionSelector() noexcept; -[[nodiscard]] const TargetRegisterAllocationInfo ®isterAllocationInfo() noexcept; -[[nodiscard]] const TargetFrameLowering &frameLowering() noexcept; -[[nodiscard]] const TargetSchedulingModel &schedulingModel() noexcept; -[[nodiscard]] const TargetMachineCombinerInfo &machineCombinerInfo() noexcept; -[[nodiscard]] const TargetMemoryFoldingInfo &memoryFoldingInfo() noexcept; -[[nodiscard]] const TargetPseudoExpansionInfo &pseudoExpansionInfo() noexcept; -[[nodiscard]] MachineOptimizationPipelineTargetInfo optimizationPipelineInfo() noexcept; - -} // namespace rcc::riscv - -#endif // RCC_TARGET_RISCV_RISCVCODEGEN_H diff --git a/backend/include/rcc/Target/RISCV/RISCVFunctionInfo.h b/backend/include/rcc/Target/RISCV/RISCVFunctionInfo.h index 2720830..6a05096 100644 --- a/backend/include/rcc/Target/RISCV/RISCVFunctionInfo.h +++ b/backend/include/rcc/Target/RISCV/RISCVFunctionInfo.h @@ -19,8 +19,7 @@ namespace riscv { class RISCVFunctionInfo final { public: - RISCVFunctionInfo(std::int32_t VarArgsFrameIndex = 0, - std::int32_t VarArgsSaveSize = 0) noexcept + RISCVFunctionInfo(std::int32_t VarArgsFrameIndex = 0, std::int32_t VarArgsSaveSize = 0) noexcept : VarArgsFrameIndex(VarArgsFrameIndex), VarArgsSaveSize(VarArgsSaveSize) {} [[nodiscard]] static constexpr TargetFunctionStateTypeID stableTypeID() noexcept { @@ -32,12 +31,11 @@ public: } [[nodiscard]] Expected verify() const; - [[nodiscard]] Expected - clone(const MachineFunctionCloneContext &Context) const; + [[nodiscard]] Expected clone(const MachineFunctionCloneContext &Context) const; [[nodiscard]] std::string print() const; [[nodiscard]] Expected> encode() const; - [[nodiscard]] static Expected - decode(std::uint32_t Version, std::span Payload); + [[nodiscard]] static Expected decode(std::uint32_t Version, + std::span Payload); [[nodiscard]] std::int32_t varArgsFrameIndex() const noexcept { return VarArgsFrameIndex; @@ -47,8 +45,7 @@ public: return VarArgsSaveSize; } - friend bool operator==(const RISCVFunctionInfo &Left, - const RISCVFunctionInfo &Right) = default; + friend bool operator==(const RISCVFunctionInfo &Left, const RISCVFunctionInfo &Right) = default; private: std::int32_t VarArgsFrameIndex = 0; diff --git a/backend/include/rcc/Target/RISCV/RISCVPipeline.h b/backend/include/rcc/Target/RISCV/RISCVPipeline.h index 9d871a9..ba0428b 100644 --- a/backend/include/rcc/Target/RISCV/RISCVPipeline.h +++ b/backend/include/rcc/Target/RISCV/RISCVPipeline.h @@ -19,17 +19,13 @@ class TargetDescription; namespace riscv { -[[nodiscard]] Expected addCanonicalPipeline(MachinePassManager &Pipeline, - const MachineFunction &Function); [[nodiscard]] Expected addCanonicalPipeline(MachinePassManager &Pipeline, const MachineFunction &Function, - RISCVSubtargetFeatures Features); -[[nodiscard]] Expected> -createCanonicalPipelinePass(std::string_view Name); + const RISCVSubtarget &Subtarget); [[nodiscard]] Expected> -createCanonicalPipelinePass(std::string_view Name, RISCVSubtargetFeatures Features); +createCanonicalPipelinePass(std::string_view Name, const RISCVSubtarget &Subtarget); [[nodiscard]] Expected> -canonicalPipelinePassNames(const MachineFunction &Function); +canonicalPipelinePassNames(const MachineFunction &Function, const RISCVSubtarget &Subtarget); } // namespace riscv } // namespace rcc diff --git a/backend/include/rcc/Target/RISCV/RISCVSubtarget.h b/backend/include/rcc/Target/RISCV/RISCVSubtarget.h index d5f088f..28718f0 100644 --- a/backend/include/rcc/Target/RISCV/RISCVSubtarget.h +++ b/backend/include/rcc/Target/RISCV/RISCVSubtarget.h @@ -6,10 +6,19 @@ #include "rcc/Support/Error.h" #include +#include #include #include -namespace rcc::riscv { +namespace rcc { + +class InstructionSelector; +class LegalizerInfo; +class TargetCallLowering; + +namespace riscv { + +class RISCVRegisterBankInfo; enum class RISCVExtension : std::uint8_t { I, @@ -42,6 +51,33 @@ private: std::uint16_t Enabled = 0; }; -} // namespace rcc::riscv +class RISCVSubtarget final { +public: + explicit RISCVSubtarget(RISCVSubtargetFeatures Features); + RISCVSubtarget(const RISCVSubtarget &) = delete; + RISCVSubtarget &operator=(const RISCVSubtarget &) = delete; + RISCVSubtarget(RISCVSubtarget &&) = delete; + RISCVSubtarget &operator=(RISCVSubtarget &&) = delete; + ~RISCVSubtarget(); + + [[nodiscard]] const RISCVSubtargetFeatures &features() const noexcept { + return Features; + } + + [[nodiscard]] const TargetCallLowering *getCallLowering() const; + [[nodiscard]] InstructionSelector *getInstructionSelector() const; + [[nodiscard]] const LegalizerInfo *getLegalizerInfo() const; + [[nodiscard]] const RISCVRegisterBankInfo *getRegBankInfo() const; + +private: + RISCVSubtargetFeatures Features; + mutable std::unique_ptr CallLoweringInfo; + mutable std::unique_ptr InstSelector; + mutable std::unique_ptr Legalizer; + mutable std::unique_ptr RegBankInfo; +}; + +} // namespace riscv +} // namespace rcc #endif // RCC_TARGET_RISCV_RISCVSUBTARGET_H -- cgit v1.2.3