aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/MachineFunctionAttributes.cpp
diff options
context:
space:
mode:
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