SDNodeDbgValue.h revision 276479
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" 18276479Sdim#include "llvm/IR/DebugLoc.h" 19249423Sdim#include "llvm/Support/DataTypes.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; 48276479Sdim bool IsIndirect; 49205218Srdivacky uint64_t Offset; 50205218Srdivacky DebugLoc DL; 51205218Srdivacky unsigned Order; 52206083Srdivacky bool Invalid; 53205218Srdivackypublic: 54205218Srdivacky // Constructor for non-constants. 55276479Sdim SDDbgValue(MDNode *mdP, SDNode *N, unsigned R, 56276479Sdim bool indir, uint64_t off, DebugLoc dl, 57276479Sdim unsigned O) : mdPtr(mdP), IsIndirect(indir), 58276479Sdim Offset(off), DL(dl), Order(O), 59206083Srdivacky Invalid(false) { 60205218Srdivacky kind = SDNODE; 61205218Srdivacky u.s.Node = N; 62205218Srdivacky u.s.ResNo = R; 63205218Srdivacky } 64205218Srdivacky 65205218Srdivacky // Constructor for constants. 66207618Srdivacky SDDbgValue(MDNode *mdP, const Value *C, uint64_t off, DebugLoc dl, 67207618Srdivacky unsigned O) : 68276479Sdim mdPtr(mdP), IsIndirect(false), Offset(off), DL(dl), Order(O), 69276479Sdim Invalid(false) { 70205218Srdivacky kind = CONST; 71205218Srdivacky u.Const = C; 72205218Srdivacky } 73205218Srdivacky 74205218Srdivacky // Constructor for frame indices. 75205218Srdivacky SDDbgValue(MDNode *mdP, unsigned FI, uint64_t off, DebugLoc dl, unsigned O) : 76276479Sdim mdPtr(mdP), IsIndirect(false), Offset(off), DL(dl), Order(O), 77276479Sdim Invalid(false) { 78205218Srdivacky kind = FRAMEIX; 79205218Srdivacky u.FrameIx = FI; 80205218Srdivacky } 81205218Srdivacky 82205218Srdivacky // Returns the kind. 83205218Srdivacky DbgValueKind getKind() { return kind; } 84205218Srdivacky 85205218Srdivacky // Returns the MDNode pointer. 86205218Srdivacky MDNode *getMDPtr() { return mdPtr; } 87205218Srdivacky 88205218Srdivacky // Returns the SDNode* for a register ref 89205218Srdivacky SDNode *getSDNode() { assert (kind==SDNODE); return u.s.Node; } 90205218Srdivacky 91205218Srdivacky // Returns the ResNo for a register ref 92205218Srdivacky unsigned getResNo() { assert (kind==SDNODE); return u.s.ResNo; } 93205218Srdivacky 94205218Srdivacky // Returns the Value* for a constant 95207618Srdivacky const Value *getConst() { assert (kind==CONST); return u.Const; } 96205218Srdivacky 97205218Srdivacky // Returns the FrameIx for a stack object 98205218Srdivacky unsigned getFrameIx() { assert (kind==FRAMEIX); return u.FrameIx; } 99205218Srdivacky 100276479Sdim // Returns whether this is an indirect value. 101276479Sdim bool isIndirect() { return IsIndirect; } 102276479Sdim 103205218Srdivacky // Returns the offset. 104205218Srdivacky uint64_t getOffset() { return Offset; } 105205218Srdivacky 106205218Srdivacky // Returns the DebugLoc. 107205218Srdivacky DebugLoc getDebugLoc() { return DL; } 108205218Srdivacky 109205218Srdivacky // Returns the SDNodeOrder. This is the order of the preceding node in the 110205218Srdivacky // input. 111205218Srdivacky unsigned getOrder() { return Order; } 112206083Srdivacky 113206083Srdivacky // setIsInvalidated / isInvalidated - Setter / getter of the "Invalidated" 114206083Srdivacky // property. A SDDbgValue is invalid if the SDNode that produces the value is 115206083Srdivacky // deleted. 116206083Srdivacky void setIsInvalidated() { Invalid = true; } 117206083Srdivacky bool isInvalidated() { return Invalid; } 118205218Srdivacky}; 119205218Srdivacky 120205218Srdivacky} // end llvm namespace 121205218Srdivacky 122205218Srdivacky#endif 123