1a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner//===--- llvm/Analysis/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 17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_DEBUGINFO_H 18674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_DEBUGINFO_H 19a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 20d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel#include "llvm/ADT/SmallPtrSet.h" 21255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/SmallVector.h" 22f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner#include "llvm/ADT/StringRef.h" 23210d0febc24551aed293b903562c19567e96fa5dChris Lattner#include "llvm/Support/Dwarf.h" 24a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 25a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattnernamespace llvm { 26a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class BasicBlock; 27a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class Constant; 28a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class Function; 29a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class GlobalVariable; 30a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class Module; 31497a7a81a806748b7a49b529b6da4040da0a3832Chris Lattner class Type; 32a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class Value; 33b419a5cfe9fae934d6c05da173934673f5402c99Douglas Gregor class DbgDeclareInst; 34620f28095bd0411065abb934917b68983b223b3dTorok Edwin class Instruction; 35f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner class MDNode; 3662367045a493f9bffa433e34b68fc7dda96e1eddDevang Patel class NamedMDNode; 37f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner class LLVMContext; 38504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman class raw_ostream; 39a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 405b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel class DIFile; 415b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel class DISubprogram; 425b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel class DILexicalBlock; 436618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher class DILexicalBlockFile; 445b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel class DIVariable; 455b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel class DIType; 466588abf377b7381274236e651462ec83052f6013Devang Patel class DIObjCProperty; 475b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel 48784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner /// DIDescriptor - A thin wraper around MDNode to access encoded debug info. 49599da5ec016a6e52371c8e76e5aa091c04cbacd1Eric Christopher /// This should not be stored in a container, because the underlying MDNode 50599da5ec016a6e52371c8e76e5aa091c04cbacd1Eric Christopher /// may change in certain situations. 51a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIDescriptor { 529dd2b47d444e310347debcac5cdddedbb22881e6Devang Patel public: 539dd2b47d444e310347debcac5cdddedbb22881e6Devang Patel enum { 54b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagPrivate = 1 << 0, 55b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagProtected = 1 << 1, 56b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagFwdDecl = 1 << 2, 57b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagAppleBlock = 1 << 3, 58b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagBlockByrefStruct = 1 << 4, 59b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagVirtual = 1 << 5, 60b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagArtificial = 1 << 6, 61b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagExplicit = 1 << 7, 62b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel FlagPrototyped = 1 << 8, 63e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher FlagObjcClassComplete = 1 << 9, 649a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher FlagObjectPointer = 1 << 10, 656b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher FlagVector = 1 << 11, 666b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher FlagStaticMember = 1 << 12 679dd2b47d444e310347debcac5cdddedbb22881e6Devang Patel }; 68f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar protected: 69e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel const MDNode *DbgNode; 70a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 7165dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getStringField(unsigned Elt) const; 72a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getUnsignedField(unsigned Elt) const { 73a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner return (unsigned)getUInt64Field(Elt); 74a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner } 75a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getUInt64Field(unsigned Elt) const; 769127be8a19471039f1c8e50e92c8ebd0460048e9Bill Wendling int64_t getInt64Field(unsigned Elt) const; 77a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIDescriptor getDescriptorField(unsigned Elt) const; 78a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 79a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner template <typename DescTy> 80a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DescTy getFieldAs(unsigned Elt) const { 81ebe57f1b30870d46b48bf3bb22d7a88c780e9848Devang Patel return DescTy(getDescriptorField(Elt)); 82a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner } 83a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 84a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner GlobalVariable *getGlobalVariableField(unsigned Elt) const; 852739896cdd3c987de3d7f9a41217b4b954287c8dDevang Patel Constant *getConstantField(unsigned Elt) const; 86215aa15a0d0df75af8d9cef6ef49026dcc3258a8Stuart Hastings Function *getFunctionField(unsigned Elt) const; 87e97a3a4b4fccbe6283b616af93ab0117d3a7fee9Alexey Samsonov void replaceFunctionField(unsigned Elt, Function *F); 88a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 89a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 90e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel explicit DIDescriptor() : DbgNode(0) {} 91e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIDescriptor(const MDNode *N) : DbgNode(N) {} 925b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel explicit DIDescriptor(const DIFile F); 935b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel explicit DIDescriptor(const DISubprogram F); 946618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher explicit DIDescriptor(const DILexicalBlockFile F); 955b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel explicit DIDescriptor(const DILexicalBlock F); 965b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel explicit DIDescriptor(const DIVariable F); 975b164b5a5cab577fdfc21b22b78b3207dbcfbcf1Devang Patel explicit DIDescriptor(const DIType F); 98a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 99c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 100a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 101e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel operator MDNode *() const { return const_cast<MDNode*>(DbgNode); } 102e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel MDNode *operator ->() const { return const_cast<MDNode*>(DbgNode); } 1032c1623ae0b041519fecdfdb97b1bda4708b6aeb6Devang Patel 1042c1623ae0b041519fecdfdb97b1bda4708b6aeb6Devang Patel unsigned getTag() const { 1056906ba52f050a6608502987e754a622f5c5111a6Devang Patel return getUnsignedField(0) & ~LLVMDebugVersionMask; 1062c1623ae0b041519fecdfdb97b1bda4708b6aeb6Devang Patel } 107a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 1086ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isDerivedType() const; 1096ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isCompositeType() const; 1106ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isBasicType() const; 1116ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isVariable() const; 1126ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isSubprogram() const; 1136ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isGlobalVariable() const; 11443d98b3c4ecd564d4666468983322c019819f730Devang Patel bool isScope() const; 1157aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel bool isFile() const; 116c9f322d9a62c57ba965678a874faad6d239b9256Devang Patel bool isCompileUnit() const; 1176404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel bool isNameSpace() const; 1186618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher bool isLexicalBlockFile() const; 1195e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel bool isLexicalBlock() const; 120ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isSubrange() const; 121ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isEnumerator() const; 122ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isType() const; 123ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isGlobal() const; 124d6747df5e0354256a9e440d38f21c0b3ca82af28Devang Patel bool isUnspecifiedParameter() const; 1257e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel bool isTemplateTypeParameter() const; 126e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel bool isTemplateValueParameter() const; 1271ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isObjCProperty() const; 128494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling 129494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling /// print - print descriptor. 130494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void print(raw_ostream &OS) const; 131494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling 132494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling /// dump - print descriptor to dbgs() with a newline. 133494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void dump() const; 134a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 135a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 13668afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel /// DISubrange - This is used to represent ranges, for array bounds. 13768afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel class DISubrange : public DIDescriptor { 138494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 139494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 14068afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel public: 141e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DISubrange(const MDNode *N = 0) : DIDescriptor(N) {} 142a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 143222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling int64_t getLo() const { return getInt64Field(1); } 1449493dae613847b01b79914502f337814fe3e00acBill Wendling int64_t getCount() const { return getInt64Field(2); } 145c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 14668afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel }; 147a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 148a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIArray - This descriptor holds an array of descriptors. 149a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIArray : public DIDescriptor { 150a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 151e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIArray(const MDNode *N = 0) 152e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel : DIDescriptor(N) {} 153a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 154a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getNumElements() const; 155a22d57d6f8215717298ae0cef34d00ab5104ddeaDevang Patel DIDescriptor getElement(unsigned Idx) const { 156a22d57d6f8215717298ae0cef34d00ab5104ddeaDevang Patel return getDescriptorField(Idx); 15768afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel } 158a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 159a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 16043d98b3c4ecd564d4666468983322c019819f730Devang Patel /// DIScope - A base class for various scopes. 16143d98b3c4ecd564d4666468983322c019819f730Devang Patel class DIScope : public DIDescriptor { 162494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling protected: 163494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 164494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 16543d98b3c4ecd564d4666468983322c019819f730Devang Patel public: 166e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {} 16758e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 16865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getFilename() const; 16965dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDirectory() const; 17043d98b3c4ecd564d4666468983322c019819f730Devang Patel }; 17143d98b3c4ecd564d4666468983322c019819f730Devang Patel 172de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie /// DIFile - This is a wrapper for a file. 173de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie class DIFile : public DIScope { 174de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie friend class DIDescriptor; 175de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie public: 176de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie explicit DIFile(const MDNode *N = 0) : DIScope(N) { 177de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie if (DbgNode && !isFile()) 178de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie DbgNode = 0; 179de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie } 180de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie bool Verify() const; 181de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie }; 182de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie 183a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DICompileUnit - A wrapper for a compile unit. 184c9f322d9a62c57ba965678a874faad6d239b9256Devang Patel class DICompileUnit : public DIScope { 185494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 186494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 187a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 188e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DICompileUnit(const MDNode *N = 0) : DIScope(N) {} 189a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 190de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie unsigned getLanguage() const { return getUnsignedField(2); } 191de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie StringRef getFilename() const { 192de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie return getFieldAs<DIFile>(3).getFilename(); 193de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie } 194de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie StringRef getDirectory() const { 195de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie return getFieldAs<DIFile>(3).getDirectory(); 196de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie } 197de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie StringRef getProducer() const { return getStringField(4); } 198f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 199de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie bool isOptimized() const { return getUnsignedField(5) != 0; } 200de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie StringRef getFlags() const { return getStringField(6); } 201de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie unsigned getRunTimeVersion() const { return getUnsignedField(7); } 202ce31b027e7891da951f1036465e8d82dd0bd3297Devang Patel 20394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray getEnumTypes() const; 20494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray getRetainedTypes() const; 20594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray getSubprograms() const; 20694c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIArray getGlobalVariables() const; 20794c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel 208de3077ae6b5ad8e6f417a8f6aa0ca1ae980f6272David Blaikie StringRef getSplitDebugFilename() const { return getStringField(12); } 209e4b67906d3cc5ea365359f9b034189aaa51ca1e9Eric Christopher 210b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a compile unit is well formed. 211b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 212a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 213a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 214a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}'). 215a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// FIXME: it seems strange that this doesn't have either a reference to the 216a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// type/precision or a file/line pair for location info. 217a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIEnumerator : public DIDescriptor { 218494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 219494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 220a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 221e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIEnumerator(const MDNode *N = 0) : DIDescriptor(N) {} 222a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 22365dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getName() const { return getStringField(1); } 2245ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel uint64_t getEnumValue() const { return getUInt64Field(2); } 225c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 226a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 227a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 228a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIType - This is a wrapper for a type. 229a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// FIXME: Types should be factored much better so that CV qualifiers and 230a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// others do not require a huge and empty descriptor full of zeros. 23177bf295dbb0b049fdec853ced0763084c43b2438Devang Patel class DIType : public DIScope { 232a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner protected: 233494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 234494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 235a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // This ctor is used when the Tag has already been validated by a derived 236a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // ctor. 237e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DIType(const MDNode *N, bool, bool) : DIScope(N) {} 238f193ff05909c2de373032f773e76804474b1ef4eDevang Patel public: 239b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a type descriptor is well formed. 240b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 241e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIType(const MDNode *N); 242a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner explicit DIType() {} 2438526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel 24477bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 2456404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel StringRef getName() const { return getStringField(2); } 246ab70ed41f344c04dabaf180c40f04827bc9c56b5Devang Patel DIFile getFile() const { return getFieldAs<DIFile>(3); } 247a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getLineNumber() const { return getUnsignedField(4); } 248a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getSizeInBits() const { return getUInt64Field(5); } 249a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getAlignInBits() const { return getUInt64Field(6); } 250a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // FIXME: Offset is only used for DW_TAG_member nodes. Making every type 251a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // carry this is just plain insane. 252a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getOffsetInBits() const { return getUInt64Field(7); } 253a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getFlags() const { return getUnsignedField(8); } 254e1f515ea59df5cb989c371604bba2271e6f3ee0dChris Lattner bool isPrivate() const { 255f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagPrivate) != 0; 256e2d5a6c3bb9b2c3bce78bb0143d8988bf6735d44Devang Patel } 257e1f515ea59df5cb989c371604bba2271e6f3ee0dChris Lattner bool isProtected() const { 258f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagProtected) != 0; 259e2d5a6c3bb9b2c3bce78bb0143d8988bf6735d44Devang Patel } 260e1f515ea59df5cb989c371604bba2271e6f3ee0dChris Lattner bool isForwardDecl() const { 261f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagFwdDecl) != 0; 262e2d5a6c3bb9b2c3bce78bb0143d8988bf6735d44Devang Patel } 263a1ba269a27ca9d776e6de77e8177fa8fa844bd5eDevang Patel // isAppleBlock - Return true if this is the Apple Blocks extension. 264a1ba269a27ca9d776e6de77e8177fa8fa844bd5eDevang Patel bool isAppleBlockExtension() const { 265f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagAppleBlock) != 0; 2668af76bdb7450b097efa17f7c192882111a9e8f10Devang Patel } 267dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice bool isBlockByrefStruct() const { 268dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice return (getFlags() & FlagBlockByrefStruct) != 0; 269dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice } 2705d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel bool isVirtual() const { 2715d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel return (getFlags() & FlagVirtual) != 0; 2725d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel } 273b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel bool isArtificial() const { 274b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel return (getFlags() & FlagArtificial) != 0; 275b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel } 276e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher bool isObjectPointer() const { 277e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher return (getFlags() & FlagObjectPointer) != 0; 278e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher } 279201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel bool isObjcClassComplete() const { 280201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel return (getFlags() & FlagObjcClassComplete) != 0; 281b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel } 2829a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher bool isVector() const { 2839a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher return (getFlags() & FlagVector) != 0; 2849a1e0e252a7ede548acaac98cf304d4bb135fb97Eric Christopher } 2856b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher bool isStaticMember() const { 2866b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher return (getFlags() & FlagStaticMember) != 0; 2876b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher } 2883c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel bool isValid() const { 2893c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel return DbgNode && (isBasicType() || isDerivedType() || isCompositeType()); 2903c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel } 2915f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getDirectory() const { 2920e82ac07bc6e48cc343951a28e61bbf748690d6dDevang Patel return getFieldAs<DIFile>(3).getDirectory(); 293bc2bb9bbd0610bc43f08be6678431148898591aaDevang Patel } 2945f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getFilename() const { 2950e82ac07bc6e48cc343951a28e61bbf748690d6dDevang Patel return getFieldAs<DIFile>(3).getFilename(); 296bc2bb9bbd0610bc43f08be6678431148898591aaDevang Patel } 297504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 2986f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel /// isUnsignedDIType - Return true if type encoding is unsigned. 2996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel bool isUnsignedDIType(); 3006f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 301489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman /// replaceAllUsesWith - Replace all uses of debug info referenced by 302489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman /// this descriptor. 303489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman void replaceAllUsesWith(DIDescriptor &D); 3040a2551de2c61b372d45b236b413a5d2e15225c0fDevang Patel void replaceAllUsesWith(MDNode *D); 305a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 306a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 307a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIBasicType - A basic type, like 'int' or 'float'. 308a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIBasicType : public DIType { 309a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 310e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIBasicType(const MDNode *N = 0) : DIType(N) {} 311dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 312a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getEncoding() const { return getUnsignedField(9); } 313bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 3140c4720c6bdf517d02aaf71d90c0572a5aa4813bcDevang Patel /// Verify - Verify that a basic type descriptor is well formed. 3150c4720c6bdf517d02aaf71d90c0572a5aa4813bcDevang Patel bool Verify() const; 316a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 317a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 318a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIDerivedType - A simple derived type, like a const qualified type, 3196b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher /// a typedef, a pointer or reference, et cetera. Or, a data member of 3206b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher /// a class/struct/union. 321a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIDerivedType : public DIType { 322494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 323494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 324a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner protected: 325e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIDerivedType(const MDNode *N, bool, bool) 326e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel : DIType(N, true, true) {} 327a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 328e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIDerivedType(const MDNode *N = 0) 329f17f5ebbdcd67966f7841c3597d750756d5bbd38Devang Patel : DIType(N, true, true) {} 330dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 331a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); } 332bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 33336375ee7a584343fabaf20630326f1848263bce6Devang Patel /// getOriginalTypeSize - If this type is derived from a base type then 33436375ee7a584343fabaf20630326f1848263bce6Devang Patel /// return base type size. 33536375ee7a584343fabaf20630326f1848263bce6Devang Patel uint64_t getOriginalTypeSize() const; 336504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 3375f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher /// getObjCProperty - Return property node, if this ivar is 3386588abf377b7381274236e651462ec83052f6013Devang Patel /// associated with one. 3396588abf377b7381274236e651462ec83052f6013Devang Patel MDNode *getObjCProperty() const; 3406588abf377b7381274236e651462ec83052f6013Devang Patel 34162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie DIType getClassType() const { 34262fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie assert(getTag() == dwarf::DW_TAG_ptr_to_member_type); 34362fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie return getFieldAs<DIType>(10); 34462fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie } 34562fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie 3466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher Constant *getConstant() const { 3476b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher assert((getTag() == dwarf::DW_TAG_member) && isStaticMember()); 3486b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher return getConstantField(10); 3496b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher } 3506b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher 3510c4720c6bdf517d02aaf71d90c0572a5aa4813bcDevang Patel /// Verify - Verify that a derived type descriptor is well formed. 3520c4720c6bdf517d02aaf71d90c0572a5aa4813bcDevang Patel bool Verify() const; 353a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 354a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 355a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DICompositeType - This descriptor holds a type that can refer to multiple 356a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// other types, like a function or struct. 357a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// FIXME: Why is this a DIDerivedType?? 358a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DICompositeType : public DIDerivedType { 359494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 360494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 361a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 362e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DICompositeType(const MDNode *N = 0) 363e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel : DIDerivedType(N, true, true) { 3646ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel if (N && !isCompositeType()) 365e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel DbgNode = 0; 366dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling } 367dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 368a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIArray getTypeArray() const { return getFieldAs<DIArray>(10); } 36913319ceffdd99d153e62011c5dda08b95e3279e3Devang Patel unsigned getRunTimeLang() const { return getUnsignedField(11); } 3700fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel DICompositeType getContainingType() const { 3710fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel return getFieldAs<DICompositeType>(12); 3720fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel } 3737e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel DIArray getTemplateParams() const { return getFieldAs<DIArray>(13); } 374b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 375b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a composite type descriptor is well formed. 376b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 377a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 378a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 3797e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel /// DITemplateTypeParameter - This is a wrapper for template type parameter. 3807e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel class DITemplateTypeParameter : public DIDescriptor { 3817e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel public: 3827e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel explicit DITemplateTypeParameter(const MDNode *N = 0) : DIDescriptor(N) {} 3837e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel 3847e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 3857e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel StringRef getName() const { return getStringField(2); } 3867e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel DIType getType() const { return getFieldAs<DIType>(3); } 3875f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getFilename() const { 3887e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel return getFieldAs<DIFile>(4).getFilename(); 3897e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel } 3905f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getDirectory() const { 3917e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel return getFieldAs<DIFile>(4).getDirectory(); 3927e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel } 3937e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel unsigned getLineNumber() const { return getUnsignedField(5); } 3947e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel unsigned getColumnNumber() const { return getUnsignedField(6); } 395c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 3967e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel }; 3977e2cb116556e1153401cd6b94d0f51db978f6902Devang Patel 398e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel /// DITemplateValueParameter - This is a wrapper for template value parameter. 399e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel class DITemplateValueParameter : public DIDescriptor { 400e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel public: 401e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel explicit DITemplateValueParameter(const MDNode *N = 0) : DIDescriptor(N) {} 402e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel 403e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 404e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel StringRef getName() const { return getStringField(2); } 405e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel DIType getType() const { return getFieldAs<DIType>(3); } 406e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel uint64_t getValue() const { return getUInt64Field(4); } 4075f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getFilename() const { 408e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel return getFieldAs<DIFile>(5).getFilename(); 409e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel } 4105f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getDirectory() const { 411e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel return getFieldAs<DIFile>(5).getDirectory(); 412e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel } 413e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel unsigned getLineNumber() const { return getUnsignedField(6); } 414e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel unsigned getColumnNumber() const { return getUnsignedField(7); } 415c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 416e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel }; 417e7d93877c6e7029d27bfd1c137fceb472f81f390Devang Patel 418a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DISubprogram - This is a wrapper for a subprogram (e.g. a function). 41982dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel class DISubprogram : public DIScope { 420494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 421494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 422a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 423e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DISubprogram(const MDNode *N = 0) : DIScope(N) {} 424dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 42577bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(2); } 42665dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getName() const { return getStringField(3); } 42765dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDisplayName() const { return getStringField(4); } 42865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getLinkageName() const { return getStringField(5); } 42982dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel unsigned getLineNumber() const { return getUnsignedField(7); } 43086ae142c51fc29ab870ebf42f6bf8699bca81512Devang Patel DICompositeType getType() const { return getFieldAs<DICompositeType>(8); } 431b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 4320de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel /// getReturnTypeName - Subprogram return types are encoded either as 4330de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel /// DIType or as DICompositeType. 43465dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getReturnTypeName() const { 4350de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel DICompositeType DCT(getFieldAs<DICompositeType>(8)); 4363c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel if (DCT.Verify()) { 4370de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel DIArray A = DCT.getTypeArray(); 4382db49d797b86b7f3615bae17b2b016727778a6c4Devang Patel DIType T(A.getElement(0)); 4395ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel return T.getName(); 4400de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel } 4410de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel DIType T(getFieldAs<DIType>(8)); 4425ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel return T.getName(); 4430de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel } 4440de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel 44582dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel /// isLocalToUnit - Return true if this subprogram is local to the current 44682dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel /// compile unit, like 'static' in C. 4475ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel unsigned isLocalToUnit() const { return getUnsignedField(9); } 4485ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel unsigned isDefinition() const { return getUnsignedField(10); } 4495d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel 450f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner unsigned getVirtuality() const { return getUnsignedField(11); } 451f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner unsigned getVirtualIndex() const { return getUnsignedField(12); } 4525d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel 4535d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel DICompositeType getContainingType() const { 4545d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel return getFieldAs<DICompositeType>(13); 4555d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel } 4566126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher 457e2952f956ab47e5defda2e26cf9a87d928459a57David Blaikie unsigned getFlags() const { 458e2952f956ab47e5defda2e26cf9a87d928459a57David Blaikie return getUnsignedField(14); 459e2952f956ab47e5defda2e26cf9a87d928459a57David Blaikie } 460e2952f956ab47e5defda2e26cf9a87d928459a57David Blaikie 4615f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher unsigned isArtificial() const { 4629dd2b47d444e310347debcac5cdddedbb22881e6Devang Patel return (getUnsignedField(14) & FlagArtificial) != 0; 4639dd2b47d444e310347debcac5cdddedbb22881e6Devang Patel } 4641a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel /// isPrivate - Return true if this subprogram has "private" 4651a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel /// access specifier. 4665f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher bool isPrivate() const { 4671a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel return (getUnsignedField(14) & FlagPrivate) != 0; 4681a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel } 4691a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel /// isProtected - Return true if this subprogram has "protected" 4701a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel /// access specifier. 4715f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher bool isProtected() const { 4721a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel return (getUnsignedField(14) & FlagProtected) != 0; 4731a30123b609d48ac50f9a9e088e55683df70cfc3Devang Patel } 47421ea1d5b4cad8c8dee1288453f797572766c94d8Devang Patel /// isExplicit - Return true if this subprogram is marked as explicit. 4755f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher bool isExplicit() const { 47621ea1d5b4cad8c8dee1288453f797572766c94d8Devang Patel return (getUnsignedField(14) & FlagExplicit) != 0; 47721ea1d5b4cad8c8dee1288453f797572766c94d8Devang Patel } 4787b172c6ae6c4fea90db785902b4326afb21ad584Devang Patel /// isPrototyped - Return true if this subprogram is prototyped. 4795f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher bool isPrototyped() const { 4807b172c6ae6c4fea90db785902b4326afb21ad584Devang Patel return (getUnsignedField(14) & FlagPrototyped) != 0; 4817b172c6ae6c4fea90db785902b4326afb21ad584Devang Patel } 48221ea1d5b4cad8c8dee1288453f797572766c94d8Devang Patel 483ccff812777470d294b7d7407783ccb6111ca0d10Devang Patel unsigned isOptimized() const; 4845d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel 4855f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getFilename() const { 4865f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher return getFieldAs<DIFile>(6).getFilename(); 4878fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel } 4888fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel 4895f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getDirectory() const { 4905f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher return getFieldAs<DIFile>(6).getDirectory(); 4918fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel } 49258e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 4934293f4e4d935aa620ea2615323cf7ad016f6e346David Blaikie DIFile getFile() const { 4944293f4e4d935aa620ea2615323cf7ad016f6e346David Blaikie return getFieldAs<DIFile>(6); 4954293f4e4d935aa620ea2615323cf7ad016f6e346David Blaikie } 4964293f4e4d935aa620ea2615323cf7ad016f6e346David Blaikie 4976126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher /// getScopeLineNumber - Get the beginning of the scope of the 4986126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher /// function, not necessarily where the name of the program 4996126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher /// starts. 5006126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher unsigned getScopeLineNumber() const { return getUnsignedField(20); } 5016126a1e1894f346fae02a514a20aa56b879aeb99Eric Christopher 502b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a subprogram descriptor is well formed. 503b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 504bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 505af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel /// describes - Return true if this subprogram provides debugging 506af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel /// information for the function F. 507af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel bool describes(const Function *F); 508215aa15a0d0df75af8d9cef6ef49026dcc3258a8Stuart Hastings 509215aa15a0d0df75af8d9cef6ef49026dcc3258a8Stuart Hastings Function *getFunction() const { return getFunctionField(16); } 510e97a3a4b4fccbe6283b616af93ab0117d3a7fee9Alexey Samsonov void replaceFunction(Function *F) { replaceFunctionField(16, F); } 511da19475328ece3da19437a2e9eef035dcafa2814Devang Patel DIArray getTemplateParams() const { return getFieldAs<DIArray>(17); } 5125e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel DISubprogram getFunctionDeclaration() const { 5135e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel return getFieldAs<DISubprogram>(18); 5145e06bb83f4d7b1b86659ad851324350afb04f5b0Devang Patel } 51593d39be5300702d8c9892ec04a492a6056926462Devang Patel MDNode *getVariablesNodes() const; 51693d39be5300702d8c9892ec04a492a6056926462Devang Patel DIArray getVariables() const; 517a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 518a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 519a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIGlobalVariable - This is a wrapper for a global variable. 520a49d8772902c2a72c298952f633ab4224cf33addDevang Patel class DIGlobalVariable : public DIDescriptor { 521494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 522494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 523a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 524a49d8772902c2a72c298952f633ab4224cf33addDevang Patel explicit DIGlobalVariable(const MDNode *N = 0) : DIDescriptor(N) {} 525a49d8772902c2a72c298952f633ab4224cf33addDevang Patel 526a49d8772902c2a72c298952f633ab4224cf33addDevang Patel DIScope getContext() const { return getFieldAs<DIScope>(2); } 527a49d8772902c2a72c298952f633ab4224cf33addDevang Patel StringRef getName() const { return getStringField(3); } 528a49d8772902c2a72c298952f633ab4224cf33addDevang Patel StringRef getDisplayName() const { return getStringField(4); } 529a49d8772902c2a72c298952f633ab4224cf33addDevang Patel StringRef getLinkageName() const { return getStringField(5); } 530439780eeaef1a2c6a1105fb705a27c5c819e8d0eJames Molloy StringRef getFilename() const { 531439780eeaef1a2c6a1105fb705a27c5c819e8d0eJames Molloy return getFieldAs<DIFile>(6).getFilename(); 5325f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher } 533439780eeaef1a2c6a1105fb705a27c5c819e8d0eJames Molloy StringRef getDirectory() const { 534439780eeaef1a2c6a1105fb705a27c5c819e8d0eJames Molloy return getFieldAs<DIFile>(6).getDirectory(); 535439780eeaef1a2c6a1105fb705a27c5c819e8d0eJames Molloy 5365f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher } 537a49d8772902c2a72c298952f633ab4224cf33addDevang Patel 538a49d8772902c2a72c298952f633ab4224cf33addDevang Patel unsigned getLineNumber() const { return getUnsignedField(7); } 539a49d8772902c2a72c298952f633ab4224cf33addDevang Patel DIType getType() const { return getFieldAs<DIType>(8); } 540a49d8772902c2a72c298952f633ab4224cf33addDevang Patel unsigned isLocalToUnit() const { return getUnsignedField(9); } 541a49d8772902c2a72c298952f633ab4224cf33addDevang Patel unsigned isDefinition() const { return getUnsignedField(10); } 542dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 543a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner GlobalVariable *getGlobal() const { return getGlobalVariableField(11); } 5442739896cdd3c987de3d7f9a41217b4b954287c8dDevang Patel Constant *getConstant() const { return getConstantField(11); } 5456b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher DIDerivedType getStaticDataMemberDeclaration() const { 5466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher return getFieldAs<DIDerivedType>(12); 5476b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher } 548b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 549b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a global variable descriptor is well formed. 550b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 551a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 552a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 553a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIVariable - This is a wrapper for a variable (e.g. parameter, local, 554a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// global etc). 555a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIVariable : public DIDescriptor { 556494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling friend class DIDescriptor; 557494f8c6cfaa7443bc708f6006c70f37ca30ac765Bill Wendling void printInternal(raw_ostream &OS) const; 558a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 559e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIVariable(const MDNode *N = 0) 560f17f5ebbdcd67966f7841c3597d750756d5bbd38Devang Patel : DIDescriptor(N) {} 561a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 56277bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 56377bf295dbb0b049fdec853ced0763084c43b2438Devang Patel StringRef getName() const { return getStringField(2); } 5641afbb517965e29b07cb42e2335d5eadd87de6535Alexey Samsonov DIFile getFile() const { return getFieldAs<DIFile>(3); } 5655f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher unsigned getLineNumber() const { 5665f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher return (getUnsignedField(4) << 8) >> 8; 567e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel } 568e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel unsigned getArgNumber() const { 5695f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher unsigned L = getUnsignedField(4); 570e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel return L >> 24; 571e9e16c5f52c4a093f4de234d448cdebedab8938eDevang Patel } 572a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIType getType() const { return getFieldAs<DIType>(5); } 5735f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher 5743cf763dc7a9741c14432710943ab66b439562881Devang Patel /// isArtificial - Return true if this variable is marked as "artificial". 5755f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher bool isArtificial() const { 5763cf763dc7a9741c14432710943ab66b439562881Devang Patel return (getUnsignedField(6) & FlagArtificial) != 0; 5773cf763dc7a9741c14432710943ab66b439562881Devang Patel } 578a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 579e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher bool isObjectPointer() const { 580e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher return (getUnsignedField(6) & FlagObjectPointer) != 0; 581e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher } 582e521278f00cf5f4ea0cc4aac126df30924d3e705Eric Christopher 58340c7e4142e2327a540eceb640392a6da4ccfb3bfDevang Patel /// getInlinedAt - If this variable is inlined then return inline location. 58448d726fbce7a70a2f5d7752c883731efe1e5e1c9Devang Patel MDNode *getInlinedAt() const; 585b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 586b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a variable descriptor is well formed. 587b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 588bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 5893e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump /// HasComplexAddr - Return true if the variable has a complex address. 5903e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump bool hasComplexAddress() const { 5913e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump return getNumAddrElements() > 0; 5923e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump } 5933e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump 594f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner unsigned getNumAddrElements() const; 5955f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher 5963e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump uint64_t getAddrElement(unsigned Idx) const { 59723336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel return getUInt64Field(Idx+8); 5983e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump } 5993e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump 600dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice /// isBlockByrefVariable - Return true if the variable was declared as 601dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice /// a "__block" variable (Apple Blocks). 602f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar bool isBlockByrefVariable() const { 603f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return getType().isBlockByrefStruct(); 604dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice } 605dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice 606a506b00d142b04ddaba776d4a8bd5d85b87aeea8David Blaikie /// isInlinedFnArgument - Return true if this variable provides debugging 60722070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel /// information for an inlined function arguments. 60822070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel bool isInlinedFnArgument(const Function *CurFn); 60922070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel 61048d726fbce7a70a2f5d7752c883731efe1e5e1c9Devang Patel void printExtendedName(raw_ostream &OS) const; 611a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 612a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 6135e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel /// DILexicalBlock - This is a wrapper for a lexical block. 6145e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel class DILexicalBlock : public DIScope { 615a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 616e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DILexicalBlock(const MDNode *N = 0) : DIScope(N) {} 6173d821aaae238534132df3982d703e758e91472cfDevang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 6183d821aaae238534132df3982d703e758e91472cfDevang Patel unsigned getLineNumber() const { return getUnsignedField(2); } 6193d821aaae238534132df3982d703e758e91472cfDevang Patel unsigned getColumnNumber() const { return getUnsignedField(3); } 6200db42710693badaab808ccf8bcd265144ce8493dStuart Hastings StringRef getDirectory() const { 62122063d60ab2e3d4fa9528cffb14e8284c7058a30David Blaikie return getFieldAs<DIFile>(4).getDirectory(); 6220db42710693badaab808ccf8bcd265144ce8493dStuart Hastings } 6230db42710693badaab808ccf8bcd265144ce8493dStuart Hastings StringRef getFilename() const { 62422063d60ab2e3d4fa9528cffb14e8284c7058a30David Blaikie return getFieldAs<DIFile>(4).getFilename(); 6250db42710693badaab808ccf8bcd265144ce8493dStuart Hastings } 626c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 627f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel }; 62858e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 6296618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher /// DILexicalBlockFile - This is a wrapper for a lexical block with 6306618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher /// a filename change. 6316618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher class DILexicalBlockFile : public DIScope { 6326618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher public: 6336618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher explicit DILexicalBlockFile(const MDNode *N = 0) : DIScope(N) {} 634ff715b240351dc2b8fba1be236d7a1746d2f0031David Blaikie DIScope getContext() const { if (getScope().isSubprogram()) return getScope(); return getScope().getContext(); } 6353c43b48fa96664318f0c1c17475114fe7015add6Eric Christopher unsigned getLineNumber() const { return getScope().getLineNumber(); } 6363c43b48fa96664318f0c1c17475114fe7015add6Eric Christopher unsigned getColumnNumber() const { return getScope().getColumnNumber(); } 6376618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher StringRef getDirectory() const { 63833905b2a34da69bc05d67567fe1c1b6e74d32fa0David Blaikie return getFieldAs<DIFile>(2).getDirectory(); 6396618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher } 6406618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher StringRef getFilename() const { 64133905b2a34da69bc05d67567fe1c1b6e74d32fa0David Blaikie return getFieldAs<DIFile>(2).getFilename(); 6426618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher } 6436618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher DILexicalBlock getScope() const { return getFieldAs<DILexicalBlock>(1); } 644c0ec8a4f4db3c579dfc8c219dc39014f34260b42David Blaikie bool Verify() const; 6456618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher }; 6466618a241f7ba2571a1a55b3733c4441d467baf42Eric Christopher 6476404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel /// DINameSpace - A wrapper for a C++ style name space. 6485f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher class DINameSpace : public DIScope { 6496404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel public: 650e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DINameSpace(const MDNode *N = 0) : DIScope(N) {} 6516404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 6526404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel StringRef getName() const { return getStringField(2); } 6535f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getDirectory() const { 6540e82ac07bc6e48cc343951a28e61bbf748690d6dDevang Patel return getFieldAs<DIFile>(3).getDirectory(); 655a514a4e17284617f7bff0ffa694d699da45fc882Devang Patel } 6565f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher StringRef getFilename() const { 6570e82ac07bc6e48cc343951a28e61bbf748690d6dDevang Patel return getFieldAs<DIFile>(3).getFilename(); 658a514a4e17284617f7bff0ffa694d699da45fc882Devang Patel } 6596404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel unsigned getLineNumber() const { return getUnsignedField(4); } 66047e2265a30d0a990839f81315ce6387c09d2c36bDevang Patel bool Verify() const; 6616404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel }; 6626404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel 663f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel /// DILocation - This object holds location information. This object 664f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel /// is not associated with any DWARF tag. 665f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel class DILocation : public DIDescriptor { 666f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel public: 667e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DILocation(const MDNode *N) : DIDescriptor(N) { } 66858e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 669f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel unsigned getLineNumber() const { return getUnsignedField(0); } 670f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel unsigned getColumnNumber() const { return getUnsignedField(1); } 6715ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel DIScope getScope() const { return getFieldAs<DIScope>(2); } 6725ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel DILocation getOrigLocation() const { return getFieldAs<DILocation>(3); } 67365dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getFilename() const { return getScope().getFilename(); } 67465dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDirectory() const { return getScope().getDirectory(); } 6753c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel bool Verify() const; 676a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 677a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 6781ea02d467a311b4846b942377d0b00fde987be65Devang Patel class DIObjCProperty : public DIDescriptor { 6792da1a1621fd8ea40b143dc44812a0e97e6ef5c59Bill Wendling friend class DIDescriptor; 6802da1a1621fd8ea40b143dc44812a0e97e6ef5c59Bill Wendling void printInternal(raw_ostream &OS) const; 6811ea02d467a311b4846b942377d0b00fde987be65Devang Patel public: 6821ea02d467a311b4846b942377d0b00fde987be65Devang Patel explicit DIObjCProperty(const MDNode *N) : DIDescriptor(N) { } 6831ea02d467a311b4846b942377d0b00fde987be65Devang Patel 6841ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef getObjCPropertyName() const { return getStringField(1); } 685b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher DIFile getFile() const { return getFieldAs<DIFile>(2); } 686b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher unsigned getLineNumber() const { return getUnsignedField(3); } 687b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher 6881ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef getObjCPropertyGetterName() const { 689b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return getStringField(4); 6901ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 6911ea02d467a311b4846b942377d0b00fde987be65Devang Patel StringRef getObjCPropertySetterName() const { 692b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return getStringField(5); 6931ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 6941ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isReadOnlyObjCProperty() { 695b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_readonly) != 0; 6961ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 6971ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isReadWriteObjCProperty() { 698b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_readwrite) != 0; 6991ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 7001ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isAssignObjCProperty() { 701b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_assign) != 0; 7021ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 7031ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isRetainObjCProperty() { 704b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_retain) != 0; 7051ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 7061ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isCopyObjCProperty() { 707b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_copy) != 0; 7081ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 7091ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool isNonAtomicObjCProperty() { 710b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher return (getUnsignedField(6) & dwarf::DW_APPLE_PROPERTY_nonatomic) != 0; 7111ea02d467a311b4846b942377d0b00fde987be65Devang Patel } 7121ea02d467a311b4846b942377d0b00fde987be65Devang Patel 713b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher DIType getType() const { return getFieldAs<DIType>(7); } 714b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher 7151ea02d467a311b4846b942377d0b00fde987be65Devang Patel /// Verify - Verify that a derived type descriptor is well formed. 7161ea02d467a311b4846b942377d0b00fde987be65Devang Patel bool Verify() const; 7171ea02d467a311b4846b942377d0b00fde987be65Devang Patel }; 7181ea02d467a311b4846b942377d0b00fde987be65Devang Patel 719193f720f118f52eb05de172d936a440f335c1469Devang Patel /// getDISubprogram - Find subprogram that is enclosing this scope. 720e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DISubprogram getDISubprogram(const MDNode *Scope); 721193f720f118f52eb05de172d936a440f335c1469Devang Patel 722193f720f118f52eb05de172d936a440f335c1469Devang Patel /// getDICompositeType - Find underlying composite type. 723193f720f118f52eb05de172d936a440f335c1469Devang Patel DICompositeType getDICompositeType(DIType T); 724193f720f118f52eb05de172d936a440f335c1469Devang Patel 7256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel /// isSubprogramContext - Return true if Context is either a subprogram 7266f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel /// or another context nested inside a subprogram. 7276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel bool isSubprogramContext(const MDNode *Context); 7286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 72962367045a493f9bffa433e34b68fc7dda96e1eddDevang Patel /// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable 73062367045a493f9bffa433e34b68fc7dda96e1eddDevang Patel /// to hold function specific information. 73193d39be5300702d8c9892ec04a492a6056926462Devang Patel NamedMDNode *getOrInsertFnSpecificMDNode(Module &M, DISubprogram SP); 73262367045a493f9bffa433e34b68fc7dda96e1eddDevang Patel 7335f214ae1793b77f632f7f0b61875d5d439762a51Eric Christopher /// getFnSpecificMDNode - Return a NameMDNode, if available, that is 73462367045a493f9bffa433e34b68fc7dda96e1eddDevang Patel /// suitable to hold function specific information. 73593d39be5300702d8c9892ec04a492a6056926462Devang Patel NamedMDNode *getFnSpecificMDNode(const Module &M, DISubprogram SP); 73662367045a493f9bffa433e34b68fc7dda96e1eddDevang Patel 73723336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel /// createInlinedVariable - Create a new inlined variable based on current 73823336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel /// variable. 73923336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel /// @param DV Current Variable. 74023336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel /// @param InlinedScope Location at current variable is inlined. 74123336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel DIVariable createInlinedVariable(MDNode *DV, MDNode *InlinedScope, 74223336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel LLVMContext &VMContext); 74323336b449eee301f4c4dcabbd75dedf3c75c30fcDevang Patel 744b549bcfe6c19dbb24162c75bbcc06d4a5fa90cb8Devang Patel /// cleanseInlinedVariable - Remove inlined scope from the variable. 745b549bcfe6c19dbb24162c75bbcc06d4a5fa90cb8Devang Patel DIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext); 746b549bcfe6c19dbb24162c75bbcc06d4a5fa90cb8Devang Patel 74798c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel class DebugInfoFinder { 748d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel public: 74998c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel /// processModule - Process entire module and collect debug info 750d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel /// anchors. 751c4639d6ec2cf1e66d0bbc22db9ec530419b18784Eric Christopher void processModule(const Module &M); 752f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 753d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel private: 75498c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel /// processType - Process DIType. 75598c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel void processType(DIType DT); 756d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 757beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel /// processLexicalBlock - Process DILexicalBlock. 758beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel void processLexicalBlock(DILexicalBlock LB); 759beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel 760beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel /// processSubprogram - Process DISubprogram. 76198c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel void processSubprogram(DISubprogram SP); 762d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 763b4d31306a4f9e84a7ab6ace99964634adb4bf7e6Devang Patel /// processDeclare - Process DbgDeclareInst. 764c4639d6ec2cf1e66d0bbc22db9ec530419b18784Eric Christopher void processDeclare(const DbgDeclareInst *DDI); 765b4d31306a4f9e84a7ab6ace99964634adb4bf7e6Devang Patel 7666daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel /// processLocation - Process DILocation. 7676daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel void processLocation(DILocation Loc); 7686daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel 769d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel /// addCompileUnit - Add compile unit into CUs. 770d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel bool addCompileUnit(DICompileUnit CU); 771f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 772d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel /// addGlobalVariable - Add global variable into GVs. 773d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel bool addGlobalVariable(DIGlobalVariable DIG); 774d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 775ecfd04b272940374323c2e6e57aff06ff5c4f133Eric Christopher // addSubprogram - Add subprogram into SPs. 776d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel bool addSubprogram(DISubprogram SP); 777d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 77872bcdb6c9b5456cf6687c9066ae9d220ebedd80aDevang Patel /// addType - Add type into Tys. 77972bcdb6c9b5456cf6687c9066ae9d220ebedd80aDevang Patel bool addType(DIType DT); 78072bcdb6c9b5456cf6687c9066ae9d220ebedd80aDevang Patel 781d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel public: 7825374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman typedef SmallVector<MDNode *, 8>::const_iterator iterator; 7835374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator compile_unit_begin() const { return CUs.begin(); } 7845374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator compile_unit_end() const { return CUs.end(); } 7855374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator subprogram_begin() const { return SPs.begin(); } 7865374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator subprogram_end() const { return SPs.end(); } 7875374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator global_variable_begin() const { return GVs.begin(); } 7885374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator global_variable_end() const { return GVs.end(); } 7895374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator type_begin() const { return TYs.begin(); } 7905374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator type_end() const { return TYs.end(); } 7915374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman 7925374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned compile_unit_count() const { return CUs.size(); } 7935374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned global_variable_count() const { return GVs.size(); } 7945374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned subprogram_count() const { return SPs.size(); } 7955374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned type_count() const { return TYs.size(); } 796d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 797d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel private: 798e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> CUs; // Compile Units 799e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> SPs; // Subprograms 800e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> GVs; // Global Variables; 801e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> TYs; // Types 802e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallPtrSet<MDNode *, 64> NodesSeen; 803d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel }; 804a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner} // end namespace llvm 805a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 806a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner#endif 807