DebugInfo.h revision 47e2265a30d0a990839f81315ce6387c09d2c36b
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 17891415b5a248c72b94e6ff1022bcc1cab7813539Evan Cheng#ifndef LLVM_ANALYSIS_DEBUGINFO_H 18891415b5a248c72b94e6ff1022bcc1cab7813539Evan Cheng#define LLVM_ANALYSIS_DEBUGINFO_H 19a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 2013e16b65ddd679d6edb5f182d683701fdea37b85Devang Patel#include "llvm/ADT/SmallVector.h" 21d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel#include "llvm/ADT/SmallPtrSet.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; 36f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner class LLVMContext; 37504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman class raw_ostream; 38a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 39784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner /// DIDescriptor - A thin wraper around MDNode to access encoded debug info. 40784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner /// This should not be stored in a container, because underly MDNode may 41784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner /// change in certain situations. 42a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIDescriptor { 43f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar protected: 44e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel const MDNode *DbgNode; 45a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 4665dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getStringField(unsigned Elt) const; 47a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getUnsignedField(unsigned Elt) const { 48a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner return (unsigned)getUInt64Field(Elt); 49a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner } 50a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getUInt64Field(unsigned Elt) const; 51a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIDescriptor getDescriptorField(unsigned Elt) const; 52a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 53a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner template <typename DescTy> 54a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DescTy getFieldAs(unsigned Elt) const { 55ebe57f1b30870d46b48bf3bb22d7a88c780e9848Devang Patel return DescTy(getDescriptorField(Elt)); 56a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner } 57a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 58a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner GlobalVariable *getGlobalVariableField(unsigned Elt) const; 59a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 60a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 61e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel explicit DIDescriptor() : DbgNode(0) {} 62e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIDescriptor(const MDNode *N) : DbgNode(N) {} 63a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 643c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel bool Verify() const { return DbgNode != 0; } 65a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 66e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel operator MDNode *() const { return const_cast<MDNode*>(DbgNode); } 67e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel MDNode *operator ->() const { return const_cast<MDNode*>(DbgNode); } 682c1623ae0b041519fecdfdb97b1bda4708b6aeb6Devang Patel 698526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel unsigned getVersion() const { 706906ba52f050a6608502987e754a622f5c5111a6Devang Patel return getUnsignedField(0) & LLVMDebugVersionMask; 718526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel } 72a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 732c1623ae0b041519fecdfdb97b1bda4708b6aeb6Devang Patel unsigned getTag() const { 746906ba52f050a6608502987e754a622f5c5111a6Devang Patel return getUnsignedField(0) & ~LLVMDebugVersionMask; 752c1623ae0b041519fecdfdb97b1bda4708b6aeb6Devang Patel } 76a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 77504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print descriptor. 78504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 79504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 80504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print descriptor to dbgs() with a newline. 8116de0136404b7e4703e528ae6f641c6fb7ee2f8bBill Wendling void dump() const; 826ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel 836ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isDerivedType() const; 846ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isCompositeType() const; 856ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isBasicType() const; 866ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isVariable() const; 876ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isSubprogram() const; 886ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel bool isGlobalVariable() const; 8943d98b3c4ecd564d4666468983322c019819f730Devang Patel bool isScope() const; 907aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel bool isFile() const; 91c9f322d9a62c57ba965678a874faad6d239b9256Devang Patel bool isCompileUnit() const; 926404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel bool isNameSpace() const; 935e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel bool isLexicalBlock() const; 94ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isSubrange() const; 95ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isEnumerator() const; 96ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isType() const; 97ecbeb1a490ed6ef8f12e7a38471bdfc20942b0a3Devang Patel bool isGlobal() const; 98a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 99a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 10068afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel /// DISubrange - This is used to represent ranges, for array bounds. 10168afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel class DISubrange : public DIDescriptor { 10268afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel public: 103e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DISubrange(const MDNode *N = 0) : DIDescriptor(N) {} 104a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 10568afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel int64_t getLo() const { return (int64_t)getUInt64Field(1); } 10668afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel int64_t getHi() const { return (int64_t)getUInt64Field(2); } 10768afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel }; 108a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 109a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIArray - This descriptor holds an array of descriptors. 110a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIArray : public DIDescriptor { 111a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 112e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIArray(const MDNode *N = 0) 113e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel : DIDescriptor(N) {} 114a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 115a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getNumElements() const; 116a22d57d6f8215717298ae0cef34d00ab5104ddeaDevang Patel DIDescriptor getElement(unsigned Idx) const { 117a22d57d6f8215717298ae0cef34d00ab5104ddeaDevang Patel return getDescriptorField(Idx); 11868afdc3ab08975569e59cc8c04c2db9e9478a996Devang Patel } 119a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 120a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 12143d98b3c4ecd564d4666468983322c019819f730Devang Patel /// DIScope - A base class for various scopes. 12243d98b3c4ecd564d4666468983322c019819f730Devang Patel class DIScope : public DIDescriptor { 12343d98b3c4ecd564d4666468983322c019819f730Devang Patel public: 124e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {} 125e5b1454cdd8522831093128ddc7d7f81328d9f33Devang Patel virtual ~DIScope() {} 12658e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 12765dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getFilename() const; 12865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDirectory() const; 12943d98b3c4ecd564d4666468983322c019819f730Devang Patel }; 13043d98b3c4ecd564d4666468983322c019819f730Devang Patel 131a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DICompileUnit - A wrapper for a compile unit. 132c9f322d9a62c57ba965678a874faad6d239b9256Devang Patel class DICompileUnit : public DIScope { 133a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 134e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DICompileUnit(const MDNode *N = 0) : DIScope(N) {} 135a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 136a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getLanguage() const { return getUnsignedField(2); } 13765dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getFilename() const { return getStringField(3); } 13865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDirectory() const { return getStringField(4); } 13965dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getProducer() const { return getStringField(5); } 140f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 141dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel /// isMain - Each input file is encoded as a separate compile unit in LLVM 142dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel /// debugging information output. However, many target specific tool chains 143f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar /// prefer to encode only one compile unit in an object file. In this 144dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel /// situation, the LLVM code generator will include debugging information 145f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar /// entities in the compile unit that is marked as main compile unit. The 146dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel /// code generator accepts maximum one main compile unit per module. If a 147f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar /// module does not contain any main compile unit then the code generator 148dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel /// will emit multiple compile units in the output object file. 14913319ceffdd99d153e62011c5dda08b95e3279e3Devang Patel 15036375ee7a584343fabaf20630326f1848263bce6Devang Patel bool isMain() const { return getUnsignedField(6); } 15136375ee7a584343fabaf20630326f1848263bce6Devang Patel bool isOptimized() const { return getUnsignedField(7); } 15265dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getFlags() const { return getStringField(8); } 15313319ceffdd99d153e62011c5dda08b95e3279e3Devang Patel unsigned getRunTimeVersion() const { return getUnsignedField(9); } 154ce31b027e7891da951f1036465e8d82dd0bd3297Devang Patel 155b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a compile unit is well formed. 156b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 157bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 158504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print compile unit. 159504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 160504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 161504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print compile unit to dbgs() with a newline. 162bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 163a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 164a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 1657aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel /// DIFile - This is a wrapper for a file. 1667aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel class DIFile : public DIScope { 1677aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel public: 168e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIFile(const MDNode *N = 0) : DIScope(N) { 1697aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel if (DbgNode && !isFile()) 1707aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel DbgNode = 0; 1717aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel } 1727aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel StringRef getFilename() const { return getStringField(1); } 1737aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel StringRef getDirectory() const { return getStringField(2); } 1747aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); } 1757aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel }; 1767aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel 177a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}'). 178a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// FIXME: it seems strange that this doesn't have either a reference to the 179a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// type/precision or a file/line pair for location info. 180a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIEnumerator : public DIDescriptor { 181a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 182e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIEnumerator(const MDNode *N = 0) : DIDescriptor(N) {} 183a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 18465dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getName() const { return getStringField(1); } 1855ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel uint64_t getEnumValue() const { return getUInt64Field(2); } 186a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 187a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 188a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIType - This is a wrapper for a type. 189a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// FIXME: Types should be factored much better so that CV qualifiers and 190a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// others do not require a huge and empty descriptor full of zeros. 19177bf295dbb0b049fdec853ced0763084c43b2438Devang Patel class DIType : public DIScope { 1922a574669f3aed5951dcd62fa14c25dcde4d1a754Devang Patel public: 1932a574669f3aed5951dcd62fa14c25dcde4d1a754Devang Patel enum { 1943e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump FlagPrivate = 1 << 0, 1953e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump FlagProtected = 1 << 1, 1963e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump FlagFwdDecl = 1 << 2, 1973e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump FlagAppleBlock = 1 << 3, 1985d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel FlagBlockByrefStruct = 1 << 4, 199b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel FlagVirtual = 1 << 5, 200b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel FlagArtificial = 1 << 6 // To identify artificial arguments in 201b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel // a subroutine type. e.g. "this" in c++. 2022a574669f3aed5951dcd62fa14c25dcde4d1a754Devang Patel }; 2032a574669f3aed5951dcd62fa14c25dcde4d1a754Devang Patel 204a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner protected: 205a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // This ctor is used when the Tag has already been validated by a derived 206a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // ctor. 207e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DIType(const MDNode *N, bool, bool) : DIScope(N) {} 208486938f7a1d17a547c6c05565aacd6051fad47c9Devang Patel 209f193ff05909c2de373032f773e76804474b1ef4eDevang Patel public: 210486938f7a1d17a547c6c05565aacd6051fad47c9Devang Patel 211b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a type descriptor is well formed. 212b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 213a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 214e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIType(const MDNode *N); 215a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner explicit DIType() {} 2168526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel virtual ~DIType() {} 2178526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel 21877bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 2196404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel StringRef getName() const { return getStringField(2); } 2204b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DICompileUnit getCompileUnit() const{ 2214b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 2224b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return getFieldAs<DICompileUnit>(3); 2234b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel 2244b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F = getFieldAs<DIFile>(3); 2254b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return F.getCompileUnit(); 2264b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel } 227a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getLineNumber() const { return getUnsignedField(4); } 228a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getSizeInBits() const { return getUInt64Field(5); } 229a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getAlignInBits() const { return getUInt64Field(6); } 230a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // FIXME: Offset is only used for DW_TAG_member nodes. Making every type 231a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner // carry this is just plain insane. 232a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t getOffsetInBits() const { return getUInt64Field(7); } 233a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getFlags() const { return getUnsignedField(8); } 234e1f515ea59df5cb989c371604bba2271e6f3ee0dChris Lattner bool isPrivate() const { 235f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagPrivate) != 0; 236e2d5a6c3bb9b2c3bce78bb0143d8988bf6735d44Devang Patel } 237e1f515ea59df5cb989c371604bba2271e6f3ee0dChris Lattner bool isProtected() const { 238f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagProtected) != 0; 239e2d5a6c3bb9b2c3bce78bb0143d8988bf6735d44Devang Patel } 240e1f515ea59df5cb989c371604bba2271e6f3ee0dChris Lattner bool isForwardDecl() const { 241f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagFwdDecl) != 0; 242e2d5a6c3bb9b2c3bce78bb0143d8988bf6735d44Devang Patel } 243a1ba269a27ca9d776e6de77e8177fa8fa844bd5eDevang Patel // isAppleBlock - Return true if this is the Apple Blocks extension. 244a1ba269a27ca9d776e6de77e8177fa8fa844bd5eDevang Patel bool isAppleBlockExtension() const { 245f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return (getFlags() & FlagAppleBlock) != 0; 2468af76bdb7450b097efa17f7c192882111a9e8f10Devang Patel } 247dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice bool isBlockByrefStruct() const { 248dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice return (getFlags() & FlagBlockByrefStruct) != 0; 249dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice } 2505d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel bool isVirtual() const { 2515d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel return (getFlags() & FlagVirtual) != 0; 2525d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel } 253b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel bool isArtificial() const { 254b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel return (getFlags() & FlagArtificial) != 0; 255b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel } 2563c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel bool isValid() const { 2573c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel return DbgNode && (isBasicType() || isDerivedType() || isCompositeType()); 2583c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel } 25977bf295dbb0b049fdec853ced0763084c43b2438Devang Patel StringRef getFilename() const { return getCompileUnit().getFilename();} 26077bf295dbb0b049fdec853ced0763084c43b2438Devang Patel StringRef getDirectory() const { return getCompileUnit().getDirectory();} 261504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 262504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print type. 263504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 264504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 265504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print type to dbgs() with a newline. 266bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 267a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 268a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 269a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIBasicType - A basic type, like 'int' or 'float'. 270a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIBasicType : public DIType { 271a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 272e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIBasicType(const MDNode *N = 0) : DIType(N) {} 273dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 274a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getEncoding() const { return getUnsignedField(9); } 275bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 276504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print basic type. 277504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 278504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 279504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print basic type to dbgs() with a newline. 280bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 281a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 282a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 283a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIDerivedType - A simple derived type, like a const qualified type, 284a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// a typedef, a pointer or reference, etc. 285a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIDerivedType : public DIType { 286a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner protected: 287e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIDerivedType(const MDNode *N, bool, bool) 288e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel : DIType(N, true, true) {} 289a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 290e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIDerivedType(const MDNode *N = 0) 291f17f5ebbdcd67966f7841c3597d750756d5bbd38Devang Patel : DIType(N, true, true) {} 292dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 293a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); } 294bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 29536375ee7a584343fabaf20630326f1848263bce6Devang Patel /// getOriginalTypeSize - If this type is derived from a base type then 29636375ee7a584343fabaf20630326f1848263bce6Devang Patel /// return base type size. 29736375ee7a584343fabaf20630326f1848263bce6Devang Patel uint64_t getOriginalTypeSize() const; 298504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 299504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print derived type. 300504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 301504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 302504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print derived type to dbgs() with a newline. 303bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 304c4999d71e162bab8c38fe104554a3b81b4f08771Devang Patel 305c4999d71e162bab8c38fe104554a3b81b4f08771Devang Patel /// replaceAllUsesWith - Replace all uses of debug info referenced by 306c4999d71e162bab8c38fe104554a3b81b4f08771Devang Patel /// this descriptor. After this completes, the current debug info value 307c4999d71e162bab8c38fe104554a3b81b4f08771Devang Patel /// is erased. 308c4999d71e162bab8c38fe104554a3b81b4f08771Devang Patel void replaceAllUsesWith(DIDescriptor &D); 309a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 310a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 311a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DICompositeType - This descriptor holds a type that can refer to multiple 312a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// other types, like a function or struct. 313a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// FIXME: Why is this a DIDerivedType?? 314a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DICompositeType : public DIDerivedType { 315a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 316e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DICompositeType(const MDNode *N = 0) 317e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel : DIDerivedType(N, true, true) { 3186ceea33c5e5c00069453e48740aaef5fe1c0953bDevang Patel if (N && !isCompositeType()) 319e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel DbgNode = 0; 320dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling } 321dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 322a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIArray getTypeArray() const { return getFieldAs<DIArray>(10); } 32313319ceffdd99d153e62011c5dda08b95e3279e3Devang Patel unsigned getRunTimeLang() const { return getUnsignedField(11); } 3240fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel DICompositeType getContainingType() const { 3250fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel return getFieldAs<DICompositeType>(12); 3260fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel } 327b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 328b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a composite type descriptor is well formed. 329b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 330bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 331504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print composite type. 332504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 333504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 334504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print composite type to dbgs() with a newline. 335bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 336a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 337a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 338a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIGlobal - This is a common class for global variables and subprograms. 339a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIGlobal : public DIDescriptor { 340a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner protected: 341e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIGlobal(const MDNode *N) : DIDescriptor(N) {} 342486938f7a1d17a547c6c05565aacd6051fad47c9Devang Patel 343a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 3448526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel virtual ~DIGlobal() {} 3458526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel 34677bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(2); } 34765dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getName() const { return getStringField(3); } 34865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDisplayName() const { return getStringField(4); } 34965dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getLinkageName() const { return getStringField(5); } 3504b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DICompileUnit getCompileUnit() const{ 3514b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 3524b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return getFieldAs<DICompileUnit>(6); 3534b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel 3544b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F = getFieldAs<DIFile>(6); 3554b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return F.getCompileUnit(); 3564b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel } 3574b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel 358a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getLineNumber() const { return getUnsignedField(7); } 359a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIType getType() const { return getFieldAs<DIType>(8); } 360a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 361a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// isLocalToUnit - Return true if this subprogram is local to the current 362a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// compile unit, like 'static' in C. 363a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned isLocalToUnit() const { return getUnsignedField(9); } 364a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned isDefinition() const { return getUnsignedField(10); } 3658526cc03a51347ab29737d1e5682aa6a7d095b9bDevang Patel 366504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print global. 367504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 368504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 369504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print global to dbgs() with a newline. 370bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 371a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 372a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 373a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DISubprogram - This is a wrapper for a subprogram (e.g. a function). 37482dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel class DISubprogram : public DIScope { 375a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 376e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DISubprogram(const MDNode *N = 0) : DIScope(N) {} 377dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 37877bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(2); } 37965dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getName() const { return getStringField(3); } 38065dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDisplayName() const { return getStringField(4); } 38165dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getLinkageName() const { return getStringField(5); } 3824b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DICompileUnit getCompileUnit() const{ 3834b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 3844b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return getFieldAs<DICompileUnit>(6); 3854b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel 3864b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F = getFieldAs<DIFile>(6); 3874b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return F.getCompileUnit(); 3884b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel } 38982dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel unsigned getLineNumber() const { return getUnsignedField(7); } 39086ae142c51fc29ab870ebf42f6bf8699bca81512Devang Patel DICompositeType getType() const { return getFieldAs<DICompositeType>(8); } 391b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 3920de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel /// getReturnTypeName - Subprogram return types are encoded either as 3930de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel /// DIType or as DICompositeType. 39465dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getReturnTypeName() const { 3950de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel DICompositeType DCT(getFieldAs<DICompositeType>(8)); 3963c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel if (DCT.Verify()) { 3970de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel DIArray A = DCT.getTypeArray(); 3982db49d797b86b7f3615bae17b2b016727778a6c4Devang Patel DIType T(A.getElement(0)); 3995ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel return T.getName(); 4000de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel } 4010de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel DIType T(getFieldAs<DIType>(8)); 4025ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel return T.getName(); 4030de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel } 4040de4fa621e60a542d9bd43c09bd596ba452f035cDevang Patel 40582dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel /// isLocalToUnit - Return true if this subprogram is local to the current 40682dfc0cd8c3c2bf780a13cc35c1a8df7ad137477Devang Patel /// compile unit, like 'static' in C. 4075ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel unsigned isLocalToUnit() const { return getUnsignedField(9); } 4085ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel unsigned isDefinition() const { return getUnsignedField(10); } 4095d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel 410f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner unsigned getVirtuality() const { return getUnsignedField(11); } 411f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner unsigned getVirtualIndex() const { return getUnsignedField(12); } 4125d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel 4135d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel DICompositeType getContainingType() const { 4145d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel return getFieldAs<DICompositeType>(13); 4155d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel } 4164e0d19dfd9ab77f9974cb07320dfe4f7f5ffd7b9Devang Patel unsigned isArtificial() const { return getUnsignedField(14); } 417ccff812777470d294b7d7407783ccb6111ca0d10Devang Patel unsigned isOptimized() const; 4185d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel 4198fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel StringRef getFilename() const { 4208fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 4218fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel return getCompileUnit().getFilename(); 4228fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel 4238fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel DIFile F = getFieldAs<DIFile>(6); 4248fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel return F.getFilename(); 4258fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel } 4268fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel 4278fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel StringRef getDirectory() const { 4288fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 4298fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel return getCompileUnit().getFilename(); 4308fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel 4318fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel DIFile F = getFieldAs<DIFile>(6); 4328fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel return F.getDirectory(); 4338fe7979c416cc5aad167329a2d7e7f5000f445feDevang Patel } 43458e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 435b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a subprogram descriptor is well formed. 436b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 437bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 438504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print subprogram. 439504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 440504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 441504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print subprogram to dbgs() with a newline. 442bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 443af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel 444af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel /// describes - Return true if this subprogram provides debugging 445af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel /// information for the function F. 446af5b6bb6a539f1d4cc3b0f0e10b3c3c9267bbfd1Devang Patel bool describes(const Function *F); 447a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 448a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 449a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIGlobalVariable - This is a wrapper for a global variable. 450a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIGlobalVariable : public DIGlobal { 451a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 452e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIGlobalVariable(const MDNode *N = 0) : DIGlobal(N) {} 453dc817b6f4220ea386f9621800d64f4c0e36f75c7Bill Wendling 454a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner GlobalVariable *getGlobal() const { return getGlobalVariableField(11); } 455b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 456b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a global variable descriptor is well formed. 457b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 458bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 459504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print global variable. 460504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 461504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 462504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print global variable to dbgs() with a newline. 463bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 464a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 465a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 466a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIVariable - This is a wrapper for a variable (e.g. parameter, local, 467a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// global etc). 468a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIVariable : public DIDescriptor { 469a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 470e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DIVariable(const MDNode *N = 0) 471f17f5ebbdcd67966f7841c3597d750756d5bbd38Devang Patel : DIDescriptor(N) {} 472a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 47377bf295dbb0b049fdec853ced0763084c43b2438Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 47477bf295dbb0b049fdec853ced0763084c43b2438Devang Patel StringRef getName() const { return getStringField(2); } 4754b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DICompileUnit getCompileUnit() const{ 4764b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 4774b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return getFieldAs<DICompileUnit>(3); 4784b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel 4794b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F = getFieldAs<DIFile>(3); 4804b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return F.getCompileUnit(); 4814b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel } 482a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned getLineNumber() const { return getUnsignedField(4); } 483a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIType getType() const { return getFieldAs<DIType>(5); } 484a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 485b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel 486b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel /// Verify - Verify that a variable descriptor is well formed. 487b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel bool Verify() const; 488bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel 4893e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump /// HasComplexAddr - Return true if the variable has a complex address. 4903e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump bool hasComplexAddress() const { 4913e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump return getNumAddrElements() > 0; 4923e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump } 4933e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump 494f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner unsigned getNumAddrElements() const; 495f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner 4963e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump uint64_t getAddrElement(unsigned Idx) const { 4973e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump return getUInt64Field(Idx+6); 4983e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump } 4993e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump 500dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice /// isBlockByrefVariable - Return true if the variable was declared as 501dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice /// a "__block" variable (Apple Blocks). 502f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar bool isBlockByrefVariable() const { 503f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar return getType().isBlockByrefStruct(); 504dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice } 505dc8f6049d11ee73835c7b7e9b7c6d0b9e6a2c9b1Caroline Tice 50622070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel /// isInlinedFnArgument - Return trule if this variable provides debugging 50722070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel /// information for an inlined function arguments. 50822070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel bool isInlinedFnArgument(const Function *CurFn); 50922070e88f2550dc31f02273b3fa78e4e9847996bDevang Patel 510504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// print - print variable. 511504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman void print(raw_ostream &OS) const; 512504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman 513504043662ced71235b7c7d4ae3ce3cee898cb391Dan Gohman /// dump - print variable to dbgs() with a newline. 514bf3f5a08eed98e723e920a06a0cde9699593aa41Devang Patel void dump() const; 515a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 516a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 5175e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel /// DILexicalBlock - This is a wrapper for a lexical block. 5185e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel class DILexicalBlock : public DIScope { 519a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 520e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DILexicalBlock(const MDNode *N = 0) : DIScope(N) {} 5213d821aaae238534132df3982d703e758e91472cfDevang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 5223d821aaae238534132df3982d703e758e91472cfDevang Patel StringRef getDirectory() const { return getContext().getDirectory(); } 5233d821aaae238534132df3982d703e758e91472cfDevang Patel StringRef getFilename() const { return getContext().getFilename(); } 5243d821aaae238534132df3982d703e758e91472cfDevang Patel unsigned getLineNumber() const { return getUnsignedField(2); } 5253d821aaae238534132df3982d703e758e91472cfDevang Patel unsigned getColumnNumber() const { return getUnsignedField(3); } 526f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel }; 52758e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 5286404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel /// DINameSpace - A wrapper for a C++ style name space. 5296404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel class DINameSpace : public DIScope { 5306404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel public: 531e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DINameSpace(const MDNode *N = 0) : DIScope(N) {} 5326404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel DIScope getContext() const { return getFieldAs<DIScope>(1); } 5336404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel StringRef getName() const { return getStringField(2); } 5346404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel StringRef getDirectory() const { return getContext().getDirectory(); } 5356404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel StringRef getFilename() const { return getContext().getFilename(); } 5364b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DICompileUnit getCompileUnit() const{ 5374b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel if (getVersion() == llvm::LLVMDebugVersion7) 5384b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return getFieldAs<DICompileUnit>(3); 5394b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel 5404b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F = getFieldAs<DIFile>(3); 5414b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel return F.getCompileUnit(); 5424b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel } 5436404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel unsigned getLineNumber() const { return getUnsignedField(4); } 54447e2265a30d0a990839f81315ce6387c09d2c36bDevang Patel bool Verify() const; 5456404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel }; 5466404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel 547f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel /// DILocation - This object holds location information. This object 548f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel /// is not associated with any DWARF tag. 549f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel class DILocation : public DIDescriptor { 550f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel public: 551e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel explicit DILocation(const MDNode *N) : DIDescriptor(N) { } 55258e7a2dfc2e0203abb5a4637bd0fcf9c1992fb95Devang Patel 553f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel unsigned getLineNumber() const { return getUnsignedField(0); } 554f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel unsigned getColumnNumber() const { return getUnsignedField(1); } 5555ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel DIScope getScope() const { return getFieldAs<DIScope>(2); } 5565ccdd10b1a0ee1ce35b6e5a18eb0fcfd6f5131d3Devang Patel DILocation getOrigLocation() const { return getFieldAs<DILocation>(3); } 55765dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getFilename() const { return getScope().getFilename(); } 55865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef getDirectory() const { return getScope().getDirectory(); } 5593c91b05d2b1751b9e4e21fd958d358ec463dcd3cDevang Patel bool Verify() const; 560a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 561a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 562a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// DIFactory - This object assists with the construction of the various 563a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// descriptors. 564a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner class DIFactory { 565a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner Module &M; 5669903527c142a37a25ea3b2212cb04a182331fbfaOwen Anderson LLVMContext& VMContext; 567f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 568a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner Function *DeclareFn; // llvm.dbg.declare 5692f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez Function *ValueFn; // llvm.dbg.value 570a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 571a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIFactory(const DIFactory &); // DO NOT IMPLEMENT 572a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner void operator=(const DIFactory&); // DO NOT IMPLEMENT 573a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner public: 5743e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump enum ComplexAddrKind { OpPlus=1, OpDeref }; 5753e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump 576497a7a81a806748b7a49b529b6da4040da0a3832Chris Lattner explicit DIFactory(Module &m); 577a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 578f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar /// GetOrCreateArray - Create an descriptor for an array of descriptors. 579a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// This implicitly uniques the arrays created. 580a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIArray GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys); 581a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 582a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// GetOrCreateSubrange - Create a descriptor for a value range. This 583a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// implicitly uniques the values returned. 584a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DISubrange GetOrCreateSubrange(int64_t Lo, int64_t Hi); 585a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 586a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateCompileUnit - Create a new descriptor for the specified compile 587a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// unit. 588a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DICompileUnit CreateCompileUnit(unsigned LangID, 58965dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Filename, 59065dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Directory, 59165dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Producer, 592dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel bool isMain = false, 5933b64c6bc2916bc62a99ef8a2995a426d994e1a04Devang Patel bool isOptimized = false, 59465dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Flags = "", 59513319ceffdd99d153e62011c5dda08b95e3279e3Devang Patel unsigned RunTimeVer = 0); 596a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 5977aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel /// CreateFile - Create a new descriptor for the specified file. 5987aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel DIFile CreateFile(StringRef Filename, StringRef Directory, DICompileUnit CU); 5997aa81897066a20ace12c8f61ae0e5a253fb64dc2Devang Patel 600a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateEnumerator - Create a single enumerator value. 60165dbc909f5377947026a41f29420bb8112bdf611Devang Patel DIEnumerator CreateEnumerator(StringRef Name, uint64_t Val); 602a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 603a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateBasicType - Create a basic type like int, float, etc. 60465dbc909f5377947026a41f29420bb8112bdf611Devang Patel DIBasicType CreateBasicType(DIDescriptor Context, StringRef Name, 6054b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, unsigned LineNumber, 606a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t SizeInBits, uint64_t AlignInBits, 607a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t OffsetInBits, unsigned Flags, 608dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel unsigned Encoding); 609a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 610ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel /// CreateBasicType - Create a basic type like int, float, etc. 61165dbc909f5377947026a41f29420bb8112bdf611Devang Patel DIBasicType CreateBasicTypeEx(DIDescriptor Context, StringRef Name, 6124b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, unsigned LineNumber, 613ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel Constant *SizeInBits, Constant *AlignInBits, 614ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel Constant *OffsetInBits, unsigned Flags, 615ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel unsigned Encoding); 616ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel 617a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateDerivedType - Create a derived type like const qualified type, 618a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// pointer, typedef, etc. 619a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIDerivedType CreateDerivedType(unsigned Tag, DIDescriptor Context, 62065dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Name, 6214b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, 622a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned LineNumber, 623a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t SizeInBits, uint64_t AlignInBits, 624a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t OffsetInBits, unsigned Flags, 625dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel DIType DerivedFrom); 626a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 627ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel /// CreateDerivedType - Create a derived type like const qualified type, 628ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel /// pointer, typedef, etc. 629ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel DIDerivedType CreateDerivedTypeEx(unsigned Tag, DIDescriptor Context, 6304b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel StringRef Name, 6314b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, 6324b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel unsigned LineNumber, 6334b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel Constant *SizeInBits, 6344b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel Constant *AlignInBits, 6354b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel Constant *OffsetInBits, unsigned Flags, 6364b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIType DerivedFrom); 637ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel 638a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateCompositeType - Create a composite type like array, struct, etc. 639a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context, 64065dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Name, 6414b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, 642a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner unsigned LineNumber, 643a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t SizeInBits, 644a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t AlignInBits, 645a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner uint64_t OffsetInBits, unsigned Flags, 646a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIType DerivedFrom, 64713319ceffdd99d153e62011c5dda08b95e3279e3Devang Patel DIArray Elements, 6480fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel unsigned RunTimeLang = 0, 6490fd7f9d7ffea48aa9c4965132ade33cf28f973eaDevang Patel MDNode *ContainingType = 0); 650a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 651b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel /// CreateArtificialType - Create a new DIType with "artificial" flag set. 652b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel DIType CreateArtificialType(DIType Ty); 653b4645643de240e5b3461b03a9c6950fefe1538acDevang Patel 654ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel /// CreateCompositeType - Create a composite type like array, struct, etc. 655ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel DICompositeType CreateCompositeTypeEx(unsigned Tag, DIDescriptor Context, 6564b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel StringRef Name, 6574b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, 6584b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel unsigned LineNumber, 6594b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel Constant *SizeInBits, 6604b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel Constant *AlignInBits, 6614b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel Constant *OffsetInBits, 6624b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel unsigned Flags, 6634b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIType DerivedFrom, 6644b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIArray Elements, 6654b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel unsigned RunTimeLang = 0); 666ac16d44e58e74bb0b5cecf3ec5e8d7de315f7d95Devang Patel 667a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateSubprogram - Create a new descriptor for the specified subprogram. 668a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// See comments in DISubprogram for descriptions of these fields. 66965dbc909f5377947026a41f29420bb8112bdf611Devang Patel DISubprogram CreateSubprogram(DIDescriptor Context, StringRef Name, 67065dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef DisplayName, 67165dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef LinkageName, 6724b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, unsigned LineNo, 6732e369930dc9e36728f7953a238d63925d3660612Devang Patel DIType Ty, bool isLocalToUnit, 6745d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel bool isDefinition, 6755d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel unsigned VK = 0, 6765d11eb0ed54116b7f33507999617661fb2ae99dfDevang Patel unsigned VIndex = 0, 6774e0d19dfd9ab77f9974cb07320dfe4f7f5ffd7b9Devang Patel DIType = DIType(), 678ccff812777470d294b7d7407783ccb6111ca0d10Devang Patel bool isArtificial = 0, 679ccff812777470d294b7d7407783ccb6111ca0d10Devang Patel bool isOptimized = false); 680a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 681e3a18de4f66a90040fb67495578652e36a886af5Devang Patel /// CreateSubprogramDefinition - Create new subprogram descriptor for the 682e3a18de4f66a90040fb67495578652e36a886af5Devang Patel /// given declaration. 683e3a18de4f66a90040fb67495578652e36a886af5Devang Patel DISubprogram CreateSubprogramDefinition(DISubprogram &SPDeclaration); 684e3a18de4f66a90040fb67495578652e36a886af5Devang Patel 685a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateGlobalVariable - Create a new descriptor for the specified global. 686a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIGlobalVariable 68765dbc909f5377947026a41f29420bb8112bdf611Devang Patel CreateGlobalVariable(DIDescriptor Context, StringRef Name, 68865dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef DisplayName, 68965dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef LinkageName, 6904b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, 6912e369930dc9e36728f7953a238d63925d3660612Devang Patel unsigned LineNo, DIType Ty, bool isLocalToUnit, 692dd9db6688283639a0c95f8ed67beb1bd54b5fff4Devang Patel bool isDefinition, llvm::GlobalVariable *GV); 693a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 694a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// CreateVariable - Create a new descriptor for the specified variable. 695a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner DIVariable CreateVariable(unsigned Tag, DIDescriptor Context, 69665dbc909f5377947026a41f29420bb8112bdf611Devang Patel StringRef Name, 6974b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, unsigned LineNo, 6982e369930dc9e36728f7953a238d63925d3660612Devang Patel DIType Ty); 699a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 7003e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump /// CreateComplexVariable - Create a new descriptor for the specified 7013e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump /// variable which has a complex address expression for its address. 7023e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump DIVariable CreateComplexVariable(unsigned Tag, DIDescriptor Context, 7033e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump const std::string &Name, 7044b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, unsigned LineNo, 7052e369930dc9e36728f7953a238d63925d3660612Devang Patel DIType Ty, 7063e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump SmallVector<Value *, 9> &addr); 7073e4c9bdb67db9b6d65b17d474e3268b520a93514Mike Stump 708f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar /// CreateLexicalBlock - This creates a descriptor for a lexical block 7095e005d814f13f1796cf9e32c7525a5241fface1aDevang Patel /// with the specified parent context. 7103d821aaae238534132df3982d703e758e91472cfDevang Patel DILexicalBlock CreateLexicalBlock(DIDescriptor Context, unsigned Line = 0, 7113d821aaae238534132df3982d703e758e91472cfDevang Patel unsigned Col = 0); 712a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 7136404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel /// CreateNameSpace - This creates new descriptor for a namespace 7146404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel /// with the specified parent context. 7156404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel DINameSpace CreateNameSpace(DIDescriptor Context, StringRef Name, 7164b945500a5eb1b32ee8004e40e386105ee5815ebDevang Patel DIFile F, unsigned LineNo); 7176404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel 718f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel /// CreateLocation - Creates a debug info location. 719f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo, 7203fc19bbbbb6b215a7417dfe63c9cb59519bcfde7Daniel Dunbar DIScope S, DILocation OrigLoc); 721f98d8fee3c5367622cf03e52f1e1b2251ac6cf3fDevang Patel 722e54a5e88a57a78b1e24430f27bdf0a8f7f0e8e23Devang Patel /// CreateLocation - Creates a debug info location. 723e54a5e88a57a78b1e24430f27bdf0a8f7f0e8e23Devang Patel DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo, 724e54a5e88a57a78b1e24430f27bdf0a8f7f0e8e23Devang Patel DIScope S, MDNode *OrigLoc = 0); 725e54a5e88a57a78b1e24430f27bdf0a8f7f0e8e23Devang Patel 726a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call. 7276daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D, 7286daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel BasicBlock *InsertAtEnd); 729e4250396ea254b374436e94f391f1adb9bd94d20Mike Stump 730e4250396ea254b374436e94f391f1adb9bd94d20Mike Stump /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call. 7316daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D, 7326daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel Instruction *InsertBefore); 733a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 734c59b33562c84cb627e456fa979df2242f81b5a87Victor Hernandez /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 7355b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset, 736c59b33562c84cb627e456fa979df2242f81b5a87Victor Hernandez DIVariable D, BasicBlock *InsertAtEnd); 7372f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez 738c59b33562c84cb627e456fa979df2242f81b5a87Victor Hernandez /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 7395b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset, 740c59b33562c84cb627e456fa979df2242f81b5a87Victor Hernandez DIVariable D, Instruction *InsertBefore); 741a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner private: 742a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner Constant *GetTagConstant(unsigned TAG); 743a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner }; 744a913f4fca947c195a675e04ba625fe9e67d1a865Devang Patel 745784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner bool getLocationInfo(const Value *V, std::string &DisplayName, 746784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner std::string &Type, unsigned &LineNo, std::string &File, 747784b850e320c783ce402d5d8bbbb4b0a3ad4b69cChris Lattner std::string &Dir); 74813e16b65ddd679d6edb5f182d683701fdea37b85Devang Patel 749193f720f118f52eb05de172d936a440f335c1469Devang Patel /// getDISubprogram - Find subprogram that is enclosing this scope. 750e9f8f5e6004fd49f2aff4dd23db8e9b0e4454fc6Devang Patel DISubprogram getDISubprogram(const MDNode *Scope); 751193f720f118f52eb05de172d936a440f335c1469Devang Patel 752193f720f118f52eb05de172d936a440f335c1469Devang Patel /// getDICompositeType - Find underlying composite type. 753193f720f118f52eb05de172d936a440f335c1469Devang Patel DICompositeType getDICompositeType(DIType T); 754193f720f118f52eb05de172d936a440f335c1469Devang Patel 75598c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel class DebugInfoFinder { 756d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel public: 75798c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel /// processModule - Process entire module and collect debug info 758d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel /// anchors. 75998c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel void processModule(Module &M); 760f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 761d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel private: 76298c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel /// processType - Process DIType. 76398c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel void processType(DIType DT); 764d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 765beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel /// processLexicalBlock - Process DILexicalBlock. 766beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel void processLexicalBlock(DILexicalBlock LB); 767beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel 768beab41b874c3f15df848f9953e8e2c99182b1df8Devang Patel /// processSubprogram - Process DISubprogram. 76998c65173bb27e1df4ebe87f8c864d6dc197209caDevang Patel void processSubprogram(DISubprogram SP); 770d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 771b4d31306a4f9e84a7ab6ace99964634adb4bf7e6Devang Patel /// processDeclare - Process DbgDeclareInst. 772b4d31306a4f9e84a7ab6ace99964634adb4bf7e6Devang Patel void processDeclare(DbgDeclareInst *DDI); 773b4d31306a4f9e84a7ab6ace99964634adb4bf7e6Devang Patel 7746daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel /// processLocation - Process DILocation. 7756daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel void processLocation(DILocation Loc); 7766daf99bf8fa7572fac271bbcd0a8da44ffc2df44Devang Patel 777d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel /// addCompileUnit - Add compile unit into CUs. 778d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel bool addCompileUnit(DICompileUnit CU); 779f612ff6cfbf3a59842732f0280807c0714ab9025Daniel Dunbar 780d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel /// addGlobalVariable - Add global variable into GVs. 781d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel bool addGlobalVariable(DIGlobalVariable DIG); 782d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 783d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel // addSubprogram - Add subprgoram into SPs. 784d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel bool addSubprogram(DISubprogram SP); 785d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 78672bcdb6c9b5456cf6687c9066ae9d220ebedd80aDevang Patel /// addType - Add type into Tys. 78772bcdb6c9b5456cf6687c9066ae9d220ebedd80aDevang Patel bool addType(DIType DT); 78872bcdb6c9b5456cf6687c9066ae9d220ebedd80aDevang Patel 789d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel public: 7905374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman typedef SmallVector<MDNode *, 8>::const_iterator iterator; 7915374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator compile_unit_begin() const { return CUs.begin(); } 7925374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator compile_unit_end() const { return CUs.end(); } 7935374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator subprogram_begin() const { return SPs.begin(); } 7945374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator subprogram_end() const { return SPs.end(); } 7955374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator global_variable_begin() const { return GVs.begin(); } 7965374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator global_variable_end() const { return GVs.end(); } 7975374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator type_begin() const { return TYs.begin(); } 7985374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman iterator type_end() const { return TYs.end(); } 7995374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman 8005374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned compile_unit_count() const { return CUs.size(); } 8015374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned global_variable_count() const { return GVs.size(); } 8025374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned subprogram_count() const { return SPs.size(); } 8035374195cd74b481681f41d5e1b03e5ba69c9dad0Dan Gohman unsigned type_count() const { return TYs.size(); } 804d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel 805d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel private: 806e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> CUs; // Compile Units 807e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> SPs; // Subprograms 808e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> GVs; // Global Variables; 809e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallVector<MDNode *, 8> TYs; // Types 810e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel SmallPtrSet<MDNode *, 64> NodesSeen; 811d2f79a13463f8797fbffa0e5d577c5bddc9126fbDevang Patel }; 812a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner} // end namespace llvm 813a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner 814a45664f7091d988d8ff3966a845bf672062e1e7aChris Lattner#endif 815