Statepoint.cpp revision de2d8694e25a814696358e95141f4b1aa4d8847e
1//===-- IR/Statepoint.cpp -- gc.statepoint utilities ---  -----------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains some utility functions to help recognize gc.statepoint
11// intrinsics.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm/IR/Statepoint.h"
16
17#include "llvm/IR/Function.h"
18
19using namespace llvm;
20
21static const Function *getCalledFunction(ImmutableCallSite CS) {
22  if (!CS.getInstruction())
23    return nullptr;
24  return CS.getCalledFunction();
25}
26
27bool llvm::isStatepoint(ImmutableCallSite CS) {
28  if (auto *F = getCalledFunction(CS))
29    return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint;
30  return false;
31}
32
33bool llvm::isStatepoint(const Value *V) {
34  if (auto CS = ImmutableCallSite(V))
35    return isStatepoint(CS);
36  return false;
37}
38
39bool llvm::isStatepoint(const Value &V) {
40  return isStatepoint(&V);
41}
42
43bool llvm::isGCRelocate(ImmutableCallSite CS) {
44  return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction());
45}
46
47bool llvm::isGCResult(ImmutableCallSite CS) {
48  return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction());
49}
50
51bool llvm::isStatepointDirectiveAttr(Attribute Attr) {
52  return Attr.hasAttribute("statepoint-id") ||
53         Attr.hasAttribute("statepoint-num-patch-bytes");
54}
55
56StatepointDirectives llvm::parseStatepointDirectivesFromAttrs(AttributeSet AS) {
57  StatepointDirectives Result;
58
59  Attribute AttrID =
60      AS.getAttribute(AttributeSet::FunctionIndex, "statepoint-id");
61  uint64_t StatepointID;
62  if (AttrID.isStringAttribute())
63    if (!AttrID.getValueAsString().getAsInteger(10, StatepointID))
64      Result.StatepointID = StatepointID;
65
66  uint32_t NumPatchBytes;
67  Attribute AttrNumPatchBytes = AS.getAttribute(AttributeSet::FunctionIndex,
68                                                "statepoint-num-patch-bytes");
69  if (AttrNumPatchBytes.isStringAttribute())
70    if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes))
71      Result.NumPatchBytes = NumPatchBytes;
72
73  return Result;
74}
75