IntrinsicInst.h revision 283ba2fbb4a40d5f7615aba070f2f7ec161d19ac
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_INTRINSICINST_H 25#define LLVM_INTRINSICINST_H 26 27#include "llvm/Constants.h" 28#include "llvm/Metadata.h" 29#include "llvm/Function.h" 30#include "llvm/Instructions.h" 31#include "llvm/Intrinsics.h" 32 33namespace llvm { 34 /// IntrinsicInst - A useful wrapper class for inspecting calls to intrinsic 35 /// functions. This allows the standard isa/dyncast/cast functionality to 36 /// work with calls to intrinsic functions. 37 class IntrinsicInst : public CallInst { 38 IntrinsicInst(); // DO NOT IMPLEMENT 39 IntrinsicInst(const IntrinsicInst&); // DO NOT IMPLEMENT 40 void operator=(const IntrinsicInst&); // DO NOT IMPLEMENT 41 public: 42 /// getIntrinsicID - Return the intrinsic ID of this intrinsic. 43 /// 44 Intrinsic::ID getIntrinsicID() const { 45 return (Intrinsic::ID)getCalledFunction()->getIntrinsicID(); 46 } 47 48 // Methods for support type inquiry through isa, cast, and dyn_cast: 49 static inline bool classof(const IntrinsicInst *) { return true; } 50 static inline bool classof(const CallInst *I) { 51 if (const Function *CF = I->getCalledFunction()) 52 return CF->getIntrinsicID() != 0; 53 return false; 54 } 55 static inline bool classof(const Value *V) { 56 return isa<CallInst>(V) && classof(cast<CallInst>(V)); 57 } 58 }; 59 60 /// DbgInfoIntrinsic - This is the common base class for debug info intrinsics 61 /// 62 class DbgInfoIntrinsic : public IntrinsicInst { 63 public: 64 65 // Methods for support type inquiry through isa, cast, and dyn_cast: 66 static inline bool classof(const DbgInfoIntrinsic *) { return true; } 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 } 75 static inline bool classof(const Value *V) { 76 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 77 } 78 79 static Value *StripCast(Value *C); 80 }; 81 82 /// DbgDeclareInst - This represents the llvm.dbg.declare instruction. 83 /// 84 class DbgDeclareInst : public DbgInfoIntrinsic { 85 public: 86 Value *getAddress() const { 87 if (MDNode* MD = dyn_cast<MDNode>(getOperand(1))) 88 return MD->getOperand(0); 89 else 90 return NULL; 91 } 92 MDNode *getVariable() const { return cast<MDNode>(getOperand(2)); } 93 94 // Methods for support type inquiry through isa, cast, and dyn_cast: 95 static inline bool classof(const DbgDeclareInst *) { return true; } 96 static inline bool classof(const IntrinsicInst *I) { 97 return I->getIntrinsicID() == Intrinsic::dbg_declare; 98 } 99 static inline bool classof(const Value *V) { 100 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 101 } 102 }; 103 104 /// DbgValueInst - This represents the llvm.dbg.value instruction. 105 /// 106 class DbgValueInst : public DbgInfoIntrinsic { 107 public: 108 const Value *getValue() const; 109 Value *getValue(); 110 uint64_t getOffset() const { 111 return cast<ConstantInt>( 112 const_cast<Value*>(getOperand(2)))->getZExtValue(); 113 } 114 const MDNode *getVariable() const { return cast<MDNode>(getOperand(3)); } 115 MDNode *getVariable() { return cast<MDNode>(getOperand(3)); } 116 117 // Methods for support type inquiry through isa, cast, and dyn_cast: 118 static inline bool classof(const DbgValueInst *) { return true; } 119 static inline bool classof(const IntrinsicInst *I) { 120 return I->getIntrinsicID() == Intrinsic::dbg_value; 121 } 122 static inline bool classof(const Value *V) { 123 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 124 } 125 }; 126 127 /// MemIntrinsic - This is the common base class for memset/memcpy/memmove. 128 /// 129 class MemIntrinsic : public IntrinsicInst { 130 public: 131 Value *getRawDest() const { return const_cast<Value*>(getOperand(1)); } 132 133 Value *getLength() const { return const_cast<Value*>(getOperand(3)); } 134 ConstantInt *getAlignmentCst() const { 135 return cast<ConstantInt>(const_cast<Value*>(getOperand(4))); 136 } 137 138 unsigned getAlignment() const { 139 return getAlignmentCst()->getZExtValue(); 140 } 141 142 /// getDest - This is just like getRawDest, but it strips off any cast 143 /// instructions that feed it, giving the original input. The returned 144 /// value is guaranteed to be a pointer. 145 Value *getDest() const { return getRawDest()->stripPointerCasts(); } 146 147 /// set* - Set the specified arguments of the instruction. 148 /// 149 void setDest(Value *Ptr) { 150 assert(getRawDest()->getType() == Ptr->getType() && 151 "setDest called with pointer of wrong type!"); 152 setOperand(1, Ptr); 153 } 154 155 void setLength(Value *L) { 156 assert(getLength()->getType() == L->getType() && 157 "setLength called with value of wrong type!"); 158 setOperand(3, L); 159 } 160 161 void setAlignment(Constant* A) { 162 setOperand(4, A); 163 } 164 165 const Type *getAlignmentType() const { 166 return getOperand(4)->getType(); 167 } 168 169 // Methods for support type inquiry through isa, cast, and dyn_cast: 170 static inline bool classof(const MemIntrinsic *) { return true; } 171 static inline bool classof(const IntrinsicInst *I) { 172 switch (I->getIntrinsicID()) { 173 case Intrinsic::memcpy: 174 case Intrinsic::memmove: 175 case Intrinsic::memset: 176 return true; 177 default: return false; 178 } 179 } 180 static inline bool classof(const Value *V) { 181 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 182 } 183 }; 184 185 /// MemSetInst - This class wraps the llvm.memset intrinsic. 186 /// 187 class MemSetInst : public MemIntrinsic { 188 public: 189 /// get* - Return the arguments to the instruction. 190 /// 191 Value *getValue() const { return const_cast<Value*>(getOperand(2)); } 192 193 void setValue(Value *Val) { 194 assert(getValue()->getType() == Val->getType() && 195 "setSource called with pointer of wrong type!"); 196 setOperand(2, Val); 197 } 198 199 // Methods for support type inquiry through isa, cast, and dyn_cast: 200 static inline bool classof(const MemSetInst *) { return true; } 201 static inline bool classof(const IntrinsicInst *I) { 202 return I->getIntrinsicID() == Intrinsic::memset; 203 } 204 static inline bool classof(const Value *V) { 205 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 206 } 207 }; 208 209 /// MemTransferInst - This class wraps the llvm.memcpy/memmove intrinsics. 210 /// 211 class MemTransferInst : public MemIntrinsic { 212 public: 213 /// get* - Return the arguments to the instruction. 214 /// 215 Value *getRawSource() const { return const_cast<Value*>(getOperand(2)); } 216 217 /// getSource - This is just like getRawSource, but it strips off any cast 218 /// instructions that feed it, giving the original input. The returned 219 /// value is guaranteed to be a pointer. 220 Value *getSource() const { return getRawSource()->stripPointerCasts(); } 221 222 void setSource(Value *Ptr) { 223 assert(getRawSource()->getType() == Ptr->getType() && 224 "setSource called with pointer of wrong type!"); 225 setOperand(2, Ptr); 226 } 227 228 // Methods for support type inquiry through isa, cast, and dyn_cast: 229 static inline bool classof(const MemTransferInst *) { return true; } 230 static inline bool classof(const IntrinsicInst *I) { 231 return I->getIntrinsicID() == Intrinsic::memcpy || 232 I->getIntrinsicID() == Intrinsic::memmove; 233 } 234 static inline bool classof(const Value *V) { 235 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 236 } 237 }; 238 239 240 /// MemCpyInst - This class wraps the llvm.memcpy intrinsic. 241 /// 242 class MemCpyInst : public MemTransferInst { 243 public: 244 // Methods for support type inquiry through isa, cast, and dyn_cast: 245 static inline bool classof(const MemCpyInst *) { return true; } 246 static inline bool classof(const IntrinsicInst *I) { 247 return I->getIntrinsicID() == Intrinsic::memcpy; 248 } 249 static inline bool classof(const Value *V) { 250 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 251 } 252 }; 253 254 /// MemMoveInst - This class wraps the llvm.memmove intrinsic. 255 /// 256 class MemMoveInst : public MemTransferInst { 257 public: 258 // Methods for support type inquiry through isa, cast, and dyn_cast: 259 static inline bool classof(const MemMoveInst *) { return true; } 260 static inline bool classof(const IntrinsicInst *I) { 261 return I->getIntrinsicID() == Intrinsic::memmove; 262 } 263 static inline bool classof(const Value *V) { 264 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 265 } 266 }; 267 268 /// EHSelectorInst - This represents the llvm.eh.selector instruction. 269 /// 270 class EHSelectorInst : public IntrinsicInst { 271 public: 272 // Methods for support type inquiry through isa, cast, and dyn_cast: 273 static inline bool classof(const EHSelectorInst *) { return true; } 274 static inline bool classof(const IntrinsicInst *I) { 275 return I->getIntrinsicID() == Intrinsic::eh_selector; 276 } 277 static inline bool classof(const Value *V) { 278 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 279 } 280 }; 281 282 /// MemoryUseIntrinsic - This is the common base class for the memory use 283 /// marker intrinsics. 284 /// 285 class MemoryUseIntrinsic : public IntrinsicInst { 286 public: 287 288 // Methods for support type inquiry through isa, cast, and dyn_cast: 289 static inline bool classof(const MemoryUseIntrinsic *) { return true; } 290 static inline bool classof(const IntrinsicInst *I) { 291 switch (I->getIntrinsicID()) { 292 case Intrinsic::lifetime_start: 293 case Intrinsic::lifetime_end: 294 case Intrinsic::invariant_start: 295 case Intrinsic::invariant_end: 296 return true; 297 default: return false; 298 } 299 } 300 static inline bool classof(const Value *V) { 301 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 302 } 303 }; 304 305} 306 307#endif 308