1205218Srdivacky//===-- llvm/CodeGen/SDNodeDbgValue.h - SelectionDAG dbg_value --*- C++ -*-===// 2205218Srdivacky// 3205218Srdivacky// The LLVM Compiler Infrastructure 4205218Srdivacky// 5205218Srdivacky// This file is distributed under the University of Illinois Open Source 6205218Srdivacky// License. See LICENSE.TXT for details. 7205218Srdivacky// 8205218Srdivacky//===----------------------------------------------------------------------===// 9205218Srdivacky// 10205218Srdivacky// This file declares the SDDbgValue class. 11205218Srdivacky// 12205218Srdivacky//===----------------------------------------------------------------------===// 13205218Srdivacky 14205218Srdivacky#ifndef LLVM_CODEGEN_SDNODEDBGVALUE_H 15205218Srdivacky#define LLVM_CODEGEN_SDNODEDBGVALUE_H 16205218Srdivacky 17205218Srdivacky#include "llvm/ADT/SmallVector.h" 18249423Sdim#include "llvm/Support/DataTypes.h" 19205218Srdivacky#include "llvm/Support/DebugLoc.h" 20205218Srdivacky 21205218Srdivackynamespace llvm { 22205218Srdivacky 23205218Srdivackyclass MDNode; 24205218Srdivackyclass SDNode; 25205218Srdivackyclass Value; 26205218Srdivacky 27205218Srdivacky/// SDDbgValue - Holds the information from a dbg_value node through SDISel. 28205218Srdivacky/// We do not use SDValue here to avoid including its header. 29205218Srdivacky 30205218Srdivackyclass SDDbgValue { 31205218Srdivackypublic: 32205218Srdivacky enum DbgValueKind { 33205218Srdivacky SDNODE = 0, // value is the result of an expression 34205218Srdivacky CONST = 1, // value is a constant 35205218Srdivacky FRAMEIX = 2 // value is contents of a stack location 36205218Srdivacky }; 37205218Srdivackyprivate: 38205218Srdivacky enum DbgValueKind kind; 39205218Srdivacky union { 40205218Srdivacky struct { 41205218Srdivacky SDNode *Node; // valid for expressions 42205218Srdivacky unsigned ResNo; // valid for expressions 43205218Srdivacky } s; 44207618Srdivacky const Value *Const; // valid for constants 45205218Srdivacky unsigned FrameIx; // valid for stack objects 46205218Srdivacky } u; 47205218Srdivacky MDNode *mdPtr; 48205218Srdivacky uint64_t Offset; 49205218Srdivacky DebugLoc DL; 50205218Srdivacky unsigned Order; 51206083Srdivacky bool Invalid; 52205218Srdivackypublic: 53205218Srdivacky // Constructor for non-constants. 54205218Srdivacky SDDbgValue(MDNode *mdP, SDNode *N, unsigned R, uint64_t off, DebugLoc dl, 55206083Srdivacky unsigned O) : mdPtr(mdP), Offset(off), DL(dl), Order(O), 56206083Srdivacky Invalid(false) { 57205218Srdivacky kind = SDNODE; 58205218Srdivacky u.s.Node = N; 59205218Srdivacky u.s.ResNo = R; 60205218Srdivacky } 61205218Srdivacky 62205218Srdivacky // Constructor for constants. 63207618Srdivacky SDDbgValue(MDNode *mdP, const Value *C, uint64_t off, DebugLoc dl, 64207618Srdivacky unsigned O) : 65206083Srdivacky mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) { 66205218Srdivacky kind = CONST; 67205218Srdivacky u.Const = C; 68205218Srdivacky } 69205218Srdivacky 70205218Srdivacky // Constructor for frame indices. 71205218Srdivacky SDDbgValue(MDNode *mdP, unsigned FI, uint64_t off, DebugLoc dl, unsigned O) : 72206083Srdivacky mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) { 73205218Srdivacky kind = FRAMEIX; 74205218Srdivacky u.FrameIx = FI; 75205218Srdivacky } 76205218Srdivacky 77205218Srdivacky // Returns the kind. 78205218Srdivacky DbgValueKind getKind() { return kind; } 79205218Srdivacky 80205218Srdivacky // Returns the MDNode pointer. 81205218Srdivacky MDNode *getMDPtr() { return mdPtr; } 82205218Srdivacky 83205218Srdivacky // Returns the SDNode* for a register ref 84205218Srdivacky SDNode *getSDNode() { assert (kind==SDNODE); return u.s.Node; } 85205218Srdivacky 86205218Srdivacky // Returns the ResNo for a register ref 87205218Srdivacky unsigned getResNo() { assert (kind==SDNODE); return u.s.ResNo; } 88205218Srdivacky 89205218Srdivacky // Returns the Value* for a constant 90207618Srdivacky const Value *getConst() { assert (kind==CONST); return u.Const; } 91205218Srdivacky 92205218Srdivacky // Returns the FrameIx for a stack object 93205218Srdivacky unsigned getFrameIx() { assert (kind==FRAMEIX); return u.FrameIx; } 94205218Srdivacky 95205218Srdivacky // Returns the offset. 96205218Srdivacky uint64_t getOffset() { return Offset; } 97205218Srdivacky 98205218Srdivacky // Returns the DebugLoc. 99205218Srdivacky DebugLoc getDebugLoc() { return DL; } 100205218Srdivacky 101205218Srdivacky // Returns the SDNodeOrder. This is the order of the preceding node in the 102205218Srdivacky // input. 103205218Srdivacky unsigned getOrder() { return Order; } 104206083Srdivacky 105206083Srdivacky // setIsInvalidated / isInvalidated - Setter / getter of the "Invalidated" 106206083Srdivacky // property. A SDDbgValue is invalid if the SDNode that produces the value is 107206083Srdivacky // deleted. 108206083Srdivacky void setIsInvalidated() { Invalid = true; } 109206083Srdivacky bool isInvalidated() { return Invalid; } 110205218Srdivacky}; 111205218Srdivacky 112205218Srdivacky} // end llvm namespace 113205218Srdivacky 114205218Srdivacky#endif 115