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