• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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