Home | History | Annotate | Download | only in Analysis
      1 //===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===//
      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 implements the helper classes used to build and interpret debug
     11 // information in LLVM IR form.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/Analysis/DebugInfo.h"
     16 #include "llvm/Constants.h"
     17 #include "llvm/DerivedTypes.h"
     18 #include "llvm/Intrinsics.h"
     19 #include "llvm/IntrinsicInst.h"
     20 #include "llvm/Instructions.h"
     21 #include "llvm/Module.h"
     22 #include "llvm/Analysis/ValueTracking.h"
     23 #include "llvm/ADT/SmallPtrSet.h"
     24 #include "llvm/ADT/SmallString.h"
     25 #include "llvm/ADT/STLExtras.h"
     26 #include "llvm/Support/Debug.h"
     27 #include "llvm/Support/Dwarf.h"
     28 #include "llvm/Support/raw_ostream.h"
     29 using namespace llvm;
     30 using namespace llvm::dwarf;
     31 
     32 //===----------------------------------------------------------------------===//
     33 // DIDescriptor
     34 //===----------------------------------------------------------------------===//
     35 
     36 DIDescriptor::DIDescriptor(const DIFile F) : DbgNode(F.DbgNode) {
     37 }
     38 
     39 DIDescriptor::DIDescriptor(const DISubprogram F) : DbgNode(F.DbgNode) {
     40 }
     41 
     42 DIDescriptor::DIDescriptor(const DILexicalBlock F) : DbgNode(F.DbgNode) {
     43 }
     44 
     45 DIDescriptor::DIDescriptor(const DIVariable F) : DbgNode(F.DbgNode) {
     46 }
     47 
     48 DIDescriptor::DIDescriptor(const DIType F) : DbgNode(F.DbgNode) {
     49 }
     50 
     51 StringRef
     52 DIDescriptor::getStringField(unsigned Elt) const {
     53   if (DbgNode == 0)
     54     return StringRef();
     55 
     56   if (Elt < DbgNode->getNumOperands())
     57     if (MDString *MDS = dyn_cast_or_null<MDString>(DbgNode->getOperand(Elt)))
     58       return MDS->getString();
     59 
     60   return StringRef();
     61 }
     62 
     63 uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {
     64   if (DbgNode == 0)
     65     return 0;
     66 
     67   if (Elt < DbgNode->getNumOperands())
     68     if (ConstantInt *CI = dyn_cast<ConstantInt>(DbgNode->getOperand(Elt)))
     69       return CI->getZExtValue();
     70 
     71   return 0;
     72 }
     73 
     74 DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const {
     75   if (DbgNode == 0)
     76     return DIDescriptor();
     77 
     78   if (Elt < DbgNode->getNumOperands())
     79     return
     80       DIDescriptor(dyn_cast_or_null<const MDNode>(DbgNode->getOperand(Elt)));
     81   return DIDescriptor();
     82 }
     83 
     84 GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {
     85   if (DbgNode == 0)
     86     return 0;
     87 
     88   if (Elt < DbgNode->getNumOperands())
     89       return dyn_cast_or_null<GlobalVariable>(DbgNode->getOperand(Elt));
     90   return 0;
     91 }
     92 
     93 Constant *DIDescriptor::getConstantField(unsigned Elt) const {
     94   if (DbgNode == 0)
     95     return 0;
     96 
     97   if (Elt < DbgNode->getNumOperands())
     98       return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt));
     99   return 0;
    100 }
    101 
    102 Function *DIDescriptor::getFunctionField(unsigned Elt) const {
    103   if (DbgNode == 0)
    104     return 0;
    105 
    106   if (Elt < DbgNode->getNumOperands())
    107       return dyn_cast_or_null<Function>(DbgNode->getOperand(Elt));
    108   return 0;
    109 }
    110 
    111 unsigned DIVariable::getNumAddrElements() const {
    112   if (getVersion() <= llvm::LLVMDebugVersion8)
    113     return DbgNode->getNumOperands()-6;
    114   if (getVersion() == llvm::LLVMDebugVersion9)
    115     return DbgNode->getNumOperands()-7;
    116   return DbgNode->getNumOperands()-8;
    117 }
    118 
    119 
    120 //===----------------------------------------------------------------------===//
    121 // Predicates
    122 //===----------------------------------------------------------------------===//
    123 
    124 /// isBasicType - Return true if the specified tag is legal for
    125 /// DIBasicType.
    126 bool DIDescriptor::isBasicType() const {
    127   return DbgNode && getTag() == dwarf::DW_TAG_base_type;
    128 }
    129 
    130 /// isDerivedType - Return true if the specified tag is legal for DIDerivedType.
    131 bool DIDescriptor::isDerivedType() const {
    132   if (!DbgNode) return false;
    133   switch (getTag()) {
    134   case dwarf::DW_TAG_typedef:
    135   case dwarf::DW_TAG_pointer_type:
    136   case dwarf::DW_TAG_reference_type:
    137   case dwarf::DW_TAG_const_type:
    138   case dwarf::DW_TAG_volatile_type:
    139   case dwarf::DW_TAG_restrict_type:
    140   case dwarf::DW_TAG_member:
    141   case dwarf::DW_TAG_inheritance:
    142   case dwarf::DW_TAG_friend:
    143     return true;
    144   default:
    145     // CompositeTypes are currently modelled as DerivedTypes.
    146     return isCompositeType();
    147   }
    148 }
    149 
    150 /// isCompositeType - Return true if the specified tag is legal for
    151 /// DICompositeType.
    152 bool DIDescriptor::isCompositeType() const {
    153   if (!DbgNode) return false;
    154   switch (getTag()) {
    155   case dwarf::DW_TAG_array_type:
    156   case dwarf::DW_TAG_structure_type:
    157   case dwarf::DW_TAG_union_type:
    158   case dwarf::DW_TAG_enumeration_type:
    159   case dwarf::DW_TAG_vector_type:
    160   case dwarf::DW_TAG_subroutine_type:
    161   case dwarf::DW_TAG_class_type:
    162     return true;
    163   default:
    164     return false;
    165   }
    166 }
    167 
    168 /// isVariable - Return true if the specified tag is legal for DIVariable.
    169 bool DIDescriptor::isVariable() const {
    170   if (!DbgNode) return false;
    171   switch (getTag()) {
    172   case dwarf::DW_TAG_auto_variable:
    173   case dwarf::DW_TAG_arg_variable:
    174   case dwarf::DW_TAG_return_variable:
    175     return true;
    176   default:
    177     return false;
    178   }
    179 }
    180 
    181 /// isType - Return true if the specified tag is legal for DIType.
    182 bool DIDescriptor::isType() const {
    183   return isBasicType() || isCompositeType() || isDerivedType();
    184 }
    185 
    186 /// isSubprogram - Return true if the specified tag is legal for
    187 /// DISubprogram.
    188 bool DIDescriptor::isSubprogram() const {
    189   return DbgNode && getTag() == dwarf::DW_TAG_subprogram;
    190 }
    191 
    192 /// isGlobalVariable - Return true if the specified tag is legal for
    193 /// DIGlobalVariable.
    194 bool DIDescriptor::isGlobalVariable() const {
    195   return DbgNode && (getTag() == dwarf::DW_TAG_variable ||
    196                      getTag() == dwarf::DW_TAG_constant);
    197 }
    198 
    199 /// isGlobal - Return true if the specified tag is legal for DIGlobal.
    200 bool DIDescriptor::isGlobal() const {
    201   return isGlobalVariable();
    202 }
    203 
    204 /// isUnspecifiedParmeter - Return true if the specified tag is
    205 /// DW_TAG_unspecified_parameters.
    206 bool DIDescriptor::isUnspecifiedParameter() const {
    207   return DbgNode && getTag() == dwarf::DW_TAG_unspecified_parameters;
    208 }
    209 
    210 /// isScope - Return true if the specified tag is one of the scope
    211 /// related tag.
    212 bool DIDescriptor::isScope() const {
    213   if (!DbgNode) return false;
    214   switch (getTag()) {
    215   case dwarf::DW_TAG_compile_unit:
    216   case dwarf::DW_TAG_lexical_block:
    217   case dwarf::DW_TAG_subprogram:
    218   case dwarf::DW_TAG_namespace:
    219     return true;
    220   default:
    221     break;
    222   }
    223   return false;
    224 }
    225 
    226 /// isTemplateTypeParameter - Return true if the specified tag is
    227 /// DW_TAG_template_type_parameter.
    228 bool DIDescriptor::isTemplateTypeParameter() const {
    229   return DbgNode && getTag() == dwarf::DW_TAG_template_type_parameter;
    230 }
    231 
    232 /// isTemplateValueParameter - Return true if the specified tag is
    233 /// DW_TAG_template_value_parameter.
    234 bool DIDescriptor::isTemplateValueParameter() const {
    235   return DbgNode && getTag() == dwarf::DW_TAG_template_value_parameter;
    236 }
    237 
    238 /// isCompileUnit - Return true if the specified tag is DW_TAG_compile_unit.
    239 bool DIDescriptor::isCompileUnit() const {
    240   return DbgNode && getTag() == dwarf::DW_TAG_compile_unit;
    241 }
    242 
    243 /// isFile - Return true if the specified tag is DW_TAG_file_type.
    244 bool DIDescriptor::isFile() const {
    245   return DbgNode && getTag() == dwarf::DW_TAG_file_type;
    246 }
    247 
    248 /// isNameSpace - Return true if the specified tag is DW_TAG_namespace.
    249 bool DIDescriptor::isNameSpace() const {
    250   return DbgNode && getTag() == dwarf::DW_TAG_namespace;
    251 }
    252 
    253 /// isLexicalBlock - Return true if the specified tag is DW_TAG_lexical_block.
    254 bool DIDescriptor::isLexicalBlock() const {
    255   return DbgNode && getTag() == dwarf::DW_TAG_lexical_block;
    256 }
    257 
    258 /// isSubrange - Return true if the specified tag is DW_TAG_subrange_type.
    259 bool DIDescriptor::isSubrange() const {
    260   return DbgNode && getTag() == dwarf::DW_TAG_subrange_type;
    261 }
    262 
    263 /// isEnumerator - Return true if the specified tag is DW_TAG_enumerator.
    264 bool DIDescriptor::isEnumerator() const {
    265   return DbgNode && getTag() == dwarf::DW_TAG_enumerator;
    266 }
    267 
    268 //===----------------------------------------------------------------------===//
    269 // Simple Descriptor Constructors and other Methods
    270 //===----------------------------------------------------------------------===//
    271 
    272 DIType::DIType(const MDNode *N) : DIScope(N) {
    273   if (!N) return;
    274   if (!isBasicType() && !isDerivedType() && !isCompositeType()) {
    275     DbgNode = 0;
    276   }
    277 }
    278 
    279 unsigned DIArray::getNumElements() const {
    280   if (!DbgNode)
    281     return 0;
    282   return DbgNode->getNumOperands();
    283 }
    284 
    285 /// replaceAllUsesWith - Replace all uses of debug info referenced by
    286 /// this descriptor.
    287 void DIType::replaceAllUsesWith(DIDescriptor &D) {
    288   if (!DbgNode)
    289     return;
    290 
    291   // Since we use a TrackingVH for the node, its easy for clients to manufacture
    292   // legitimate situations where they want to replaceAllUsesWith() on something
    293   // which, due to uniquing, has merged with the source. We shield clients from
    294   // this detail by allowing a value to be replaced with replaceAllUsesWith()
    295   // itself.
    296   if (DbgNode != D) {
    297     MDNode *Node = const_cast<MDNode*>(DbgNode);
    298     const MDNode *DN = D;
    299     const Value *V = cast_or_null<Value>(DN);
    300     Node->replaceAllUsesWith(const_cast<Value*>(V));
    301     MDNode::deleteTemporary(Node);
    302   }
    303 }
    304 
    305 /// replaceAllUsesWith - Replace all uses of debug info referenced by
    306 /// this descriptor.
    307 void DIType::replaceAllUsesWith(MDNode *D) {
    308   if (!DbgNode)
    309     return;
    310 
    311   // Since we use a TrackingVH for the node, its easy for clients to manufacture
    312   // legitimate situations where they want to replaceAllUsesWith() on something
    313   // which, due to uniquing, has merged with the source. We shield clients from
    314   // this detail by allowing a value to be replaced with replaceAllUsesWith()
    315   // itself.
    316   if (DbgNode != D) {
    317     MDNode *Node = const_cast<MDNode*>(DbgNode);
    318     const MDNode *DN = D;
    319     const Value *V = cast_or_null<Value>(DN);
    320     Node->replaceAllUsesWith(const_cast<Value*>(V));
    321     MDNode::deleteTemporary(Node);
    322   }
    323 }
    324 
    325 /// Verify - Verify that a compile unit is well formed.
    326 bool DICompileUnit::Verify() const {
    327   if (!DbgNode)
    328     return false;
    329   StringRef N = getFilename();
    330   if (N.empty())
    331     return false;
    332   // It is possible that directory and produce string is empty.
    333   return true;
    334 }
    335 
    336 /// Verify - Verify that a type descriptor is well formed.
    337 bool DIType::Verify() const {
    338   if (!DbgNode)
    339     return false;
    340   if (!getContext().Verify())
    341     return false;
    342   unsigned Tag = getTag();
    343   if (!isBasicType() && Tag != dwarf::DW_TAG_const_type &&
    344       Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_pointer_type &&
    345       Tag != dwarf::DW_TAG_reference_type && Tag != dwarf::DW_TAG_restrict_type
    346       && Tag != dwarf::DW_TAG_vector_type && Tag != dwarf::DW_TAG_array_type
    347       && Tag != dwarf::DW_TAG_enumeration_type
    348       && getFilename().empty())
    349     return false;
    350   return true;
    351 }
    352 
    353 /// Verify - Verify that a basic type descriptor is well formed.
    354 bool DIBasicType::Verify() const {
    355   return isBasicType();
    356 }
    357 
    358 /// Verify - Verify that a derived type descriptor is well formed.
    359 bool DIDerivedType::Verify() const {
    360   return isDerivedType();
    361 }
    362 
    363 /// Verify - Verify that a composite type descriptor is well formed.
    364 bool DICompositeType::Verify() const {
    365   if (!DbgNode)
    366     return false;
    367   if (!getContext().Verify())
    368     return false;
    369 
    370   DICompileUnit CU = getCompileUnit();
    371   if (!CU.Verify())
    372     return false;
    373   return true;
    374 }
    375 
    376 /// Verify - Verify that a subprogram descriptor is well formed.
    377 bool DISubprogram::Verify() const {
    378   if (!DbgNode)
    379     return false;
    380 
    381   if (!getContext().Verify())
    382     return false;
    383 
    384   DICompileUnit CU = getCompileUnit();
    385   if (!CU.Verify())
    386     return false;
    387 
    388   DICompositeType Ty = getType();
    389   if (!Ty.Verify())
    390     return false;
    391   return true;
    392 }
    393 
    394 /// Verify - Verify that a global variable descriptor is well formed.
    395 bool DIGlobalVariable::Verify() const {
    396   if (!DbgNode)
    397     return false;
    398 
    399   if (getDisplayName().empty())
    400     return false;
    401 
    402   if (!getContext().Verify())
    403     return false;
    404 
    405   DICompileUnit CU = getCompileUnit();
    406   if (!CU.Verify())
    407     return false;
    408 
    409   DIType Ty = getType();
    410   if (!Ty.Verify())
    411     return false;
    412 
    413   if (!getGlobal() && !getConstant())
    414     return false;
    415 
    416   return true;
    417 }
    418 
    419 /// Verify - Verify that a variable descriptor is well formed.
    420 bool DIVariable::Verify() const {
    421   if (!DbgNode)
    422     return false;
    423 
    424   if (!getContext().Verify())
    425     return false;
    426 
    427   if (!getCompileUnit().Verify())
    428     return false;
    429 
    430   DIType Ty = getType();
    431   if (!Ty.Verify())
    432     return false;
    433 
    434   return true;
    435 }
    436 
    437 /// Verify - Verify that a location descriptor is well formed.
    438 bool DILocation::Verify() const {
    439   if (!DbgNode)
    440     return false;
    441 
    442   return DbgNode->getNumOperands() == 4;
    443 }
    444 
    445 /// Verify - Verify that a namespace descriptor is well formed.
    446 bool DINameSpace::Verify() const {
    447   if (!DbgNode)
    448     return false;
    449   if (getName().empty())
    450     return false;
    451   if (!getCompileUnit().Verify())
    452     return false;
    453   return true;
    454 }
    455 
    456 /// getOriginalTypeSize - If this type is derived from a base type then
    457 /// return base type size.
    458 uint64_t DIDerivedType::getOriginalTypeSize() const {
    459   unsigned Tag = getTag();
    460   if (Tag == dwarf::DW_TAG_member || Tag == dwarf::DW_TAG_typedef ||
    461       Tag == dwarf::DW_TAG_const_type || Tag == dwarf::DW_TAG_volatile_type ||
    462       Tag == dwarf::DW_TAG_restrict_type) {
    463     DIType BaseType = getTypeDerivedFrom();
    464     // If this type is not derived from any type then take conservative
    465     // approach.
    466     if (!BaseType.isValid())
    467       return getSizeInBits();
    468     if (BaseType.isDerivedType())
    469       return DIDerivedType(BaseType).getOriginalTypeSize();
    470     else
    471       return BaseType.getSizeInBits();
    472   }
    473 
    474   return getSizeInBits();
    475 }
    476 
    477 /// isInlinedFnArgument - Return true if this variable provides debugging
    478 /// information for an inlined function arguments.
    479 bool DIVariable::isInlinedFnArgument(const Function *CurFn) {
    480   assert(CurFn && "Invalid function");
    481   if (!getContext().isSubprogram())
    482     return false;
    483   // This variable is not inlined function argument if its scope
    484   // does not describe current function.
    485   return !(DISubprogram(getContext()).describes(CurFn));
    486 }
    487 
    488 /// describes - Return true if this subprogram provides debugging
    489 /// information for the function F.
    490 bool DISubprogram::describes(const Function *F) {
    491   assert(F && "Invalid function");
    492   if (F == getFunction())
    493     return true;
    494   StringRef Name = getLinkageName();
    495   if (Name.empty())
    496     Name = getName();
    497   if (F->getName() == Name)
    498     return true;
    499   return false;
    500 }
    501 
    502 unsigned DISubprogram::isOptimized() const {
    503   assert (DbgNode && "Invalid subprogram descriptor!");
    504   if (DbgNode->getNumOperands() == 16)
    505     return getUnsignedField(15);
    506   return 0;
    507 }
    508 
    509 StringRef DIScope::getFilename() const {
    510   if (!DbgNode)
    511     return StringRef();
    512   if (isLexicalBlock())
    513     return DILexicalBlock(DbgNode).getFilename();
    514   if (isSubprogram())
    515     return DISubprogram(DbgNode).getFilename();
    516   if (isCompileUnit())
    517     return DICompileUnit(DbgNode).getFilename();
    518   if (isNameSpace())
    519     return DINameSpace(DbgNode).getFilename();
    520   if (isType())
    521     return DIType(DbgNode).getFilename();
    522   if (isFile())
    523     return DIFile(DbgNode).getFilename();
    524   assert(0 && "Invalid DIScope!");
    525   return StringRef();
    526 }
    527 
    528 StringRef DIScope::getDirectory() const {
    529   if (!DbgNode)
    530     return StringRef();
    531   if (isLexicalBlock())
    532     return DILexicalBlock(DbgNode).getDirectory();
    533   if (isSubprogram())
    534     return DISubprogram(DbgNode).getDirectory();
    535   if (isCompileUnit())
    536     return DICompileUnit(DbgNode).getDirectory();
    537   if (isNameSpace())
    538     return DINameSpace(DbgNode).getDirectory();
    539   if (isType())
    540     return DIType(DbgNode).getDirectory();
    541   if (isFile())
    542     return DIFile(DbgNode).getDirectory();
    543   assert(0 && "Invalid DIScope!");
    544   return StringRef();
    545 }
    546 
    547 //===----------------------------------------------------------------------===//
    548 // DIDescriptor: dump routines for all descriptors.
    549 //===----------------------------------------------------------------------===//
    550 
    551 
    552 /// print - Print descriptor.
    553 void DIDescriptor::print(raw_ostream &OS) const {
    554   OS << "[" << dwarf::TagString(getTag()) << "] ";
    555   OS.write_hex((intptr_t) &*DbgNode) << ']';
    556 }
    557 
    558 /// print - Print compile unit.
    559 void DICompileUnit::print(raw_ostream &OS) const {
    560   if (getLanguage())
    561     OS << " [" << dwarf::LanguageString(getLanguage()) << "] ";
    562 
    563   OS << " [" << getDirectory() << "/" << getFilename() << "]";
    564 }
    565 
    566 /// print - Print type.
    567 void DIType::print(raw_ostream &OS) const {
    568   if (!DbgNode) return;
    569 
    570   StringRef Res = getName();
    571   if (!Res.empty())
    572     OS << " [" << Res << "] ";
    573 
    574   unsigned Tag = getTag();
    575   OS << " [" << dwarf::TagString(Tag) << "] ";
    576 
    577   // TODO : Print context
    578   getCompileUnit().print(OS);
    579   OS << " ["
    580          << "line " << getLineNumber() << ", "
    581          << getSizeInBits() << " bits, "
    582          << getAlignInBits() << " bit alignment, "
    583          << getOffsetInBits() << " bit offset"
    584          << "] ";
    585 
    586   if (isPrivate())
    587     OS << " [private] ";
    588   else if (isProtected())
    589     OS << " [protected] ";
    590 
    591   if (isForwardDecl())
    592     OS << " [fwd] ";
    593 
    594   if (isBasicType())
    595     DIBasicType(DbgNode).print(OS);
    596   else if (isDerivedType())
    597     DIDerivedType(DbgNode).print(OS);
    598   else if (isCompositeType())
    599     DICompositeType(DbgNode).print(OS);
    600   else {
    601     OS << "Invalid DIType\n";
    602     return;
    603   }
    604 
    605   OS << "\n";
    606 }
    607 
    608 /// print - Print basic type.
    609 void DIBasicType::print(raw_ostream &OS) const {
    610   OS << " [" << dwarf::AttributeEncodingString(getEncoding()) << "] ";
    611 }
    612 
    613 /// print - Print derived type.
    614 void DIDerivedType::print(raw_ostream &OS) const {
    615   OS << "\n\t Derived From: "; getTypeDerivedFrom().print(OS);
    616 }
    617 
    618 /// print - Print composite type.
    619 void DICompositeType::print(raw_ostream &OS) const {
    620   DIArray A = getTypeArray();
    621   OS << " [" << A.getNumElements() << " elements]";
    622 }
    623 
    624 /// print - Print subprogram.
    625 void DISubprogram::print(raw_ostream &OS) const {
    626   StringRef Res = getName();
    627   if (!Res.empty())
    628     OS << " [" << Res << "] ";
    629 
    630   unsigned Tag = getTag();
    631   OS << " [" << dwarf::TagString(Tag) << "] ";
    632 
    633   // TODO : Print context
    634   getCompileUnit().print(OS);
    635   OS << " [" << getLineNumber() << "] ";
    636 
    637   if (isLocalToUnit())
    638     OS << " [local] ";
    639 
    640   if (isDefinition())
    641     OS << " [def] ";
    642 
    643   OS << "\n";
    644 }
    645 
    646 /// print - Print global variable.
    647 void DIGlobalVariable::print(raw_ostream &OS) const {
    648   OS << " [";
    649   StringRef Res = getName();
    650   if (!Res.empty())
    651     OS << " [" << Res << "] ";
    652 
    653   unsigned Tag = getTag();
    654   OS << " [" << dwarf::TagString(Tag) << "] ";
    655 
    656   // TODO : Print context
    657   getCompileUnit().print(OS);
    658   OS << " [" << getLineNumber() << "] ";
    659 
    660   if (isLocalToUnit())
    661     OS << " [local] ";
    662 
    663   if (isDefinition())
    664     OS << " [def] ";
    665 
    666   if (isGlobalVariable())
    667     DIGlobalVariable(DbgNode).print(OS);
    668   OS << "]\n";
    669 }
    670 
    671 /// print - Print variable.
    672 void DIVariable::print(raw_ostream &OS) const {
    673   StringRef Res = getName();
    674   if (!Res.empty())
    675     OS << " [" << Res << "] ";
    676 
    677   getCompileUnit().print(OS);
    678   OS << " [" << getLineNumber() << "] ";
    679   getType().print(OS);
    680   OS << "\n";
    681 
    682   // FIXME: Dump complex addresses
    683 }
    684 
    685 /// dump - Print descriptor to dbgs() with a newline.
    686 void DIDescriptor::dump() const {
    687   print(dbgs()); dbgs() << '\n';
    688 }
    689 
    690 /// dump - Print compile unit to dbgs() with a newline.
    691 void DICompileUnit::dump() const {
    692   print(dbgs()); dbgs() << '\n';
    693 }
    694 
    695 /// dump - Print type to dbgs() with a newline.
    696 void DIType::dump() const {
    697   print(dbgs()); dbgs() << '\n';
    698 }
    699 
    700 /// dump - Print basic type to dbgs() with a newline.
    701 void DIBasicType::dump() const {
    702   print(dbgs()); dbgs() << '\n';
    703 }
    704 
    705 /// dump - Print derived type to dbgs() with a newline.
    706 void DIDerivedType::dump() const {
    707   print(dbgs()); dbgs() << '\n';
    708 }
    709 
    710 /// dump - Print composite type to dbgs() with a newline.
    711 void DICompositeType::dump() const {
    712   print(dbgs()); dbgs() << '\n';
    713 }
    714 
    715 /// dump - Print subprogram to dbgs() with a newline.
    716 void DISubprogram::dump() const {
    717   print(dbgs()); dbgs() << '\n';
    718 }
    719 
    720 /// dump - Print global variable.
    721 void DIGlobalVariable::dump() const {
    722   print(dbgs()); dbgs() << '\n';
    723 }
    724 
    725 /// dump - Print variable.
    726 void DIVariable::dump() const {
    727   print(dbgs()); dbgs() << '\n';
    728 }
    729 
    730 /// fixupObjcLikeName - Replace contains special characters used
    731 /// in a typical Objective-C names with '.' in a given string.
    732 static void fixupObjcLikeName(StringRef Str, SmallVectorImpl<char> &Out) {
    733   bool isObjCLike = false;
    734   for (size_t i = 0, e = Str.size(); i < e; ++i) {
    735     char C = Str[i];
    736     if (C == '[')
    737       isObjCLike = true;
    738 
    739     if (isObjCLike && (C == '[' || C == ']' || C == ' ' || C == ':' ||
    740                        C == '+' || C == '(' || C == ')'))
    741       Out.push_back('.');
    742     else
    743       Out.push_back(C);
    744   }
    745 }
    746 
    747 /// getFnSpecificMDNode - Return a NameMDNode, if available, that is
    748 /// suitable to hold function specific information.
    749 NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {
    750   SmallString<32> Name = StringRef("llvm.dbg.lv.");
    751   fixupObjcLikeName(FuncName, Name);
    752 
    753   return M.getNamedMetadata(Name.str());
    754 }
    755 
    756 /// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
    757 /// to hold function specific information.
    758 NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) {
    759   SmallString<32> Name = StringRef("llvm.dbg.lv.");
    760   fixupObjcLikeName(FuncName, Name);
    761 
    762   return M.getOrInsertNamedMetadata(Name.str());
    763 }
    764 
    765 /// createInlinedVariable - Create a new inlined variable based on current
    766 /// variable.
    767 /// @param DV            Current Variable.
    768 /// @param InlinedScope  Location at current variable is inlined.
    769 DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope,
    770                                        LLVMContext &VMContext) {
    771   SmallVector<Value *, 16> Elts;
    772   // Insert inlined scope as 7th element.
    773   for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)
    774     i == 7 ? Elts.push_back(InlinedScope) :
    775              Elts.push_back(DV->getOperand(i));
    776   return DIVariable(MDNode::get(VMContext, Elts));
    777 }
    778 
    779 /// cleanseInlinedVariable - Remove inlined scope from the variable.
    780 DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) {
    781   SmallVector<Value *, 16> Elts;
    782   // Insert inlined scope as 7th element.
    783   for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)
    784     i == 7 ?
    785       Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext))):
    786       Elts.push_back(DV->getOperand(i));
    787   return DIVariable(MDNode::get(VMContext, Elts));
    788 }
    789 
    790 //===----------------------------------------------------------------------===//
    791 // DebugInfoFinder implementations.
    792 //===----------------------------------------------------------------------===//
    793 
    794 /// processModule - Process entire module and collect debug info.
    795 void DebugInfoFinder::processModule(Module &M) {
    796   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
    797     for (Function::iterator FI = (*I).begin(), FE = (*I).end(); FI != FE; ++FI)
    798       for (BasicBlock::iterator BI = (*FI).begin(), BE = (*FI).end(); BI != BE;
    799            ++BI) {
    800         if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
    801           processDeclare(DDI);
    802 
    803         DebugLoc Loc = BI->getDebugLoc();
    804         if (Loc.isUnknown())
    805           continue;
    806 
    807         LLVMContext &Ctx = BI->getContext();
    808         DIDescriptor Scope(Loc.getScope(Ctx));
    809 
    810         if (Scope.isCompileUnit())
    811           addCompileUnit(DICompileUnit(Scope));
    812         else if (Scope.isSubprogram())
    813           processSubprogram(DISubprogram(Scope));
    814         else if (Scope.isLexicalBlock())
    815           processLexicalBlock(DILexicalBlock(Scope));
    816 
    817         if (MDNode *IA = Loc.getInlinedAt(Ctx))
    818           processLocation(DILocation(IA));
    819       }
    820 
    821   if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv")) {
    822     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
    823       DIGlobalVariable DIG(cast<MDNode>(NMD->getOperand(i)));
    824       if (addGlobalVariable(DIG)) {
    825         addCompileUnit(DIG.getCompileUnit());
    826         processType(DIG.getType());
    827       }
    828     }
    829   }
    830 
    831   if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
    832     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
    833       processSubprogram(DISubprogram(NMD->getOperand(i)));
    834 }
    835 
    836 /// processLocation - Process DILocation.
    837 void DebugInfoFinder::processLocation(DILocation Loc) {
    838   if (!Loc.Verify()) return;
    839   DIDescriptor S(Loc.getScope());
    840   if (S.isCompileUnit())
    841     addCompileUnit(DICompileUnit(S));
    842   else if (S.isSubprogram())
    843     processSubprogram(DISubprogram(S));
    844   else if (S.isLexicalBlock())
    845     processLexicalBlock(DILexicalBlock(S));
    846   processLocation(Loc.getOrigLocation());
    847 }
    848 
    849 /// processType - Process DIType.
    850 void DebugInfoFinder::processType(DIType DT) {
    851   if (!addType(DT))
    852     return;
    853 
    854   addCompileUnit(DT.getCompileUnit());
    855   if (DT.isCompositeType()) {
    856     DICompositeType DCT(DT);
    857     processType(DCT.getTypeDerivedFrom());
    858     DIArray DA = DCT.getTypeArray();
    859     for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {
    860       DIDescriptor D = DA.getElement(i);
    861       if (D.isType())
    862         processType(DIType(D));
    863       else if (D.isSubprogram())
    864         processSubprogram(DISubprogram(D));
    865     }
    866   } else if (DT.isDerivedType()) {
    867     DIDerivedType DDT(DT);
    868     processType(DDT.getTypeDerivedFrom());
    869   }
    870 }
    871 
    872 /// processLexicalBlock
    873 void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) {
    874   DIScope Context = LB.getContext();
    875   if (Context.isLexicalBlock())
    876     return processLexicalBlock(DILexicalBlock(Context));
    877   else
    878     return processSubprogram(DISubprogram(Context));
    879 }
    880 
    881 /// processSubprogram - Process DISubprogram.
    882 void DebugInfoFinder::processSubprogram(DISubprogram SP) {
    883   if (!addSubprogram(SP))
    884     return;
    885   addCompileUnit(SP.getCompileUnit());
    886   processType(SP.getType());
    887 }
    888 
    889 /// processDeclare - Process DbgDeclareInst.
    890 void DebugInfoFinder::processDeclare(DbgDeclareInst *DDI) {
    891   MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
    892   if (!N) return;
    893 
    894   DIDescriptor DV(N);
    895   if (!DV.isVariable())
    896     return;
    897 
    898   if (!NodesSeen.insert(DV))
    899     return;
    900 
    901   addCompileUnit(DIVariable(N).getCompileUnit());
    902   processType(DIVariable(N).getType());
    903 }
    904 
    905 /// addType - Add type into Tys.
    906 bool DebugInfoFinder::addType(DIType DT) {
    907   if (!DT.isValid())
    908     return false;
    909 
    910   if (!NodesSeen.insert(DT))
    911     return false;
    912 
    913   TYs.push_back(DT);
    914   return true;
    915 }
    916 
    917 /// addCompileUnit - Add compile unit into CUs.
    918 bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {
    919   if (!CU.Verify())
    920     return false;
    921 
    922   if (!NodesSeen.insert(CU))
    923     return false;
    924 
    925   CUs.push_back(CU);
    926   return true;
    927 }
    928 
    929 /// addGlobalVariable - Add global variable into GVs.
    930 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {
    931   if (!DIDescriptor(DIG).isGlobalVariable())
    932     return false;
    933 
    934   if (!NodesSeen.insert(DIG))
    935     return false;
    936 
    937   GVs.push_back(DIG);
    938   return true;
    939 }
    940 
    941 // addSubprogram - Add subprgoram into SPs.
    942 bool DebugInfoFinder::addSubprogram(DISubprogram SP) {
    943   if (!DIDescriptor(SP).isSubprogram())
    944     return false;
    945 
    946   if (!NodesSeen.insert(SP))
    947     return false;
    948 
    949   SPs.push_back(SP);
    950   return true;
    951 }
    952 
    953 /// getDISubprogram - Find subprogram that is enclosing this scope.
    954 DISubprogram llvm::getDISubprogram(const MDNode *Scope) {
    955   DIDescriptor D(Scope);
    956   if (D.isSubprogram())
    957     return DISubprogram(Scope);
    958 
    959   if (D.isLexicalBlock())
    960     return getDISubprogram(DILexicalBlock(Scope).getContext());
    961 
    962   return DISubprogram();
    963 }
    964 
    965 /// getDICompositeType - Find underlying composite type.
    966 DICompositeType llvm::getDICompositeType(DIType T) {
    967   if (T.isCompositeType())
    968     return DICompositeType(T);
    969 
    970   if (T.isDerivedType())
    971     return getDICompositeType(DIDerivedType(T).getTypeDerivedFrom());
    972 
    973   return DICompositeType();
    974 }
    975