aboutsummaryrefslogtreecommitdiffstats
path: root/lib/IR/Statepoint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/IR/Statepoint.cpp')
-rw-r--r--lib/IR/Statepoint.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/IR/Statepoint.cpp b/lib/IR/Statepoint.cpp
new file mode 100644
index 0000000..83ee611
--- /dev/null
+++ b/lib/IR/Statepoint.cpp
@@ -0,0 +1,77 @@
+//===-- IR/Statepoint.cpp -- gc.statepoint utilities --- -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Constant.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Statepoint.h"
+#include "llvm/Support/CommandLine.h"
+
+using namespace std;
+using namespace llvm;
+
+bool llvm::isStatepoint(const ImmutableCallSite &CS) {
+ if (!CS.getInstruction()) {
+ // This is not a call site
+ return false;
+ }
+
+ const Function *F = CS.getCalledFunction();
+ return (F && F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint);
+}
+bool llvm::isStatepoint(const Value *inst) {
+ if (isa<InvokeInst>(inst) || isa<CallInst>(inst)) {
+ ImmutableCallSite CS(inst);
+ return isStatepoint(CS);
+ }
+ return false;
+}
+bool llvm::isStatepoint(const Value &inst) {
+ return isStatepoint(&inst);
+}
+
+bool llvm::isGCRelocate(const ImmutableCallSite &CS) {
+ if (!CS.getInstruction()) {
+ // This is not a call site
+ return false;
+ }
+
+ return isGCRelocate(CS.getInstruction());
+}
+bool llvm::isGCRelocate(const Value *inst) {
+ if (const CallInst *call = dyn_cast<CallInst>(inst)) {
+ if (const Function *F = call->getCalledFunction()) {
+ return F->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
+ }
+ }
+ return false;
+}
+
+bool llvm::isGCResult(const ImmutableCallSite &CS) {
+ if (!CS.getInstruction()) {
+ // This is not a call site
+ return false;
+ }
+
+ return isGCResult(CS.getInstruction());
+}
+bool llvm::isGCResult(const Value *inst) {
+ if (const CallInst *call = dyn_cast<CallInst>(inst)) {
+ if (Function *F = call->getCalledFunction()) {
+ return (F->getIntrinsicID() == Intrinsic::experimental_gc_result_int ||
+ F->getIntrinsicID() == Intrinsic::experimental_gc_result_float ||
+ F->getIntrinsicID() == Intrinsic::experimental_gc_result_ptr ||
+ F->getIntrinsicID() == Intrinsic::experimental_gc_result);
+ }
+ }
+ return false;
+}