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