1a8efe28a44996978faa42a387f1a6087a7b942c7Evan Cheng//===-- llvm/CodeGen/SDNodeDbgValue.h - SelectionDAG dbg_value --*- C++ -*-===//
206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//
306a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//                     The LLVM Compiler Infrastructure
406a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//
506a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen// This file is distributed under the University of Illinois Open Source
606a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen// License. See LICENSE.TXT for details.
706a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//
806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//===----------------------------------------------------------------------===//
906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//
1006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen// This file declares the SDDbgValue class.
1106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//
1206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen//===----------------------------------------------------------------------===//
1306a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
14a8efe28a44996978faa42a387f1a6087a7b942c7Evan Cheng#ifndef LLVM_CODEGEN_SDNODEDBGVALUE_H
15a8efe28a44996978faa42a387f1a6087a7b942c7Evan Cheng#define LLVM_CODEGEN_SDNODEDBGVALUE_H
1606a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
1706a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen#include "llvm/ADT/SmallVector.h"
181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h"
19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Support/DebugLoc.h"
2006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
2106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesennamespace llvm {
2206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
2306a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesenclass MDNode;
2406a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesenclass SDNode;
2506a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesenclass Value;
2606a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
2706a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen/// SDDbgValue - Holds the information from a dbg_value node through SDISel.
2806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen/// We do not use SDValue here to avoid including its header.
2906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
3006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesenclass SDDbgValue {
31bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenpublic:
32bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  enum DbgValueKind {
33e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen    SDNODE = 0,             // value is the result of an expression
34e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen    CONST = 1,              // value is a constant
35e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen    FRAMEIX = 2             // value is contents of a stack location
36bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  };
37bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesenprivate:
38bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  enum DbgValueKind kind;
39bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  union {
40bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    struct {
41e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen      SDNode *Node;         // valid for expressions
42e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen      unsigned ResNo;       // valid for expressions
43bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    } s;
4446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Value *Const;     // valid for constants
45bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    unsigned FrameIx;       // valid for stack objects
46bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  } u;
4706a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  MDNode *mdPtr;
4806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  uint64_t Offset;
4906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  DebugLoc DL;
50fab4a25d46cdd178c20e6a8029a2eed10f61f0baDale Johannesen  unsigned Order;
51bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  bool Invalid;
5206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesenpublic:
5306a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  // Constructor for non-constants.
54fab4a25d46cdd178c20e6a8029a2eed10f61f0baDale Johannesen  SDDbgValue(MDNode *mdP, SDNode *N, unsigned R, uint64_t off, DebugLoc dl,
55bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng             unsigned O) : mdPtr(mdP), Offset(off), DL(dl), Order(O),
56bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng                           Invalid(false) {
57e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen    kind = SDNODE;
58bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    u.s.Node = N;
59bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    u.s.ResNo = R;
60bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
6106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
6206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  // Constructor for constants.
6346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  SDDbgValue(MDNode *mdP, const Value *C, uint64_t off, DebugLoc dl,
6446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman             unsigned O) :
65c388ace6f9012c503630eb633e3977e0fc42bb00Evan Cheng    mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) {
66e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen    kind = CONST;
67bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    u.Const = C;
68bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
69bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
70bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // Constructor for frame indices.
71bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  SDDbgValue(MDNode *mdP, unsigned FI, uint64_t off, DebugLoc dl, unsigned O) :
72c388ace6f9012c503630eb633e3977e0fc42bb00Evan Cheng    mdPtr(mdP), Offset(off), DL(dl), Order(O), Invalid(false) {
73e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen    kind = FRAMEIX;
74bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen    u.FrameIx = FI;
75bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  }
76bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
77bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // Returns the kind.
78bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  DbgValueKind getKind() { return kind; }
7906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
8006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  // Returns the MDNode pointer.
8106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  MDNode *getMDPtr() { return mdPtr; }
8206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
83bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // Returns the SDNode* for a register ref
84e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen  SDNode *getSDNode() { assert (kind==SDNODE); return u.s.Node; }
85bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen
86bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // Returns the ResNo for a register ref
87e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen  unsigned getResNo() { assert (kind==SDNODE); return u.s.ResNo; }
8806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
89bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // Returns the Value* for a constant
9046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const Value *getConst() { assert (kind==CONST); return u.Const; }
9106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
92bfdf7f38523bd38ae0538861a2bfd8bdc46e5c33Dale Johannesen  // Returns the FrameIx for a stack object
93e3b8533e711718ffa5366cbc8fdf7c6881b8cb02Dale Johannesen  unsigned getFrameIx() { assert (kind==FRAMEIX); return u.FrameIx; }
9406a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
9506a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  // Returns the offset.
9606a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  uint64_t getOffset() { return Offset; }
9706a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
9806a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  // Returns the DebugLoc.
9906a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen  DebugLoc getDebugLoc() { return DL; }
100fab4a25d46cdd178c20e6a8029a2eed10f61f0baDale Johannesen
101fab4a25d46cdd178c20e6a8029a2eed10f61f0baDale Johannesen  // Returns the SDNodeOrder.  This is the order of the preceding node in the
102fab4a25d46cdd178c20e6a8029a2eed10f61f0baDale Johannesen  // input.
103fab4a25d46cdd178c20e6a8029a2eed10f61f0baDale Johannesen  unsigned getOrder() { return Order; }
104bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng
105bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  // setIsInvalidated / isInvalidated - Setter / getter of the "Invalidated"
106bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  // property. A SDDbgValue is invalid if the SDNode that produces the value is
107bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  // deleted.
108bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  void setIsInvalidated() { Invalid = true; }
109bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng  bool isInvalidated() { return Invalid; }
11006a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen};
11106a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
11206a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen} // end llvm namespace
11306a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen
11406a26637daff1bb785ef0945d1ba05f6ccdfab86Dale Johannesen#endif
115