Line data Source code
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 :
19 : using namespace llvm;
20 :
21 : static const Function *getCalledFunction(ImmutableCallSite CS) {
22 2002037 : if (!CS.getInstruction())
23 : return nullptr;
24 : return CS.getCalledFunction();
25 : }
26 :
27 2002037 : bool llvm::isStatepoint(ImmutableCallSite CS) {
28 : if (auto *F = getCalledFunction(CS))
29 1938525 : return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint;
30 : return false;
31 : }
32 :
33 14962039 : bool llvm::isStatepoint(const Value *V) {
34 14962039 : if (auto CS = ImmutableCallSite(V))
35 2001683 : return isStatepoint(CS);
36 : return false;
37 : }
38 :
39 3615778 : bool llvm::isStatepoint(const Value &V) {
40 3615778 : return isStatepoint(&V);
41 : }
42 :
43 24492 : bool llvm::isGCRelocate(ImmutableCallSite CS) {
44 24492 : return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction());
45 : }
46 :
47 24450 : bool llvm::isGCRelocate(const Value *V) {
48 24450 : if (auto CS = ImmutableCallSite(V))
49 24450 : return isGCRelocate(CS);
50 : return false;
51 : }
52 :
53 42 : bool llvm::isGCResult(ImmutableCallSite CS) {
54 42 : return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction());
55 : }
56 :
57 0 : bool llvm::isGCResult(const Value *V) {
58 0 : if (auto CS = ImmutableCallSite(V))
59 0 : return isGCResult(CS);
60 : return false;
61 : }
62 :
63 14 : bool llvm::isStatepointDirectiveAttr(Attribute Attr) {
64 26 : return Attr.hasAttribute("statepoint-id") ||
65 12 : Attr.hasAttribute("statepoint-num-patch-bytes");
66 : }
67 :
68 : StatepointDirectives
69 315 : llvm::parseStatepointDirectivesFromAttrs(AttributeList AS) {
70 : StatepointDirectives Result;
71 :
72 : Attribute AttrID =
73 315 : AS.getAttribute(AttributeList::FunctionIndex, "statepoint-id");
74 : uint64_t StatepointID;
75 315 : if (AttrID.isStringAttribute())
76 4 : if (!AttrID.getValueAsString().getAsInteger(10, StatepointID))
77 : Result.StatepointID = StatepointID;
78 :
79 : uint32_t NumPatchBytes;
80 : Attribute AttrNumPatchBytes = AS.getAttribute(AttributeList::FunctionIndex,
81 315 : "statepoint-num-patch-bytes");
82 315 : if (AttrNumPatchBytes.isStringAttribute())
83 4 : if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes))
84 : Result.NumPatchBytes = NumPatchBytes;
85 :
86 315 : return Result;
87 : }
|