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 static Value *getValueImpl(Value *Op) {
     53   auto *MD = cast<MetadataAsValue>(Op)->getMetadata();
     54   if (auto *V = dyn_cast<ValueAsMetadata>(MD))
     55     return V->getValue();
     56 
     57   // When the value goes to null, it gets replaced by an empty MDNode.
     58   assert(!cast<MDNode>(MD)->getNumOperands() && "Expected an empty MDNode");
     59   return nullptr;
     60 }
     61 
     62 //===----------------------------------------------------------------------===//
     63 /// DbgDeclareInst - This represents the llvm.dbg.declare instruction.
     64 ///
     65 
     66 Value *DbgDeclareInst::getAddress() const {
     67   if (!getArgOperand(0))
     68     return nullptr;
     69 
     70   return getValueImpl(getArgOperand(0));
     71 }
     72 
     73 //===----------------------------------------------------------------------===//
     74 /// DbgValueInst - This represents the llvm.dbg.value instruction.
     75 ///
     76 
     77 const Value *DbgValueInst::getValue() const {
     78   return const_cast<DbgValueInst *>(this)->getValue();
     79 }
     80 
     81 Value *DbgValueInst::getValue() { return getValueImpl(getArgOperand(0)); }
     82