diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-12 22:37:49 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-12 22:37:49 +0800 |
| commit | 3341938bb644e6fc39afa6a8fcb1306604999e42 (patch) | |
| tree | a7586c0a8a9d3e7e9dbc8709daf4dd76ca51be5f /backend/include/rcc | |
| parent | 0bb35fa2306a66f1f0baf118619b5c1640ed9c01 (diff) | |
| download | rcc-project-3341938bb644e6fc39afa6a8fcb1306604999e42.tar.gz rcc-project-3341938bb644e6fc39afa6a8fcb1306604999e42.tar.xz | |
[RISCV] Split the GlobalISel target components
Diffstat (limited to 'backend/include/rcc')
| -rw-r--r-- | backend/include/rcc/CodeGen/InlineAsm.h | 12 | ||||
| -rw-r--r-- | backend/include/rcc/Target/RISCV/RISCVCallLowering.h | 43 | ||||
| -rw-r--r-- | backend/include/rcc/Target/RISCV/RISCVCodeGen.h | 36 | ||||
| -rw-r--r-- | backend/include/rcc/Target/RISCV/RISCVFunctionInfo.h | 13 | ||||
| -rw-r--r-- | backend/include/rcc/Target/RISCV/RISCVPipeline.h | 10 | ||||
| -rw-r--r-- | backend/include/rcc/Target/RISCV/RISCVSubtarget.h | 40 |
6 files changed, 50 insertions, 104 deletions
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<std::uint32_t> 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<std::uint32_t> 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<std::uint32_t>(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 <cstdint> - -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<std::uint32_t>(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 <memory> - -namespace rcc::riscv { - -[[nodiscard]] const LegalizerInfo &legalizerInfo() noexcept; -[[nodiscard]] std::unique_ptr<LegalizerInfo> 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<void> verify() const; - [[nodiscard]] Expected<RISCVFunctionInfo> - clone(const MachineFunctionCloneContext &Context) const; + [[nodiscard]] Expected<RISCVFunctionInfo> clone(const MachineFunctionCloneContext &Context) const; [[nodiscard]] std::string print() const; [[nodiscard]] Expected<std::vector<std::byte>> encode() const; - [[nodiscard]] static Expected<RISCVFunctionInfo> - decode(std::uint32_t Version, std::span<const std::byte> Payload); + [[nodiscard]] static Expected<RISCVFunctionInfo> decode(std::uint32_t Version, + std::span<const std::byte> 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 @@ -20,16 +20,12 @@ class TargetDescription; namespace riscv { [[nodiscard]] Expected<void> addCanonicalPipeline(MachinePassManager &Pipeline, - const MachineFunction &Function); -[[nodiscard]] Expected<void> addCanonicalPipeline(MachinePassManager &Pipeline, const MachineFunction &Function, - RISCVSubtargetFeatures Features); -[[nodiscard]] Expected<std::unique_ptr<MachineFunctionPass>> -createCanonicalPipelinePass(std::string_view Name); + const RISCVSubtarget &Subtarget); [[nodiscard]] Expected<std::unique_ptr<MachineFunctionPass>> -createCanonicalPipelinePass(std::string_view Name, RISCVSubtargetFeatures Features); +createCanonicalPipelinePass(std::string_view Name, const RISCVSubtarget &Subtarget); [[nodiscard]] Expected<std::vector<std::string>> -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 <cstdint> +#include <memory> #include <span> #include <string> -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<TargetCallLowering> CallLoweringInfo; + mutable std::unique_ptr<InstructionSelector> InstSelector; + mutable std::unique_ptr<LegalizerInfo> Legalizer; + mutable std::unique_ptr<RISCVRegisterBankInfo> RegBankInfo; +}; + +} // namespace riscv +} // namespace rcc #endif // RCC_TARGET_RISCV_RISCVSUBTARGET_H |
