1 //===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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:
14 // if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
15 // ... MCI->getDest() ... MCI->getSource() ...
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
22 //===----------------------------------------------------------------------===//
24 #ifndef LLVM_IR_INTRINSICINST_H
25 #define LLVM_IR_INTRINSICINST_H
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"
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() = delete;
39 IntrinsicInst(const IntrinsicInst&) = delete;
40 void operator=(const IntrinsicInst&) = delete;
42 /// getIntrinsicID - Return the intrinsic ID of this intrinsic.
44 Intrinsic::ID getIntrinsicID() const {
45 return getCalledFunction()->getIntrinsicID();
48 // Methods for support type inquiry through isa, cast, and dyn_cast:
49 static inline bool classof(const CallInst *I) {
50 if (const Function *CF = I->getCalledFunction())
51 return CF->isIntrinsic();
54 static inline bool classof(const Value *V) {
55 return isa<CallInst>(V) && classof(cast<CallInst>(V));
59 /// DbgInfoIntrinsic - This is the common base class for debug info intrinsics
61 class DbgInfoIntrinsic : public IntrinsicInst {
64 // Methods for support type inquiry through isa, cast, and dyn_cast:
65 static inline bool classof(const IntrinsicInst *I) {
66 switch (I->getIntrinsicID()) {
67 case Intrinsic::dbg_declare:
68 case Intrinsic::dbg_value:
70 default: return false;
73 static inline bool classof(const Value *V) {
74 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
77 static Value *StripCast(Value *C);
80 /// DbgDeclareInst - This represents the llvm.dbg.declare instruction.
82 class DbgDeclareInst : public DbgInfoIntrinsic {
84 Value *getAddress() const;
85 DILocalVariable *getVariable() const {
86 return cast<DILocalVariable>(getRawVariable());
88 DIExpression *getExpression() const {
89 return cast<DIExpression>(getRawExpression());
92 Metadata *getRawVariable() const {
93 return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
95 Metadata *getRawExpression() const {
96 return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
99 // Methods for support type inquiry through isa, cast, and dyn_cast:
100 static inline bool classof(const IntrinsicInst *I) {
101 return I->getIntrinsicID() == Intrinsic::dbg_declare;
103 static inline bool classof(const Value *V) {
104 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
108 /// DbgValueInst - This represents the llvm.dbg.value instruction.
110 class DbgValueInst : public DbgInfoIntrinsic {
112 const Value *getValue() const;
114 uint64_t getOffset() const {
115 return cast<ConstantInt>(
116 const_cast<Value*>(getArgOperand(1)))->getZExtValue();
118 DILocalVariable *getVariable() const {
119 return cast<DILocalVariable>(getRawVariable());
121 DIExpression *getExpression() const {
122 return cast<DIExpression>(getRawExpression());
125 Metadata *getRawVariable() const {
126 return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
128 Metadata *getRawExpression() const {
129 return cast<MetadataAsValue>(getArgOperand(3))->getMetadata();
132 // Methods for support type inquiry through isa, cast, and dyn_cast:
133 static inline bool classof(const IntrinsicInst *I) {
134 return I->getIntrinsicID() == Intrinsic::dbg_value;
136 static inline bool classof(const Value *V) {
137 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
141 /// MemIntrinsic - This is the common base class for memset/memcpy/memmove.
143 class MemIntrinsic : public IntrinsicInst {
145 Value *getRawDest() const { return const_cast<Value*>(getArgOperand(0)); }
146 const Use &getRawDestUse() const { return getArgOperandUse(0); }
147 Use &getRawDestUse() { return getArgOperandUse(0); }
149 Value *getLength() const { return const_cast<Value*>(getArgOperand(2)); }
150 const Use &getLengthUse() const { return getArgOperandUse(2); }
151 Use &getLengthUse() { return getArgOperandUse(2); }
153 unsigned getDestAlignment() const {
154 // Note, param attributes start at 1, so offset dest index from 0 to 1.
155 return getParamAlignment(1);
158 ConstantInt *getVolatileCst() const {
159 return cast<ConstantInt>(const_cast<Value*>(getArgOperand(3)));
161 bool isVolatile() const {
162 return !getVolatileCst()->isZero();
165 unsigned getDestAddressSpace() const {
166 return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
169 /// getDest - This is just like getRawDest, but it strips off any cast
170 /// instructions that feed it, giving the original input. The returned
171 /// value is guaranteed to be a pointer.
172 Value *getDest() const { return getRawDest()->stripPointerCasts(); }
174 /// set* - Set the specified arguments of the instruction.
176 void setDest(Value *Ptr) {
177 assert(getRawDest()->getType() == Ptr->getType() &&
178 "setDest called with pointer of wrong type!");
179 setArgOperand(0, Ptr);
182 void setLength(Value *L) {
183 assert(getLength()->getType() == L->getType() &&
184 "setLength called with value of wrong type!");
188 void setDestAlignment(unsigned Align) {
189 // Note, param attributes start at 1, so offset dest index from 0 to 1.
190 setParamAlignment(1, Align);
193 void setVolatile(Constant* V) {
197 // Methods for support type inquiry through isa, cast, and dyn_cast:
198 static inline bool classof(const IntrinsicInst *I) {
199 switch (I->getIntrinsicID()) {
200 case Intrinsic::memcpy:
201 case Intrinsic::memmove:
202 case Intrinsic::memset:
204 default: return false;
207 static inline bool classof(const Value *V) {
208 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
212 /// MemSetInst - This class wraps the llvm.memset intrinsic.
214 class MemSetInst : public MemIntrinsic {
216 /// get* - Return the arguments to the instruction.
218 Value *getValue() const { return const_cast<Value*>(getArgOperand(1)); }
219 const Use &getValueUse() const { return getArgOperandUse(1); }
220 Use &getValueUse() { return getArgOperandUse(1); }
222 void setValue(Value *Val) {
223 assert(getValue()->getType() == Val->getType() &&
224 "setValue called with value of wrong type!");
225 setArgOperand(1, Val);
228 // Methods for support type inquiry through isa, cast, and dyn_cast:
229 static inline bool classof(const IntrinsicInst *I) {
230 return I->getIntrinsicID() == Intrinsic::memset;
232 static inline bool classof(const Value *V) {
233 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
237 /// MemTransferInst - This class wraps the llvm.memcpy/memmove intrinsics.
239 class MemTransferInst : public MemIntrinsic {
241 /// get* - Return the arguments to the instruction.
243 Value *getRawSource() const { return const_cast<Value*>(getArgOperand(1)); }
244 const Use &getRawSourceUse() const { return getArgOperandUse(1); }
245 Use &getRawSourceUse() { return getArgOperandUse(1); }
247 /// getSource - This is just like getRawSource, but it strips off any cast
248 /// instructions that feed it, giving the original input. The returned
249 /// value is guaranteed to be a pointer.
250 Value *getSource() const { return getRawSource()->stripPointerCasts(); }
252 unsigned getSourceAddressSpace() const {
253 return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
256 unsigned getSrcAlignment() const {
257 // Note, param attributes start at 1, so offset src index from 1 to 2.
258 return getParamAlignment(2);
261 void setSource(Value *Ptr) {
262 assert(getRawSource()->getType() == Ptr->getType() &&
263 "setSource called with pointer of wrong type!");
264 setArgOperand(1, Ptr);
267 void setSrcAlignment(unsigned Align) {
268 // Note, param attributes start at 1, so offset src index from 1 to 2.
269 setParamAlignment(2, Align);
272 // Methods for support type inquiry through isa, cast, and dyn_cast:
273 static inline bool classof(const IntrinsicInst *I) {
274 return I->getIntrinsicID() == Intrinsic::memcpy ||
275 I->getIntrinsicID() == Intrinsic::memmove;
277 static inline bool classof(const Value *V) {
278 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
283 /// MemCpyInst - This class wraps the llvm.memcpy intrinsic.
285 class MemCpyInst : public MemTransferInst {
287 // Methods for support type inquiry through isa, cast, and dyn_cast:
288 static inline bool classof(const IntrinsicInst *I) {
289 return I->getIntrinsicID() == Intrinsic::memcpy;
291 static inline bool classof(const Value *V) {
292 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
296 /// MemMoveInst - This class wraps the llvm.memmove intrinsic.
298 class MemMoveInst : public MemTransferInst {
300 // Methods for support type inquiry through isa, cast, and dyn_cast:
301 static inline bool classof(const IntrinsicInst *I) {
302 return I->getIntrinsicID() == Intrinsic::memmove;
304 static inline bool classof(const Value *V) {
305 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
309 /// VAStartInst - This represents the llvm.va_start intrinsic.
311 class VAStartInst : public IntrinsicInst {
313 static inline bool classof(const IntrinsicInst *I) {
314 return I->getIntrinsicID() == Intrinsic::vastart;
316 static inline bool classof(const Value *V) {
317 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
320 Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
323 /// VAEndInst - This represents the llvm.va_end intrinsic.
325 class VAEndInst : public IntrinsicInst {
327 static inline bool classof(const IntrinsicInst *I) {
328 return I->getIntrinsicID() == Intrinsic::vaend;
330 static inline bool classof(const Value *V) {
331 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
334 Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
337 /// VACopyInst - This represents the llvm.va_copy intrinsic.
339 class VACopyInst : public IntrinsicInst {
341 static inline bool classof(const IntrinsicInst *I) {
342 return I->getIntrinsicID() == Intrinsic::vacopy;
344 static inline bool classof(const Value *V) {
345 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
348 Value *getDest() const { return const_cast<Value*>(getArgOperand(0)); }
349 Value *getSrc() const { return const_cast<Value*>(getArgOperand(1)); }
352 /// This represents the llvm.instrprof_increment intrinsic.
353 class InstrProfIncrementInst : public IntrinsicInst {
355 static inline bool classof(const IntrinsicInst *I) {
356 return I->getIntrinsicID() == Intrinsic::instrprof_increment;
358 static inline bool classof(const Value *V) {
359 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
362 GlobalVariable *getName() const {
363 return cast<GlobalVariable>(
364 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
367 ConstantInt *getHash() const {
368 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
371 ConstantInt *getNumCounters() const {
372 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
375 ConstantInt *getIndex() const {
376 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
380 /// This represents the llvm.instrprof_value_profile intrinsic.
381 class InstrProfValueProfileInst : public IntrinsicInst {
383 static inline bool classof(const IntrinsicInst *I) {
384 return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
386 static inline bool classof(const Value *V) {
387 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
390 GlobalVariable *getName() const {
391 return cast<GlobalVariable>(
392 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
395 ConstantInt *getHash() const {
396 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
399 Value *getTargetValue() const {
400 return cast<Value>(const_cast<Value *>(getArgOperand(2)));
403 ConstantInt *getValueKind() const {
404 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
407 // Returns the value site index.
408 ConstantInt *getIndex() const {
409 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));