[llvm-commits] CVS: llvm/include/llvm/IntrinsicInst.h

Chris Lattner lattner at cs.uiuc.edu
Mon Oct 11 21:20:57 PDT 2004



Changes in directory llvm/include/llvm:

IntrinsicInst.h added (r1.1)
---
Log message:

New header.  Classes can be added as needed.


---
Diffs of the changes:  (+198 -0)

Index: llvm/include/llvm/IntrinsicInst.h
diff -c /dev/null llvm/include/llvm/IntrinsicInst.h:1.1
*** /dev/null	Mon Oct 11 23:20:56 2004
--- llvm/include/llvm/IntrinsicInst.h	Mon Oct 11 23:20:46 2004
***************
*** 0 ****
--- 1,198 ----
+ //===-- llvm/InstrinsicInst.h - Intrinsic Instruction Wrappers --*- C++ -*-===//
+ // 
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ // 
+ //===----------------------------------------------------------------------===//
+ //
+ // This file defines classes that make it really easy to deal with intrinsic
+ // functions with the isa/dyncast family of functions.  In particular, this
+ // allows you to do things like:
+ //
+ //     if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
+ //        ... MCI->getDest() ... MCI->getSource() ...
+ //
+ // All intrinsic function calls are instances of the call instruction, so these
+ // are all subclasses of the CallInst class.  Note that none of these classes
+ // has state or virtual methods, which is an important part of this gross/neat
+ // hack working.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #ifndef LLVM_INTRINSICINST_H
+ #define LLVM_INTRINSICINST_H
+ 
+ #include "llvm/Constants.h"
+ #include "llvm/Function.h"
+ #include "llvm/Instructions.h"
+ #include "llvm/Intrinsics.h"
+ 
+ namespace llvm {
+   class IntrinsicInst : public CallInst {
+     IntrinsicInst();                      // DO NOT IMPLEMENT
+     IntrinsicInst(const IntrinsicInst&);  // DO NOT IMPLEMENT
+     void operator=(const IntrinsicInst&); // DO NOT IMPLEMENT
+   public:
+ 
+     /// StripPointerCasts - This static method strips off any unneeded pointer
+     /// casts from the specified value, returning the original uncasted value.
+     /// Note that the returned value is guaranteed to have pointer type.
+     static Value *StripPointerCasts(Value *Ptr);
+   };
+ 
+ 
+   /// MemIntrinsic - This is the common base class for memset/memcpy/memmove.
+   ///
+   struct MemIntrinsic : public IntrinsicInst {
+     Value *getRawDest() const { return const_cast<Value*>(getOperand(0)); }
+ 
+     Value *getLength() const { return const_cast<Value*>(getOperand(2)); }
+     ConstantInt *getAlignment() const {
+       return cast<ConstantInt>(const_cast<Value*>(getOperand(3)));
+     }
+ 
+     /// getDest - This is just like getRawDest, but it strips off any cast
+     /// instructions that feed it, giving the original input.  The returned
+     /// value is guaranteed to be a pointer.
+     Value *getDest() const { return StripPointerCasts(getRawDest()); }
+ 
+     /// set* - Set the specified arguments of the instruction.
+     ///
+     void setDest(Value *Ptr) {
+       assert(getRawDest()->getType() == Ptr->getType() &&
+              "setDest called with pointer of wrong type!");
+       setOperand(0, Ptr);
+     }
+ 
+     void setLength(Value *L) {
+       assert(getLength()->getType() == L->getType() &&
+              "setLength called with value of wrong type!");
+       setOperand(2, L);
+     }
+     void setAlignment(ConstantInt *A) {
+       assert(getAlignment()->getType() == A->getType() &&
+              "setAlignment called with value of wrong type!");
+       setOperand(3, A);
+     }
+ 
+     // Methods for support type inquiry through isa, cast, and dyn_cast:
+     static inline bool classof(const MemIntrinsic *) { return true; }
+     static inline bool classof(const CallInst *I) {
+       if (const Function *CF = I->getCalledFunction())
+         switch (CF->getIntrinsicID()) {
+         case Intrinsic::memcpy:
+         case Intrinsic::memmove:
+         case Intrinsic::memset:
+           return true;
+         default: break;
+         }
+       return false;
+     }
+     static inline bool classof(const Value *V) {
+       return isa<CallInst>(V) && classof(cast<CallInst>(V));
+     }
+   };
+ 
+ 
+   /// MemCpyInst - This class wraps the llvm.memcpy intrinsic.
+   ///
+   struct MemCpyInst : public MemIntrinsic {
+     /// get* - Return the arguments to the instruction.
+     ///
+     Value *getRawSource() const { return const_cast<Value*>(getOperand(1)); }
+ 
+     /// getSource - This is just like getRawSource, but it strips off any cast
+     /// instructions that feed it, giving the original input.  The returned
+     /// value is guaranteed to be a pointer.
+     Value *getSource() const { return StripPointerCasts(getRawSource()); }
+ 
+     
+     void setSource(Value *Ptr) {
+       assert(getRawSource()->getType() == Ptr->getType() &&
+              "setSource called with pointer of wrong type!");
+       setOperand(1, Ptr);
+     }
+ 
+     // Methods for support type inquiry through isa, cast, and dyn_cast:
+     static inline bool classof(const MemCpyInst *) { return true; }
+     static inline bool classof(const MemIntrinsic *I) {
+       return I->getCalledFunction()->getIntrinsicID() == Intrinsic::memcpy;
+     }
+     static inline bool classof(const CallInst *I) {
+       if (const Function *CF = I->getCalledFunction())
+         if (CF->getIntrinsicID() == Intrinsic::memcpy)
+           return true;
+       return false;
+     }
+     static inline bool classof(const Value *V) {
+       return isa<CallInst>(V) && classof(cast<CallInst>(V));
+     }
+   };
+ 
+   /// MemMoveInst - This class wraps the llvm.memmove intrinsic.
+   ///
+   struct MemMoveInst : public MemIntrinsic {
+     /// get* - Return the arguments to the instruction.
+     ///
+     Value *getRawSource() const { return const_cast<Value*>(getOperand(1)); }
+ 
+     /// getSource - This is just like getRawSource, but it strips off any cast
+     /// instructions that feed it, giving the original input.  The returned
+     /// value is guaranteed to be a pointer.
+     Value *getSource() const { return StripPointerCasts(getRawSource()); }
+ 
+     void setSource(Value *Ptr) {
+       assert(getRawSource()->getType() == Ptr->getType() &&
+              "setSource called with pointer of wrong type!");
+       setOperand(1, Ptr);
+     }
+ 
+     // Methods for support type inquiry through isa, cast, and dyn_cast:
+     static inline bool classof(const MemMoveInst *) { return true; }
+     static inline bool classof(const MemIntrinsic *I) {
+       return I->getCalledFunction()->getIntrinsicID() == Intrinsic::memmove;
+     }
+     static inline bool classof(const CallInst *I) {
+       if (const Function *CF = I->getCalledFunction())
+         if (CF->getIntrinsicID() == Intrinsic::memmove)
+           return true;
+       return false;
+     }
+     static inline bool classof(const Value *V) {
+       return isa<CallInst>(V) && classof(cast<CallInst>(V));
+     }
+   };
+ 
+   /// MemSetInst - This class wraps the llvm.memcpy intrinsic.
+   ///
+   struct MemSetInst : public MemIntrinsic {
+     /// get* - Return the arguments to the instruction.
+     ///
+     Value *getValue() const { return const_cast<Value*>(getOperand(1)); }
+ 
+     void setValue(Value *Val) {
+       assert(getValue()->getType() == Val->getType() &&
+              "setSource called with pointer of wrong type!");
+       setOperand(1, Val);
+     }
+ 
+     // Methods for support type inquiry through isa, cast, and dyn_cast:
+     static inline bool classof(const MemSetInst *) { return true; }
+     static inline bool classof(const MemIntrinsic *I) {
+       return I->getCalledFunction()->getIntrinsicID() == Intrinsic::memset;
+     }
+     static inline bool classof(const CallInst *I) {
+       if (const Function *CF = I->getCalledFunction())
+         if (CF->getIntrinsicID() == Intrinsic::memset)
+           return true;
+       return false;
+     }
+     static inline bool classof(const Value *V) {
+       return isa<CallInst>(V) && classof(cast<CallInst>(V));
+     }
+   };
+ }
+ 
+ #endif






More information about the llvm-commits mailing list