summaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Statepoint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/IR/Statepoint.cpp')
-rw-r--r--llvm/lib/IR/Statepoint.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/llvm/lib/IR/Statepoint.cpp b/llvm/lib/IR/Statepoint.cpp
new file mode 100644
index 000000000000..fce89b42e9bf
--- /dev/null
+++ b/llvm/lib/IR/Statepoint.cpp
@@ -0,0 +1,78 @@
+//===-- IR/Statepoint.cpp -- gc.statepoint utilities --- -----------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains some utility functions to help recognize gc.statepoint
+// intrinsics.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/IR/Statepoint.h"
+
+#include "llvm/IR/Function.h"
+
+using namespace llvm;
+
+bool llvm::isStatepoint(const CallBase *Call) {
+ if (auto *F = Call->getCalledFunction())
+ return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint;
+ return false;
+}
+
+bool llvm::isStatepoint(const Value *V) {
+ if (auto *Call = dyn_cast<CallBase>(V))
+ return isStatepoint(Call);
+ return false;
+}
+
+bool llvm::isStatepoint(const Value &V) {
+ return isStatepoint(&V);
+}
+
+bool llvm::isGCRelocate(const CallBase *Call) {
+ return isa<GCRelocateInst>(Call);
+}
+
+bool llvm::isGCRelocate(const Value *V) {
+ if (auto *Call = dyn_cast<CallBase>(V))
+ return isGCRelocate(Call);
+ return false;
+}
+
+bool llvm::isGCResult(const CallBase *Call) { return isa<GCResultInst>(Call); }
+
+bool llvm::isGCResult(const Value *V) {
+ if (auto *Call = dyn_cast<CallBase>(V))
+ return isGCResult(Call);
+ return false;
+}
+
+bool llvm::isStatepointDirectiveAttr(Attribute Attr) {
+ return Attr.hasAttribute("statepoint-id") ||
+ Attr.hasAttribute("statepoint-num-patch-bytes");
+}
+
+StatepointDirectives
+llvm::parseStatepointDirectivesFromAttrs(AttributeList AS) {
+ StatepointDirectives Result;
+
+ Attribute AttrID =
+ AS.getAttribute(AttributeList::FunctionIndex, "statepoint-id");
+ uint64_t StatepointID;
+ if (AttrID.isStringAttribute())
+ if (!AttrID.getValueAsString().getAsInteger(10, StatepointID))
+ Result.StatepointID = StatepointID;
+
+ uint32_t NumPatchBytes;
+ Attribute AttrNumPatchBytes = AS.getAttribute(AttributeList::FunctionIndex,
+ "statepoint-num-patch-bytes");
+ if (AttrNumPatchBytes.isStringAttribute())
+ if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes))
+ Result.NumPatchBytes = NumPatchBytes;
+
+ return Result;
+}