Home | History | Annotate | Download | only in SelectionDAG
      1 //===-- llvm/CodeGen/SDNodeDbgValue.h - SelectionDAG dbg_value --*- 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 declares the SDDbgValue class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CODEGEN_SDNODEDBGVALUE_H
     15 #define LLVM_CODEGEN_SDNODEDBGVALUE_H
     16 
     17 #include "llvm/ADT/SmallVector.h"
     18 #include "llvm/Support/DebugLoc.h"
     19 #include "llvm/Support/DataTypes.h"
     20 
     21 namespace llvm {
     22 
     23 class MDNode;
     24 class SDNode;
     25 class Value;
     26 
     27 /// SDDbgValue - Holds the information from a dbg_value node through SDISel.
     28 /// We do not use SDValue here to avoid including its header.
     29 
     30 class SDDbgValue {
     31 public:
     32   enum DbgValueKind {
     33     SDNODE = 0,             // value is the result of an expression
     34     CONST = 1,              // value is a constant
     35     FRAMEIX = 2             // value is contents of a stack location
     36   };
     37 private:
     38   enum DbgValueKind kind;
     39   union {
     40     struct {
     41       SDNode *Node;         // valid for expressions
     42       unsigned ResNo;       // valid for expressions
     43     } s;
     44     const Value *Const;     // valid for constants
     45     unsigned FrameIx;       // valid for stack objects
     46   } u;
     47   MDNode *mdPtr;
     48   uint64_t Offset;
     49   DebugLoc DL;
     50   unsigned Order;
     51   bool Invalid;
     52 public:
     53   // Constructor for non-constants.
     54   SDDbgValue(MDNode *mdP, SDNode *N, unsigned R, uint64_t off, DebugLoc dl,
     55              unsigned O) : mdPtr(mdP), Offset(off), DL(dl), Order(O),
     56                            Invalid(false) {
     57     kind = SDNODE;
     58     u.s.Node = N;
     59     u.s.ResNo = R;
     60   }
     61 
     62   // Constructor for constants.
     63   SDDbgValue(MDNode *mdP, const Value *C, uint64_t off, DebugLoc dl,
     64              unsigned O) :
     65     mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) {
     66     kind = CONST;
     67     u.Const = C;
     68   }
     69 
     70   // Constructor for frame indices.
     71   SDDbgValue(MDNode *mdP, unsigned FI, uint64_t off, DebugLoc dl, unsigned O) :
     72     mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) {
     73     kind = FRAMEIX;
     74     u.FrameIx = FI;
     75   }
     76 
     77   // Returns the kind.
     78   DbgValueKind getKind() { return kind; }
     79 
     80   // Returns the MDNode pointer.
     81   MDNode *getMDPtr() { return mdPtr; }
     82 
     83   // Returns the SDNode* for a register ref
     84   SDNode *getSDNode() { assert (kind==SDNODE); return u.s.Node; }
     85 
     86   // Returns the ResNo for a register ref
     87   unsigned getResNo() { assert (kind==SDNODE); return u.s.ResNo; }
     88 
     89   // Returns the Value* for a constant
     90   const Value *getConst() { assert (kind==CONST); return u.Const; }
     91 
     92   // Returns the FrameIx for a stack object
     93   unsigned getFrameIx() { assert (kind==FRAMEIX); return u.FrameIx; }
     94 
     95   // Returns the offset.
     96   uint64_t getOffset() { return Offset; }
     97 
     98   // Returns the DebugLoc.
     99   DebugLoc getDebugLoc() { return DL; }
    100 
    101   // Returns the SDNodeOrder.  This is the order of the preceding node in the
    102   // input.
    103   unsigned getOrder() { return Order; }
    104 
    105   // setIsInvalidated / isInvalidated - Setter / getter of the "Invalidated"
    106   // property. A SDDbgValue is invalid if the SDNode that produces the value is
    107   // deleted.
    108   void setIsInvalidated() { Invalid = true; }
    109   bool isInvalidated() { return Invalid; }
    110 };
    111 
    112 } // end llvm namespace
    113 
    114 #endif
    115