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