136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- DebugInfo.h - Debug Information Helpers ------------------*- C++ -*-===//
2a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//
3a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//                     The LLVM Compiler Infrastructure
4a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//
5a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner// This file is distributed under the University of Illinois Open Source
6a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner// License. See LICENSE.TXT for details.
7a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//
8a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//===----------------------------------------------------------------------===//
9a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//
10a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner// This file defines a bunch of datatypes that are useful for creating and
11dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling// walking debug info in LLVM IR form. They essentially provide wrappers around
12dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling// the information in the global variables that's needed when constructing the
13dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling// DWARF information.
14a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//
15a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//===----------------------------------------------------------------------===//
16a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_IR_DEBUGINFO_H
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_IR_DEBUGINFO_H
19a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner
20bc66071baa3153ba95d673b8084383835221eef6Manman Ren#include "llvm/ADT/DenseMap.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/iterator_range.h"
22d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel#include "llvm/ADT/SmallPtrSet.h"
23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/SmallVector.h"
24f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner#include "llvm/ADT/StringRef.h"
25c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren#include "llvm/IR/Metadata.h"
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Casting.h"
27210d0febc24551aed293b903562c19567e96fa5dChris Lattner#include "llvm/Support/Dwarf.h"
28a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner
29a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattnernamespace llvm {
30f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass BasicBlock;
31f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass Constant;
32f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass Function;
33f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass GlobalVariable;
34f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass Module;
35f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass Type;
36f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass Value;
37f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DbgDeclareInst;
38f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DbgValueInst;
39f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass Instruction;
40f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass MDNode;
41f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass MDString;
42f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass NamedMDNode;
43f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass LLVMContext;
44f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass raw_ostream;
45f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
46f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIFile;
47f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DISubprogram;
48f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DILexicalBlock;
49f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DILexicalBlockFile;
50f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIVariable;
51f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIType;
52f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIScope;
53f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIObjCProperty;
54f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
55f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Maps from type identifier to the actual MDNode.
56f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertypedef DenseMap<const MDString *, MDNode *> DITypeIdentifierMap;
57f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
58f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIDescriptor - A thin wraper around MDNode to access encoded debug info.
59f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// This should not be stored in a container, because the underlying MDNode
60f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// may change in certain situations.
61f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIDescriptor {
62f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // Befriends DIRef so DIRef can befriend the protected member
63f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // function: getFieldAs<DIRef>.
64f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  template <typename T> friend class DIRef;
65f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
66f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
67f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  enum {
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagPrivate           = 1 << 0,
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagProtected         = 1 << 1,
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagFwdDecl           = 1 << 2,
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagAppleBlock        = 1 << 3,
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagBlockByrefStruct  = 1 << 4,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagVirtual           = 1 << 5,
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagArtificial        = 1 << 6,
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagExplicit          = 1 << 7,
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagPrototyped        = 1 << 8,
77f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    FlagObjcClassComplete = 1 << 9,
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagObjectPointer     = 1 << 10,
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagVector            = 1 << 11,
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagStaticMember      = 1 << 12,
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagIndirectVariable  = 1 << 13,
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagLValueReference   = 1 << 14,
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FlagRValueReference   = 1 << 15
84a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner  };
85a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel
86f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherprotected:
87f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  const MDNode *DbgNode;
88f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
89f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getStringField(unsigned Elt) const;
90f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getUnsignedField(unsigned Elt) const {
91f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (unsigned)getUInt64Field(Elt);
92f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
93f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  uint64_t getUInt64Field(unsigned Elt) const;
94f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  int64_t getInt64Field(unsigned Elt) const;
95f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIDescriptor getDescriptorField(unsigned Elt) const;
96f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
97f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  template <typename DescTy> DescTy getFieldAs(unsigned Elt) const {
98f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return DescTy(getDescriptorField(Elt));
99f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
100f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
101f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  GlobalVariable *getGlobalVariableField(unsigned Elt) const;
102f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  Constant *getConstantField(unsigned Elt) const;
103f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  Function *getFunctionField(unsigned Elt) const;
104f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void replaceFunctionField(unsigned Elt, Function *F);
105f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
106f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIDescriptor(const MDNode *N = nullptr) : DbgNode(N) {}
108f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
109f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
110f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
111f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  operator MDNode *() const { return const_cast<MDNode *>(DbgNode); }
112f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  MDNode *operator->() const { return const_cast<MDNode *>(DbgNode); }
113f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
114f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // An explicit operator bool so that we can do testing of DI values
115f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // easily.
116f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // FIXME: This operator bool isn't actually protecting anything at the
117f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // moment due to the conversion operator above making DIDescriptor nodes
118f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // implicitly convertable to bool.
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LLVM_EXPLICIT operator bool() const { return DbgNode != nullptr; }
120f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
121f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool operator==(DIDescriptor Other) const { return DbgNode == Other.DbgNode; }
122f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool operator!=(DIDescriptor Other) const { return !operator==(Other); }
123f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
124f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  uint16_t getTag() const {
125f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getUnsignedField(0) & ~LLVMDebugVersionMask;
126f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
127f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
128f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isDerivedType() const;
129f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isCompositeType() const;
130f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isBasicType() const;
131f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isVariable() const;
132f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isSubprogram() const;
133f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isGlobalVariable() const;
134f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isScope() const;
135f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isFile() const;
136f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isCompileUnit() const;
137f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isNameSpace() const;
138f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isLexicalBlockFile() const;
139f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isLexicalBlock() const;
140f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isSubrange() const;
141f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isEnumerator() const;
142f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isType() const;
143f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isUnspecifiedParameter() const;
144f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isTemplateTypeParameter() const;
145f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isTemplateValueParameter() const;
146f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isObjCProperty() const;
147f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isImportedEntity() const;
148f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
149f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// print - print descriptor.
150f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void print(raw_ostream &OS) const;
151f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
152f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// dump - print descriptor to dbgs() with a newline.
153f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void dump() const;
154f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
155f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
156f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DISubrange - This is used to represent ranges, for array bounds.
157f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DISubrange : public DIDescriptor {
158f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
159f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
160f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
161f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DISubrange(const MDNode *N = nullptr) : DIDescriptor(N) {}
163f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
164f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  int64_t getLo() const { return getInt64Field(1); }
165f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  int64_t getCount() const { return getInt64Field(2); }
166f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
167f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
168f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
169f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIArray - This descriptor holds an array of descriptors.
170f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIArray : public DIDescriptor {
171f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIArray(const MDNode *N = nullptr) : DIDescriptor(N) {}
173f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
174f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getNumElements() const;
175f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIDescriptor getElement(unsigned Idx) const {
176f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getDescriptorField(Idx);
177f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
178f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
179f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
180f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}').
181f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// FIXME: it seems strange that this doesn't have either a reference to the
182f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// type/precision or a file/line pair for location info.
183f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIEnumerator : public DIDescriptor {
184f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
185f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
186f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
187f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIEnumerator(const MDNode *N = nullptr) : DIDescriptor(N) {}
189f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
190f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(1); }
191f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  int64_t getEnumValue() const { return getInt64Field(2); }
192f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
193f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
194f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
195f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertemplate <typename T> class DIRef;
196f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertypedef DIRef<DIScope> DIScopeRef;
197f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertypedef DIRef<DIType> DITypeRef;
198f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
199f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIScope - A base class for various scopes.
20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Although, implementation-wise, DIScope is the parent class of most
20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// other DIxxx classes, including DIType and its descendants, most of
20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIScope's descendants are not a substitutable subtype of
20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIScope. The DIDescriptor::isScope() method only is true for
20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIScopes that are scopes in the strict lexical scope sense
20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// (DICompileUnit, DISubprogram, etc.), but not for, e.g., a DIType.
207f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIScope : public DIDescriptor {
208f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherprotected:
209f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
210f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
211f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
212f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIScope(const MDNode *N = nullptr) : DIDescriptor(N) {}
214f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
215f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Gets the parent scope for this scope node or returns a
216f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// default constructed scope.
217f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScopeRef getContext() const;
218c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  /// If the scope node has a name, return that, else return an empty string.
219c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  StringRef getName() const;
220f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getFilename() const;
221f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDirectory() const;
222f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
223f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Generate a reference to this DIScope. Uses the type identifier instead
224f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// of the actual MDNode if possible, to help type uniquing.
225f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScopeRef getRef() const;
226f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
227f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
228f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Represents reference to a DIDescriptor, abstracts over direct and
229f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// identifier-based metadata references.
230f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertemplate <typename T> class DIRef {
231f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  template <typename DescTy>
232f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend DescTy DIDescriptor::getFieldAs(unsigned Elt) const;
233f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend DIScopeRef DIScope::getContext() const;
234f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend DIScopeRef DIScope::getRef() const;
23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  friend class DIType;
236f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
237f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Val can be either a MDNode or a MDString, in the latter,
238f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// MDString specifies the type identifier.
239f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  const Value *Val;
240f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  explicit DIRef(const Value *V);
241f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
242f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
243164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  T resolve(const DITypeIdentifierMap &Map) const;
244d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren  StringRef getName() const;
245f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  operator Value *() const { return const_cast<Value *>(Val); }
246f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
247f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
248164793918c325b25425f962fc9540a1e1cd9224bEric Christophertemplate <typename T>
249164793918c325b25425f962fc9540a1e1cd9224bEric ChristopherT DIRef<T>::resolve(const DITypeIdentifierMap &Map) const {
250164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  if (!Val)
251164793918c325b25425f962fc9540a1e1cd9224bEric Christopher    return T();
252164793918c325b25425f962fc9540a1e1cd9224bEric Christopher
253164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  if (const MDNode *MD = dyn_cast<MDNode>(Val))
254164793918c325b25425f962fc9540a1e1cd9224bEric Christopher    return T(MD);
255164793918c325b25425f962fc9540a1e1cd9224bEric Christopher
256164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  const MDString *MS = cast<MDString>(Val);
257164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  // Find the corresponding MDNode.
258164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  DITypeIdentifierMap::const_iterator Iter = Map.find(MS);
259164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  assert(Iter != Map.end() && "Identifier not in the type map?");
260164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  assert(DIDescriptor(Iter->second).isType() &&
261164793918c325b25425f962fc9540a1e1cd9224bEric Christopher         "MDNode in DITypeIdentifierMap should be a DIType.");
262164793918c325b25425f962fc9540a1e1cd9224bEric Christopher  return T(Iter->second);
263164793918c325b25425f962fc9540a1e1cd9224bEric Christopher}
264164793918c325b25425f962fc9540a1e1cd9224bEric Christopher
265977ce007ad49f122f8132a042ddb6b2c0fd53491Eric Christophertemplate <typename T> StringRef DIRef<T>::getName() const {
266d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren  if (!Val)
267d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren    return StringRef();
268d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren
269d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren  if (const MDNode *MD = dyn_cast<MDNode>(Val))
270d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren    return T(MD).getName();
271d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren
272d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren  const MDString *MS = cast<MDString>(Val);
273d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren  return MS->getString();
274d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren}
275d88ccb6480b65d7560bfc840b689fbc8f36501bfManman Ren
276f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Specialize getFieldAs to handle fields that are references to DIScopes.
277f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertemplate <> DIScopeRef DIDescriptor::getFieldAs<DIScopeRef>(unsigned Elt) const;
278f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Specialize DIRef constructor for DIScopeRef.
279f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertemplate <> DIRef<DIScope>::DIRef(const Value *V);
280f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
281f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Specialize getFieldAs to handle fields that are references to DITypes.
282f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertemplate <> DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const;
283f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Specialize DIRef constructor for DITypeRef.
284f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christophertemplate <> DIRef<DIType>::DIRef(const Value *V);
285f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
286f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIType - This is a wrapper for a type.
287f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// FIXME: Types should be factored much better so that CV qualifiers and
288f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// others do not require a huge and empty descriptor full of zeros.
289f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIType : public DIScope {
290f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherprotected:
291f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
292f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
293f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
294f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIType(const MDNode *N = nullptr) : DIScope(N) {}
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  operator DITypeRef () const {
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    assert(isType() &&
29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines           "constructing DITypeRef from an MDNode that is not a type");
29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return DITypeRef(&*getRef());
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
301f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
302f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a type descriptor is well formed.
303f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
304f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
305f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScopeRef getContext() const { return getFieldAs<DIScopeRef>(2); }
306f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(3); }
307f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(4); }
308f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  uint64_t getSizeInBits() const { return getUInt64Field(5); }
309f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  uint64_t getAlignInBits() const { return getUInt64Field(6); }
310f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // FIXME: Offset is only used for DW_TAG_member nodes.  Making every type
311f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // carry this is just plain insane.
312f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  uint64_t getOffsetInBits() const { return getUInt64Field(7); }
313f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getFlags() const { return getUnsignedField(8); }
314f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isPrivate() const { return (getFlags() & FlagPrivate) != 0; }
315f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isProtected() const { return (getFlags() & FlagProtected) != 0; }
316f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isForwardDecl() const { return (getFlags() & FlagFwdDecl) != 0; }
317f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // isAppleBlock - Return true if this is the Apple Blocks extension.
318f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isAppleBlockExtension() const {
319f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getFlags() & FlagAppleBlock) != 0;
320f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
321f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isBlockByrefStruct() const {
322f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getFlags() & FlagBlockByrefStruct) != 0;
323f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
324f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isVirtual() const { return (getFlags() & FlagVirtual) != 0; }
325f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isArtificial() const { return (getFlags() & FlagArtificial) != 0; }
326f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isObjectPointer() const { return (getFlags() & FlagObjectPointer) != 0; }
327f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isObjcClassComplete() const {
328f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getFlags() & FlagObjcClassComplete) != 0;
329f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
330f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isVector() const { return (getFlags() & FlagVector) != 0; }
331f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isStaticMember() const { return (getFlags() & FlagStaticMember) != 0; }
33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool isLValueReference() const {
33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getFlags() & FlagLValueReference) != 0;
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool isRValueReference() const {
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getFlags() & FlagRValueReference) != 0;
33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
338f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isValid() const { return DbgNode && isType(); }
339f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
340f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// replaceAllUsesWith - Replace all uses of debug info referenced by
341f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// this descriptor.
342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void replaceAllUsesWith(LLVMContext &VMContext, DIDescriptor D);
343f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void replaceAllUsesWith(MDNode *D);
344f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
345f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
346f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIBasicType - A basic type, like 'int' or 'float'.
347f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIBasicType : public DIType {
348f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIBasicType(const MDNode *N = nullptr) : DIType(N) {}
350f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
351f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getEncoding() const { return getUnsignedField(9); }
352f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
353f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a basic type descriptor is well formed.
354f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
355f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
356f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
357f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIDerivedType - A simple derived type, like a const qualified type,
358f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// a typedef, a pointer or reference, et cetera.  Or, a data member of
359f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// a class/struct/union.
360f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIDerivedType : public DIType {
361f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
362f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
363f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
364f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIDerivedType(const MDNode *N = nullptr) : DIType(N) {}
366f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
367c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  DITypeRef getTypeDerivedFrom() const { return getFieldAs<DITypeRef>(9); }
368f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
369f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// getObjCProperty - Return property node, if this ivar is
370f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// associated with one.
371f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  MDNode *getObjCProperty() const;
372f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
373f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DITypeRef getClassType() const {
374f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    assert(getTag() == dwarf::DW_TAG_ptr_to_member_type);
375f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getFieldAs<DITypeRef>(10);
376f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
377f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
378f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  Constant *getConstant() const {
379f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    assert((getTag() == dwarf::DW_TAG_member) && isStaticMember());
380f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getConstantField(10);
381f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
382f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
383f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a derived type descriptor is well formed.
384f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
385f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
386f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
387f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DICompositeType - This descriptor holds a type that can refer to multiple
388f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// other types, like a function or struct.
389f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DICompositeType is derived from DIDerivedType because some
390f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// composite types (such as enums) can be derived from basic types
391f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher// FIXME: Make this derive from DIType directly & just store the
392f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher// base type in a single DIType field.
393f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DICompositeType : public DIDerivedType {
394f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
395f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
396f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
397f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DICompositeType(const MDNode *N = nullptr) : DIDerivedType(N) {}
399f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
400f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
401f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void setTypeArray(DIArray Elements, DIArray TParams = DIArray());
402f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getRunTimeLang() const { return getUnsignedField(11); }
403f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DITypeRef getContainingType() const { return getFieldAs<DITypeRef>(12); }
404f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void setContainingType(DICompositeType ContainingType);
405f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getTemplateParams() const { return getFieldAs<DIArray>(13); }
406f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  MDString *getIdentifier() const;
407f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
408f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a composite type descriptor is well formed.
409f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
410f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
411f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
412f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIFile - This is a wrapper for a file.
413f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIFile : public DIScope {
414f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
415f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
416f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
417dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIFile(const MDNode *N = nullptr) : DIScope(N) {}
418f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  MDNode *getFileNode() const;
419f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
420f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
421f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
422f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DICompileUnit - A wrapper for a compile unit.
423f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DICompileUnit : public DIScope {
424f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
425f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
426f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
427f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
428dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DICompileUnit(const MDNode *N = nullptr) : DIScope(N) {}
429f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
430dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  dwarf::SourceLanguage getLanguage() const {
431dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return static_cast<dwarf::SourceLanguage>(getUnsignedField(2));
432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
433f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getProducer() const { return getStringField(3); }
434f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
435f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isOptimized() const { return getUnsignedField(4) != 0; }
436f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getFlags() const { return getStringField(5); }
437f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getRunTimeVersion() const { return getUnsignedField(6); }
438f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
439f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getEnumTypes() const;
440f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getRetainedTypes() const;
441f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getSubprograms() const;
442f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getGlobalVariables() const;
443f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getImportedEntities() const;
444f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
445f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getSplitDebugFilename() const { return getStringField(12); }
44636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getEmissionKind() const { return getUnsignedField(13); }
447f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
448f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a compile unit is well formed.
449f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
450f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
451f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
452f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DISubprogram - This is a wrapper for a subprogram (e.g. a function).
453f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DISubprogram : public DIScope {
454f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
455f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
456f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
457f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
458dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DISubprogram(const MDNode *N = nullptr) : DIScope(N) {}
459f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
460b8e48a636e7ee6c13140382eb93d9695a65b0624Manman Ren  DIScopeRef getContext() const { return getFieldAs<DIScopeRef>(2); }
461f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(3); }
462f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDisplayName() const { return getStringField(4); }
463f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getLinkageName() const { return getStringField(5); }
464f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(6); }
465f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DICompositeType getType() const { return getFieldAs<DICompositeType>(7); }
466f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
467f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isLocalToUnit - Return true if this subprogram is local to the current
468f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// compile unit, like 'static' in C.
469f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned isLocalToUnit() const { return getUnsignedField(8); }
470f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned isDefinition() const { return getUnsignedField(9); }
471f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
472f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getVirtuality() const { return getUnsignedField(10); }
473f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getVirtualIndex() const { return getUnsignedField(11); }
474f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
475f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DITypeRef getContainingType() const { return getFieldAs<DITypeRef>(12); }
476f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
477f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getFlags() const { return getUnsignedField(13); }
478f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
479f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned isArtificial() const {
480f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(13) & FlagArtificial) != 0;
481f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
482f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isPrivate - Return true if this subprogram has "private"
483f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// access specifier.
484f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isPrivate() const { return (getUnsignedField(13) & FlagPrivate) != 0; }
485f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isProtected - Return true if this subprogram has "protected"
486f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// access specifier.
487f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isProtected() const {
488f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(13) & FlagProtected) != 0;
489f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
490f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isExplicit - Return true if this subprogram is marked as explicit.
491f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isExplicit() const { return (getUnsignedField(13) & FlagExplicit) != 0; }
492f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isPrototyped - Return true if this subprogram is prototyped.
493f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isPrototyped() const {
494f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(13) & FlagPrototyped) != 0;
495f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
496f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
49736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Return true if this subprogram is a C++11 reference-qualified
49836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// non-static member function (void foo() &).
49936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned isLValueReference() const {
50036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getUnsignedField(13) & FlagLValueReference) != 0;
50136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
50236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
50336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Return true if this subprogram is a C++11
50436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// rvalue-reference-qualified non-static member function
50536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// (void foo() &&).
50636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned isRValueReference() const {
50736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getUnsignedField(13) & FlagRValueReference) != 0;
50836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
50936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
510f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned isOptimized() const;
511f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
512f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a subprogram descriptor is well formed.
513f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
514f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
515f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// describes - Return true if this subprogram provides debugging
516f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// information for the function F.
517f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool describes(const Function *F);
518f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
519f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  Function *getFunction() const { return getFunctionField(15); }
520f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void replaceFunction(Function *F) { replaceFunctionField(15, F); }
521f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getTemplateParams() const { return getFieldAs<DIArray>(16); }
522f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DISubprogram getFunctionDeclaration() const {
523f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getFieldAs<DISubprogram>(17);
524f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
525f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  MDNode *getVariablesNodes() const;
526f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIArray getVariables() const;
527f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
528f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// getScopeLineNumber - Get the beginning of the scope of the
529f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// function, not necessarily where the name of the program
530f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// starts.
531f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getScopeLineNumber() const { return getUnsignedField(19); }
532f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
533f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
534f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DILexicalBlock - This is a wrapper for a lexical block.
535f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DILexicalBlock : public DIScope {
536f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
537dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DILexicalBlock(const MDNode *N = nullptr) : DIScope(N) {}
538f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getContext() const { return getFieldAs<DIScope>(2); }
539f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(3); }
540f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getColumnNumber() const { return getUnsignedField(4); }
54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getDiscriminator() const { return getUnsignedField(5); }
542f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
543f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
544f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
545f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DILexicalBlockFile - This is a wrapper for a lexical block with
546f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// a filename change.
547f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DILexicalBlockFile : public DIScope {
548f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
549dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DILexicalBlockFile(const MDNode *N = nullptr) : DIScope(N) {}
550f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getContext() const {
551f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    if (getScope().isSubprogram())
552f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher      return getScope();
553f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getScope().getContext();
554f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
555f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getScope().getLineNumber(); }
556f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getColumnNumber() const { return getScope().getColumnNumber(); }
557f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DILexicalBlock getScope() const { return getFieldAs<DILexicalBlock>(2); }
558f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
559f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
560f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
561f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DINameSpace - A wrapper for a C++ style name space.
562f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DINameSpace : public DIScope {
563f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
564f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
565f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
566f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
567dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DINameSpace(const MDNode *N = nullptr) : DIScope(N) {}
568f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getContext() const { return getFieldAs<DIScope>(2); }
569f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(3); }
570f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(4); }
571f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
572f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
573f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
57436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIUnspecifiedParameter - This is a wrapper for unspecified parameters.
57536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DIUnspecifiedParameter : public DIDescriptor {
57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
577dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIUnspecifiedParameter(const MDNode *N = nullptr)
578dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : DIDescriptor(N) {}
57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool Verify() const;
58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
58136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
582f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DITemplateTypeParameter - This is a wrapper for template type parameter.
583f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DITemplateTypeParameter : public DIDescriptor {
584f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
585dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DITemplateTypeParameter(const MDNode *N = nullptr)
586dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : DIDescriptor(N) {}
587f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
588b4d9c11f6c7e0a38e750f946d5cea3ffa5ae8f61Manman Ren  DIScopeRef getContext() const { return getFieldAs<DIScopeRef>(1); }
589f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(2); }
590b4d9c11f6c7e0a38e750f946d5cea3ffa5ae8f61Manman Ren  DITypeRef getType() const { return getFieldAs<DITypeRef>(3); }
591f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getFilename() const { return getFieldAs<DIFile>(4).getFilename(); }
592f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDirectory() const {
593f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getFieldAs<DIFile>(4).getDirectory();
594f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
595f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(5); }
596f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getColumnNumber() const { return getUnsignedField(6); }
597f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
598f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
599f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
600f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DITemplateValueParameter - This is a wrapper for template value parameter.
601f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DITemplateValueParameter : public DIDescriptor {
602f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
603dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DITemplateValueParameter(const MDNode *N = nullptr)
604dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : DIDescriptor(N) {}
605f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
606b4d9c11f6c7e0a38e750f946d5cea3ffa5ae8f61Manman Ren  DIScopeRef getContext() const { return getFieldAs<DIScopeRef>(1); }
607f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(2); }
608b4d9c11f6c7e0a38e750f946d5cea3ffa5ae8f61Manman Ren  DITypeRef getType() const { return getFieldAs<DITypeRef>(3); }
609f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  Value *getValue() const;
610f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getFilename() const { return getFieldAs<DIFile>(5).getFilename(); }
611f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDirectory() const {
612f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getFieldAs<DIFile>(5).getDirectory();
613f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
614f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(6); }
615f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getColumnNumber() const { return getUnsignedField(7); }
616f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
617f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
618f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
619f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIGlobalVariable - This is a wrapper for a global variable.
620f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIGlobalVariable : public DIDescriptor {
621f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
622f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
623f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
624f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
625dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIGlobalVariable(const MDNode *N = nullptr) : DIDescriptor(N) {}
626f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
627f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getContext() const { return getFieldAs<DIScope>(2); }
628f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(3); }
629f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDisplayName() const { return getStringField(4); }
630f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getLinkageName() const { return getStringField(5); }
631f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getFilename() const { return getFieldAs<DIFile>(6).getFilename(); }
632f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDirectory() const {
633f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getFieldAs<DIFile>(6).getDirectory();
634f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
635f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
636f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(7); }
63736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DITypeRef getType() const { return getFieldAs<DITypeRef>(8); }
638f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned isLocalToUnit() const { return getUnsignedField(9); }
639f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned isDefinition() const { return getUnsignedField(10); }
640f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
641f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  GlobalVariable *getGlobal() const { return getGlobalVariableField(11); }
642f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  Constant *getConstant() const { return getConstantField(11); }
643f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIDerivedType getStaticDataMemberDeclaration() const {
644f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return getFieldAs<DIDerivedType>(12);
645f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
646f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
647f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a global variable descriptor is well formed.
648f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
649f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
650f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
651f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DIVariable - This is a wrapper for a variable (e.g. parameter, local,
652f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// global etc).
653f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIVariable : public DIDescriptor {
654f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
655f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
656f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
657f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
658dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit DIVariable(const MDNode *N = nullptr) : DIDescriptor(N) {}
659f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
660f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getContext() const { return getFieldAs<DIScope>(1); }
661f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(2); }
662f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIFile getFile() const { return getFieldAs<DIFile>(3); }
663f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return (getUnsignedField(4) << 8) >> 8; }
664f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getArgNumber() const {
665f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    unsigned L = getUnsignedField(4);
666f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return L >> 24;
667f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
66836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DITypeRef getType() const { return getFieldAs<DITypeRef>(5); }
669f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
670f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isArtificial - Return true if this variable is marked as "artificial".
671f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isArtificial() const {
672f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & FlagArtificial) != 0;
673f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
674f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
675f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isObjectPointer() const {
676f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & FlagObjectPointer) != 0;
677f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
678f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
679f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// \brief Return true if this variable is represented as a pointer.
680f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isIndirect() const {
681f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & FlagIndirectVariable) != 0;
682f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
683f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
684f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// getInlinedAt - If this variable is inlined then return inline location.
685f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  MDNode *getInlinedAt() const;
686f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
687f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a variable descriptor is well formed.
688f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
689f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
690f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// HasComplexAddr - Return true if the variable has a complex address.
691f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool hasComplexAddress() const { return getNumAddrElements() > 0; }
692f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
693cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \brief Return the size of this variable's complex address or
694cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// zero if there is none.
695cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned getNumAddrElements() const {
696cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (DbgNode->getNumOperands() < 9)
697cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return 0;
698cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return getDescriptorField(8)->getNumOperands();
699f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
700f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
701cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \brief return the Idx'th complex address element.
702cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  uint64_t getAddrElement(unsigned Idx) const;
703cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
704f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isBlockByrefVariable - Return true if the variable was declared as
705f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// a "__block" variable (Apple Blocks).
70636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool isBlockByrefVariable(const DITypeIdentifierMap &Map) const {
70736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getType().resolve(Map)).isBlockByrefStruct();
70836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
709f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
710f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// isInlinedFnArgument - Return true if this variable provides debugging
711f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// information for an inlined function arguments.
712f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isInlinedFnArgument(const Function *CurFn);
713f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
714f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printExtendedName(raw_ostream &OS) const;
715f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
716f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
717f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DILocation - This object holds location information. This object
718f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// is not associated with any DWARF tag.
719f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DILocation : public DIDescriptor {
720f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
721f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  explicit DILocation(const MDNode *N) : DIDescriptor(N) {}
722f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
723f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(0); }
724f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getColumnNumber() const { return getUnsignedField(1); }
725f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getScope() const { return getFieldAs<DIScope>(2); }
726f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DILocation getOrigLocation() const { return getFieldAs<DILocation>(3); }
727f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getFilename() const { return getScope().getFilename(); }
728f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getDirectory() const { return getScope().getDirectory(); }
729f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
73036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool atSameLineAs(const DILocation &Other) const {
73136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return (getLineNumber() == Other.getLineNumber() &&
73236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            getFilename() == Other.getFilename());
73336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
73436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getDiscriminator - DWARF discriminators are used to distinguish
73536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// identical file locations for instructions that are on different
73636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// basic blocks. If two instructions are inside the same lexical block
73736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// and are in different basic blocks, we create a new lexical block
73836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// with identical location as the original but with a different
73936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// discriminator value (lib/Transforms/Util/AddDiscriminators.cpp
74036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// for details).
74136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getDiscriminator() const {
74236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Since discriminators are associated with lexical blocks, make
74336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // sure this location is a lexical block before retrieving its
74436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // value.
74536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return getScope().isLexicalBlock()
74636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               ? getFieldAs<DILexicalBlock>(2).getDiscriminator()
74736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines               : 0;
74836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
74936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned computeNewDiscriminator(LLVMContext &Ctx);
75036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DILocation copyWithNewScope(LLVMContext &Ctx, DILexicalBlock NewScope);
751f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
752f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
753f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIObjCProperty : public DIDescriptor {
754f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
755f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
756f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
757f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
758f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  explicit DIObjCProperty(const MDNode *N) : DIDescriptor(N) {}
759f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
760f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getObjCPropertyName() const { return getStringField(1); }
761f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIFile getFile() const { return getFieldAs<DIFile>(2); }
762f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(3); }
763f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
764f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getObjCPropertyGetterName() const { return getStringField(4); }
765f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getObjCPropertySetterName() const { return getStringField(5); }
766f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isReadOnlyObjCProperty() const {
767f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_readonly) != 0;
768f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
769f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isReadWriteObjCProperty() const {
770f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_readwrite) != 0;
771f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
772f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isAssignObjCProperty() const {
773f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_assign) != 0;
774f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
775f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isRetainObjCProperty() const {
776f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_retain) != 0;
777f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
778f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isCopyObjCProperty() const {
779f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_copy) != 0;
780f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
781f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool isNonAtomicObjCProperty() const {
782f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher    return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_nonatomic) != 0;
783f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  }
784f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
78536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Objective-C doesn't have an ODR, so there is no benefit in storing
78636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// the type as a DITypeRef here.
787f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIType getType() const { return getFieldAs<DIType>(7); }
788f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
789f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Verify - Verify that a derived type descriptor is well formed.
790f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
791f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
792f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
793f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// \brief An imported module (C++ using directive or similar).
794f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DIImportedEntity : public DIDescriptor {
795f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  friend class DIDescriptor;
796f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void printInternal(raw_ostream &OS) const;
797f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
798f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
799f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  explicit DIImportedEntity(const MDNode *N) : DIDescriptor(N) {}
800f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DIScope getContext() const { return getFieldAs<DIScope>(1); }
80136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIScopeRef getEntity() const { return getFieldAs<DIScopeRef>(2); }
802f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned getLineNumber() const { return getUnsignedField(3); }
803f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  StringRef getName() const { return getStringField(4); }
804f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool Verify() const;
805f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
806f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
807f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// getDISubprogram - Find subprogram that is enclosing this scope.
808f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherDISubprogram getDISubprogram(const MDNode *Scope);
809f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
810f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// getDICompositeType - Find underlying composite type.
811f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherDICompositeType getDICompositeType(DIType T);
812f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
813f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
814f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// to hold function specific information.
815f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherNamedMDNode *getOrInsertFnSpecificMDNode(Module &M, DISubprogram SP);
816f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
817f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
818f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// suitable to hold function specific information.
819f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherNamedMDNode *getFnSpecificMDNode(const Module &M, DISubprogram SP);
820f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
821f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// createInlinedVariable - Create a new inlined variable based on current
822f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// variable.
823f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// @param DV            Current Variable.
824f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// @param InlinedScope  Location at current variable is inlined.
825f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherDIVariable createInlinedVariable(MDNode *DV, MDNode *InlinedScope,
826f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher                                 LLVMContext &VMContext);
827f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
828f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// cleanseInlinedVariable - Remove inlined scope from the variable.
829f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherDIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext);
830f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
831f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// Construct DITypeIdentifierMap by going through retained types of each CU.
832f2fff255de51eec0e9d4a85724bb433be7e4c24bEric ChristopherDITypeIdentifierMap generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes);
833f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
834c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// Strip debug info in the module if it exists.
835c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// To do this, we remove all calls to the debugger intrinsics and any named
836c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// metadata for debugging. We also remove debug locations for instructions.
837c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// Return true if module is modified.
838c877b10446669bf107c19cab78b920ce9cffb989Manman Renbool StripDebugInfo(Module &M);
839c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
84051fce2c886e4ca33272975cc80bc1cc5abfcdffdManman Ren/// Return Debug Info Metadata Version by checking module flags.
84151fce2c886e4ca33272975cc80bc1cc5abfcdffdManman Renunsigned getDebugMetadataVersionFromModule(const Module &M);
84227457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren
843f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DebugInfoFinder tries to list all debug info MDNodes used in a module. To
844f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// list debug info MDNodes used by an instruction, DebugInfoFinder uses
845f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// processDeclare, processValue and processLocation to handle DbgDeclareInst,
846f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// DbgValueInst and DbgLoc attached to instructions. processModule will go
847f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// through all DICompileUnits in llvm.dbg.cu and list debug info MDNodes
848f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher/// used by the CUs.
849f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherclass DebugInfoFinder {
850f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
851f56f1dfecc04078dd76121cf06dae4024372f329Alexey Samsonov  DebugInfoFinder() : TypeMapInitialized(false) {}
852f56f1dfecc04078dd76121cf06dae4024372f329Alexey Samsonov
853f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// processModule - Process entire module and collect debug info
854f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// anchors.
855f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void processModule(const Module &M);
856f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
857f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// processDeclare - Process DbgDeclareInst.
8582b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  void processDeclare(const Module &M, const DbgDeclareInst *DDI);
859f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Process DbgValueInst.
8602b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  void processValue(const Module &M, const DbgValueInst *DVI);
861f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// processLocation - Process DILocation.
8622b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  void processLocation(const Module &M, DILocation Loc);
863f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
864f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// Clear all lists.
865f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void reset();
866f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
867f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherprivate:
8682b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  /// Initialize TypeIdentifierMap.
8696950be28511caf355abdf405404b5f37cc136bc5Manman Ren  void InitializeTypeMap(const Module &M);
8702b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren
871f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// processType - Process DIType.
872f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void processType(DIType DT);
873f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
874f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// processSubprogram - Process DISubprogram.
875f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void processSubprogram(DISubprogram SP);
876f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
877f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  void processScope(DIScope Scope);
878f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
879f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// addCompileUnit - Add compile unit into CUs.
880f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool addCompileUnit(DICompileUnit CU);
881f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
882f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// addGlobalVariable - Add global variable into GVs.
883f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool addGlobalVariable(DIGlobalVariable DIG);
884f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
885f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  // addSubprogram - Add subprogram into SPs.
886f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool addSubprogram(DISubprogram SP);
887f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
888f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  /// addType - Add type into Tys.
889f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool addType(DIType DT);
890f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
891f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  bool addScope(DIScope Scope);
892f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
893f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherpublic:
89436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef SmallVectorImpl<DICompileUnit>::const_iterator compile_unit_iterator;
89536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef SmallVectorImpl<DISubprogram>::const_iterator subprogram_iterator;
89636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef SmallVectorImpl<DIGlobalVariable>::const_iterator global_variable_iterator;
89736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef SmallVectorImpl<DIType>::const_iterator type_iterator;
89836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef SmallVectorImpl<DIScope>::const_iterator scope_iterator;
89936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
90036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  iterator_range<compile_unit_iterator> compile_units() const {
90136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return iterator_range<compile_unit_iterator>(CUs.begin(), CUs.end());
90236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
90336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
90436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  iterator_range<subprogram_iterator> subprograms() const {
90536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return iterator_range<subprogram_iterator>(SPs.begin(), SPs.end());
90636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
90736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
90836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  iterator_range<global_variable_iterator> global_variables() const {
90936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return iterator_range<global_variable_iterator>(GVs.begin(), GVs.end());
91036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
91136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
91236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  iterator_range<type_iterator> types() const {
91336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return iterator_range<type_iterator>(TYs.begin(), TYs.end());
91436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
91536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
91636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  iterator_range<scope_iterator> scopes() const {
91736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return iterator_range<scope_iterator>(Scopes.begin(), Scopes.end());
91836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
919f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
920f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned compile_unit_count() const { return CUs.size(); }
921f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned global_variable_count() const { return GVs.size(); }
922f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned subprogram_count() const { return SPs.size(); }
923f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned type_count() const { return TYs.size(); }
924f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  unsigned scope_count() const { return Scopes.size(); }
925f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher
926f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopherprivate:
92736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<DICompileUnit, 8> CUs;    // Compile Units
92836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<DISubprogram, 8> SPs;    // Subprograms
92936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<DIGlobalVariable, 8> GVs;    // Global Variables;
93036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<DIType, 8> TYs;    // Types
93136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<DIScope, 8> Scopes; // Scopes
932f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  SmallPtrSet<MDNode *, 64> NodesSeen;
933f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher  DITypeIdentifierMap TypeIdentifierMap;
9342b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  /// Specify if TypeIdentifierMap is initialized.
9352b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  bool TypeMapInitialized;
936f2fff255de51eec0e9d4a85724bb433be7e4c24bEric Christopher};
937cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
938cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesDenseMap<const Function *, DISubprogram> makeSubprogramMap(const Module &M);
939cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
940a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner} // end namespace llvm
941a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner
942a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner#endif
943