aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVCallingConv.h
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-28 14:07:11 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-28 14:07:11 +0800
commit6e8feb15a0d256ca19e88185f78c81f689ce7d34 (patch)
tree9a2d97b188095a334a61ad471fc1b123ce2b2429 /backend/lib/Target/RISCV/RISCVCallingConv.h
parent8c878ada4e1df8b37aea9ff44a5fb2b25d2b2a1f (diff)
downloadrcc-project-6e8feb15a0d256ca19e88185f78c81f689ce7d34.tar.gz
rcc-project-6e8feb15a0d256ca19e88185f78c81f689ce7d34.tar.xz
[RISCV] Separate calling convention assignment
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVCallingConv.h')
-rw-r--r--backend/lib/Target/RISCV/RISCVCallingConv.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/backend/lib/Target/RISCV/RISCVCallingConv.h b/backend/lib/Target/RISCV/RISCVCallingConv.h
new file mode 100644
index 0000000..ba2dcf2
--- /dev/null
+++ b/backend/lib/Target/RISCV/RISCVCallingConv.h
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef RCC_LIB_TARGET_RISCV_RISCVCALLINGCONV_H
+#define RCC_LIB_TARGET_RISCV_RISCVCALLINGCONV_H
+
+#include "rcc/CodeGen/TargetCallLowering.h"
+#include "rcc/Target/RISCV/RISCVInstructions.h"
+
+#include <cstddef>
+#include <cstdint>
+#include <span>
+#include <string>
+#include <vector>
+
+namespace rcc::riscv {
+
+struct CallingConventionInfo;
+
+inline constexpr std::uint64_t XLenBytes = 8;
+inline constexpr std::uint64_t ABIStackAlignmentBytes = 16;
+
+[[nodiscard]] constexpr CallingConventionID
+callingConventionID(CallingConvention Convention) noexcept {
+ return CallingConventionID::fromValue(static_cast<std::uint32_t>(Convention));
+}
+
+struct ArgumentAssignmentResult final {
+ std::vector<CCAssignment> Assignments;
+ StackArgumentArea StackArea;
+ std::size_t FirstUnallocatedGPR = 0;
+};
+
+[[nodiscard]] Expected<std::size_t> verifyValueSequence(std::span<const ABIValue> Values,
+ bool RequireRegisters);
+[[nodiscard]] Expected<ArgumentAssignmentResult>
+assignArguments(std::span<const ABIValue> Values, std::size_t FixedArgumentCount, bool IsVariadic,
+ const CallingConventionInfo &Convention);
+[[nodiscard]] Expected<std::vector<CCAssignment>>
+assignReturns(std::span<const ABIValue> Values, bool RequireRegisters,
+ const CallingConventionInfo &Convention);
+[[nodiscard]] bool hasStructReturn(std::span<const ABIValue> Arguments) noexcept;
+[[nodiscard]] Expected<std::string>
+tailCallRejection(const CallLoweringRequest &Request, const ArgumentAssignmentResult &Arguments,
+ std::span<const CCAssignment> Results,
+ std::span<const ByValCopyAssignment> ByValCopies,
+ const CallingConventionInfo &Convention);
+[[nodiscard]] Expected<const CallingConventionInfo *>
+riscvConvention(CallingConventionID Convention);
+
+} // namespace rcc::riscv
+
+#endif // RCC_LIB_TARGET_RISCV_RISCVCALLINGCONV_H