1*9880d681SAndroid Build Coastguard Worker //===-- llvm/CodeGen/SDNodeDbgValue.h - SelectionDAG dbg_value --*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file declares the SDDbgValue class. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_SDNODEDBGVALUE_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_CODEGEN_SELECTIONDAG_SDNODEDBGVALUE_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugLoc.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h" 19*9880d681SAndroid Build Coastguard Worker #include <utility> 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker class MDNode; 24*9880d681SAndroid Build Coastguard Worker class SDNode; 25*9880d681SAndroid Build Coastguard Worker class Value; 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker /// SDDbgValue - Holds the information from a dbg_value node through SDISel. 28*9880d681SAndroid Build Coastguard Worker /// We do not use SDValue here to avoid including its header. 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker class SDDbgValue { 31*9880d681SAndroid Build Coastguard Worker public: 32*9880d681SAndroid Build Coastguard Worker enum DbgValueKind { 33*9880d681SAndroid Build Coastguard Worker SDNODE = 0, // value is the result of an expression 34*9880d681SAndroid Build Coastguard Worker CONST = 1, // value is a constant 35*9880d681SAndroid Build Coastguard Worker FRAMEIX = 2 // value is contents of a stack location 36*9880d681SAndroid Build Coastguard Worker }; 37*9880d681SAndroid Build Coastguard Worker private: 38*9880d681SAndroid Build Coastguard Worker union { 39*9880d681SAndroid Build Coastguard Worker struct { 40*9880d681SAndroid Build Coastguard Worker SDNode *Node; // valid for expressions 41*9880d681SAndroid Build Coastguard Worker unsigned ResNo; // valid for expressions 42*9880d681SAndroid Build Coastguard Worker } s; 43*9880d681SAndroid Build Coastguard Worker const Value *Const; // valid for constants 44*9880d681SAndroid Build Coastguard Worker unsigned FrameIx; // valid for stack objects 45*9880d681SAndroid Build Coastguard Worker } u; 46*9880d681SAndroid Build Coastguard Worker MDNode *Var; 47*9880d681SAndroid Build Coastguard Worker MDNode *Expr; 48*9880d681SAndroid Build Coastguard Worker uint64_t Offset; 49*9880d681SAndroid Build Coastguard Worker DebugLoc DL; 50*9880d681SAndroid Build Coastguard Worker unsigned Order; 51*9880d681SAndroid Build Coastguard Worker enum DbgValueKind kind; 52*9880d681SAndroid Build Coastguard Worker bool IsIndirect; 53*9880d681SAndroid Build Coastguard Worker bool Invalid = false; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker public: 56*9880d681SAndroid Build Coastguard Worker // Constructor for non-constants. SDDbgValue(MDNode * Var,MDNode * Expr,SDNode * N,unsigned R,bool indir,uint64_t off,DebugLoc dl,unsigned O)57*9880d681SAndroid Build Coastguard Worker SDDbgValue(MDNode *Var, MDNode *Expr, SDNode *N, unsigned R, bool indir, 58*9880d681SAndroid Build Coastguard Worker uint64_t off, DebugLoc dl, unsigned O) 59*9880d681SAndroid Build Coastguard Worker : Var(Var), Expr(Expr), Offset(off), DL(std::move(dl)), Order(O), 60*9880d681SAndroid Build Coastguard Worker IsIndirect(indir) { 61*9880d681SAndroid Build Coastguard Worker kind = SDNODE; 62*9880d681SAndroid Build Coastguard Worker u.s.Node = N; 63*9880d681SAndroid Build Coastguard Worker u.s.ResNo = R; 64*9880d681SAndroid Build Coastguard Worker } 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker // Constructor for constants. SDDbgValue(MDNode * Var,MDNode * Expr,const Value * C,uint64_t off,DebugLoc dl,unsigned O)67*9880d681SAndroid Build Coastguard Worker SDDbgValue(MDNode *Var, MDNode *Expr, const Value *C, uint64_t off, 68*9880d681SAndroid Build Coastguard Worker DebugLoc dl, unsigned O) 69*9880d681SAndroid Build Coastguard Worker : Var(Var), Expr(Expr), Offset(off), DL(std::move(dl)), Order(O), 70*9880d681SAndroid Build Coastguard Worker IsIndirect(false) { 71*9880d681SAndroid Build Coastguard Worker kind = CONST; 72*9880d681SAndroid Build Coastguard Worker u.Const = C; 73*9880d681SAndroid Build Coastguard Worker } 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker // Constructor for frame indices. SDDbgValue(MDNode * Var,MDNode * Expr,unsigned FI,uint64_t off,DebugLoc dl,unsigned O)76*9880d681SAndroid Build Coastguard Worker SDDbgValue(MDNode *Var, MDNode *Expr, unsigned FI, uint64_t off, DebugLoc dl, 77*9880d681SAndroid Build Coastguard Worker unsigned O) 78*9880d681SAndroid Build Coastguard Worker : Var(Var), Expr(Expr), Offset(off), DL(std::move(dl)), Order(O), 79*9880d681SAndroid Build Coastguard Worker IsIndirect(false) { 80*9880d681SAndroid Build Coastguard Worker kind = FRAMEIX; 81*9880d681SAndroid Build Coastguard Worker u.FrameIx = FI; 82*9880d681SAndroid Build Coastguard Worker } 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker // Returns the kind. getKind()85*9880d681SAndroid Build Coastguard Worker DbgValueKind getKind() const { return kind; } 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker // Returns the MDNode pointer for the variable. getVariable()88*9880d681SAndroid Build Coastguard Worker MDNode *getVariable() const { return Var; } 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker // Returns the MDNode pointer for the expression. getExpression()91*9880d681SAndroid Build Coastguard Worker MDNode *getExpression() const { return Expr; } 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker // Returns the SDNode* for a register ref getSDNode()94*9880d681SAndroid Build Coastguard Worker SDNode *getSDNode() const { assert (kind==SDNODE); return u.s.Node; } 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker // Returns the ResNo for a register ref getResNo()97*9880d681SAndroid Build Coastguard Worker unsigned getResNo() const { assert (kind==SDNODE); return u.s.ResNo; } 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker // Returns the Value* for a constant getConst()100*9880d681SAndroid Build Coastguard Worker const Value *getConst() const { assert (kind==CONST); return u.Const; } 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker // Returns the FrameIx for a stack object getFrameIx()103*9880d681SAndroid Build Coastguard Worker unsigned getFrameIx() const { assert (kind==FRAMEIX); return u.FrameIx; } 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker // Returns whether this is an indirect value. isIndirect()106*9880d681SAndroid Build Coastguard Worker bool isIndirect() const { return IsIndirect; } 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker // Returns the offset. getOffset()109*9880d681SAndroid Build Coastguard Worker uint64_t getOffset() const { return Offset; } 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker // Returns the DebugLoc. getDebugLoc()112*9880d681SAndroid Build Coastguard Worker DebugLoc getDebugLoc() const { return DL; } 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker // Returns the SDNodeOrder. This is the order of the preceding node in the 115*9880d681SAndroid Build Coastguard Worker // input. getOrder()116*9880d681SAndroid Build Coastguard Worker unsigned getOrder() const { return Order; } 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker // setIsInvalidated / isInvalidated - Setter / getter of the "Invalidated" 119*9880d681SAndroid Build Coastguard Worker // property. A SDDbgValue is invalid if the SDNode that produces the value is 120*9880d681SAndroid Build Coastguard Worker // deleted. setIsInvalidated()121*9880d681SAndroid Build Coastguard Worker void setIsInvalidated() { Invalid = true; } isInvalidated()122*9880d681SAndroid Build Coastguard Worker bool isInvalidated() const { return Invalid; } 123*9880d681SAndroid Build Coastguard Worker }; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker } // end llvm namespace 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker #endif 128