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