aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/MachineFunctionAttributes.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 17:36:40 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 17:36:40 +0800
commit787f3a7a20958bfa6f231abccc617f4d8de25c4d (patch)
tree775d2913f48fc5f3a6e44bc6da986da9e52754ef /backend/lib/CodeGen/MachineFunctionAttributes.cpp
parent77d76b73a614820bf45024b053db376f35b06d10 (diff)
downloadrcc-project-787f3a7a20958bfa6f231abccc617f4d8de25c4d.tar.gz
rcc-project-787f3a7a20958bfa6f231abccc617f4d8de25c4d.tar.xz
[CodeGen] Add MIR function and block attributes
Diffstat (limited to 'backend/lib/CodeGen/MachineFunctionAttributes.cpp')
-rw-r--r--backend/lib/CodeGen/MachineFunctionAttributes.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/MachineFunctionAttributes.cpp b/backend/lib/CodeGen/MachineFunctionAttributes.cpp
new file mode 100644
index 0000000..799e701
--- /dev/null
+++ b/backend/lib/CodeGen/MachineFunctionAttributes.cpp
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "rcc/CodeGen/MachineFunctionAttributes.h"
+
+#include <cstdint>
+#include <string_view>
+
+namespace rcc {
+
+std::string_view getMachineFunctionAttributeName(MachineFunctionAttribute Attribute) noexcept {
+ switch (Attribute) {
+ case MachineFunctionAttribute::ExposesReturnsTwice:
+ return "ExposesReturnsTwice";
+ case MachineFunctionAttribute::HasWinCFI:
+ return "HasWinCFI";
+ case MachineFunctionAttribute::HasFakeUses:
+ return "HasFakeUses";
+ case MachineFunctionAttribute::CallsEHReturn:
+ return "CallsEHReturn";
+ case MachineFunctionAttribute::CallsUnwindInit:
+ return "CallsUnwindInit";
+ case MachineFunctionAttribute::HasEHContTarget:
+ return "HasEHContTarget";
+ case MachineFunctionAttribute::HasEHScopes:
+ return "HasEHScopes";
+ case MachineFunctionAttribute::HasEHFunclets:
+ return "HasEHFunclets";
+ case MachineFunctionAttribute::IsOutlined:
+ return "IsOutlined";
+ case MachineFunctionAttribute::DebugInstrRef:
+ return "DebugInstrRef";
+ case MachineFunctionAttribute::TracksDebugUserValues:
+ return "TracksDebugUserValues";
+ case MachineFunctionAttribute::Count:
+ return "Invalid";
+ }
+ return "Invalid";
+}
+
+Expected<MachineFunctionAttributes>
+MachineFunctionAttributes::fromRawFlags(std::uint16_t RawFlags) {
+ if ((RawFlags & static_cast<std::uint16_t>(~ValidFlags)) != 0) {
+ return makeUnexpected(ErrorCode::InvalidArgument,
+ "machine function attributes contain unknown flag bits");
+ }
+ MachineFunctionAttributes Result;
+ Result.Flags = RawFlags;
+ return Result;
+}
+
+Expected<void> MachineFunctionAttributes::verify() const {
+ if ((Flags & static_cast<std::uint16_t>(~ValidFlags)) != 0) {
+ return makeUnexpected(ErrorCode::VerificationError,
+ "machine function attributes contain unknown flag bits");
+ }
+ if (FunctionAlignment && FunctionAlignment->bytes() == 0) {
+ return makeUnexpected(ErrorCode::VerificationError,
+ "machine function alignment must be nonzero");
+ }
+ return {};
+}
+
+} // namespace rcc