LLVM  4.0.0
Statepoint.cpp
Go to the documentation of this file.
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 
22  if (!CS.getInstruction())
23  return nullptr;
24  return CS.getCalledFunction();
25 }
26 
28  if (auto *F = getCalledFunction(CS))
29  return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint;
30  return false;
31 }
32 
33 bool llvm::isStatepoint(const Value *V) {
34  if (auto CS = ImmutableCallSite(V))
35  return isStatepoint(CS);
36  return false;
37 }
38 
39 bool llvm::isStatepoint(const Value &V) {
40  return isStatepoint(&V);
41 }
42 
44  return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction());
45 }
46 
48  return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction());
49 }
50 
52  return Attr.hasAttribute("statepoint-id") ||
53  Attr.hasAttribute("statepoint-num-patch-bytes");
54 }
55 
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 }
std::enable_if< std::numeric_limits< T >::is_signed, bool >::type getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:494
bool hasAttribute(AttrKind Val) const
Return true if the attribute is present.
Definition: Attributes.cpp:185
bool isGCRelocate(ImmutableCallSite CS)
Definition: Statepoint.cpp:43
#define F(x, y, z)
Definition: MD5.cpp:51
Optional< uint32_t > NumPatchBytes
Definition: Statepoint.h:448
bool isGCResult(ImmutableCallSite CS)
Definition: Statepoint.cpp:47
StatepointDirectives parseStatepointDirectivesFromAttrs(AttributeSet AS)
Parse out statepoint directives from the function attributes present in AS.
Definition: Statepoint.cpp:56
InstrTy * getInstruction() const
Definition: CallSite.h:93
static const Function * getCalledFunction(ImmutableCallSite CS)
Definition: Statepoint.cpp:21
bool isStatepointDirectiveAttr(Attribute Attr)
Return true if the the Attr is an attribute that is a statepoint directive.
Definition: Statepoint.cpp:51
Optional< uint64_t > StatepointID
Definition: Statepoint.h:449
Call sites that get wrapped by a gc.statepoint (currently only in RewriteStatepointsForGC and potenti...
Definition: Statepoint.h:447
ImmutableCallSite - establish a view to a call site for examination.
Definition: CallSite.h:665
bool isStringAttribute() const
Return true if the attribute is a string (target-dependent) attribute.
Definition: Attributes.cpp:153
Attribute getAttribute(unsigned Index, Attribute::AttrKind Kind) const
Return the attribute object that exists at the given index.
bool isStatepoint(ImmutableCallSite CS)
Definition: Statepoint.cpp:27
StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:178
FunTy * getCalledFunction() const
getCalledFunction - Return the function being called if this is a direct call, otherwise return null ...
Definition: CallSite.h:110
LLVM Value Representation.
Definition: Value.h:71