xref: /aosp_15_r20/external/llvm/include/llvm/IR/IntrinsicInst.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines classes that make it really easy to deal with intrinsic
11*9880d681SAndroid Build Coastguard Worker // functions with the isa/dyncast family of functions.  In particular, this
12*9880d681SAndroid Build Coastguard Worker // allows you to do things like:
13*9880d681SAndroid Build Coastguard Worker //
14*9880d681SAndroid Build Coastguard Worker //     if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
15*9880d681SAndroid Build Coastguard Worker //        ... MCI->getDest() ... MCI->getSource() ...
16*9880d681SAndroid Build Coastguard Worker //
17*9880d681SAndroid Build Coastguard Worker // All intrinsic function calls are instances of the call instruction, so these
18*9880d681SAndroid Build Coastguard Worker // are all subclasses of the CallInst class.  Note that none of these classes
19*9880d681SAndroid Build Coastguard Worker // has state or virtual methods, which is an important part of this gross/neat
20*9880d681SAndroid Build Coastguard Worker // hack working.
21*9880d681SAndroid Build Coastguard Worker //
22*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_IR_INTRINSICINST_H
25*9880d681SAndroid Build Coastguard Worker #define LLVM_IR_INTRINSICINST_H
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Intrinsics.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h"
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker namespace llvm {
34*9880d681SAndroid Build Coastguard Worker   /// A wrapper class for inspecting calls to intrinsic functions.
35*9880d681SAndroid Build Coastguard Worker   /// This allows the standard isa/dyncast/cast functionality to work with calls
36*9880d681SAndroid Build Coastguard Worker   /// to intrinsic functions.
37*9880d681SAndroid Build Coastguard Worker   class IntrinsicInst : public CallInst {
38*9880d681SAndroid Build Coastguard Worker     IntrinsicInst() = delete;
39*9880d681SAndroid Build Coastguard Worker     IntrinsicInst(const IntrinsicInst&) = delete;
40*9880d681SAndroid Build Coastguard Worker     void operator=(const IntrinsicInst&) = delete;
41*9880d681SAndroid Build Coastguard Worker   public:
42*9880d681SAndroid Build Coastguard Worker     /// Return the intrinsic ID of this intrinsic.
getIntrinsicID()43*9880d681SAndroid Build Coastguard Worker     Intrinsic::ID getIntrinsicID() const {
44*9880d681SAndroid Build Coastguard Worker       return getCalledFunction()->getIntrinsicID();
45*9880d681SAndroid Build Coastguard Worker     }
46*9880d681SAndroid Build Coastguard Worker 
47*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const CallInst * I)48*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const CallInst *I) {
49*9880d681SAndroid Build Coastguard Worker       if (const Function *CF = I->getCalledFunction())
50*9880d681SAndroid Build Coastguard Worker         return CF->isIntrinsic();
51*9880d681SAndroid Build Coastguard Worker       return false;
52*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)53*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
54*9880d681SAndroid Build Coastguard Worker       return isa<CallInst>(V) && classof(cast<CallInst>(V));
55*9880d681SAndroid Build Coastguard Worker     }
56*9880d681SAndroid Build Coastguard Worker   };
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   /// This is the common base class for debug info intrinsics.
59*9880d681SAndroid Build Coastguard Worker   class DbgInfoIntrinsic : public IntrinsicInst {
60*9880d681SAndroid Build Coastguard Worker   public:
61*9880d681SAndroid Build Coastguard Worker     /// Get the location corresponding to the variable referenced by the debug
62*9880d681SAndroid Build Coastguard Worker     /// info intrinsic.  Depending on the intrinsic, this could be the
63*9880d681SAndroid Build Coastguard Worker     /// variable's value or its address.
64*9880d681SAndroid Build Coastguard Worker     Value *getVariableLocation(bool AllowNullOp = true) const;
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)67*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
68*9880d681SAndroid Build Coastguard Worker       switch (I->getIntrinsicID()) {
69*9880d681SAndroid Build Coastguard Worker       case Intrinsic::dbg_declare:
70*9880d681SAndroid Build Coastguard Worker       case Intrinsic::dbg_value:
71*9880d681SAndroid Build Coastguard Worker         return true;
72*9880d681SAndroid Build Coastguard Worker       default: return false;
73*9880d681SAndroid Build Coastguard Worker       }
74*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)75*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
76*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
77*9880d681SAndroid Build Coastguard Worker     }
78*9880d681SAndroid Build Coastguard Worker   };
79*9880d681SAndroid Build Coastguard Worker 
80*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.dbg.declare instruction.
81*9880d681SAndroid Build Coastguard Worker   class DbgDeclareInst : public DbgInfoIntrinsic {
82*9880d681SAndroid Build Coastguard Worker   public:
getAddress()83*9880d681SAndroid Build Coastguard Worker     Value *getAddress() const { return getVariableLocation(); }
getVariable()84*9880d681SAndroid Build Coastguard Worker     DILocalVariable *getVariable() const {
85*9880d681SAndroid Build Coastguard Worker       return cast<DILocalVariable>(getRawVariable());
86*9880d681SAndroid Build Coastguard Worker     }
getExpression()87*9880d681SAndroid Build Coastguard Worker     DIExpression *getExpression() const {
88*9880d681SAndroid Build Coastguard Worker       return cast<DIExpression>(getRawExpression());
89*9880d681SAndroid Build Coastguard Worker     }
90*9880d681SAndroid Build Coastguard Worker 
getRawVariable()91*9880d681SAndroid Build Coastguard Worker     Metadata *getRawVariable() const {
92*9880d681SAndroid Build Coastguard Worker       return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
93*9880d681SAndroid Build Coastguard Worker     }
getRawExpression()94*9880d681SAndroid Build Coastguard Worker     Metadata *getRawExpression() const {
95*9880d681SAndroid Build Coastguard Worker       return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
96*9880d681SAndroid Build Coastguard Worker     }
97*9880d681SAndroid Build Coastguard Worker 
98*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)99*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
100*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::dbg_declare;
101*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)102*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
103*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
104*9880d681SAndroid Build Coastguard Worker     }
105*9880d681SAndroid Build Coastguard Worker   };
106*9880d681SAndroid Build Coastguard Worker 
107*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.dbg.value instruction.
108*9880d681SAndroid Build Coastguard Worker   class DbgValueInst : public DbgInfoIntrinsic {
109*9880d681SAndroid Build Coastguard Worker   public:
getValue()110*9880d681SAndroid Build Coastguard Worker     Value *getValue() const {
111*9880d681SAndroid Build Coastguard Worker       return getVariableLocation(/* AllowNullOp = */ false);
112*9880d681SAndroid Build Coastguard Worker     }
getOffset()113*9880d681SAndroid Build Coastguard Worker     uint64_t getOffset() const {
114*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(
115*9880d681SAndroid Build Coastguard Worker                           const_cast<Value*>(getArgOperand(1)))->getZExtValue();
116*9880d681SAndroid Build Coastguard Worker     }
getVariable()117*9880d681SAndroid Build Coastguard Worker     DILocalVariable *getVariable() const {
118*9880d681SAndroid Build Coastguard Worker       return cast<DILocalVariable>(getRawVariable());
119*9880d681SAndroid Build Coastguard Worker     }
getExpression()120*9880d681SAndroid Build Coastguard Worker     DIExpression *getExpression() const {
121*9880d681SAndroid Build Coastguard Worker       return cast<DIExpression>(getRawExpression());
122*9880d681SAndroid Build Coastguard Worker     }
123*9880d681SAndroid Build Coastguard Worker 
getRawVariable()124*9880d681SAndroid Build Coastguard Worker     Metadata *getRawVariable() const {
125*9880d681SAndroid Build Coastguard Worker       return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
126*9880d681SAndroid Build Coastguard Worker     }
getRawExpression()127*9880d681SAndroid Build Coastguard Worker     Metadata *getRawExpression() const {
128*9880d681SAndroid Build Coastguard Worker       return cast<MetadataAsValue>(getArgOperand(3))->getMetadata();
129*9880d681SAndroid Build Coastguard Worker     }
130*9880d681SAndroid Build Coastguard Worker 
131*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)132*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
133*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::dbg_value;
134*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)135*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
136*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
137*9880d681SAndroid Build Coastguard Worker     }
138*9880d681SAndroid Build Coastguard Worker   };
139*9880d681SAndroid Build Coastguard Worker 
140*9880d681SAndroid Build Coastguard Worker   /// This is the common base class for memset/memcpy/memmove.
141*9880d681SAndroid Build Coastguard Worker   class MemIntrinsic : public IntrinsicInst {
142*9880d681SAndroid Build Coastguard Worker   public:
getRawDest()143*9880d681SAndroid Build Coastguard Worker     Value *getRawDest() const { return const_cast<Value*>(getArgOperand(0)); }
getRawDestUse()144*9880d681SAndroid Build Coastguard Worker     const Use &getRawDestUse() const { return getArgOperandUse(0); }
getRawDestUse()145*9880d681SAndroid Build Coastguard Worker     Use &getRawDestUse() { return getArgOperandUse(0); }
146*9880d681SAndroid Build Coastguard Worker 
getLength()147*9880d681SAndroid Build Coastguard Worker     Value *getLength() const { return const_cast<Value*>(getArgOperand(2)); }
getLengthUse()148*9880d681SAndroid Build Coastguard Worker     const Use &getLengthUse() const { return getArgOperandUse(2); }
getLengthUse()149*9880d681SAndroid Build Coastguard Worker     Use &getLengthUse() { return getArgOperandUse(2); }
150*9880d681SAndroid Build Coastguard Worker 
getAlignmentCst()151*9880d681SAndroid Build Coastguard Worker     ConstantInt *getAlignmentCst() const {
152*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value*>(getArgOperand(3)));
153*9880d681SAndroid Build Coastguard Worker     }
154*9880d681SAndroid Build Coastguard Worker 
getAlignment()155*9880d681SAndroid Build Coastguard Worker     unsigned getAlignment() const {
156*9880d681SAndroid Build Coastguard Worker       return getAlignmentCst()->getZExtValue();
157*9880d681SAndroid Build Coastguard Worker     }
158*9880d681SAndroid Build Coastguard Worker 
getVolatileCst()159*9880d681SAndroid Build Coastguard Worker     ConstantInt *getVolatileCst() const {
160*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value*>(getArgOperand(4)));
161*9880d681SAndroid Build Coastguard Worker     }
isVolatile()162*9880d681SAndroid Build Coastguard Worker     bool isVolatile() const {
163*9880d681SAndroid Build Coastguard Worker       return !getVolatileCst()->isZero();
164*9880d681SAndroid Build Coastguard Worker     }
165*9880d681SAndroid Build Coastguard Worker 
getDestAddressSpace()166*9880d681SAndroid Build Coastguard Worker     unsigned getDestAddressSpace() const {
167*9880d681SAndroid Build Coastguard Worker       return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
168*9880d681SAndroid Build Coastguard Worker     }
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker     /// This is just like getRawDest, but it strips off any cast
171*9880d681SAndroid Build Coastguard Worker     /// instructions that feed it, giving the original input.  The returned
172*9880d681SAndroid Build Coastguard Worker     /// value is guaranteed to be a pointer.
getDest()173*9880d681SAndroid Build Coastguard Worker     Value *getDest() const { return getRawDest()->stripPointerCasts(); }
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker     /// Set the specified arguments of the instruction.
setDest(Value * Ptr)176*9880d681SAndroid Build Coastguard Worker     void setDest(Value *Ptr) {
177*9880d681SAndroid Build Coastguard Worker       assert(getRawDest()->getType() == Ptr->getType() &&
178*9880d681SAndroid Build Coastguard Worker              "setDest called with pointer of wrong type!");
179*9880d681SAndroid Build Coastguard Worker       setArgOperand(0, Ptr);
180*9880d681SAndroid Build Coastguard Worker     }
181*9880d681SAndroid Build Coastguard Worker 
setLength(Value * L)182*9880d681SAndroid Build Coastguard Worker     void setLength(Value *L) {
183*9880d681SAndroid Build Coastguard Worker       assert(getLength()->getType() == L->getType() &&
184*9880d681SAndroid Build Coastguard Worker              "setLength called with value of wrong type!");
185*9880d681SAndroid Build Coastguard Worker       setArgOperand(2, L);
186*9880d681SAndroid Build Coastguard Worker     }
187*9880d681SAndroid Build Coastguard Worker 
setAlignment(Constant * A)188*9880d681SAndroid Build Coastguard Worker     void setAlignment(Constant* A) {
189*9880d681SAndroid Build Coastguard Worker       setArgOperand(3, A);
190*9880d681SAndroid Build Coastguard Worker     }
191*9880d681SAndroid Build Coastguard Worker 
setVolatile(Constant * V)192*9880d681SAndroid Build Coastguard Worker     void setVolatile(Constant* V) {
193*9880d681SAndroid Build Coastguard Worker       setArgOperand(4, V);
194*9880d681SAndroid Build Coastguard Worker     }
195*9880d681SAndroid Build Coastguard Worker 
getAlignmentType()196*9880d681SAndroid Build Coastguard Worker     Type *getAlignmentType() const {
197*9880d681SAndroid Build Coastguard Worker       return getArgOperand(3)->getType();
198*9880d681SAndroid Build Coastguard Worker     }
199*9880d681SAndroid Build Coastguard Worker 
200*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)201*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
202*9880d681SAndroid Build Coastguard Worker       switch (I->getIntrinsicID()) {
203*9880d681SAndroid Build Coastguard Worker       case Intrinsic::memcpy:
204*9880d681SAndroid Build Coastguard Worker       case Intrinsic::memmove:
205*9880d681SAndroid Build Coastguard Worker       case Intrinsic::memset:
206*9880d681SAndroid Build Coastguard Worker         return true;
207*9880d681SAndroid Build Coastguard Worker       default: return false;
208*9880d681SAndroid Build Coastguard Worker       }
209*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)210*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
211*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
212*9880d681SAndroid Build Coastguard Worker     }
213*9880d681SAndroid Build Coastguard Worker   };
214*9880d681SAndroid Build Coastguard Worker 
215*9880d681SAndroid Build Coastguard Worker   /// This class wraps the llvm.memset intrinsic.
216*9880d681SAndroid Build Coastguard Worker   class MemSetInst : public MemIntrinsic {
217*9880d681SAndroid Build Coastguard Worker   public:
218*9880d681SAndroid Build Coastguard Worker     /// Return the arguments to the instruction.
getValue()219*9880d681SAndroid Build Coastguard Worker     Value *getValue() const { return const_cast<Value*>(getArgOperand(1)); }
getValueUse()220*9880d681SAndroid Build Coastguard Worker     const Use &getValueUse() const { return getArgOperandUse(1); }
getValueUse()221*9880d681SAndroid Build Coastguard Worker     Use &getValueUse() { return getArgOperandUse(1); }
222*9880d681SAndroid Build Coastguard Worker 
setValue(Value * Val)223*9880d681SAndroid Build Coastguard Worker     void setValue(Value *Val) {
224*9880d681SAndroid Build Coastguard Worker       assert(getValue()->getType() == Val->getType() &&
225*9880d681SAndroid Build Coastguard Worker              "setValue called with value of wrong type!");
226*9880d681SAndroid Build Coastguard Worker       setArgOperand(1, Val);
227*9880d681SAndroid Build Coastguard Worker     }
228*9880d681SAndroid Build Coastguard Worker 
229*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)230*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
231*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::memset;
232*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)233*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
234*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
235*9880d681SAndroid Build Coastguard Worker     }
236*9880d681SAndroid Build Coastguard Worker   };
237*9880d681SAndroid Build Coastguard Worker 
238*9880d681SAndroid Build Coastguard Worker   /// This class wraps the llvm.memcpy/memmove intrinsics.
239*9880d681SAndroid Build Coastguard Worker   class MemTransferInst : public MemIntrinsic {
240*9880d681SAndroid Build Coastguard Worker   public:
241*9880d681SAndroid Build Coastguard Worker     /// Return the arguments to the instruction.
getRawSource()242*9880d681SAndroid Build Coastguard Worker     Value *getRawSource() const { return const_cast<Value*>(getArgOperand(1)); }
getRawSourceUse()243*9880d681SAndroid Build Coastguard Worker     const Use &getRawSourceUse() const { return getArgOperandUse(1); }
getRawSourceUse()244*9880d681SAndroid Build Coastguard Worker     Use &getRawSourceUse() { return getArgOperandUse(1); }
245*9880d681SAndroid Build Coastguard Worker 
246*9880d681SAndroid Build Coastguard Worker     /// This is just like getRawSource, but it strips off any cast
247*9880d681SAndroid Build Coastguard Worker     /// instructions that feed it, giving the original input.  The returned
248*9880d681SAndroid Build Coastguard Worker     /// value is guaranteed to be a pointer.
getSource()249*9880d681SAndroid Build Coastguard Worker     Value *getSource() const { return getRawSource()->stripPointerCasts(); }
250*9880d681SAndroid Build Coastguard Worker 
getSourceAddressSpace()251*9880d681SAndroid Build Coastguard Worker     unsigned getSourceAddressSpace() const {
252*9880d681SAndroid Build Coastguard Worker       return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
253*9880d681SAndroid Build Coastguard Worker     }
254*9880d681SAndroid Build Coastguard Worker 
setSource(Value * Ptr)255*9880d681SAndroid Build Coastguard Worker     void setSource(Value *Ptr) {
256*9880d681SAndroid Build Coastguard Worker       assert(getRawSource()->getType() == Ptr->getType() &&
257*9880d681SAndroid Build Coastguard Worker              "setSource called with pointer of wrong type!");
258*9880d681SAndroid Build Coastguard Worker       setArgOperand(1, Ptr);
259*9880d681SAndroid Build Coastguard Worker     }
260*9880d681SAndroid Build Coastguard Worker 
261*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)262*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
263*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::memcpy ||
264*9880d681SAndroid Build Coastguard Worker              I->getIntrinsicID() == Intrinsic::memmove;
265*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)266*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
267*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
268*9880d681SAndroid Build Coastguard Worker     }
269*9880d681SAndroid Build Coastguard Worker   };
270*9880d681SAndroid Build Coastguard Worker 
271*9880d681SAndroid Build Coastguard Worker 
272*9880d681SAndroid Build Coastguard Worker   /// This class wraps the llvm.memcpy intrinsic.
273*9880d681SAndroid Build Coastguard Worker   class MemCpyInst : public MemTransferInst {
274*9880d681SAndroid Build Coastguard Worker   public:
275*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)276*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
277*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::memcpy;
278*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)279*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
280*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
281*9880d681SAndroid Build Coastguard Worker     }
282*9880d681SAndroid Build Coastguard Worker   };
283*9880d681SAndroid Build Coastguard Worker 
284*9880d681SAndroid Build Coastguard Worker   /// This class wraps the llvm.memmove intrinsic.
285*9880d681SAndroid Build Coastguard Worker   class MemMoveInst : public MemTransferInst {
286*9880d681SAndroid Build Coastguard Worker   public:
287*9880d681SAndroid Build Coastguard Worker     // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)288*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
289*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::memmove;
290*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)291*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
292*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
293*9880d681SAndroid Build Coastguard Worker     }
294*9880d681SAndroid Build Coastguard Worker   };
295*9880d681SAndroid Build Coastguard Worker 
296*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.va_start intrinsic.
297*9880d681SAndroid Build Coastguard Worker   class VAStartInst : public IntrinsicInst {
298*9880d681SAndroid Build Coastguard Worker   public:
classof(const IntrinsicInst * I)299*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
300*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::vastart;
301*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)302*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
303*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
304*9880d681SAndroid Build Coastguard Worker     }
305*9880d681SAndroid Build Coastguard Worker 
getArgList()306*9880d681SAndroid Build Coastguard Worker     Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
307*9880d681SAndroid Build Coastguard Worker   };
308*9880d681SAndroid Build Coastguard Worker 
309*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.va_end intrinsic.
310*9880d681SAndroid Build Coastguard Worker   class VAEndInst : public IntrinsicInst {
311*9880d681SAndroid Build Coastguard Worker   public:
classof(const IntrinsicInst * I)312*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
313*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::vaend;
314*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)315*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
316*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
317*9880d681SAndroid Build Coastguard Worker     }
318*9880d681SAndroid Build Coastguard Worker 
getArgList()319*9880d681SAndroid Build Coastguard Worker     Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
320*9880d681SAndroid Build Coastguard Worker   };
321*9880d681SAndroid Build Coastguard Worker 
322*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.va_copy intrinsic.
323*9880d681SAndroid Build Coastguard Worker   class VACopyInst : public IntrinsicInst {
324*9880d681SAndroid Build Coastguard Worker   public:
classof(const IntrinsicInst * I)325*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
326*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::vacopy;
327*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)328*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
329*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
330*9880d681SAndroid Build Coastguard Worker     }
331*9880d681SAndroid Build Coastguard Worker 
getDest()332*9880d681SAndroid Build Coastguard Worker     Value *getDest() const { return const_cast<Value*>(getArgOperand(0)); }
getSrc()333*9880d681SAndroid Build Coastguard Worker     Value *getSrc() const { return const_cast<Value*>(getArgOperand(1)); }
334*9880d681SAndroid Build Coastguard Worker   };
335*9880d681SAndroid Build Coastguard Worker 
336*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.instrprof_increment intrinsic.
337*9880d681SAndroid Build Coastguard Worker   class InstrProfIncrementInst : public IntrinsicInst {
338*9880d681SAndroid Build Coastguard Worker   public:
classof(const IntrinsicInst * I)339*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
340*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::instrprof_increment;
341*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)342*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
343*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
344*9880d681SAndroid Build Coastguard Worker     }
345*9880d681SAndroid Build Coastguard Worker 
getName()346*9880d681SAndroid Build Coastguard Worker     GlobalVariable *getName() const {
347*9880d681SAndroid Build Coastguard Worker       return cast<GlobalVariable>(
348*9880d681SAndroid Build Coastguard Worker           const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
349*9880d681SAndroid Build Coastguard Worker     }
350*9880d681SAndroid Build Coastguard Worker 
getHash()351*9880d681SAndroid Build Coastguard Worker     ConstantInt *getHash() const {
352*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
353*9880d681SAndroid Build Coastguard Worker     }
354*9880d681SAndroid Build Coastguard Worker 
getNumCounters()355*9880d681SAndroid Build Coastguard Worker     ConstantInt *getNumCounters() const {
356*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
357*9880d681SAndroid Build Coastguard Worker     }
358*9880d681SAndroid Build Coastguard Worker 
getIndex()359*9880d681SAndroid Build Coastguard Worker     ConstantInt *getIndex() const {
360*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
361*9880d681SAndroid Build Coastguard Worker     }
362*9880d681SAndroid Build Coastguard Worker   };
363*9880d681SAndroid Build Coastguard Worker 
364*9880d681SAndroid Build Coastguard Worker   /// This represents the llvm.instrprof_value_profile intrinsic.
365*9880d681SAndroid Build Coastguard Worker   class InstrProfValueProfileInst : public IntrinsicInst {
366*9880d681SAndroid Build Coastguard Worker   public:
classof(const IntrinsicInst * I)367*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const IntrinsicInst *I) {
368*9880d681SAndroid Build Coastguard Worker       return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
369*9880d681SAndroid Build Coastguard Worker     }
classof(const Value * V)370*9880d681SAndroid Build Coastguard Worker     static inline bool classof(const Value *V) {
371*9880d681SAndroid Build Coastguard Worker       return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
372*9880d681SAndroid Build Coastguard Worker     }
373*9880d681SAndroid Build Coastguard Worker 
getName()374*9880d681SAndroid Build Coastguard Worker     GlobalVariable *getName() const {
375*9880d681SAndroid Build Coastguard Worker       return cast<GlobalVariable>(
376*9880d681SAndroid Build Coastguard Worker           const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
377*9880d681SAndroid Build Coastguard Worker     }
378*9880d681SAndroid Build Coastguard Worker 
getHash()379*9880d681SAndroid Build Coastguard Worker     ConstantInt *getHash() const {
380*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
381*9880d681SAndroid Build Coastguard Worker     }
382*9880d681SAndroid Build Coastguard Worker 
getTargetValue()383*9880d681SAndroid Build Coastguard Worker     Value *getTargetValue() const {
384*9880d681SAndroid Build Coastguard Worker       return cast<Value>(const_cast<Value *>(getArgOperand(2)));
385*9880d681SAndroid Build Coastguard Worker     }
386*9880d681SAndroid Build Coastguard Worker 
getValueKind()387*9880d681SAndroid Build Coastguard Worker     ConstantInt *getValueKind() const {
388*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
389*9880d681SAndroid Build Coastguard Worker     }
390*9880d681SAndroid Build Coastguard Worker 
391*9880d681SAndroid Build Coastguard Worker     // Returns the value site index.
getIndex()392*9880d681SAndroid Build Coastguard Worker     ConstantInt *getIndex() const {
393*9880d681SAndroid Build Coastguard Worker       return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
394*9880d681SAndroid Build Coastguard Worker     }
395*9880d681SAndroid Build Coastguard Worker   };
396*9880d681SAndroid Build Coastguard Worker } // namespace llvm
397*9880d681SAndroid Build Coastguard Worker 
398*9880d681SAndroid Build Coastguard Worker #endif
399