]>
Commit | Line | Data |
---|---|---|
1a4d82fc | 1 | //===-- InstrinsicInst.cpp - Intrinsic Instruction Wrappers ---------------===// |
223e47cc LB |
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 | ||
970d7e83 LB |
24 | #include "llvm/IR/IntrinsicInst.h" |
25 | #include "llvm/IR/Constants.h" | |
26 | #include "llvm/IR/GlobalVariable.h" | |
27 | #include "llvm/IR/Metadata.h" | |
223e47cc LB |
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); | |
1a4d82fc | 38 | return nullptr; |
223e47cc LB |
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 | ||
85aaf69f SL |
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 | ||
223e47cc LB |
62 | //===----------------------------------------------------------------------===// |
63 | /// DbgDeclareInst - This represents the llvm.dbg.declare instruction. | |
64 | /// | |
65 | ||
66 | Value *DbgDeclareInst::getAddress() const { | |
85aaf69f | 67 | if (!getArgOperand(0)) |
1a4d82fc | 68 | return nullptr; |
85aaf69f SL |
69 | |
70 | return getValueImpl(getArgOperand(0)); | |
223e47cc LB |
71 | } |
72 | ||
73 | //===----------------------------------------------------------------------===// | |
74 | /// DbgValueInst - This represents the llvm.dbg.value instruction. | |
75 | /// | |
76 | ||
77 | const Value *DbgValueInst::getValue() const { | |
85aaf69f | 78 | return const_cast<DbgValueInst *>(this)->getValue(); |
223e47cc LB |
79 | } |
80 | ||
85aaf69f | 81 | Value *DbgValueInst::getValue() { return getValueImpl(getArgOperand(0)); } |