Home | History | Annotate | Download | only in Analysis
      1 //===--- llvm/Analysis/DebugInfo.h - Debug Information Helpers --*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines a bunch of datatypes that are useful for creating and
     11 // walking debug info in LLVM IR form. They essentially provide wrappers around
     12 // the information in the global variables that's needed when constructing the
     13 // DWARF information.
     14 //
     15 //===----------------------------------------------------------------------===//
     16 
     17 #ifndef LLVM_ANALYSIS_DEBUGINFO_H
     18 #define LLVM_ANALYSIS_DEBUGINFO_H
     19 
     20 #include "llvm/ADT/SmallVector.h"
     21 #include "llvm/ADT/SmallPtrSet.h"
     22 #include "llvm/ADT/StringRef.h"
     23 #include "llvm/Support/Dwarf.h"
     24 
     25 namespace llvm {
     26   class BasicBlock;
     27   class Constant;
     28   class Function;
     29   class GlobalVariable;
     30   class Module;
     31   class Type;
     32   class Value;
     33   class DbgDeclareInst;
     34   class Instruction;
     35   class MDNode;
     36   class NamedMDNode;
     37   class LLVMContext;
     38   class raw_ostream;
     39 
     40   class DIFile;
     41   class DISubprogram;
     42   class DILexicalBlock;
     43   class DILexicalBlockFile;
     44   class DIVariable;
     45   class DIType;
     46 
     47   /// DIDescriptor - A thin wraper around MDNode to access encoded debug info.
     48   /// This should not be stored in a container, because underly MDNode may
     49   /// change in certain situations.
     50   class DIDescriptor {
     51   public:
     52     enum {
     53       FlagPrivate            = 1 << 0,
     54       FlagProtected          = 1 << 1,
     55       FlagFwdDecl            = 1 << 2,
     56       FlagAppleBlock         = 1 << 3,
     57       FlagBlockByrefStruct   = 1 << 4,
     58       FlagVirtual            = 1 << 5,
     59       FlagArtificial         = 1 << 6,
     60       FlagExplicit           = 1 << 7,
     61       FlagPrototyped         = 1 << 8,
     62       FlagObjcClassComplete  = 1 << 9
     63     };
     64   protected:
     65     const MDNode *DbgNode;
     66 
     67     StringRef getStringField(unsigned Elt) const;
     68     unsigned getUnsignedField(unsigned Elt) const {
     69       return (unsigned)getUInt64Field(Elt);
     70     }
     71     uint64_t getUInt64Field(unsigned Elt) const;
     72     DIDescriptor getDescriptorField(unsigned Elt) const;
     73 
     74     template <typename DescTy>
     75     DescTy getFieldAs(unsigned Elt) const {
     76       return DescTy(getDescriptorField(Elt));
     77     }
     78 
     79     GlobalVariable *getGlobalVariableField(unsigned Elt) const;
     80     Constant *getConstantField(unsigned Elt) const;
     81     Function *getFunctionField(unsigned Elt) const;
     82 
     83   public:
     84     explicit DIDescriptor() : DbgNode(0) {}
     85     explicit DIDescriptor(const MDNode *N) : DbgNode(N) {}
     86     explicit DIDescriptor(const DIFile F);
     87     explicit DIDescriptor(const DISubprogram F);
     88     explicit DIDescriptor(const DILexicalBlockFile F);
     89     explicit DIDescriptor(const DILexicalBlock F);
     90     explicit DIDescriptor(const DIVariable F);
     91     explicit DIDescriptor(const DIType F);
     92 
     93     bool Verify() const { return DbgNode != 0; }
     94 
     95     operator MDNode *() const { return const_cast<MDNode*>(DbgNode); }
     96     MDNode *operator ->() const { return const_cast<MDNode*>(DbgNode); }
     97 
     98     unsigned getVersion() const {
     99       return getUnsignedField(0) & LLVMDebugVersionMask;
    100     }
    101 
    102     unsigned getTag() const {
    103       return getUnsignedField(0) & ~LLVMDebugVersionMask;
    104     }
    105 
    106     /// print - print descriptor.
    107     void print(raw_ostream &OS) const;
    108 
    109     /// dump - print descriptor to dbgs() with a newline.
    110     void dump() const;
    111 
    112     bool isDerivedType() const;
    113     bool isCompositeType() const;
    114     bool isBasicType() const;
    115     bool isVariable() const;
    116     bool isSubprogram() const;
    117     bool isGlobalVariable() const;
    118     bool isScope() const;
    119     bool isFile() const;
    120     bool isCompileUnit() const;
    121     bool isNameSpace() const;
    122     bool isLexicalBlockFile() const;
    123     bool isLexicalBlock() const;
    124     bool isSubrange() const;
    125     bool isEnumerator() const;
    126     bool isType() const;
    127     bool isGlobal() const;
    128     bool isUnspecifiedParameter() const;
    129     bool isTemplateTypeParameter() const;
    130     bool isTemplateValueParameter() const;
    131   };
    132 
    133   /// DISubrange - This is used to represent ranges, for array bounds.
    134   class DISubrange : public DIDescriptor {
    135   public:
    136     explicit DISubrange(const MDNode *N = 0) : DIDescriptor(N) {}
    137 
    138     int64_t getLo() const { return (int64_t)getUInt64Field(1); }
    139     int64_t getHi() const { return (int64_t)getUInt64Field(2); }
    140   };
    141 
    142   /// DIArray - This descriptor holds an array of descriptors.
    143   class DIArray : public DIDescriptor {
    144   public:
    145     explicit DIArray(const MDNode *N = 0)
    146       : DIDescriptor(N) {}
    147 
    148     unsigned getNumElements() const;
    149     DIDescriptor getElement(unsigned Idx) const {
    150       return getDescriptorField(Idx);
    151     }
    152   };
    153 
    154   /// DIScope - A base class for various scopes.
    155   class DIScope : public DIDescriptor {
    156   public:
    157     explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {}
    158     virtual ~DIScope() {}
    159 
    160     StringRef getFilename() const;
    161     StringRef getDirectory() const;
    162   };
    163 
    164   /// DICompileUnit - A wrapper for a compile unit.
    165   class DICompileUnit : public DIScope {
    166   public:
    167     explicit DICompileUnit(const MDNode *N = 0) : DIScope(N) {}
    168 
    169     unsigned getLanguage() const   { return getUnsignedField(2); }
    170     StringRef getFilename() const  { return getStringField(3);   }
    171     StringRef getDirectory() const { return getStringField(4);   }
    172     StringRef getProducer() const  { return getStringField(5);   }
    173 
    174     /// isMain - Each input file is encoded as a separate compile unit in LLVM
    175     /// debugging information output. However, many target specific tool chains
    176     /// prefer to encode only one compile unit in an object file. In this
    177     /// situation, the LLVM code generator will include  debugging information
    178     /// entities in the compile unit that is marked as main compile unit. The
    179     /// code generator accepts maximum one main compile unit per module. If a
    180     /// module does not contain any main compile unit then the code generator
    181     /// will emit multiple compile units in the output object file.
    182 
    183     bool isMain() const                { return getUnsignedField(6) != 0; }
    184     bool isOptimized() const           { return getUnsignedField(7) != 0; }
    185     StringRef getFlags() const       { return getStringField(8);   }
    186     unsigned getRunTimeVersion() const { return getUnsignedField(9); }
    187 
    188     DIArray getEnumTypes() const;
    189     DIArray getRetainedTypes() const;
    190     DIArray getSubprograms() const;
    191     DIArray getGlobalVariables() const;
    192 
    193     /// Verify - Verify that a compile unit is well formed.
    194     bool Verify() const;
    195 
    196     /// print - print compile unit.
    197     void print(raw_ostream &OS) const;
    198 
    199     /// dump - print compile unit to dbgs() with a newline.
    200     void dump() const;
    201   };
    202 
    203   /// DIFile - This is a wrapper for a file.
    204   class DIFile : public DIScope {
    205   public:
    206     explicit DIFile(const MDNode *N = 0) : DIScope(N) {
    207       if (DbgNode && !isFile())
    208         DbgNode = 0;
    209     }
    210     StringRef getFilename() const  { return getStringField(1);   }
    211     StringRef getDirectory() const { return getStringField(2);   }
    212     DICompileUnit getCompileUnit() const{
    213       assert (getVersion() <= LLVMDebugVersion10  && "Invalid CompileUnit!");
    214       return getFieldAs<DICompileUnit>(3);
    215     }
    216   };
    217 
    218   /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}').
    219   /// FIXME: it seems strange that this doesn't have either a reference to the
    220   /// type/precision or a file/line pair for location info.
    221   class DIEnumerator : public DIDescriptor {
    222   public:
    223     explicit DIEnumerator(const MDNode *N = 0) : DIDescriptor(N) {}
    224 
    225     StringRef getName() const        { return getStringField(1); }
    226     uint64_t getEnumValue() const      { return getUInt64Field(2); }
    227   };
    228 
    229   /// DIType - This is a wrapper for a type.
    230   /// FIXME: Types should be factored much better so that CV qualifiers and
    231   /// others do not require a huge and empty descriptor full of zeros.
    232   class DIType : public DIScope {
    233   public:
    234   protected:
    235     // This ctor is used when the Tag has already been validated by a derived
    236     // ctor.
    237     DIType(const MDNode *N, bool, bool) : DIScope(N) {}
    238 
    239   public:
    240 
    241     /// Verify - Verify that a type descriptor is well formed.
    242     bool Verify() const;
    243   public:
    244     explicit DIType(const MDNode *N);
    245     explicit DIType() {}
    246     virtual ~DIType() {}
    247 
    248     DIScope getContext() const          { return getFieldAs<DIScope>(1); }
    249     StringRef getName() const           { return getStringField(2);     }
    250     DICompileUnit getCompileUnit() const{
    251       assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
    252      if (getVersion() == llvm::LLVMDebugVersion7)
    253        return getFieldAs<DICompileUnit>(3);
    254 
    255      return getFieldAs<DIFile>(3).getCompileUnit();
    256     }
    257     DIFile getFile() const              { return getFieldAs<DIFile>(3); }
    258     unsigned getLineNumber() const      { return getUnsignedField(4); }
    259     uint64_t getSizeInBits() const      { return getUInt64Field(5); }
    260     uint64_t getAlignInBits() const     { return getUInt64Field(6); }
    261     // FIXME: Offset is only used for DW_TAG_member nodes.  Making every type
    262     // carry this is just plain insane.
    263     uint64_t getOffsetInBits() const    { return getUInt64Field(7); }
    264     unsigned getFlags() const           { return getUnsignedField(8); }
    265     bool isPrivate() const {
    266       return (getFlags() & FlagPrivate) != 0;
    267     }
    268     bool isProtected() const {
    269       return (getFlags() & FlagProtected) != 0;
    270     }
    271     bool isForwardDecl() const {
    272       return (getFlags() & FlagFwdDecl) != 0;
    273     }
    274     // isAppleBlock - Return true if this is the Apple Blocks extension.
    275     bool isAppleBlockExtension() const {
    276       return (getFlags() & FlagAppleBlock) != 0;
    277     }
    278     bool isBlockByrefStruct() const {
    279       return (getFlags() & FlagBlockByrefStruct) != 0;
    280     }
    281     bool isVirtual() const {
    282       return (getFlags() & FlagVirtual) != 0;
    283     }
    284     bool isArtificial() const {
    285       return (getFlags() & FlagArtificial) != 0;
    286     }
    287     bool isObjcClassComplete() const {
    288       return (getFlags() & FlagObjcClassComplete) != 0;
    289     }
    290     bool isValid() const {
    291       return DbgNode && (isBasicType() || isDerivedType() || isCompositeType());
    292     }
    293     StringRef getDirectory() const  {
    294       if (getVersion() == llvm::LLVMDebugVersion7)
    295         return getCompileUnit().getDirectory();
    296 
    297       return getFieldAs<DIFile>(3).getDirectory();
    298     }
    299     StringRef getFilename() const  {
    300       if (getVersion() == llvm::LLVMDebugVersion7)
    301         return getCompileUnit().getFilename();
    302 
    303       return getFieldAs<DIFile>(3).getFilename();
    304     }
    305 
    306     /// isUnsignedDIType - Return true if type encoding is unsigned.
    307     bool isUnsignedDIType();
    308 
    309     /// replaceAllUsesWith - Replace all uses of debug info referenced by
    310     /// this descriptor.
    311     void replaceAllUsesWith(DIDescriptor &D);
    312     void replaceAllUsesWith(MDNode *D);
    313 
    314     /// print - print type.
    315     void print(raw_ostream &OS) const;
    316 
    317     /// dump - print type to dbgs() with a newline.
    318     void dump() const;
    319   };
    320 
    321   /// DIBasicType - A basic type, like 'int' or 'float'.
    322   class DIBasicType : public DIType {
    323   public:
    324     explicit DIBasicType(const MDNode *N = 0) : DIType(N) {}
    325 
    326     unsigned getEncoding() const { return getUnsignedField(9); }
    327 
    328     /// Verify - Verify that a basic type descriptor is well formed.
    329     bool Verify() const;
    330 
    331     /// print - print basic type.
    332     void print(raw_ostream &OS) const;
    333 
    334     /// dump - print basic type to dbgs() with a newline.
    335     void dump() const;
    336   };
    337 
    338   /// DIDerivedType - A simple derived type, like a const qualified type,
    339   /// a typedef, a pointer or reference, etc.
    340   class DIDerivedType : public DIType {
    341   protected:
    342     explicit DIDerivedType(const MDNode *N, bool, bool)
    343       : DIType(N, true, true) {}
    344   public:
    345     explicit DIDerivedType(const MDNode *N = 0)
    346       : DIType(N, true, true) {}
    347 
    348     DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); }
    349 
    350     /// getOriginalTypeSize - If this type is derived from a base type then
    351     /// return base type size.
    352     uint64_t getOriginalTypeSize() const;
    353 
    354     StringRef getObjCPropertyName() const { return getStringField(10); }
    355     StringRef getObjCPropertyGetterName() const {
    356       return getStringField(11);
    357     }
    358     StringRef getObjCPropertySetterName() const {
    359       return getStringField(12);
    360     }
    361     bool isReadOnlyObjCProperty() {
    362       return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_readonly) != 0;
    363     }
    364     bool isReadWriteObjCProperty() {
    365       return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_readwrite) != 0;
    366     }
    367     bool isAssignObjCProperty() {
    368       return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_assign) != 0;
    369     }
    370     bool isRetainObjCProperty() {
    371       return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_retain) != 0;
    372     }
    373     bool isCopyObjCProperty() {
    374       return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_copy) != 0;
    375     }
    376     bool isNonAtomicObjCProperty() {
    377       return (getUnsignedField(13) & dwarf::DW_APPLE_PROPERTY_nonatomic) != 0;
    378     }
    379 
    380     /// Verify - Verify that a derived type descriptor is well formed.
    381     bool Verify() const;
    382 
    383     /// print - print derived type.
    384     void print(raw_ostream &OS) const;
    385 
    386     /// dump - print derived type to dbgs() with a newline.
    387     void dump() const;
    388   };
    389 
    390   /// DICompositeType - This descriptor holds a type that can refer to multiple
    391   /// other types, like a function or struct.
    392   /// FIXME: Why is this a DIDerivedType??
    393   class DICompositeType : public DIDerivedType {
    394   public:
    395     explicit DICompositeType(const MDNode *N = 0)
    396       : DIDerivedType(N, true, true) {
    397       if (N && !isCompositeType())
    398         DbgNode = 0;
    399     }
    400 
    401     DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
    402     unsigned getRunTimeLang() const { return getUnsignedField(11); }
    403     DICompositeType getContainingType() const {
    404       return getFieldAs<DICompositeType>(12);
    405     }
    406     DIArray getTemplateParams() const { return getFieldAs<DIArray>(13); }
    407 
    408     /// Verify - Verify that a composite type descriptor is well formed.
    409     bool Verify() const;
    410 
    411     /// print - print composite type.
    412     void print(raw_ostream &OS) const;
    413 
    414     /// dump - print composite type to dbgs() with a newline.
    415     void dump() const;
    416   };
    417 
    418   /// DITemplateTypeParameter - This is a wrapper for template type parameter.
    419   class DITemplateTypeParameter : public DIDescriptor {
    420   public:
    421     explicit DITemplateTypeParameter(const MDNode *N = 0) : DIDescriptor(N) {}
    422 
    423     DIScope getContext() const       { return getFieldAs<DIScope>(1); }
    424     StringRef getName() const        { return getStringField(2); }
    425     DIType getType() const           { return getFieldAs<DIType>(3); }
    426     StringRef getFilename() const    {
    427       return getFieldAs<DIFile>(4).getFilename();
    428     }
    429     StringRef getDirectory() const   {
    430       return getFieldAs<DIFile>(4).getDirectory();
    431     }
    432     unsigned getLineNumber() const   { return getUnsignedField(5); }
    433     unsigned getColumnNumber() const { return getUnsignedField(6); }
    434   };
    435 
    436   /// DITemplateValueParameter - This is a wrapper for template value parameter.
    437   class DITemplateValueParameter : public DIDescriptor {
    438   public:
    439     explicit DITemplateValueParameter(const MDNode *N = 0) : DIDescriptor(N) {}
    440 
    441     DIScope getContext() const       { return getFieldAs<DIScope>(1); }
    442     StringRef getName() const        { return getStringField(2); }
    443     DIType getType() const           { return getFieldAs<DIType>(3); }
    444     uint64_t getValue() const         { return getUInt64Field(4); }
    445     StringRef getFilename() const    {
    446       return getFieldAs<DIFile>(5).getFilename();
    447     }
    448     StringRef getDirectory() const   {
    449       return getFieldAs<DIFile>(5).getDirectory();
    450     }
    451     unsigned getLineNumber() const   { return getUnsignedField(6); }
    452     unsigned getColumnNumber() const { return getUnsignedField(7); }
    453   };
    454 
    455   /// DISubprogram - This is a wrapper for a subprogram (e.g. a function).
    456   class DISubprogram : public DIScope {
    457   public:
    458     explicit DISubprogram(const MDNode *N = 0) : DIScope(N) {}
    459 
    460     DIScope getContext() const          { return getFieldAs<DIScope>(2); }
    461     StringRef getName() const         { return getStringField(3); }
    462     StringRef getDisplayName() const  { return getStringField(4); }
    463     StringRef getLinkageName() const  { return getStringField(5); }
    464     DICompileUnit getCompileUnit() const{
    465       assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
    466       if (getVersion() == llvm::LLVMDebugVersion7)
    467         return getFieldAs<DICompileUnit>(6);
    468 
    469       return getFieldAs<DIFile>(6).getCompileUnit();
    470     }
    471     unsigned getLineNumber() const      { return getUnsignedField(7); }
    472     DICompositeType getType() const { return getFieldAs<DICompositeType>(8); }
    473 
    474     /// getReturnTypeName - Subprogram return types are encoded either as
    475     /// DIType or as DICompositeType.
    476     StringRef getReturnTypeName() const {
    477       DICompositeType DCT(getFieldAs<DICompositeType>(8));
    478       if (DCT.Verify()) {
    479         DIArray A = DCT.getTypeArray();
    480         DIType T(A.getElement(0));
    481         return T.getName();
    482       }
    483       DIType T(getFieldAs<DIType>(8));
    484       return T.getName();
    485     }
    486 
    487     /// isLocalToUnit - Return true if this subprogram is local to the current
    488     /// compile unit, like 'static' in C.
    489     unsigned isLocalToUnit() const     { return getUnsignedField(9); }
    490     unsigned isDefinition() const      { return getUnsignedField(10); }
    491 
    492     unsigned getVirtuality() const { return getUnsignedField(11); }
    493     unsigned getVirtualIndex() const { return getUnsignedField(12); }
    494 
    495     DICompositeType getContainingType() const {
    496       return getFieldAs<DICompositeType>(13);
    497     }
    498     unsigned isArtificial() const    {
    499       if (getVersion() <= llvm::LLVMDebugVersion8)
    500         return getUnsignedField(14);
    501       return (getUnsignedField(14) & FlagArtificial) != 0;
    502     }
    503     /// isPrivate - Return true if this subprogram has "private"
    504     /// access specifier.
    505     bool isPrivate() const    {
    506       if (getVersion() <= llvm::LLVMDebugVersion8)
    507         return false;
    508       return (getUnsignedField(14) & FlagPrivate) != 0;
    509     }
    510     /// isProtected - Return true if this subprogram has "protected"
    511     /// access specifier.
    512     bool isProtected() const    {
    513       if (getVersion() <= llvm::LLVMDebugVersion8)
    514         return false;
    515       return (getUnsignedField(14) & FlagProtected) != 0;
    516     }
    517     /// isExplicit - Return true if this subprogram is marked as explicit.
    518     bool isExplicit() const    {
    519       if (getVersion() <= llvm::LLVMDebugVersion8)
    520         return false;
    521       return (getUnsignedField(14) & FlagExplicit) != 0;
    522     }
    523     /// isPrototyped - Return true if this subprogram is prototyped.
    524     bool isPrototyped() const    {
    525       if (getVersion() <= llvm::LLVMDebugVersion8)
    526         return false;
    527       return (getUnsignedField(14) & FlagPrototyped) != 0;
    528     }
    529 
    530     unsigned isOptimized() const;
    531 
    532     StringRef getFilename() const    {
    533       if (getVersion() == llvm::LLVMDebugVersion7)
    534         return getCompileUnit().getFilename();
    535 
    536       return getFieldAs<DIFile>(6).getFilename();
    537     }
    538 
    539     StringRef getDirectory() const   {
    540       if (getVersion() == llvm::LLVMDebugVersion7)
    541         return getCompileUnit().getFilename();
    542 
    543       return getFieldAs<DIFile>(6).getDirectory();
    544     }
    545 
    546     /// Verify - Verify that a subprogram descriptor is well formed.
    547     bool Verify() const;
    548 
    549     /// print - print subprogram.
    550     void print(raw_ostream &OS) const;
    551 
    552     /// dump - print subprogram to dbgs() with a newline.
    553     void dump() const;
    554 
    555     /// describes - Return true if this subprogram provides debugging
    556     /// information for the function F.
    557     bool describes(const Function *F);
    558 
    559     Function *getFunction() const { return getFunctionField(16); }
    560     DIArray getTemplateParams() const { return getFieldAs<DIArray>(17); }
    561     DISubprogram getFunctionDeclaration() const {
    562       return getFieldAs<DISubprogram>(18);
    563     }
    564     MDNode *getVariablesNodes() const;
    565     DIArray getVariables() const;
    566   };
    567 
    568   /// DIGlobalVariable - This is a wrapper for a global variable.
    569   class DIGlobalVariable : public DIDescriptor {
    570   public:
    571     explicit DIGlobalVariable(const MDNode *N = 0) : DIDescriptor(N) {}
    572 
    573     DIScope getContext() const          { return getFieldAs<DIScope>(2); }
    574     StringRef getName() const         { return getStringField(3); }
    575     StringRef getDisplayName() const  { return getStringField(4); }
    576     StringRef getLinkageName() const  { return getStringField(5); }
    577     DICompileUnit getCompileUnit() const{
    578       assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
    579       if (getVersion() == llvm::LLVMDebugVersion7)
    580         return getFieldAs<DICompileUnit>(6);
    581 
    582       DIFile F = getFieldAs<DIFile>(6);
    583       return F.getCompileUnit();
    584     }
    585     StringRef getFilename() const {
    586       if (getVersion() <= llvm::LLVMDebugVersion10)
    587         return getContext().getFilename();
    588       return getFieldAs<DIFile>(6).getFilename();
    589     }
    590     StringRef getDirectory() const {
    591       if (getVersion() <= llvm::LLVMDebugVersion10)
    592         return getContext().getDirectory();
    593       return getFieldAs<DIFile>(6).getDirectory();
    594 
    595     }
    596 
    597     unsigned getLineNumber() const      { return getUnsignedField(7); }
    598     DIType getType() const              { return getFieldAs<DIType>(8); }
    599     unsigned isLocalToUnit() const      { return getUnsignedField(9); }
    600     unsigned isDefinition() const       { return getUnsignedField(10); }
    601 
    602     GlobalVariable *getGlobal() const { return getGlobalVariableField(11); }
    603     Constant *getConstant() const   { return getConstantField(11); }
    604 
    605     /// Verify - Verify that a global variable descriptor is well formed.
    606     bool Verify() const;
    607 
    608     /// print - print global variable.
    609     void print(raw_ostream &OS) const;
    610 
    611     /// dump - print global variable to dbgs() with a newline.
    612     void dump() const;
    613   };
    614 
    615   /// DIVariable - This is a wrapper for a variable (e.g. parameter, local,
    616   /// global etc).
    617   class DIVariable : public DIDescriptor {
    618   public:
    619     explicit DIVariable(const MDNode *N = 0)
    620       : DIDescriptor(N) {}
    621 
    622     DIScope getContext() const          { return getFieldAs<DIScope>(1); }
    623     StringRef getName() const           { return getStringField(2);     }
    624     DICompileUnit getCompileUnit() const{
    625       assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
    626       if (getVersion() == llvm::LLVMDebugVersion7)
    627         return getFieldAs<DICompileUnit>(3);
    628 
    629       DIFile F = getFieldAs<DIFile>(3);
    630       return F.getCompileUnit();
    631     }
    632     unsigned getLineNumber() const      {
    633       return (getUnsignedField(4) << 8) >> 8;
    634     }
    635     unsigned getArgNumber() const       {
    636       unsigned L = getUnsignedField(4);
    637       return L >> 24;
    638     }
    639     DIType getType() const              { return getFieldAs<DIType>(5); }
    640 
    641     /// isArtificial - Return true if this variable is marked as "artificial".
    642     bool isArtificial() const    {
    643       if (getVersion() <= llvm::LLVMDebugVersion8)
    644         return false;
    645       return (getUnsignedField(6) & FlagArtificial) != 0;
    646     }
    647 
    648     /// getInlinedAt - If this variable is inlined then return inline location.
    649     MDNode *getInlinedAt() const;
    650 
    651     /// Verify - Verify that a variable descriptor is well formed.
    652     bool Verify() const;
    653 
    654     /// HasComplexAddr - Return true if the variable has a complex address.
    655     bool hasComplexAddress() const {
    656       return getNumAddrElements() > 0;
    657     }
    658 
    659     unsigned getNumAddrElements() const;
    660 
    661     uint64_t getAddrElement(unsigned Idx) const {
    662       if (getVersion() <= llvm::LLVMDebugVersion8)
    663         return getUInt64Field(Idx+6);
    664       if (getVersion() == llvm::LLVMDebugVersion9)
    665         return getUInt64Field(Idx+7);
    666       return getUInt64Field(Idx+8);
    667     }
    668 
    669     /// isBlockByrefVariable - Return true if the variable was declared as
    670     /// a "__block" variable (Apple Blocks).
    671     bool isBlockByrefVariable() const {
    672       return getType().isBlockByrefStruct();
    673     }
    674 
    675     /// isInlinedFnArgument - Return trule if this variable provides debugging
    676     /// information for an inlined function arguments.
    677     bool isInlinedFnArgument(const Function *CurFn);
    678 
    679     /// print - print variable.
    680     void print(raw_ostream &OS) const;
    681 
    682     void printExtendedName(raw_ostream &OS) const;
    683 
    684     /// dump - print variable to dbgs() with a newline.
    685     void dump() const;
    686   };
    687 
    688   /// DILexicalBlock - This is a wrapper for a lexical block.
    689   class DILexicalBlock : public DIScope {
    690   public:
    691     explicit DILexicalBlock(const MDNode *N = 0) : DIScope(N) {}
    692     DIScope getContext() const       { return getFieldAs<DIScope>(1);      }
    693     unsigned getLineNumber() const   { return getUnsignedField(2);         }
    694     unsigned getColumnNumber() const { return getUnsignedField(3);         }
    695     StringRef getDirectory() const {
    696       StringRef dir = getFieldAs<DIFile>(4).getDirectory();
    697       return !dir.empty() ? dir : getContext().getDirectory();
    698     }
    699     StringRef getFilename() const {
    700       StringRef filename = getFieldAs<DIFile>(4).getFilename();
    701       return !filename.empty() ? filename : getContext().getFilename();
    702     }
    703   };
    704 
    705   /// DILexicalBlockFile - This is a wrapper for a lexical block with
    706   /// a filename change.
    707   class DILexicalBlockFile : public DIScope {
    708   public:
    709     explicit DILexicalBlockFile(const MDNode *N = 0) : DIScope(N) {}
    710     DIScope getContext() const { return getScope().getContext(); }
    711     unsigned getLineNumber() const { return getScope().getLineNumber(); }
    712     unsigned getColumnNumber() const { return getScope().getColumnNumber(); }
    713     StringRef getDirectory() const {
    714       StringRef dir = getFieldAs<DIFile>(2).getDirectory();
    715       return !dir.empty() ? dir : getContext().getDirectory();
    716     }
    717     StringRef getFilename() const {
    718       StringRef filename = getFieldAs<DIFile>(2).getFilename();
    719       assert(!filename.empty() && "Why'd you create this then?");
    720       return filename;
    721     }
    722     DILexicalBlock getScope() const { return getFieldAs<DILexicalBlock>(1); }
    723   };
    724 
    725   /// DINameSpace - A wrapper for a C++ style name space.
    726   class DINameSpace : public DIScope {
    727   public:
    728     explicit DINameSpace(const MDNode *N = 0) : DIScope(N) {}
    729     DIScope getContext() const     { return getFieldAs<DIScope>(1);      }
    730     StringRef getName() const      { return getStringField(2);           }
    731     StringRef getDirectory() const  {
    732       return getFieldAs<DIFile>(3).getDirectory();
    733     }
    734     StringRef getFilename() const  {
    735       return getFieldAs<DIFile>(3).getFilename();
    736     }
    737     DICompileUnit getCompileUnit() const{
    738       assert (getVersion() <= LLVMDebugVersion10 && "Invalid getCompileUnit!");
    739       if (getVersion() == llvm::LLVMDebugVersion7)
    740         return getFieldAs<DICompileUnit>(3);
    741 
    742       return getFieldAs<DIFile>(3).getCompileUnit();
    743     }
    744     unsigned getLineNumber() const { return getUnsignedField(4);         }
    745     bool Verify() const;
    746   };
    747 
    748   /// DILocation - This object holds location information. This object
    749   /// is not associated with any DWARF tag.
    750   class DILocation : public DIDescriptor {
    751   public:
    752     explicit DILocation(const MDNode *N) : DIDescriptor(N) { }
    753 
    754     unsigned getLineNumber() const     { return getUnsignedField(0); }
    755     unsigned getColumnNumber() const   { return getUnsignedField(1); }
    756     DIScope  getScope() const          { return getFieldAs<DIScope>(2); }
    757     DILocation getOrigLocation() const { return getFieldAs<DILocation>(3); }
    758     StringRef getFilename() const    { return getScope().getFilename(); }
    759     StringRef getDirectory() const   { return getScope().getDirectory(); }
    760     bool Verify() const;
    761   };
    762 
    763   /// getDISubprogram - Find subprogram that is enclosing this scope.
    764   DISubprogram getDISubprogram(const MDNode *Scope);
    765 
    766   /// getDICompositeType - Find underlying composite type.
    767   DICompositeType getDICompositeType(DIType T);
    768 
    769   /// isSubprogramContext - Return true if Context is either a subprogram
    770   /// or another context nested inside a subprogram.
    771   bool isSubprogramContext(const MDNode *Context);
    772 
    773   /// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
    774   /// to hold function specific information.
    775   NamedMDNode *getOrInsertFnSpecificMDNode(Module &M, DISubprogram SP);
    776 
    777   /// getFnSpecificMDNode - Return a NameMDNode, if available, that is
    778   /// suitable to hold function specific information.
    779   NamedMDNode *getFnSpecificMDNode(const Module &M, DISubprogram SP);
    780 
    781   /// createInlinedVariable - Create a new inlined variable based on current
    782   /// variable.
    783   /// @param DV            Current Variable.
    784   /// @param InlinedScope  Location at current variable is inlined.
    785   DIVariable createInlinedVariable(MDNode *DV, MDNode *InlinedScope,
    786                                    LLVMContext &VMContext);
    787 
    788   /// cleanseInlinedVariable - Remove inlined scope from the variable.
    789   DIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext);
    790 
    791   class DebugInfoFinder {
    792   public:
    793     /// processModule - Process entire module and collect debug info
    794     /// anchors.
    795     void processModule(Module &M);
    796 
    797   private:
    798     /// processType - Process DIType.
    799     void processType(DIType DT);
    800 
    801     /// processLexicalBlock - Process DILexicalBlock.
    802     void processLexicalBlock(DILexicalBlock LB);
    803 
    804     /// processSubprogram - Process DISubprogram.
    805     void processSubprogram(DISubprogram SP);
    806 
    807     /// processDeclare - Process DbgDeclareInst.
    808     void processDeclare(DbgDeclareInst *DDI);
    809 
    810     /// processLocation - Process DILocation.
    811     void processLocation(DILocation Loc);
    812 
    813     /// addCompileUnit - Add compile unit into CUs.
    814     bool addCompileUnit(DICompileUnit CU);
    815 
    816     /// addGlobalVariable - Add global variable into GVs.
    817     bool addGlobalVariable(DIGlobalVariable DIG);
    818 
    819     // addSubprogram - Add subprgoram into SPs.
    820     bool addSubprogram(DISubprogram SP);
    821 
    822     /// addType - Add type into Tys.
    823     bool addType(DIType DT);
    824 
    825   public:
    826     typedef SmallVector<MDNode *, 8>::const_iterator iterator;
    827     iterator compile_unit_begin()    const { return CUs.begin(); }
    828     iterator compile_unit_end()      const { return CUs.end(); }
    829     iterator subprogram_begin()      const { return SPs.begin(); }
    830     iterator subprogram_end()        const { return SPs.end(); }
    831     iterator global_variable_begin() const { return GVs.begin(); }
    832     iterator global_variable_end()   const { return GVs.end(); }
    833     iterator type_begin()            const { return TYs.begin(); }
    834     iterator type_end()              const { return TYs.end(); }
    835 
    836     unsigned compile_unit_count()    const { return CUs.size(); }
    837     unsigned global_variable_count() const { return GVs.size(); }
    838     unsigned subprogram_count()      const { return SPs.size(); }
    839     unsigned type_count()            const { return TYs.size(); }
    840 
    841   private:
    842     SmallVector<MDNode *, 8> CUs;  // Compile Units
    843     SmallVector<MDNode *, 8> SPs;  // Subprograms
    844     SmallVector<MDNode *, 8> GVs;  // Global Variables;
    845     SmallVector<MDNode *, 8> TYs;  // Types
    846     SmallPtrSet<MDNode *, 64> NodesSeen;
    847   };
    848 } // end namespace llvm
    849 
    850 #endif
    851