Home | History | Annotate | Download | only in IR
      1 //===-- InstrinsicInst.cpp - Intrinsic Instruction Wrappers ---------------===//
      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 implements methods that make it really easy to deal with intrinsic
     11 // functions.
     12 //
     13 // All intrinsic function calls are instances of the call instruction, so these
     14 // are all subclasses of the CallInst class.  Note that none of these classes
     15 // has state or virtual methods, which is an important part of this gross/neat
     16 // hack working.
     17 //
     18 // In some cases, arguments to intrinsics need to be generic and are defined as
     19 // type pointer to empty struct { }*.  To access the real item of interest the
     20 // cast instruction needs to be stripped away.
     21 //
     22 //===----------------------------------------------------------------------===//
     23 
     24 #include "llvm/IR/IntrinsicInst.h"
     25 #include "llvm/IR/Constants.h"
     26 #include "llvm/IR/GlobalVariable.h"
     27 #include "llvm/IR/Metadata.h"
     28 using namespace llvm;
     29 
     30 //===----------------------------------------------------------------------===//
     31 /// DbgInfoIntrinsic - This is the common base class for debug info intrinsics
     32 ///
     33 
     34 static Value *CastOperand(Value *C) {
     35   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
     36     if (CE->isCast())
     37       return CE->getOperand(0);
     38   return nullptr;
     39 }
     40 
     41 Value *DbgInfoIntrinsic::StripCast(Value *C) {
     42   if (Value *CO = CastOperand(C)) {
     43     C = StripCast(CO);
     44   } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
     45     if (GV->hasInitializer())
     46       if (Value *CO = CastOperand(GV->getInitializer()))
     47         C = StripCast(CO);
     48   }
     49   return dyn_cast<GlobalVariable>(C);
     50 }
     51 
     52 //===----------------------------------------------------------------------===//
     53 /// DbgDeclareInst - This represents the llvm.dbg.declare instruction.
     54 ///
     55 
     56 Value *DbgDeclareInst::getAddress() const {
     57   if (MDNode* MD = cast_or_null<MDNode>(getArgOperand(0)))
     58     return MD->getOperand(0);
     59   else
     60     return nullptr;
     61 }
     62 
     63 //===----------------------------------------------------------------------===//
     64 /// DbgValueInst - This represents the llvm.dbg.value instruction.
     65 ///
     66 
     67 const Value *DbgValueInst::getValue() const {
     68   return cast<MDNode>(getArgOperand(0))->getOperand(0);
     69 }
     70 
     71 Value *DbgValueInst::getValue() {
     72   return cast<MDNode>(getArgOperand(0))->getOperand(0);
     73 }
     74