1b6c72b92c23065e219099140e16615ad2c06af30Chris Lattner//===---- llvm/Support/DebugLoc.h - Debug Location Information --*- C++ -*-===//
2d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng//
3d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng//                     The LLVM Compiler Infrastructure
4d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng//
5d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng// This file is distributed under the University of Illinois Open Source
6d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng// License. See LICENSE.TXT for details.
7d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng//
8d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng//===----------------------------------------------------------------------===//
9d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng//
101e86a66b00b94adc4ad6977ef6b47c516ac62cecDevang Patel// This file defines a number of light weight data structures used
111e86a66b00b94adc4ad6977ef6b47c516ac62cecDevang Patel// to describe and track debug location information.
1242ce8eaa8c5af9c29825737ce337e6e2397ab6a6Bill Wendling//
1342ce8eaa8c5af9c29825737ce337e6e2397ab6a6Bill Wendling//===----------------------------------------------------------------------===//
14d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng
1584e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner#ifndef LLVM_SUPPORT_DEBUGLOC_H
1684e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner#define LLVM_SUPPORT_DEBUGLOC_H
17d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng
18d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Chengnamespace llvm {
194cdd17ef47e71f34f9fc50caf78c51b9c7105ed1Benjamin Kramer  template <typename T> struct DenseMapInfo;
20e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  class MDNode;
21b227925fa313428045f554187b0136d084d723f6Chris Lattner  class LLVMContext;
22b227925fa313428045f554187b0136d084d723f6Chris Lattner
23b227925fa313428045f554187b0136d084d723f6Chris Lattner  /// DebugLoc - Debug location id.  This is carried by Instruction, SDNode,
24b227925fa313428045f554187b0136d084d723f6Chris Lattner  /// and MachineInstr to compactly encode file/line/scope information for an
25b227925fa313428045f554187b0136d084d723f6Chris Lattner  /// operation.
2684e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner  class DebugLoc {
27af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky    friend struct DenseMapInfo<DebugLoc>;
28af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky
294841121580df86b327013d1fab2a9339be487bceNick Lewycky    /// getEmptyKey() - A private constructor that returns an unknown that is
304841121580df86b327013d1fab2a9339be487bceNick Lewycky    /// not equal to the tombstone key or DebugLoc().
314841121580df86b327013d1fab2a9339be487bceNick Lewycky    static DebugLoc getEmptyKey() {
324841121580df86b327013d1fab2a9339be487bceNick Lewycky      DebugLoc DL;
33b90e1d5aaf5b43309a0643b3248dd95001b3d196Nick Lewycky      DL.LineCol = 1;
344841121580df86b327013d1fab2a9339be487bceNick Lewycky      return DL;
354841121580df86b327013d1fab2a9339be487bceNick Lewycky    }
364841121580df86b327013d1fab2a9339be487bceNick Lewycky
37af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky    /// getTombstoneKey() - A private constructor that returns an unknown that
384841121580df86b327013d1fab2a9339be487bceNick Lewycky    /// is not equal to the empty key or DebugLoc().
39af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky    static DebugLoc getTombstoneKey() {
40af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky      DebugLoc DL;
41b90e1d5aaf5b43309a0643b3248dd95001b3d196Nick Lewycky      DL.LineCol = 2;
42af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky      return DL;
43af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky    }
44af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky
45b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// LineCol - This 32-bit value encodes the line and column number for the
46b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// location, encoded as 24-bits for line and 8 bits for col.  A value of 0
47b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// for either means unknown.
48b227925fa313428045f554187b0136d084d723f6Chris Lattner    unsigned LineCol;
49b227925fa313428045f554187b0136d084d723f6Chris Lattner
50b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// ScopeIdx - This is an opaque ID# for Scope/InlinedAt information,
51b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// decoded by LLVMContext.  0 is unknown.
52b227925fa313428045f554187b0136d084d723f6Chris Lattner    int ScopeIdx;
53b227925fa313428045f554187b0136d084d723f6Chris Lattner  public:
5484e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    DebugLoc() : LineCol(0), ScopeIdx(0) {}  // Defaults to unknown.
55b227925fa313428045f554187b0136d084d723f6Chris Lattner
56f0100ff3f6adb41d257ab5bff5fef390a8f458e2Chris Lattner    /// get - Get a new DebugLoc that corresponds to the specified line/col
57f0100ff3f6adb41d257ab5bff5fef390a8f458e2Chris Lattner    /// scope/inline location.
5884e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    static DebugLoc get(unsigned Line, unsigned Col,
5984e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner                        MDNode *Scope, MDNode *InlinedAt = 0);
60b227925fa313428045f554187b0136d084d723f6Chris Lattner
6184e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    /// getFromDILocation - Translate the DILocation quad into a DebugLoc.
6284e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    static DebugLoc getFromDILocation(MDNode *N);
63d77ec6208cef2a8e615181c2bf0fc5a50a37a20bDevang Patel
64d77ec6208cef2a8e615181c2bf0fc5a50a37a20bDevang Patel    /// getFromDILexicalBlock - Translate the DILexicalBlock into a DebugLoc.
65d77ec6208cef2a8e615181c2bf0fc5a50a37a20bDevang Patel    static DebugLoc getFromDILexicalBlock(MDNode *N);
66d77ec6208cef2a8e615181c2bf0fc5a50a37a20bDevang Patel
67b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// isUnknown - Return true if this is an unknown location.
68b227925fa313428045f554187b0136d084d723f6Chris Lattner    bool isUnknown() const { return ScopeIdx == 0; }
69b227925fa313428045f554187b0136d084d723f6Chris Lattner
70b227925fa313428045f554187b0136d084d723f6Chris Lattner    unsigned getLine() const {
71b227925fa313428045f554187b0136d084d723f6Chris Lattner      return (LineCol << 8) >> 8;  // Mask out column.
72b227925fa313428045f554187b0136d084d723f6Chris Lattner    }
73b227925fa313428045f554187b0136d084d723f6Chris Lattner
74b227925fa313428045f554187b0136d084d723f6Chris Lattner    unsigned getCol() const {
75b227925fa313428045f554187b0136d084d723f6Chris Lattner      return LineCol >> 24;
76b227925fa313428045f554187b0136d084d723f6Chris Lattner    }
77b227925fa313428045f554187b0136d084d723f6Chris Lattner
78b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// getScope - This returns the scope pointer for this DebugLoc, or null if
79b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// invalid.
80b227925fa313428045f554187b0136d084d723f6Chris Lattner    MDNode *getScope(const LLVMContext &Ctx) const;
81b227925fa313428045f554187b0136d084d723f6Chris Lattner
82b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// getInlinedAt - This returns the InlinedAt pointer for this DebugLoc, or
83b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// null if invalid or not present.
84b227925fa313428045f554187b0136d084d723f6Chris Lattner    MDNode *getInlinedAt(const LLVMContext &Ctx) const;
85b227925fa313428045f554187b0136d084d723f6Chris Lattner
86b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// getScopeAndInlinedAt - Return both the Scope and the InlinedAt values.
87b227925fa313428045f554187b0136d084d723f6Chris Lattner    void getScopeAndInlinedAt(MDNode *&Scope, MDNode *&IA,
88b227925fa313428045f554187b0136d084d723f6Chris Lattner                              const LLVMContext &Ctx) const;
89b227925fa313428045f554187b0136d084d723f6Chris Lattner
90b227925fa313428045f554187b0136d084d723f6Chris Lattner
91b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// getAsMDNode - This method converts the compressed DebugLoc node into a
92b227925fa313428045f554187b0136d084d723f6Chris Lattner    /// DILocation compatible MDNode.
93b227925fa313428045f554187b0136d084d723f6Chris Lattner    MDNode *getAsMDNode(const LLVMContext &Ctx) const;
94b227925fa313428045f554187b0136d084d723f6Chris Lattner
9584e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    bool operator==(const DebugLoc &DL) const {
96b227925fa313428045f554187b0136d084d723f6Chris Lattner      return LineCol == DL.LineCol && ScopeIdx == DL.ScopeIdx;
97b227925fa313428045f554187b0136d084d723f6Chris Lattner    }
9884e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    bool operator!=(const DebugLoc &DL) const { return !(*this == DL); }
993dcb4ef757127d69c3748dec92787520e039bd53Devang Patel
1003dcb4ef757127d69c3748dec92787520e039bd53Devang Patel    void dump(const LLVMContext &Ctx) const;
101b227925fa313428045f554187b0136d084d723f6Chris Lattner  };
102af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky
103af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky  template <>
104af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky  struct DenseMapInfo<DebugLoc> {
1054cdd17ef47e71f34f9fc50caf78c51b9c7105ed1Benjamin Kramer    static DebugLoc getEmptyKey() { return DebugLoc::getEmptyKey(); }
1064cdd17ef47e71f34f9fc50caf78c51b9c7105ed1Benjamin Kramer    static DebugLoc getTombstoneKey() { return DebugLoc::getTombstoneKey(); }
107af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky    static unsigned getHashValue(const DebugLoc &Key);
1084cdd17ef47e71f34f9fc50caf78c51b9c7105ed1Benjamin Kramer    static bool isEqual(DebugLoc LHS, DebugLoc RHS) { return LHS == RHS; }
109af4db5fc95f5d846c48e80f4266687a34a2975f4Nick Lewycky  };
110d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng} // end namespace llvm
111d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng
1121e86a66b00b94adc4ad6977ef6b47c516ac62cecDevang Patel#endif /* LLVM_DEBUGLOC_H */
113