Fix XCoreTargetLowering::isLegalAddressingMode() to handle VoidTy.
[oota-llvm.git] / lib / VMCore / IntrinsicInst.cpp
1 //===-- InstrinsicInst.cpp - 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 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/IntrinsicInst.h"
25 #include "llvm/Constants.h"
26 #include "llvm/GlobalVariable.h"
27 #include "llvm/Analysis/ValueTracking.h"
28 #include "llvm/CodeGen/MachineModuleInfo.h"
29 using namespace llvm;
30
31 //===----------------------------------------------------------------------===//
32 /// DbgInfoIntrinsic - This is the common base class for debug info intrinsics
33 ///
34
35 static Value *CastOperand(Value *C) {
36   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
37     if (CE->isCast())
38       return CE->getOperand(0);
39   return NULL;
40 }
41
42 Value *DbgInfoIntrinsic::StripCast(Value *C) {
43   if (Value *CO = CastOperand(C)) {
44     C = StripCast(CO);
45   } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
46     if (GV->hasInitializer())
47       if (Value *CO = CastOperand(GV->getInitializer()))
48         C = StripCast(CO);
49   }
50   return dyn_cast<GlobalVariable>(C);
51 }
52
53 //===----------------------------------------------------------------------===//
54 /// DbgDeclareInst - This represents the llvm.dbg.declare instruction.
55 ///
56
57 Value *DbgDeclareInst::getAddress() const {
58   if (MDNode* MD = cast_or_null<MDNode>(getOperand(1)))
59     return MD->getOperand(0);
60   else
61     return NULL;
62 }
63
64 //===----------------------------------------------------------------------===//
65 /// DbgValueInst - This represents the llvm.dbg.value instruction.
66 ///
67
68 const Value *DbgValueInst::getValue() const {
69   return cast<MDNode>(getOperand(1))->getOperand(0);
70 }
71
72 Value *DbgValueInst::getValue() {
73   return cast<MDNode>(getOperand(1))->getOperand(0);
74 }