// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_LIB_TARGET_RISCV_GISEL_RISCVCALLLOWERING_H #define RCC_LIB_TARGET_RISCV_GISEL_RISCVCALLLOWERING_H #include "../RISCVCallingConv.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, }; class RISCVCallLowering final : public TargetCallLowering { public: [[nodiscard]] Expected planFormalArguments(const FormalArgumentRequest &Request) const override; [[nodiscard]] Expected planCall(const CallLoweringRequest &Request) const override; [[nodiscard]] Expected planReturn(const ReturnLoweringRequest &Request) const override; [[nodiscard]] Expected emitPlan(MachineIRBuilder &Builder, const CallLoweringPlan &Plan) const override; }; } // namespace rcc::riscv #endif // RCC_LIB_TARGET_RISCV_GISEL_RISCVCALLLOWERING_H