Remove ^M from the file.
authorBill Wendling <isanbard@gmail.com>
Fri, 8 Nov 2013 08:13:15 +0000 (08:13 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 8 Nov 2013 08:13:15 +0000 (08:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194251 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/DebugInfo.cpp

index ead426ee5de78193d055502dd90a246a226a6167..bb6d5d2891921acabcddf77f8a2fabd2e12aac43 100644 (file)
-//===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===//\r
-//\r
-//                     The LLVM Compiler Infrastructure\r
-//\r
-// This file is distributed under the University of Illinois Open Source\r
-// License. See LICENSE.TXT for details.\r
-//\r
-//===----------------------------------------------------------------------===//\r
-//\r
-// This file implements the helper classes used to build and interpret debug\r
-// information in LLVM IR form.\r
-//\r
-//===----------------------------------------------------------------------===//\r
-\r
-#include "llvm/DebugInfo.h"\r
-#include "llvm/ADT/STLExtras.h"\r
-#include "llvm/ADT/SmallPtrSet.h"\r
-#include "llvm/ADT/SmallString.h"\r
-#include "llvm/Analysis/ValueTracking.h"\r
-#include "llvm/IR/Constants.h"\r
-#include "llvm/IR/DerivedTypes.h"\r
-#include "llvm/IR/Instructions.h"\r
-#include "llvm/IR/IntrinsicInst.h"\r
-#include "llvm/IR/Intrinsics.h"\r
-#include "llvm/IR/Module.h"\r
-#include "llvm/Support/Debug.h"\r
-#include "llvm/Support/Dwarf.h"\r
-#include "llvm/Support/ValueHandle.h"\r
-#include "llvm/Support/raw_ostream.h"\r
-using namespace llvm;\r
-using namespace llvm::dwarf;\r
-\r
-//===----------------------------------------------------------------------===//\r
-// DIDescriptor\r
-//===----------------------------------------------------------------------===//\r
-\r
-bool DIDescriptor::Verify() const {\r
-  return DbgNode &&\r
-         (DIDerivedType(DbgNode).Verify() ||\r
-          DICompositeType(DbgNode).Verify() || DIBasicType(DbgNode).Verify() ||\r
-          DIVariable(DbgNode).Verify() || DISubprogram(DbgNode).Verify() ||\r
-          DIGlobalVariable(DbgNode).Verify() || DIFile(DbgNode).Verify() ||\r
-          DICompileUnit(DbgNode).Verify() || DINameSpace(DbgNode).Verify() ||\r
-          DILexicalBlock(DbgNode).Verify() ||\r
-          DILexicalBlockFile(DbgNode).Verify() ||\r
-          DISubrange(DbgNode).Verify() || DIEnumerator(DbgNode).Verify() ||\r
-          DIObjCProperty(DbgNode).Verify() ||\r
-          DITemplateTypeParameter(DbgNode).Verify() ||\r
-          DITemplateValueParameter(DbgNode).Verify() ||\r
-          DIImportedEntity(DbgNode).Verify());\r
-}\r
-\r
-static Value *getField(const MDNode *DbgNode, unsigned Elt) {\r
-  if (DbgNode == 0 || Elt >= DbgNode->getNumOperands())\r
-    return 0;\r
-  return DbgNode->getOperand(Elt);\r
-}\r
-\r
-static MDNode *getNodeField(const MDNode *DbgNode, unsigned Elt) {\r
-  return dyn_cast_or_null<MDNode>(getField(DbgNode, Elt));\r
-}\r
-\r
-static StringRef getStringField(const MDNode *DbgNode, unsigned Elt) {\r
-  if (MDString *MDS = dyn_cast_or_null<MDString>(getField(DbgNode, Elt)))\r
-    return MDS->getString();\r
-  return StringRef();\r
-}\r
-\r
-StringRef DIDescriptor::getStringField(unsigned Elt) const {\r
-  return ::getStringField(DbgNode, Elt);\r
-}\r
-\r
-uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {\r
-  if (DbgNode == 0)\r
-    return 0;\r
-\r
-  if (Elt < DbgNode->getNumOperands())\r
-    if (ConstantInt *CI\r
-        = dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt)))\r
-      return CI->getZExtValue();\r
-\r
-  return 0;\r
-}\r
-\r
-int64_t DIDescriptor::getInt64Field(unsigned Elt) const {\r
-  if (DbgNode == 0)\r
-    return 0;\r
-\r
-  if (Elt < DbgNode->getNumOperands())\r
-    if (ConstantInt *CI\r
-        = dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt)))\r
-      return CI->getSExtValue();\r
-\r
-  return 0;\r
-}\r
-\r
-DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const {\r
-  MDNode *Field = getNodeField(DbgNode, Elt);\r
-  return DIDescriptor(Field);\r
-}\r
-\r
-GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {\r
-  if (DbgNode == 0)\r
-    return 0;\r
-\r
-  if (Elt < DbgNode->getNumOperands())\r
-      return dyn_cast_or_null<GlobalVariable>(DbgNode->getOperand(Elt));\r
-  return 0;\r
-}\r
-\r
-Constant *DIDescriptor::getConstantField(unsigned Elt) const {\r
-  if (DbgNode == 0)\r
-    return 0;\r
-\r
-  if (Elt < DbgNode->getNumOperands())\r
-      return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt));\r
-  return 0;\r
-}\r
-\r
-Function *DIDescriptor::getFunctionField(unsigned Elt) const {\r
-  if (DbgNode == 0)\r
-    return 0;\r
-\r
-  if (Elt < DbgNode->getNumOperands())\r
-      return dyn_cast_or_null<Function>(DbgNode->getOperand(Elt));\r
-  return 0;\r
-}\r
-\r
-void DIDescriptor::replaceFunctionField(unsigned Elt, Function *F) {\r
-  if (DbgNode == 0)\r
-    return;\r
-\r
-  if (Elt < DbgNode->getNumOperands()) {\r
-    MDNode *Node = const_cast<MDNode*>(DbgNode);\r
-    Node->replaceOperandWith(Elt, F);\r
-  }\r
-}\r
-\r
-unsigned DIVariable::getNumAddrElements() const {\r
-  return DbgNode->getNumOperands()-8;\r
-}\r
-\r
-/// getInlinedAt - If this variable is inlined then return inline location.\r
-MDNode *DIVariable::getInlinedAt() const {\r
-  return getNodeField(DbgNode, 7);\r
-}\r
-\r
-//===----------------------------------------------------------------------===//\r
-// Predicates\r
-//===----------------------------------------------------------------------===//\r
-\r
-/// isBasicType - Return true if the specified tag is legal for\r
-/// DIBasicType.\r
-bool DIDescriptor::isBasicType() const {\r
-  if (!DbgNode) return false;\r
-  switch (getTag()) {\r
-  case dwarf::DW_TAG_base_type:\r
-  case dwarf::DW_TAG_unspecified_type:\r
-    return true;\r
-  default:\r
-    return false;\r
-  }\r
-}\r
-\r
-/// isDerivedType - Return true if the specified tag is legal for DIDerivedType.\r
-bool DIDescriptor::isDerivedType() const {\r
-  if (!DbgNode) return false;\r
-  switch (getTag()) {\r
-  case dwarf::DW_TAG_typedef:\r
-  case dwarf::DW_TAG_pointer_type:\r
-  case dwarf::DW_TAG_ptr_to_member_type:\r
-  case dwarf::DW_TAG_reference_type:\r
-  case dwarf::DW_TAG_rvalue_reference_type:\r
-  case dwarf::DW_TAG_const_type:\r
-  case dwarf::DW_TAG_volatile_type:\r
-  case dwarf::DW_TAG_restrict_type:\r
-  case dwarf::DW_TAG_member:\r
-  case dwarf::DW_TAG_inheritance:\r
-  case dwarf::DW_TAG_friend:\r
-    return true;\r
-  default:\r
-    // CompositeTypes are currently modelled as DerivedTypes.\r
-    return isCompositeType();\r
-  }\r
-}\r
-\r
-/// isCompositeType - Return true if the specified tag is legal for\r
-/// DICompositeType.\r
-bool DIDescriptor::isCompositeType() const {\r
-  if (!DbgNode) return false;\r
-  switch (getTag()) {\r
-  case dwarf::DW_TAG_array_type:\r
-  case dwarf::DW_TAG_structure_type:\r
-  case dwarf::DW_TAG_union_type:\r
-  case dwarf::DW_TAG_enumeration_type:\r
-  case dwarf::DW_TAG_subroutine_type:\r
-  case dwarf::DW_TAG_class_type:\r
-    return true;\r
-  default:\r
-    return false;\r
-  }\r
-}\r
-\r
-/// isVariable - Return true if the specified tag is legal for DIVariable.\r
-bool DIDescriptor::isVariable() const {\r
-  if (!DbgNode) return false;\r
-  switch (getTag()) {\r
-  case dwarf::DW_TAG_auto_variable:\r
-  case dwarf::DW_TAG_arg_variable:\r
-    return true;\r
-  default:\r
-    return false;\r
-  }\r
-}\r
-\r
-/// isType - Return true if the specified tag is legal for DIType.\r
-bool DIDescriptor::isType() const {\r
-  return isBasicType() || isCompositeType() || isDerivedType();\r
-}\r
-\r
-/// isSubprogram - Return true if the specified tag is legal for\r
-/// DISubprogram.\r
-bool DIDescriptor::isSubprogram() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_subprogram;\r
-}\r
-\r
-/// isGlobalVariable - Return true if the specified tag is legal for\r
-/// DIGlobalVariable.\r
-bool DIDescriptor::isGlobalVariable() const {\r
-  return DbgNode && (getTag() == dwarf::DW_TAG_variable ||\r
-                     getTag() == dwarf::DW_TAG_constant);\r
-}\r
-\r
-/// isUnspecifiedParmeter - Return true if the specified tag is\r
-/// DW_TAG_unspecified_parameters.\r
-bool DIDescriptor::isUnspecifiedParameter() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_unspecified_parameters;\r
-}\r
-\r
-/// isScope - Return true if the specified tag is one of the scope\r
-/// related tag.\r
-bool DIDescriptor::isScope() const {\r
-  if (!DbgNode) return false;\r
-  switch (getTag()) {\r
-  case dwarf::DW_TAG_compile_unit:\r
-  case dwarf::DW_TAG_lexical_block:\r
-  case dwarf::DW_TAG_subprogram:\r
-  case dwarf::DW_TAG_namespace:\r
-  case dwarf::DW_TAG_file_type:\r
-    return true;\r
-  default:\r
-    break;\r
-  }\r
-  return isType();\r
-}\r
-\r
-/// isTemplateTypeParameter - Return true if the specified tag is\r
-/// DW_TAG_template_type_parameter.\r
-bool DIDescriptor::isTemplateTypeParameter() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_template_type_parameter;\r
-}\r
-\r
-/// isTemplateValueParameter - Return true if the specified tag is\r
-/// DW_TAG_template_value_parameter.\r
-bool DIDescriptor::isTemplateValueParameter() const {\r
-  return DbgNode && (getTag() == dwarf::DW_TAG_template_value_parameter ||\r
-                     getTag() == dwarf::DW_TAG_GNU_template_template_param ||\r
-                     getTag() == dwarf::DW_TAG_GNU_template_parameter_pack);\r
-}\r
-\r
-/// isCompileUnit - Return true if the specified tag is DW_TAG_compile_unit.\r
-bool DIDescriptor::isCompileUnit() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_compile_unit;\r
-}\r
-\r
-/// isFile - Return true if the specified tag is DW_TAG_file_type.\r
-bool DIDescriptor::isFile() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_file_type;\r
-}\r
-\r
-/// isNameSpace - Return true if the specified tag is DW_TAG_namespace.\r
-bool DIDescriptor::isNameSpace() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_namespace;\r
-}\r
-\r
-/// isLexicalBlockFile - Return true if the specified descriptor is a\r
-/// lexical block with an extra file.\r
-bool DIDescriptor::isLexicalBlockFile() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&\r
-    (DbgNode->getNumOperands() == 3);\r
-}\r
-\r
-/// isLexicalBlock - Return true if the specified tag is DW_TAG_lexical_block.\r
-bool DIDescriptor::isLexicalBlock() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&\r
-    (DbgNode->getNumOperands() > 3);\r
-}\r
-\r
-/// isSubrange - Return true if the specified tag is DW_TAG_subrange_type.\r
-bool DIDescriptor::isSubrange() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_subrange_type;\r
-}\r
-\r
-/// isEnumerator - Return true if the specified tag is DW_TAG_enumerator.\r
-bool DIDescriptor::isEnumerator() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_enumerator;\r
-}\r
-\r
-/// isObjCProperty - Return true if the specified tag is DW_TAG_APPLE_property.\r
-bool DIDescriptor::isObjCProperty() const {\r
-  return DbgNode && getTag() == dwarf::DW_TAG_APPLE_property;\r
-}\r
-\r
-/// \brief Return true if the specified tag is DW_TAG_imported_module or\r
-/// DW_TAG_imported_declaration.\r
-bool DIDescriptor::isImportedEntity() const {\r
-  return DbgNode && (getTag() == dwarf::DW_TAG_imported_module ||\r
-                     getTag() == dwarf::DW_TAG_imported_declaration);\r
-}\r
-\r
-//===----------------------------------------------------------------------===//\r
-// Simple Descriptor Constructors and other Methods\r
-//===----------------------------------------------------------------------===//\r
-\r
-unsigned DIArray::getNumElements() const {\r
-  if (!DbgNode)\r
-    return 0;\r
-  return DbgNode->getNumOperands();\r
-}\r
-\r
-/// replaceAllUsesWith - Replace all uses of the MDNode used by this\r
-/// type with the one in the passed descriptor.\r
-void DIType::replaceAllUsesWith(DIDescriptor &D) {\r
-\r
-  assert(DbgNode && "Trying to replace an unverified type!");\r
-\r
-  // Since we use a TrackingVH for the node, its easy for clients to manufacture\r
-  // legitimate situations where they want to replaceAllUsesWith() on something\r
-  // which, due to uniquing, has merged with the source. We shield clients from\r
-  // this detail by allowing a value to be replaced with replaceAllUsesWith()\r
-  // itself.\r
-  if (DbgNode != D) {\r
-    MDNode *Node = const_cast<MDNode*>(DbgNode);\r
-    const MDNode *DN = D;\r
-    const Value *V = cast_or_null<Value>(DN);\r
-    Node->replaceAllUsesWith(const_cast<Value*>(V));\r
-    MDNode::deleteTemporary(Node);\r
-  }\r
-}\r
-\r
-/// replaceAllUsesWith - Replace all uses of the MDNode used by this\r
-/// type with the one in D.\r
-void DIType::replaceAllUsesWith(MDNode *D) {\r
-\r
-  assert(DbgNode && "Trying to replace an unverified type!");\r
-\r
-  // Since we use a TrackingVH for the node, its easy for clients to manufacture\r
-  // legitimate situations where they want to replaceAllUsesWith() on something\r
-  // which, due to uniquing, has merged with the source. We shield clients from\r
-  // this detail by allowing a value to be replaced with replaceAllUsesWith()\r
-  // itself.\r
-  if (DbgNode != D) {\r
-    MDNode *Node = const_cast<MDNode*>(DbgNode);\r
-    const MDNode *DN = D;\r
-    const Value *V = cast_or_null<Value>(DN);\r
-    Node->replaceAllUsesWith(const_cast<Value*>(V));\r
-    MDNode::deleteTemporary(Node);\r
-  }\r
-}\r
-\r
-/// Verify - Verify that a compile unit is well formed.\r
-bool DICompileUnit::Verify() const {\r
-  if (!isCompileUnit())\r
-    return false;\r
-\r
-  // Don't bother verifying the compilation directory or producer string\r
-  // as those could be empty.\r
-  if (getFilename().empty())\r
-    return false;\r
-\r
-  return DbgNode->getNumOperands() == 13;\r
-}\r
-\r
-/// Verify - Verify that an ObjC property is well formed.\r
-bool DIObjCProperty::Verify() const {\r
-  if (!isObjCProperty())\r
-    return false;\r
-\r
-  // Don't worry about the rest of the strings for now.\r
-  return DbgNode->getNumOperands() == 8;\r
-}\r
-\r
-/// Check if a field at position Elt of a MDNode is a MDNode.\r
-/// We currently allow an empty string and an integer.\r
-/// But we don't allow a non-empty string in a MDNode field.\r
-static bool fieldIsMDNode(const MDNode *DbgNode, unsigned Elt) {\r
-  // FIXME: This function should return true, if the field is null or the field\r
-  // is indeed a MDNode: return !Fld || isa<MDNode>(Fld).\r
-  Value *Fld = getField(DbgNode, Elt);\r
-  if (Fld && isa<MDString>(Fld) &&\r
-      !cast<MDString>(Fld)->getString().empty())\r
-    return false;\r
-  return true;\r
-}\r
-\r
-/// Check if a field at position Elt of a MDNode is a MDString.\r
-static bool fieldIsMDString(const MDNode *DbgNode, unsigned Elt) {\r
-  Value *Fld = getField(DbgNode, Elt);\r
-  return !Fld || isa<MDString>(Fld);\r
-}\r
-\r
-/// Check if a value can be a reference to a type.\r
-static bool isTypeRef(const Value *Val) {\r
-  return !Val ||\r
-         (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||\r
-         (isa<MDNode>(Val) && DIType(cast<MDNode>(Val)).isType());\r
-}\r
-\r
-/// Check if a field at position Elt of a MDNode can be a reference to a type.\r
-static bool fieldIsTypeRef(const MDNode *DbgNode, unsigned Elt) {\r
-  Value *Fld = getField(DbgNode, Elt);\r
-  return isTypeRef(Fld);\r
-}\r
-\r
-/// Check if a value can be a ScopeRef.\r
-static bool isScopeRef(const Value *Val) {\r
-  return !Val ||\r
-         (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||\r
-         (isa<MDNode>(Val) && DIScope(cast<MDNode>(Val)).isScope());\r
-}\r
-\r
-/// Check if a field at position Elt of a MDNode can be a ScopeRef.\r
-static bool fieldIsScopeRef(const MDNode *DbgNode, unsigned Elt) {\r
-  Value *Fld = getField(DbgNode, Elt);\r
-  return isScopeRef(Fld);\r
-}\r
-\r
-/// Verify - Verify that a type descriptor is well formed.\r
-bool DIType::Verify() const {\r
-  if (!isType())\r
-    return false;\r
-  // Make sure Context @ field 2 is MDNode.\r
-  if (!fieldIsScopeRef(DbgNode, 2))\r
-    return false;\r
-\r
-  // FIXME: Sink this into the various subclass verifies.\r
-  uint16_t Tag = getTag();\r
-  if (!isBasicType() && Tag != dwarf::DW_TAG_const_type &&\r
-      Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_pointer_type &&\r
-      Tag != dwarf::DW_TAG_ptr_to_member_type &&\r
-      Tag != dwarf::DW_TAG_reference_type &&\r
-      Tag != dwarf::DW_TAG_rvalue_reference_type &&\r
-      Tag != dwarf::DW_TAG_restrict_type && Tag != dwarf::DW_TAG_array_type &&\r
-      Tag != dwarf::DW_TAG_enumeration_type &&\r
-      Tag != dwarf::DW_TAG_subroutine_type &&\r
-      Tag != dwarf::DW_TAG_inheritance && Tag != dwarf::DW_TAG_friend &&\r
-      getFilename().empty())\r
-    return false;\r
-  // DIType is abstract, it should be a BasicType, a DerivedType or\r
-  // a CompositeType.\r
-  if (isBasicType())\r
-    DIBasicType(DbgNode).Verify();\r
-  else if (isCompositeType())\r
-    DICompositeType(DbgNode).Verify();\r
-  else if (isDerivedType())\r
-    DIDerivedType(DbgNode).Verify();\r
-  else\r
-    return false;\r
-  return true;\r
-}\r
-\r
-/// Verify - Verify that a basic type descriptor is well formed.\r
-bool DIBasicType::Verify() const {\r
-  return isBasicType() && DbgNode->getNumOperands() == 10;\r
-}\r
-\r
-/// Verify - Verify that a derived type descriptor is well formed.\r
-bool DIDerivedType::Verify() const {\r
-  // Make sure DerivedFrom @ field 9 is TypeRef.\r
-  if (!fieldIsTypeRef(DbgNode, 9))\r
-    return false;\r
-  if (getTag() == dwarf::DW_TAG_ptr_to_member_type)\r
-    // Make sure ClassType @ field 10 is a TypeRef.\r
-    if (!fieldIsTypeRef(DbgNode, 10))\r
-      return false;\r
-\r
-  return isDerivedType() && DbgNode->getNumOperands() >= 10 &&\r
-         DbgNode->getNumOperands() <= 14;\r
-}\r
-\r
-/// Verify - Verify that a composite type descriptor is well formed.\r
-bool DICompositeType::Verify() const {\r
-  if (!isCompositeType())\r
-    return false;\r
-\r
-  // Make sure DerivedFrom @ field 9 and ContainingType @ field 12 are TypeRef.\r
-  if (!fieldIsTypeRef(DbgNode, 9))\r
-    return false;\r
-  if (!fieldIsTypeRef(DbgNode, 12))\r
-    return false;\r
-\r
-  // Make sure the type identifier at field 14 is MDString, it can be null.\r
-  if (!fieldIsMDString(DbgNode, 14))\r
-    return false;\r
-\r
-  return DbgNode->getNumOperands() == 15;\r
-}\r
-\r
-/// Verify - Verify that a subprogram descriptor is well formed.\r
-bool DISubprogram::Verify() const {\r
-  if (!isSubprogram())\r
-    return false;\r
-\r
-  // Make sure context @ field 2 is a ScopeRef and type @ field 7 is a MDNode.\r
-  if (!fieldIsScopeRef(DbgNode, 2))\r
-    return false;\r
-  if (!fieldIsMDNode(DbgNode, 7))\r
-    return false;\r
-  // Containing type @ field 12.\r
-  if (!fieldIsTypeRef(DbgNode, 12))\r
-    return false;\r
-  return DbgNode->getNumOperands() == 20;\r
-}\r
-\r
-/// Verify - Verify that a global variable descriptor is well formed.\r
-bool DIGlobalVariable::Verify() const {\r
-  if (!isGlobalVariable())\r
-    return false;\r
-\r
-  if (getDisplayName().empty())\r
-    return false;\r
-  // Make sure context @ field 2 and type @ field 8 are MDNodes.\r
-  if (!fieldIsMDNode(DbgNode, 2))\r
-    return false;\r
-  if (!fieldIsMDNode(DbgNode, 8))\r
-    return false;\r
-  // Make sure StaticDataMemberDeclaration @ field 12 is MDNode.\r
-  if (!fieldIsMDNode(DbgNode, 12))\r
-    return false;\r
-\r
-  return DbgNode->getNumOperands() == 13;\r
-}\r
-\r
-/// Verify - Verify that a variable descriptor is well formed.\r
-bool DIVariable::Verify() const {\r
-  if (!isVariable())\r
-    return false;\r
-\r
-  // Make sure context @ field 1 and type @ field 5 are MDNodes.\r
-  if (!fieldIsMDNode(DbgNode, 1))\r
-    return false;\r
-  if (!fieldIsMDNode(DbgNode, 5))\r
-    return false;\r
-  return DbgNode->getNumOperands() >= 8;\r
-}\r
-\r
-/// Verify - Verify that a location descriptor is well formed.\r
-bool DILocation::Verify() const {\r
-  if (!DbgNode)\r
-    return false;\r
-\r
-  return DbgNode->getNumOperands() == 4;\r
-}\r
-\r
-/// Verify - Verify that a namespace descriptor is well formed.\r
-bool DINameSpace::Verify() const {\r
-  if (!isNameSpace())\r
-    return false;\r
-  return DbgNode->getNumOperands() == 5;\r
-}\r
-\r
-/// \brief Retrieve the MDNode for the directory/file pair.\r
-MDNode *DIFile::getFileNode() const {\r
-  return getNodeField(DbgNode, 1);\r
-}\r
-\r
-/// \brief Verify that the file descriptor is well formed.\r
-bool DIFile::Verify() const {\r
-  return isFile() && DbgNode->getNumOperands() == 2;\r
-}\r
-\r
-/// \brief Verify that the enumerator descriptor is well formed.\r
-bool DIEnumerator::Verify() const {\r
-  return isEnumerator() && DbgNode->getNumOperands() == 3;\r
-}\r
-\r
-/// \brief Verify that the subrange descriptor is well formed.\r
-bool DISubrange::Verify() const {\r
-  return isSubrange() && DbgNode->getNumOperands() == 3;\r
-}\r
-\r
-/// \brief Verify that the lexical block descriptor is well formed.\r
-bool DILexicalBlock::Verify() const {\r
-  return isLexicalBlock() && DbgNode->getNumOperands() == 6;\r
-}\r
-\r
-/// \brief Verify that the file-scoped lexical block descriptor is well formed.\r
-bool DILexicalBlockFile::Verify() const {\r
-  return isLexicalBlockFile() && DbgNode->getNumOperands() == 3;\r
-}\r
-\r
-/// \brief Verify that the template type parameter descriptor is well formed.\r
-bool DITemplateTypeParameter::Verify() const {\r
-  return isTemplateTypeParameter() && DbgNode->getNumOperands() == 7;\r
-}\r
-\r
-/// \brief Verify that the template value parameter descriptor is well formed.\r
-bool DITemplateValueParameter::Verify() const {\r
-  return isTemplateValueParameter() && DbgNode->getNumOperands() == 8;\r
-}\r
-\r
-/// \brief Verify that the imported module descriptor is well formed.\r
-bool DIImportedEntity::Verify() const {\r
-  return isImportedEntity() &&\r
-         (DbgNode->getNumOperands() == 4 || DbgNode->getNumOperands() == 5);\r
-}\r
-\r
-/// getObjCProperty - Return property node, if this ivar is associated with one.\r
-MDNode *DIDerivedType::getObjCProperty() const {\r
-  return getNodeField(DbgNode, 10);\r
-}\r
-\r
-MDString *DICompositeType::getIdentifier() const {\r
-  return cast_or_null<MDString>(getField(DbgNode, 14));\r
-}\r
-\r
-#ifndef NDEBUG\r
-static void VerifySubsetOf(const MDNode *LHS, const MDNode *RHS) {\r
-  for (unsigned i = 0; i != LHS->getNumOperands(); ++i) {\r
-    // Skip the 'empty' list (that's a single i32 0, rather than truly empty).\r
-    if (i == 0 && isa<ConstantInt>(LHS->getOperand(i)))\r
-      continue;\r
-    const MDNode *E = cast<MDNode>(LHS->getOperand(i));\r
-    bool found = false;\r
-    for (unsigned j = 0; !found && j != RHS->getNumOperands(); ++j)\r
-      found = E == RHS->getOperand(j);\r
-    assert(found && "Losing a member during member list replacement");\r
-  }\r
-}\r
-#endif\r
-\r
-/// \brief Set the array of member DITypes.\r
-void DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) {\r
-  assert((!TParams || DbgNode->getNumOperands() == 15) &&\r
-         "If you're setting the template parameters this should include a slot "\r
-         "for that!");\r
-  TrackingVH<MDNode> N(*this);\r
-  if (Elements) {\r
-#ifndef NDEBUG\r
-    // Check that the new list of members contains all the old members as well.\r
-    if (const MDNode *El = cast_or_null<MDNode>(N->getOperand(10)))\r
-      VerifySubsetOf(El, Elements);\r
-#endif\r
-    N->replaceOperandWith(10, Elements);\r
-  }\r
-  if (TParams)\r
-    N->replaceOperandWith(13, TParams);\r
-  DbgNode = N;\r
-}\r
-\r
-void DICompositeType::addMember(DIDescriptor D) {\r
-  SmallVector<llvm::Value *, 16> M;\r
-  DIArray OrigM = getTypeArray();\r
-  unsigned Elements = OrigM.getNumElements();\r
-  if (Elements == 1 && !OrigM.getElement(0))\r
-    Elements = 0;\r
-  M.reserve(Elements + 1);\r
-  for (unsigned i = 0; i != Elements; ++i)\r
-    M.push_back(OrigM.getElement(i));\r
-  M.push_back(D);\r
-  setTypeArray(DIArray(MDNode::get(DbgNode->getContext(), M)));\r
-}\r
-\r
-/// Generate a reference to this DIType. Uses the type identifier instead\r
-/// of the actual MDNode if possible, to help type uniquing.\r
-DIScopeRef DIScope::getRef() const {\r
-  if (!isCompositeType())\r
-    return DIScopeRef(*this);\r
-  DICompositeType DTy(DbgNode);\r
-  if (!DTy.getIdentifier())\r
-    return DIScopeRef(*this);\r
-  return DIScopeRef(DTy.getIdentifier());\r
-}\r
-\r
-/// \brief Set the containing type.\r
-void DICompositeType::setContainingType(DICompositeType ContainingType) {\r
-  TrackingVH<MDNode> N(*this);\r
-  N->replaceOperandWith(12, ContainingType.getRef());\r
-  DbgNode = N;\r
-}\r
-\r
-/// isInlinedFnArgument - Return true if this variable provides debugging\r
-/// information for an inlined function arguments.\r
-bool DIVariable::isInlinedFnArgument(const Function *CurFn) {\r
-  assert(CurFn && "Invalid function");\r
-  if (!getContext().isSubprogram())\r
-    return false;\r
-  // This variable is not inlined function argument if its scope\r
-  // does not describe current function.\r
-  return !DISubprogram(getContext()).describes(CurFn);\r
-}\r
-\r
-/// describes - Return true if this subprogram provides debugging\r
-/// information for the function F.\r
-bool DISubprogram::describes(const Function *F) {\r
-  assert(F && "Invalid function");\r
-  if (F == getFunction())\r
-    return true;\r
-  StringRef Name = getLinkageName();\r
-  if (Name.empty())\r
-    Name = getName();\r
-  if (F->getName() == Name)\r
-    return true;\r
-  return false;\r
-}\r
-\r
-unsigned DISubprogram::isOptimized() const {\r
-  assert (DbgNode && "Invalid subprogram descriptor!");\r
-  if (DbgNode->getNumOperands() == 15)\r
-    return getUnsignedField(14);\r
-  return 0;\r
-}\r
-\r
-MDNode *DISubprogram::getVariablesNodes() const {\r
-  return getNodeField(DbgNode, 18);\r
-}\r
-\r
-DIArray DISubprogram::getVariables() const {\r
-  return DIArray(getNodeField(DbgNode, 18));\r
-}\r
-\r
-Value *DITemplateValueParameter::getValue() const {\r
-  return getField(DbgNode, 4);\r
-}\r
-\r
-// If the current node has a parent scope then return that,\r
-// else return an empty scope.\r
-DIScopeRef DIScope::getContext() const {\r
-\r
-  if (isType())\r
-    return DIType(DbgNode).getContext();\r
-\r
-  if (isSubprogram())\r
-    return DIScopeRef(DISubprogram(DbgNode).getContext());\r
-\r
-  if (isLexicalBlock())\r
-    return DIScopeRef(DILexicalBlock(DbgNode).getContext());\r
-\r
-  if (isLexicalBlockFile())\r
-    return DIScopeRef(DILexicalBlockFile(DbgNode).getContext());\r
-\r
-  if (isNameSpace())\r
-    return DIScopeRef(DINameSpace(DbgNode).getContext());\r
-\r
-  assert((isFile() || isCompileUnit()) && "Unhandled type of scope.");\r
-  return DIScopeRef(NULL);\r
-}\r
-\r
-// If the scope node has a name, return that, else return an empty string.\r
-StringRef DIScope::getName() const {\r
-  if (isType())\r
-    return DIType(DbgNode).getName();\r
-  if (isSubprogram())\r
-    return DISubprogram(DbgNode).getName();\r
-  if (isNameSpace())\r
-    return DINameSpace(DbgNode).getName();\r
-  assert((isLexicalBlock() || isLexicalBlockFile() || isFile() ||\r
-          isCompileUnit()) && "Unhandled type of scope.");\r
-  return StringRef();\r
-}\r
-\r
-StringRef DIScope::getFilename() const {\r
-  if (!DbgNode)\r
-    return StringRef();\r
-  return ::getStringField(getNodeField(DbgNode, 1), 0);\r
-}\r
-\r
-StringRef DIScope::getDirectory() const {\r
-  if (!DbgNode)\r
-    return StringRef();\r
-  return ::getStringField(getNodeField(DbgNode, 1), 1);\r
-}\r
-\r
-DIArray DICompileUnit::getEnumTypes() const {\r
-  if (!DbgNode || DbgNode->getNumOperands() < 13)\r
-    return DIArray();\r
-\r
-  return DIArray(getNodeField(DbgNode, 7));\r
-}\r
-\r
-DIArray DICompileUnit::getRetainedTypes() const {\r
-  if (!DbgNode || DbgNode->getNumOperands() < 13)\r
-    return DIArray();\r
-\r
-  return DIArray(getNodeField(DbgNode, 8));\r
-}\r
-\r
-DIArray DICompileUnit::getSubprograms() const {\r
-  if (!DbgNode || DbgNode->getNumOperands() < 13)\r
-    return DIArray();\r
-\r
-  return DIArray(getNodeField(DbgNode, 9));\r
-}\r
-\r
-\r
-DIArray DICompileUnit::getGlobalVariables() const {\r
-  if (!DbgNode || DbgNode->getNumOperands() < 13)\r
-    return DIArray();\r
-\r
-  return DIArray(getNodeField(DbgNode, 10));\r
-}\r
-\r
-DIArray DICompileUnit::getImportedEntities() const {\r
-  if (!DbgNode || DbgNode->getNumOperands() < 13)\r
-    return DIArray();\r
-\r
-  return DIArray(getNodeField(DbgNode, 11));\r
-}\r
-\r
-/// fixupSubprogramName - Replace contains special characters used\r
-/// in a typical Objective-C names with '.' in a given string.\r
-static void fixupSubprogramName(DISubprogram Fn, SmallVectorImpl<char> &Out) {\r
-  StringRef FName =\r
-      Fn.getFunction() ? Fn.getFunction()->getName() : Fn.getName();\r
-  FName = Function::getRealLinkageName(FName);\r
-\r
-  StringRef Prefix("llvm.dbg.lv.");\r
-  Out.reserve(FName.size() + Prefix.size());\r
-  Out.append(Prefix.begin(), Prefix.end());\r
-\r
-  bool isObjCLike = false;\r
-  for (size_t i = 0, e = FName.size(); i < e; ++i) {\r
-    char C = FName[i];\r
-    if (C == '[')\r
-      isObjCLike = true;\r
-\r
-    if (isObjCLike && (C == '[' || C == ']' || C == ' ' || C == ':' ||\r
-                       C == '+' || C == '(' || C == ')'))\r
-      Out.push_back('.');\r
-    else\r
-      Out.push_back(C);\r
-  }\r
-}\r
-\r
-/// getFnSpecificMDNode - Return a NameMDNode, if available, that is\r
-/// suitable to hold function specific information.\r
-NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, DISubprogram Fn) {\r
-  SmallString<32> Name;\r
-  fixupSubprogramName(Fn, Name);\r
-  return M.getNamedMetadata(Name.str());\r
-}\r
-\r
-/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable\r
-/// to hold function specific information.\r
-NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, DISubprogram Fn) {\r
-  SmallString<32> Name;\r
-  fixupSubprogramName(Fn, Name);\r
-  return M.getOrInsertNamedMetadata(Name.str());\r
-}\r
-\r
-/// createInlinedVariable - Create a new inlined variable based on current\r
-/// variable.\r
-/// @param DV            Current Variable.\r
-/// @param InlinedScope  Location at current variable is inlined.\r
-DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope,\r
-                                       LLVMContext &VMContext) {\r
-  SmallVector<Value *, 16> Elts;\r
-  // Insert inlined scope as 7th element.\r
-  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)\r
-    i == 7 ? Elts.push_back(InlinedScope) :\r
-             Elts.push_back(DV->getOperand(i));\r
-  return DIVariable(MDNode::get(VMContext, Elts));\r
-}\r
-\r
-/// cleanseInlinedVariable - Remove inlined scope from the variable.\r
-DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) {\r
-  SmallVector<Value *, 16> Elts;\r
-  // Insert inlined scope as 7th element.\r
-  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)\r
-    i == 7 ?\r
-      Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))):\r
-      Elts.push_back(DV->getOperand(i));\r
-  return DIVariable(MDNode::get(VMContext, Elts));\r
-}\r
-\r
-/// getDISubprogram - Find subprogram that is enclosing this scope.\r
-DISubprogram llvm::getDISubprogram(const MDNode *Scope) {\r
-  DIDescriptor D(Scope);\r
-  if (D.isSubprogram())\r
-    return DISubprogram(Scope);\r
-\r
-  if (D.isLexicalBlockFile())\r
-    return getDISubprogram(DILexicalBlockFile(Scope).getContext());\r
-\r
-  if (D.isLexicalBlock())\r
-    return getDISubprogram(DILexicalBlock(Scope).getContext());\r
-\r
-  return DISubprogram();\r
-}\r
-\r
-/// getDICompositeType - Find underlying composite type.\r
-DICompositeType llvm::getDICompositeType(DIType T) {\r
-  if (T.isCompositeType())\r
-    return DICompositeType(T);\r
-\r
-  if (T.isDerivedType()) {\r
-    // This function is currently used by dragonegg and dragonegg does\r
-    // not generate identifier for types, so using an empty map to resolve\r
-    // DerivedFrom should be fine.\r
-    DITypeIdentifierMap EmptyMap;\r
-    return getDICompositeType(DIDerivedType(T).getTypeDerivedFrom()\r
-                                              .resolve(EmptyMap));\r
-  }\r
-\r
-  return DICompositeType();\r
-}\r
-\r
-/// Update DITypeIdentifierMap by going through retained types of each CU.\r
-DITypeIdentifierMap llvm::generateDITypeIdentifierMap(\r
-                              const NamedMDNode *CU_Nodes) {\r
-  DITypeIdentifierMap Map;\r
-  for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) {\r
-    DICompileUnit CU(CU_Nodes->getOperand(CUi));\r
-    DIArray Retain = CU.getRetainedTypes();\r
-    for (unsigned Ti = 0, Te = Retain.getNumElements(); Ti != Te; ++Ti) {\r
-      if (!Retain.getElement(Ti).isCompositeType())\r
-        continue;\r
-      DICompositeType Ty(Retain.getElement(Ti));\r
-      if (MDString *TypeId = Ty.getIdentifier()) {\r
-        // Definition has priority over declaration.\r
-        // Try to insert (TypeId, Ty) to Map.\r
-        std::pair<DITypeIdentifierMap::iterator, bool> P =\r
-            Map.insert(std::make_pair(TypeId, Ty));\r
-        // If TypeId already exists in Map and this is a definition, replace\r
-        // whatever we had (declaration or definition) with the definition.\r
-        if (!P.second && !Ty.isForwardDecl())\r
-          P.first->second = Ty;\r
-      }\r
-    }\r
-  }\r
-  return Map;\r
-}\r
-\r
-//===----------------------------------------------------------------------===//\r
-// DebugInfoFinder implementations.\r
-//===----------------------------------------------------------------------===//\r
-\r
-void DebugInfoFinder::reset() {\r
-  CUs.clear();\r
-  SPs.clear();\r
-  GVs.clear();\r
-  TYs.clear();\r
-  Scopes.clear();\r
-  NodesSeen.clear();\r
-  TypeIdentifierMap.clear();\r
-}\r
-\r
-/// processModule - Process entire module and collect debug info.\r
-void DebugInfoFinder::processModule(const Module &M) {\r
-  if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {\r
-    TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);\r
-    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {\r
-      DICompileUnit CU(CU_Nodes->getOperand(i));\r
-      addCompileUnit(CU);\r
-      DIArray GVs = CU.getGlobalVariables();\r
-      for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {\r
-        DIGlobalVariable DIG(GVs.getElement(i));\r
-        if (addGlobalVariable(DIG)) {\r
-          processScope(DIG.getContext());\r
-          processType(DIG.getType());\r
-        }\r
-      }\r
-      DIArray SPs = CU.getSubprograms();\r
-      for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)\r
-        processSubprogram(DISubprogram(SPs.getElement(i)));\r
-      DIArray EnumTypes = CU.getEnumTypes();\r
-      for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)\r
-        processType(DIType(EnumTypes.getElement(i)));\r
-      DIArray RetainedTypes = CU.getRetainedTypes();\r
-      for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)\r
-        processType(DIType(RetainedTypes.getElement(i)));\r
-      DIArray Imports = CU.getImportedEntities();\r
-      for (unsigned i = 0, e = Imports.getNumElements(); i != e; ++i) {\r
-        DIImportedEntity Import = DIImportedEntity(\r
-                                    Imports.getElement(i));\r
-        DIDescriptor Entity = Import.getEntity();\r
-        if (Entity.isType())\r
-          processType(DIType(Entity));\r
-        else if (Entity.isSubprogram())\r
-          processSubprogram(DISubprogram(Entity));\r
-        else if (Entity.isNameSpace())\r
-          processScope(DINameSpace(Entity).getContext());\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-/// processLocation - Process DILocation.\r
-void DebugInfoFinder::processLocation(DILocation Loc) {\r
-  if (!Loc) return;\r
-  processScope(Loc.getScope());\r
-  processLocation(Loc.getOrigLocation());\r
-}\r
-\r
-/// processType - Process DIType.\r
-void DebugInfoFinder::processType(DIType DT) {\r
-  if (!addType(DT))\r
-    return;\r
-  processScope(DT.getContext().resolve(TypeIdentifierMap));\r
-  if (DT.isCompositeType()) {\r
-    DICompositeType DCT(DT);\r
-    processType(DCT.getTypeDerivedFrom().resolve(TypeIdentifierMap));\r
-    DIArray DA = DCT.getTypeArray();\r
-    for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {\r
-      DIDescriptor D = DA.getElement(i);\r
-      if (D.isType())\r
-        processType(DIType(D));\r
-      else if (D.isSubprogram())\r
-        processSubprogram(DISubprogram(D));\r
-    }\r
-  } else if (DT.isDerivedType()) {\r
-    DIDerivedType DDT(DT);\r
-    processType(DDT.getTypeDerivedFrom().resolve(TypeIdentifierMap));\r
-  }\r
-}\r
-\r
-void DebugInfoFinder::processScope(DIScope Scope) {\r
-  if (Scope.isType()) {\r
-    DIType Ty(Scope);\r
-    processType(Ty);\r
-    return;\r
-  }\r
-  if (Scope.isCompileUnit()) {\r
-    addCompileUnit(DICompileUnit(Scope));\r
-    return;\r
-  }\r
-  if (Scope.isSubprogram()) {\r
-    processSubprogram(DISubprogram(Scope));\r
-    return;\r
-  }\r
-  if (!addScope(Scope))\r
-    return;\r
-  if (Scope.isLexicalBlock()) {\r
-    DILexicalBlock LB(Scope);\r
-    processScope(LB.getContext());\r
-  } else if (Scope.isLexicalBlockFile()) {\r
-    DILexicalBlockFile LBF = DILexicalBlockFile(Scope);\r
-    processScope(LBF.getScope());\r
-  } else if (Scope.isNameSpace()) {\r
-    DINameSpace NS(Scope);\r
-    processScope(NS.getContext());\r
-  }\r
-}\r
-\r
-/// processLexicalBlock\r
-void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) {\r
-  DIScope Context = LB.getContext();\r
-  if (Context.isLexicalBlock())\r
-    return processLexicalBlock(DILexicalBlock(Context));\r
-  else if (Context.isLexicalBlockFile()) {\r
-    DILexicalBlockFile DBF = DILexicalBlockFile(Context);\r
-    return processLexicalBlock(DILexicalBlock(DBF.getScope()));\r
-  }\r
-  else\r
-    return processSubprogram(DISubprogram(Context));\r
-}\r
-\r
-/// processSubprogram - Process DISubprogram.\r
-void DebugInfoFinder::processSubprogram(DISubprogram SP) {\r
-  if (!addSubprogram(SP))\r
-    return;\r
-  processScope(SP.getContext().resolve(TypeIdentifierMap));\r
-  processType(SP.getType());\r
-  DIArray TParams = SP.getTemplateParams();\r
-  for (unsigned I = 0, E = TParams.getNumElements(); I != E; ++I) {\r
-    DIDescriptor Element = TParams.getElement(I);\r
-    if (Element.isTemplateTypeParameter()) {\r
-      DITemplateTypeParameter TType(Element);\r
-      processScope(TType.getContext().resolve(TypeIdentifierMap));\r
-      processType(TType.getType().resolve(TypeIdentifierMap));\r
-    } else if (Element.isTemplateValueParameter()) {\r
-      DITemplateValueParameter TVal(Element);\r
-      processScope(TVal.getContext().resolve(TypeIdentifierMap));\r
-      processType(TVal.getType().resolve(TypeIdentifierMap));\r
-    }\r
-  }\r
-}\r
-\r
-/// processDeclare - Process DbgDeclareInst.\r
-void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {\r
-  MDNode *N = dyn_cast<MDNode>(DDI->getVariable());\r
-  if (!N) return;\r
-\r
-  DIDescriptor DV(N);\r
-  if (!DV.isVariable())\r
-    return;\r
-\r
-  if (!NodesSeen.insert(DV))\r
-    return;\r
-  processScope(DIVariable(N).getContext());\r
-  processType(DIVariable(N).getType());\r
-}\r
-\r
-void DebugInfoFinder::processValue(const DbgValueInst *DVI) {\r
-  MDNode *N = dyn_cast<MDNode>(DVI->getVariable());\r
-  if (!N) return;\r
-\r
-  DIDescriptor DV(N);\r
-  if (!DV.isVariable())\r
-    return;\r
-\r
-  if (!NodesSeen.insert(DV))\r
-    return;\r
-  processScope(DIVariable(N).getContext());\r
-  processType(DIVariable(N).getType());\r
-}\r
-\r
-/// addType - Add type into Tys.\r
-bool DebugInfoFinder::addType(DIType DT) {\r
-  if (!DT)\r
-    return false;\r
-\r
-  if (!NodesSeen.insert(DT))\r
-    return false;\r
-\r
-  TYs.push_back(DT);\r
-  return true;\r
-}\r
-\r
-/// addCompileUnit - Add compile unit into CUs.\r
-bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {\r
-  if (!CU)\r
-    return false;\r
-  if (!NodesSeen.insert(CU))\r
-    return false;\r
-\r
-  CUs.push_back(CU);\r
-  return true;\r
-}\r
-\r
-/// addGlobalVariable - Add global variable into GVs.\r
-bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {\r
-  if (!DIG)\r
-    return false;\r
-\r
-  if (!NodesSeen.insert(DIG))\r
-    return false;\r
-\r
-  GVs.push_back(DIG);\r
-  return true;\r
-}\r
-\r
-// addSubprogram - Add subprgoram into SPs.\r
-bool DebugInfoFinder::addSubprogram(DISubprogram SP) {\r
-  if (!SP)\r
-    return false;\r
-\r
-  if (!NodesSeen.insert(SP))\r
-    return false;\r
-\r
-  SPs.push_back(SP);\r
-  return true;\r
-}\r
-\r
-bool DebugInfoFinder::addScope(DIScope Scope) {\r
-  if (!Scope)\r
-    return false;\r
-  // FIXME: Ocaml binding generates a scope with no content, we treat it\r
-  // as null for now.\r
-  if (Scope->getNumOperands() == 0)\r
-    return false;\r
-  if (!NodesSeen.insert(Scope))\r
-    return false;\r
-  Scopes.push_back(Scope);\r
-  return true;\r
-}\r
-\r
-//===----------------------------------------------------------------------===//\r
-// DIDescriptor: dump routines for all descriptors.\r
-//===----------------------------------------------------------------------===//\r
-\r
-/// dump - Print descriptor to dbgs() with a newline.\r
-void DIDescriptor::dump() const {\r
-  print(dbgs()); dbgs() << '\n';\r
-}\r
-\r
-/// print - Print descriptor.\r
-void DIDescriptor::print(raw_ostream &OS) const {\r
-  if (!DbgNode) return;\r
-\r
-  if (const char *Tag = dwarf::TagString(getTag()))\r
-    OS << "[ " << Tag << " ]";\r
-\r
-  if (this->isSubrange()) {\r
-    DISubrange(DbgNode).printInternal(OS);\r
-  } else if (this->isCompileUnit()) {\r
-    DICompileUnit(DbgNode).printInternal(OS);\r
-  } else if (this->isFile()) {\r
-    DIFile(DbgNode).printInternal(OS);\r
-  } else if (this->isEnumerator()) {\r
-    DIEnumerator(DbgNode).printInternal(OS);\r
-  } else if (this->isBasicType()) {\r
-    DIType(DbgNode).printInternal(OS);\r
-  } else if (this->isDerivedType()) {\r
-    DIDerivedType(DbgNode).printInternal(OS);\r
-  } else if (this->isCompositeType()) {\r
-    DICompositeType(DbgNode).printInternal(OS);\r
-  } else if (this->isSubprogram()) {\r
-    DISubprogram(DbgNode).printInternal(OS);\r
-  } else if (this->isGlobalVariable()) {\r
-    DIGlobalVariable(DbgNode).printInternal(OS);\r
-  } else if (this->isVariable()) {\r
-    DIVariable(DbgNode).printInternal(OS);\r
-  } else if (this->isObjCProperty()) {\r
-    DIObjCProperty(DbgNode).printInternal(OS);\r
-  } else if (this->isNameSpace()) {\r
-    DINameSpace(DbgNode).printInternal(OS);\r
-  } else if (this->isScope()) {\r
-    DIScope(DbgNode).printInternal(OS);\r
-  }\r
-}\r
-\r
-void DISubrange::printInternal(raw_ostream &OS) const {\r
-  int64_t Count = getCount();\r
-  if (Count != -1)\r
-    OS << " [" << getLo() << ", " << Count - 1 << ']';\r
-  else\r
-    OS << " [unbounded]";\r
-}\r
-\r
-void DIScope::printInternal(raw_ostream &OS) const {\r
-  OS << " [" << getDirectory() << "/" << getFilename() << ']';\r
-}\r
-\r
-void DICompileUnit::printInternal(raw_ostream &OS) const {\r
-  DIScope::printInternal(OS);\r
-  OS << " [";\r
-  unsigned Lang = getLanguage();\r
-  if (const char *LangStr = dwarf::LanguageString(Lang))\r
-    OS << LangStr;\r
-  else\r
-    (OS << "lang 0x").write_hex(Lang);\r
-  OS << ']';\r
-}\r
-\r
-void DIEnumerator::printInternal(raw_ostream &OS) const {\r
-  OS << " [" << getName() << " :: " << getEnumValue() << ']';\r
-}\r
-\r
-void DIType::printInternal(raw_ostream &OS) const {\r
-  if (!DbgNode) return;\r
-\r
-  StringRef Res = getName();\r
-  if (!Res.empty())\r
-    OS << " [" << Res << "]";\r
-\r
-  // TODO: Print context?\r
-\r
-  OS << " [line " << getLineNumber()\r
-     << ", size " << getSizeInBits()\r
-     << ", align " << getAlignInBits()\r
-     << ", offset " << getOffsetInBits();\r
-  if (isBasicType())\r
-    if (const char *Enc =\r
-        dwarf::AttributeEncodingString(DIBasicType(DbgNode).getEncoding()))\r
-      OS << ", enc " << Enc;\r
-  OS << "]";\r
-\r
-  if (isPrivate())\r
-    OS << " [private]";\r
-  else if (isProtected())\r
-    OS << " [protected]";\r
-\r
-  if (isArtificial())\r
-    OS << " [artificial]";\r
-\r
-  if (isForwardDecl())\r
-    OS << " [decl]";\r
-  else if (getTag() == dwarf::DW_TAG_structure_type ||\r
-           getTag() == dwarf::DW_TAG_union_type ||\r
-           getTag() == dwarf::DW_TAG_enumeration_type ||\r
-           getTag() == dwarf::DW_TAG_class_type)\r
-    OS << " [def]";\r
-  if (isVector())\r
-    OS << " [vector]";\r
-  if (isStaticMember())\r
-    OS << " [static]";\r
-}\r
-\r
-void DIDerivedType::printInternal(raw_ostream &OS) const {\r
-  DIType::printInternal(OS);\r
-  OS << " [from " << getTypeDerivedFrom().getName() << ']';\r
-}\r
-\r
-void DICompositeType::printInternal(raw_ostream &OS) const {\r
-  DIType::printInternal(OS);\r
-  DIArray A = getTypeArray();\r
-  OS << " [" << A.getNumElements() << " elements]";\r
-}\r
-\r
-void DINameSpace::printInternal(raw_ostream &OS) const {\r
-  StringRef Name = getName();\r
-  if (!Name.empty())\r
-    OS << " [" << Name << ']';\r
-\r
-  OS << " [line " << getLineNumber() << ']';\r
-}\r
-\r
-void DISubprogram::printInternal(raw_ostream &OS) const {\r
-  // TODO : Print context\r
-  OS << " [line " << getLineNumber() << ']';\r
-\r
-  if (isLocalToUnit())\r
-    OS << " [local]";\r
-\r
-  if (isDefinition())\r
-    OS << " [def]";\r
-\r
-  if (getScopeLineNumber() != getLineNumber())\r
-    OS << " [scope " << getScopeLineNumber() << "]";\r
-\r
-  if (isPrivate())\r
-    OS << " [private]";\r
-  else if (isProtected())\r
-    OS << " [protected]";\r
-\r
-  StringRef Res = getName();\r
-  if (!Res.empty())\r
-    OS << " [" << Res << ']';\r
-}\r
-\r
-void DIGlobalVariable::printInternal(raw_ostream &OS) const {\r
-  StringRef Res = getName();\r
-  if (!Res.empty())\r
-    OS << " [" << Res << ']';\r
-\r
-  OS << " [line " << getLineNumber() << ']';\r
-\r
-  // TODO : Print context\r
-\r
-  if (isLocalToUnit())\r
-    OS << " [local]";\r
-\r
-  if (isDefinition())\r
-    OS << " [def]";\r
-}\r
-\r
-void DIVariable::printInternal(raw_ostream &OS) const {\r
-  StringRef Res = getName();\r
-  if (!Res.empty())\r
-    OS << " [" << Res << ']';\r
-\r
-  OS << " [line " << getLineNumber() << ']';\r
-}\r
-\r
-void DIObjCProperty::printInternal(raw_ostream &OS) const {\r
-  StringRef Name = getObjCPropertyName();\r
-  if (!Name.empty())\r
-    OS << " [" << Name << ']';\r
-\r
-  OS << " [line " << getLineNumber()\r
-     << ", properties " << getUnsignedField(6) << ']';\r
-}\r
-\r
-static void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS,\r
-                          const LLVMContext &Ctx) {\r
-  if (!DL.isUnknown()) {          // Print source line info.\r
-    DIScope Scope(DL.getScope(Ctx));\r
-    assert(Scope.isScope() &&\r
-      "Scope of a DebugLoc should be a DIScope.");\r
-    // Omit the directory, because it's likely to be long and uninteresting.\r
-    CommentOS << Scope.getFilename();\r
-    CommentOS << ':' << DL.getLine();\r
-    if (DL.getCol() != 0)\r
-      CommentOS << ':' << DL.getCol();\r
-    DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(DL.getInlinedAt(Ctx));\r
-    if (!InlinedAtDL.isUnknown()) {\r
-      CommentOS << " @[ ";\r
-      printDebugLoc(InlinedAtDL, CommentOS, Ctx);\r
-      CommentOS << " ]";\r
-    }\r
-  }\r
-}\r
-\r
-void DIVariable::printExtendedName(raw_ostream &OS) const {\r
-  const LLVMContext &Ctx = DbgNode->getContext();\r
-  StringRef Res = getName();\r
-  if (!Res.empty())\r
-    OS << Res << "," << getLineNumber();\r
-  if (MDNode *InlinedAt = getInlinedAt()) {\r
-    DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(InlinedAt);\r
-    if (!InlinedAtDL.isUnknown()) {\r
-      OS << " @[";\r
-      printDebugLoc(InlinedAtDL, OS, Ctx);\r
-      OS << "]";\r
-    }\r
-  }\r
-}\r
-\r
-/// Specialize constructor to make sure it has the correct type.\r
-template <>\r
-DIRef<DIScope>::DIRef(const Value *V) : Val(V) {\r
-  assert(isScopeRef(V) && "DIScopeRef should be a MDString or MDNode");\r
-}\r
-template <>\r
-DIRef<DIType>::DIRef(const Value *V) : Val(V) {\r
-  assert(isTypeRef(V) && "DITypeRef should be a MDString or MDNode");\r
-}\r
-\r
-/// Specialize getFieldAs to handle fields that are references to DIScopes.\r
-template <>\r
-DIScopeRef DIDescriptor::getFieldAs<DIScopeRef>(unsigned Elt) const {\r
-  return DIScopeRef(getField(DbgNode, Elt));\r
-}\r
-/// Specialize getFieldAs to handle fields that are references to DITypes.\r
-template <>\r
-DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const {\r
-  return DITypeRef(getField(DbgNode, Elt));\r
-}\r
+//===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the helper classes used to build and interpret debug
+// information in LLVM IR form.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/Analysis/ValueTracking.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/DerivedTypes.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/IntrinsicInst.h"
+#include "llvm/IR/Intrinsics.h"
+#include "llvm/IR/Module.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/Dwarf.h"
+#include "llvm/Support/ValueHandle.h"
+#include "llvm/Support/raw_ostream.h"
+using namespace llvm;
+using namespace llvm::dwarf;
+
+//===----------------------------------------------------------------------===//
+// DIDescriptor
+//===----------------------------------------------------------------------===//
+
+bool DIDescriptor::Verify() const {
+  return DbgNode &&
+         (DIDerivedType(DbgNode).Verify() ||
+          DICompositeType(DbgNode).Verify() || DIBasicType(DbgNode).Verify() ||
+          DIVariable(DbgNode).Verify() || DISubprogram(DbgNode).Verify() ||
+          DIGlobalVariable(DbgNode).Verify() || DIFile(DbgNode).Verify() ||
+          DICompileUnit(DbgNode).Verify() || DINameSpace(DbgNode).Verify() ||
+          DILexicalBlock(DbgNode).Verify() ||
+          DILexicalBlockFile(DbgNode).Verify() ||
+          DISubrange(DbgNode).Verify() || DIEnumerator(DbgNode).Verify() ||
+          DIObjCProperty(DbgNode).Verify() ||
+          DITemplateTypeParameter(DbgNode).Verify() ||
+          DITemplateValueParameter(DbgNode).Verify() ||
+          DIImportedEntity(DbgNode).Verify());
+}
+
+static Value *getField(const MDNode *DbgNode, unsigned Elt) {
+  if (DbgNode == 0 || Elt >= DbgNode->getNumOperands())
+    return 0;
+  return DbgNode->getOperand(Elt);
+}
+
+static MDNode *getNodeField(const MDNode *DbgNode, unsigned Elt) {
+  return dyn_cast_or_null<MDNode>(getField(DbgNode, Elt));
+}
+
+static StringRef getStringField(const MDNode *DbgNode, unsigned Elt) {
+  if (MDString *MDS = dyn_cast_or_null<MDString>(getField(DbgNode, Elt)))
+    return MDS->getString();
+  return StringRef();
+}
+
+StringRef DIDescriptor::getStringField(unsigned Elt) const {
+  return ::getStringField(DbgNode, Elt);
+}
+
+uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {
+  if (DbgNode == 0)
+    return 0;
+
+  if (Elt < DbgNode->getNumOperands())
+    if (ConstantInt *CI =
+            dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt)))
+      return CI->getZExtValue();
+
+  return 0;
+}
+
+int64_t DIDescriptor::getInt64Field(unsigned Elt) const {
+  if (DbgNode == 0)
+    return 0;
+
+  if (Elt < DbgNode->getNumOperands())
+    if (ConstantInt *CI =
+            dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt)))
+      return CI->getSExtValue();
+
+  return 0;
+}
+
+DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const {
+  MDNode *Field = getNodeField(DbgNode, Elt);
+  return DIDescriptor(Field);
+}
+
+GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {
+  if (DbgNode == 0)
+    return 0;
+
+  if (Elt < DbgNode->getNumOperands())
+    return dyn_cast_or_null<GlobalVariable>(DbgNode->getOperand(Elt));
+  return 0;
+}
+
+Constant *DIDescriptor::getConstantField(unsigned Elt) const {
+  if (DbgNode == 0)
+    return 0;
+
+  if (Elt < DbgNode->getNumOperands())
+    return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt));
+  return 0;
+}
+
+Function *DIDescriptor::getFunctionField(unsigned Elt) const {
+  if (DbgNode == 0)
+    return 0;
+
+  if (Elt < DbgNode->getNumOperands())
+    return dyn_cast_or_null<Function>(DbgNode->getOperand(Elt));
+  return 0;
+}
+
+void DIDescriptor::replaceFunctionField(unsigned Elt, Function *F) {
+  if (DbgNode == 0)
+    return;
+
+  if (Elt < DbgNode->getNumOperands()) {
+    MDNode *Node = const_cast<MDNode *>(DbgNode);
+    Node->replaceOperandWith(Elt, F);
+  }
+}
+
+unsigned DIVariable::getNumAddrElements() const {
+  return DbgNode->getNumOperands() - 8;
+}
+
+/// getInlinedAt - If this variable is inlined then return inline location.
+MDNode *DIVariable::getInlinedAt() const { return getNodeField(DbgNode, 7); }
+
+//===----------------------------------------------------------------------===//
+// Predicates
+//===----------------------------------------------------------------------===//
+
+/// isBasicType - Return true if the specified tag is legal for
+/// DIBasicType.
+bool DIDescriptor::isBasicType() const {
+  if (!DbgNode)
+    return false;
+  switch (getTag()) {
+  case dwarf::DW_TAG_base_type:
+  case dwarf::DW_TAG_unspecified_type:
+    return true;
+  default:
+    return false;
+  }
+}
+
+/// isDerivedType - Return true if the specified tag is legal for DIDerivedType.
+bool DIDescriptor::isDerivedType() const {
+  if (!DbgNode)
+    return false;
+  switch (getTag()) {
+  case dwarf::DW_TAG_typedef:
+  case dwarf::DW_TAG_pointer_type:
+  case dwarf::DW_TAG_ptr_to_member_type:
+  case dwarf::DW_TAG_reference_type:
+  case dwarf::DW_TAG_rvalue_reference_type:
+  case dwarf::DW_TAG_const_type:
+  case dwarf::DW_TAG_volatile_type:
+  case dwarf::DW_TAG_restrict_type:
+  case dwarf::DW_TAG_member:
+  case dwarf::DW_TAG_inheritance:
+  case dwarf::DW_TAG_friend:
+    return true;
+  default:
+    // CompositeTypes are currently modelled as DerivedTypes.
+    return isCompositeType();
+  }
+}
+
+/// isCompositeType - Return true if the specified tag is legal for
+/// DICompositeType.
+bool DIDescriptor::isCompositeType() const {
+  if (!DbgNode)
+    return false;
+  switch (getTag()) {
+  case dwarf::DW_TAG_array_type:
+  case dwarf::DW_TAG_structure_type:
+  case dwarf::DW_TAG_union_type:
+  case dwarf::DW_TAG_enumeration_type:
+  case dwarf::DW_TAG_subroutine_type:
+  case dwarf::DW_TAG_class_type:
+    return true;
+  default:
+    return false;
+  }
+}
+
+/// isVariable - Return true if the specified tag is legal for DIVariable.
+bool DIDescriptor::isVariable() const {
+  if (!DbgNode)
+    return false;
+  switch (getTag()) {
+  case dwarf::DW_TAG_auto_variable:
+  case dwarf::DW_TAG_arg_variable:
+    return true;
+  default:
+    return false;
+  }
+}
+
+/// isType - Return true if the specified tag is legal for DIType.
+bool DIDescriptor::isType() const {
+  return isBasicType() || isCompositeType() || isDerivedType();
+}
+
+/// isSubprogram - Return true if the specified tag is legal for
+/// DISubprogram.
+bool DIDescriptor::isSubprogram() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_subprogram;
+}
+
+/// isGlobalVariable - Return true if the specified tag is legal for
+/// DIGlobalVariable.
+bool DIDescriptor::isGlobalVariable() const {
+  return DbgNode && (getTag() == dwarf::DW_TAG_variable ||
+                     getTag() == dwarf::DW_TAG_constant);
+}
+
+/// isUnspecifiedParmeter - Return true if the specified tag is
+/// DW_TAG_unspecified_parameters.
+bool DIDescriptor::isUnspecifiedParameter() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_unspecified_parameters;
+}
+
+/// isScope - Return true if the specified tag is one of the scope
+/// related tag.
+bool DIDescriptor::isScope() const {
+  if (!DbgNode)
+    return false;
+  switch (getTag()) {
+  case dwarf::DW_TAG_compile_unit:
+  case dwarf::DW_TAG_lexical_block:
+  case dwarf::DW_TAG_subprogram:
+  case dwarf::DW_TAG_namespace:
+  case dwarf::DW_TAG_file_type:
+    return true;
+  default:
+    break;
+  }
+  return isType();
+}
+
+/// isTemplateTypeParameter - Return true if the specified tag is
+/// DW_TAG_template_type_parameter.
+bool DIDescriptor::isTemplateTypeParameter() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_template_type_parameter;
+}
+
+/// isTemplateValueParameter - Return true if the specified tag is
+/// DW_TAG_template_value_parameter.
+bool DIDescriptor::isTemplateValueParameter() const {
+  return DbgNode && (getTag() == dwarf::DW_TAG_template_value_parameter ||
+                     getTag() == dwarf::DW_TAG_GNU_template_template_param ||
+                     getTag() == dwarf::DW_TAG_GNU_template_parameter_pack);
+}
+
+/// isCompileUnit - Return true if the specified tag is DW_TAG_compile_unit.
+bool DIDescriptor::isCompileUnit() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_compile_unit;
+}
+
+/// isFile - Return true if the specified tag is DW_TAG_file_type.
+bool DIDescriptor::isFile() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_file_type;
+}
+
+/// isNameSpace - Return true if the specified tag is DW_TAG_namespace.
+bool DIDescriptor::isNameSpace() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_namespace;
+}
+
+/// isLexicalBlockFile - Return true if the specified descriptor is a
+/// lexical block with an extra file.
+bool DIDescriptor::isLexicalBlockFile() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&
+         (DbgNode->getNumOperands() == 3);
+}
+
+/// isLexicalBlock - Return true if the specified tag is DW_TAG_lexical_block.
+bool DIDescriptor::isLexicalBlock() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&
+         (DbgNode->getNumOperands() > 3);
+}
+
+/// isSubrange - Return true if the specified tag is DW_TAG_subrange_type.
+bool DIDescriptor::isSubrange() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_subrange_type;
+}
+
+/// isEnumerator - Return true if the specified tag is DW_TAG_enumerator.
+bool DIDescriptor::isEnumerator() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_enumerator;
+}
+
+/// isObjCProperty - Return true if the specified tag is DW_TAG_APPLE_property.
+bool DIDescriptor::isObjCProperty() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_APPLE_property;
+}
+
+/// \brief Return true if the specified tag is DW_TAG_imported_module or
+/// DW_TAG_imported_declaration.
+bool DIDescriptor::isImportedEntity() const {
+  return DbgNode && (getTag() == dwarf::DW_TAG_imported_module ||
+                     getTag() == dwarf::DW_TAG_imported_declaration);
+}
+
+//===----------------------------------------------------------------------===//
+// Simple Descriptor Constructors and other Methods
+//===----------------------------------------------------------------------===//
+
+unsigned DIArray::getNumElements() const {
+  if (!DbgNode)
+    return 0;
+  return DbgNode->getNumOperands();
+}
+
+/// replaceAllUsesWith - Replace all uses of the MDNode used by this
+/// type with the one in the passed descriptor.
+void DIType::replaceAllUsesWith(DIDescriptor &D) {
+
+  assert(DbgNode && "Trying to replace an unverified type!");
+
+  // Since we use a TrackingVH for the node, its easy for clients to manufacture
+  // legitimate situations where they want to replaceAllUsesWith() on something
+  // which, due to uniquing, has merged with the source. We shield clients from
+  // this detail by allowing a value to be replaced with replaceAllUsesWith()
+  // itself.
+  if (DbgNode != D) {
+    MDNode *Node = const_cast<MDNode *>(DbgNode);
+    const MDNode *DN = D;
+    const Value *V = cast_or_null<Value>(DN);
+    Node->replaceAllUsesWith(const_cast<Value *>(V));
+    MDNode::deleteTemporary(Node);
+  }
+}
+
+/// replaceAllUsesWith - Replace all uses of the MDNode used by this
+/// type with the one in D.
+void DIType::replaceAllUsesWith(MDNode *D) {
+
+  assert(DbgNode && "Trying to replace an unverified type!");
+
+  // Since we use a TrackingVH for the node, its easy for clients to manufacture
+  // legitimate situations where they want to replaceAllUsesWith() on something
+  // which, due to uniquing, has merged with the source. We shield clients from
+  // this detail by allowing a value to be replaced with replaceAllUsesWith()
+  // itself.
+  if (DbgNode != D) {
+    MDNode *Node = const_cast<MDNode *>(DbgNode);
+    const MDNode *DN = D;
+    const Value *V = cast_or_null<Value>(DN);
+    Node->replaceAllUsesWith(const_cast<Value *>(V));
+    MDNode::deleteTemporary(Node);
+  }
+}
+
+/// Verify - Verify that a compile unit is well formed.
+bool DICompileUnit::Verify() const {
+  if (!isCompileUnit())
+    return false;
+
+  // Don't bother verifying the compilation directory or producer string
+  // as those could be empty.
+  if (getFilename().empty())
+    return false;
+
+  return DbgNode->getNumOperands() == 13;
+}
+
+/// Verify - Verify that an ObjC property is well formed.
+bool DIObjCProperty::Verify() const {
+  if (!isObjCProperty())
+    return false;
+
+  // Don't worry about the rest of the strings for now.
+  return DbgNode->getNumOperands() == 8;
+}
+
+/// Check if a field at position Elt of a MDNode is a MDNode.
+/// We currently allow an empty string and an integer.
+/// But we don't allow a non-empty string in a MDNode field.
+static bool fieldIsMDNode(const MDNode *DbgNode, unsigned Elt) {
+  // FIXME: This function should return true, if the field is null or the field
+  // is indeed a MDNode: return !Fld || isa<MDNode>(Fld).
+  Value *Fld = getField(DbgNode, Elt);
+  if (Fld && isa<MDString>(Fld) && !cast<MDString>(Fld)->getString().empty())
+    return false;
+  return true;
+}
+
+/// Check if a field at position Elt of a MDNode is a MDString.
+static bool fieldIsMDString(const MDNode *DbgNode, unsigned Elt) {
+  Value *Fld = getField(DbgNode, Elt);
+  return !Fld || isa<MDString>(Fld);
+}
+
+/// Check if a value can be a reference to a type.
+static bool isTypeRef(const Value *Val) {
+  return !Val ||
+         (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
+         (isa<MDNode>(Val) && DIType(cast<MDNode>(Val)).isType());
+}
+
+/// Check if a field at position Elt of a MDNode can be a reference to a type.
+static bool fieldIsTypeRef(const MDNode *DbgNode, unsigned Elt) {
+  Value *Fld = getField(DbgNode, Elt);
+  return isTypeRef(Fld);
+}
+
+/// Check if a value can be a ScopeRef.
+static bool isScopeRef(const Value *Val) {
+  return !Val ||
+         (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
+         (isa<MDNode>(Val) && DIScope(cast<MDNode>(Val)).isScope());
+}
+
+/// Check if a field at position Elt of a MDNode can be a ScopeRef.
+static bool fieldIsScopeRef(const MDNode *DbgNode, unsigned Elt) {
+  Value *Fld = getField(DbgNode, Elt);
+  return isScopeRef(Fld);
+}
+
+/// Verify - Verify that a type descriptor is well formed.
+bool DIType::Verify() const {
+  if (!isType())
+    return false;
+  // Make sure Context @ field 2 is MDNode.
+  if (!fieldIsScopeRef(DbgNode, 2))
+    return false;
+
+  // FIXME: Sink this into the various subclass verifies.
+  uint16_t Tag = getTag();
+  if (!isBasicType() && Tag != dwarf::DW_TAG_const_type &&
+      Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_pointer_type &&
+      Tag != dwarf::DW_TAG_ptr_to_member_type &&
+      Tag != dwarf::DW_TAG_reference_type &&
+      Tag != dwarf::DW_TAG_rvalue_reference_type &&
+      Tag != dwarf::DW_TAG_restrict_type && Tag != dwarf::DW_TAG_array_type &&
+      Tag != dwarf::DW_TAG_enumeration_type &&
+      Tag != dwarf::DW_TAG_subroutine_type &&
+      Tag != dwarf::DW_TAG_inheritance && Tag != dwarf::DW_TAG_friend &&
+      getFilename().empty())
+    return false;
+  // DIType is abstract, it should be a BasicType, a DerivedType or
+  // a CompositeType.
+  if (isBasicType())
+    DIBasicType(DbgNode).Verify();
+  else if (isCompositeType())
+    DICompositeType(DbgNode).Verify();
+  else if (isDerivedType())
+    DIDerivedType(DbgNode).Verify();
+  else
+    return false;
+  return true;
+}
+
+/// Verify - Verify that a basic type descriptor is well formed.
+bool DIBasicType::Verify() const {
+  return isBasicType() && DbgNode->getNumOperands() == 10;
+}
+
+/// Verify - Verify that a derived type descriptor is well formed.
+bool DIDerivedType::Verify() const {
+  // Make sure DerivedFrom @ field 9 is TypeRef.
+  if (!fieldIsTypeRef(DbgNode, 9))
+    return false;
+  if (getTag() == dwarf::DW_TAG_ptr_to_member_type)
+    // Make sure ClassType @ field 10 is a TypeRef.
+    if (!fieldIsTypeRef(DbgNode, 10))
+      return false;
+
+  return isDerivedType() && DbgNode->getNumOperands() >= 10 &&
+         DbgNode->getNumOperands() <= 14;
+}
+
+/// Verify - Verify that a composite type descriptor is well formed.
+bool DICompositeType::Verify() const {
+  if (!isCompositeType())
+    return false;
+
+  // Make sure DerivedFrom @ field 9 and ContainingType @ field 12 are TypeRef.
+  if (!fieldIsTypeRef(DbgNode, 9))
+    return false;
+  if (!fieldIsTypeRef(DbgNode, 12))
+    return false;
+
+  // Make sure the type identifier at field 14 is MDString, it can be null.
+  if (!fieldIsMDString(DbgNode, 14))
+    return false;
+
+  return DbgNode->getNumOperands() == 15;
+}
+
+/// Verify - Verify that a subprogram descriptor is well formed.
+bool DISubprogram::Verify() const {
+  if (!isSubprogram())
+    return false;
+
+  // Make sure context @ field 2 is a ScopeRef and type @ field 7 is a MDNode.
+  if (!fieldIsScopeRef(DbgNode, 2))
+    return false;
+  if (!fieldIsMDNode(DbgNode, 7))
+    return false;
+  // Containing type @ field 12.
+  if (!fieldIsTypeRef(DbgNode, 12))
+    return false;
+  return DbgNode->getNumOperands() == 20;
+}
+
+/// Verify - Verify that a global variable descriptor is well formed.
+bool DIGlobalVariable::Verify() const {
+  if (!isGlobalVariable())
+    return false;
+
+  if (getDisplayName().empty())
+    return false;
+  // Make sure context @ field 2 and type @ field 8 are MDNodes.
+  if (!fieldIsMDNode(DbgNode, 2))
+    return false;
+  if (!fieldIsMDNode(DbgNode, 8))
+    return false;
+  // Make sure StaticDataMemberDeclaration @ field 12 is MDNode.
+  if (!fieldIsMDNode(DbgNode, 12))
+    return false;
+
+  return DbgNode->getNumOperands() == 13;
+}
+
+/// Verify - Verify that a variable descriptor is well formed.
+bool DIVariable::Verify() const {
+  if (!isVariable())
+    return false;
+
+  // Make sure context @ field 1 and type @ field 5 are MDNodes.
+  if (!fieldIsMDNode(DbgNode, 1))
+    return false;
+  if (!fieldIsMDNode(DbgNode, 5))
+    return false;
+  return DbgNode->getNumOperands() >= 8;
+}
+
+/// Verify - Verify that a location descriptor is well formed.
+bool DILocation::Verify() const {
+  if (!DbgNode)
+    return false;
+
+  return DbgNode->getNumOperands() == 4;
+}
+
+/// Verify - Verify that a namespace descriptor is well formed.
+bool DINameSpace::Verify() const {
+  if (!isNameSpace())
+    return false;
+  return DbgNode->getNumOperands() == 5;
+}
+
+/// \brief Retrieve the MDNode for the directory/file pair.
+MDNode *DIFile::getFileNode() const { return getNodeField(DbgNode, 1); }
+
+/// \brief Verify that the file descriptor is well formed.
+bool DIFile::Verify() const {
+  return isFile() && DbgNode->getNumOperands() == 2;
+}
+
+/// \brief Verify that the enumerator descriptor is well formed.
+bool DIEnumerator::Verify() const {
+  return isEnumerator() && DbgNode->getNumOperands() == 3;
+}
+
+/// \brief Verify that the subrange descriptor is well formed.
+bool DISubrange::Verify() const {
+  return isSubrange() && DbgNode->getNumOperands() == 3;
+}
+
+/// \brief Verify that the lexical block descriptor is well formed.
+bool DILexicalBlock::Verify() const {
+  return isLexicalBlock() && DbgNode->getNumOperands() == 6;
+}
+
+/// \brief Verify that the file-scoped lexical block descriptor is well formed.
+bool DILexicalBlockFile::Verify() const {
+  return isLexicalBlockFile() && DbgNode->getNumOperands() == 3;
+}
+
+/// \brief Verify that the template type parameter descriptor is well formed.
+bool DITemplateTypeParameter::Verify() const {
+  return isTemplateTypeParameter() && DbgNode->getNumOperands() == 7;
+}
+
+/// \brief Verify that the template value parameter descriptor is well formed.
+bool DITemplateValueParameter::Verify() const {
+  return isTemplateValueParameter() && DbgNode->getNumOperands() == 8;
+}
+
+/// \brief Verify that the imported module descriptor is well formed.
+bool DIImportedEntity::Verify() const {
+  return isImportedEntity() &&
+         (DbgNode->getNumOperands() == 4 || DbgNode->getNumOperands() == 5);
+}
+
+/// getObjCProperty - Return property node, if this ivar is associated with one.
+MDNode *DIDerivedType::getObjCProperty() const {
+  return getNodeField(DbgNode, 10);
+}
+
+MDString *DICompositeType::getIdentifier() const {
+  return cast_or_null<MDString>(getField(DbgNode, 14));
+}
+
+#ifndef NDEBUG
+static void VerifySubsetOf(const MDNode *LHS, const MDNode *RHS) {
+  for (unsigned i = 0; i != LHS->getNumOperands(); ++i) {
+    // Skip the 'empty' list (that's a single i32 0, rather than truly empty).
+    if (i == 0 && isa<ConstantInt>(LHS->getOperand(i)))
+      continue;
+    const MDNode *E = cast<MDNode>(LHS->getOperand(i));
+    bool found = false;
+    for (unsigned j = 0; !found && j != RHS->getNumOperands(); ++j)
+      found = E == RHS->getOperand(j);
+    assert(found && "Losing a member during member list replacement");
+  }
+}
+#endif
+
+/// \brief Set the array of member DITypes.
+void DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) {
+  assert((!TParams || DbgNode->getNumOperands() == 15) &&
+         "If you're setting the template parameters this should include a slot "
+         "for that!");
+  TrackingVH<MDNode> N(*this);
+  if (Elements) {
+#ifndef NDEBUG
+    // Check that the new list of members contains all the old members as well.
+    if (const MDNode *El = cast_or_null<MDNode>(N->getOperand(10)))
+      VerifySubsetOf(El, Elements);
+#endif
+    N->replaceOperandWith(10, Elements);
+  }
+  if (TParams)
+    N->replaceOperandWith(13, TParams);
+  DbgNode = N;
+}
+
+void DICompositeType::addMember(DIDescriptor D) {
+  SmallVector<llvm::Value *, 16> M;
+  DIArray OrigM = getTypeArray();
+  unsigned Elements = OrigM.getNumElements();
+  if (Elements == 1 && !OrigM.getElement(0))
+    Elements = 0;
+  M.reserve(Elements + 1);
+  for (unsigned i = 0; i != Elements; ++i)
+    M.push_back(OrigM.getElement(i));
+  M.push_back(D);
+  setTypeArray(DIArray(MDNode::get(DbgNode->getContext(), M)));
+}
+
+/// Generate a reference to this DIType. Uses the type identifier instead
+/// of the actual MDNode if possible, to help type uniquing.
+DIScopeRef DIScope::getRef() const {
+  if (!isCompositeType())
+    return DIScopeRef(*this);
+  DICompositeType DTy(DbgNode);
+  if (!DTy.getIdentifier())
+    return DIScopeRef(*this);
+  return DIScopeRef(DTy.getIdentifier());
+}
+
+/// \brief Set the containing type.
+void DICompositeType::setContainingType(DICompositeType ContainingType) {
+  TrackingVH<MDNode> N(*this);
+  N->replaceOperandWith(12, ContainingType.getRef());
+  DbgNode = N;
+}
+
+/// isInlinedFnArgument - Return true if this variable provides debugging
+/// information for an inlined function arguments.
+bool DIVariable::isInlinedFnArgument(const Function *CurFn) {
+  assert(CurFn && "Invalid function");
+  if (!getContext().isSubprogram())
+    return false;
+  // This variable is not inlined function argument if its scope
+  // does not describe current function.
+  return !DISubprogram(getContext()).describes(CurFn);
+}
+
+/// describes - Return true if this subprogram provides debugging
+/// information for the function F.
+bool DISubprogram::describes(const Function *F) {
+  assert(F && "Invalid function");
+  if (F == getFunction())
+    return true;
+  StringRef Name = getLinkageName();
+  if (Name.empty())
+    Name = getName();
+  if (F->getName() == Name)
+    return true;
+  return false;
+}
+
+unsigned DISubprogram::isOptimized() const {
+  assert(DbgNode && "Invalid subprogram descriptor!");
+  if (DbgNode->getNumOperands() == 15)
+    return getUnsignedField(14);
+  return 0;
+}
+
+MDNode *DISubprogram::getVariablesNodes() const {
+  return getNodeField(DbgNode, 18);
+}
+
+DIArray DISubprogram::getVariables() const {
+  return DIArray(getNodeField(DbgNode, 18));
+}
+
+Value *DITemplateValueParameter::getValue() const {
+  return getField(DbgNode, 4);
+}
+
+// If the current node has a parent scope then return that,
+// else return an empty scope.
+DIScopeRef DIScope::getContext() const {
+
+  if (isType())
+    return DIType(DbgNode).getContext();
+
+  if (isSubprogram())
+    return DIScopeRef(DISubprogram(DbgNode).getContext());
+
+  if (isLexicalBlock())
+    return DIScopeRef(DILexicalBlock(DbgNode).getContext());
+
+  if (isLexicalBlockFile())
+    return DIScopeRef(DILexicalBlockFile(DbgNode).getContext());
+
+  if (isNameSpace())
+    return DIScopeRef(DINameSpace(DbgNode).getContext());
+
+  assert((isFile() || isCompileUnit()) && "Unhandled type of scope.");
+  return DIScopeRef(NULL);
+}
+
+// If the scope node has a name, return that, else return an empty string.
+StringRef DIScope::getName() const {
+  if (isType())
+    return DIType(DbgNode).getName();
+  if (isSubprogram())
+    return DISubprogram(DbgNode).getName();
+  if (isNameSpace())
+    return DINameSpace(DbgNode).getName();
+  assert((isLexicalBlock() || isLexicalBlockFile() || isFile() ||
+          isCompileUnit()) &&
+         "Unhandled type of scope.");
+  return StringRef();
+}
+
+StringRef DIScope::getFilename() const {
+  if (!DbgNode)
+    return StringRef();
+  return ::getStringField(getNodeField(DbgNode, 1), 0);
+}
+
+StringRef DIScope::getDirectory() const {
+  if (!DbgNode)
+    return StringRef();
+  return ::getStringField(getNodeField(DbgNode, 1), 1);
+}
+
+DIArray DICompileUnit::getEnumTypes() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 13)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 7));
+}
+
+DIArray DICompileUnit::getRetainedTypes() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 13)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 8));
+}
+
+DIArray DICompileUnit::getSubprograms() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 13)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 9));
+}
+
+DIArray DICompileUnit::getGlobalVariables() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 13)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 10));
+}
+
+DIArray DICompileUnit::getImportedEntities() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 13)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 11));
+}
+
+/// fixupSubprogramName - Replace contains special characters used
+/// in a typical Objective-C names with '.' in a given string.
+static void fixupSubprogramName(DISubprogram Fn, SmallVectorImpl<char> &Out) {
+  StringRef FName =
+      Fn.getFunction() ? Fn.getFunction()->getName() : Fn.getName();
+  FName = Function::getRealLinkageName(FName);
+
+  StringRef Prefix("llvm.dbg.lv.");
+  Out.reserve(FName.size() + Prefix.size());
+  Out.append(Prefix.begin(), Prefix.end());
+
+  bool isObjCLike = false;
+  for (size_t i = 0, e = FName.size(); i < e; ++i) {
+    char C = FName[i];
+    if (C == '[')
+      isObjCLike = true;
+
+    if (isObjCLike && (C == '[' || C == ']' || C == ' ' || C == ':' ||
+                       C == '+' || C == '(' || C == ')'))
+      Out.push_back('.');
+    else
+      Out.push_back(C);
+  }
+}
+
+/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
+/// suitable to hold function specific information.
+NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, DISubprogram Fn) {
+  SmallString<32> Name;
+  fixupSubprogramName(Fn, Name);
+  return M.getNamedMetadata(Name.str());
+}
+
+/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
+/// to hold function specific information.
+NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, DISubprogram Fn) {
+  SmallString<32> Name;
+  fixupSubprogramName(Fn, Name);
+  return M.getOrInsertNamedMetadata(Name.str());
+}
+
+/// createInlinedVariable - Create a new inlined variable based on current
+/// variable.
+/// @param DV            Current Variable.
+/// @param InlinedScope  Location at current variable is inlined.
+DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope,
+                                       LLVMContext &VMContext) {
+  SmallVector<Value *, 16> Elts;
+  // Insert inlined scope as 7th element.
+  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)
+    i == 7 ? Elts.push_back(InlinedScope) : Elts.push_back(DV->getOperand(i));
+  return DIVariable(MDNode::get(VMContext, Elts));
+}
+
+/// cleanseInlinedVariable - Remove inlined scope from the variable.
+DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) {
+  SmallVector<Value *, 16> Elts;
+  // Insert inlined scope as 7th element.
+  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)
+    i == 7 ? Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)))
+           : Elts.push_back(DV->getOperand(i));
+  return DIVariable(MDNode::get(VMContext, Elts));
+}
+
+/// getDISubprogram - Find subprogram that is enclosing this scope.
+DISubprogram llvm::getDISubprogram(const MDNode *Scope) {
+  DIDescriptor D(Scope);
+  if (D.isSubprogram())
+    return DISubprogram(Scope);
+
+  if (D.isLexicalBlockFile())
+    return getDISubprogram(DILexicalBlockFile(Scope).getContext());
+
+  if (D.isLexicalBlock())
+    return getDISubprogram(DILexicalBlock(Scope).getContext());
+
+  return DISubprogram();
+}
+
+/// getDICompositeType - Find underlying composite type.
+DICompositeType llvm::getDICompositeType(DIType T) {
+  if (T.isCompositeType())
+    return DICompositeType(T);
+
+  if (T.isDerivedType()) {
+    // This function is currently used by dragonegg and dragonegg does
+    // not generate identifier for types, so using an empty map to resolve
+    // DerivedFrom should be fine.
+    DITypeIdentifierMap EmptyMap;
+    return getDICompositeType(
+        DIDerivedType(T).getTypeDerivedFrom().resolve(EmptyMap));
+  }
+
+  return DICompositeType();
+}
+
+/// Update DITypeIdentifierMap by going through retained types of each CU.
+DITypeIdentifierMap
+llvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) {
+  DITypeIdentifierMap Map;
+  for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) {
+    DICompileUnit CU(CU_Nodes->getOperand(CUi));
+    DIArray Retain = CU.getRetainedTypes();
+    for (unsigned Ti = 0, Te = Retain.getNumElements(); Ti != Te; ++Ti) {
+      if (!Retain.getElement(Ti).isCompositeType())
+        continue;
+      DICompositeType Ty(Retain.getElement(Ti));
+      if (MDString *TypeId = Ty.getIdentifier()) {
+        // Definition has priority over declaration.
+        // Try to insert (TypeId, Ty) to Map.
+        std::pair<DITypeIdentifierMap::iterator, bool> P =
+            Map.insert(std::make_pair(TypeId, Ty));
+        // If TypeId already exists in Map and this is a definition, replace
+        // whatever we had (declaration or definition) with the definition.
+        if (!P.second && !Ty.isForwardDecl())
+          P.first->second = Ty;
+      }
+    }
+  }
+  return Map;
+}
+
+//===----------------------------------------------------------------------===//
+// DebugInfoFinder implementations.
+//===----------------------------------------------------------------------===//
+
+void DebugInfoFinder::reset() {
+  CUs.clear();
+  SPs.clear();
+  GVs.clear();
+  TYs.clear();
+  Scopes.clear();
+  NodesSeen.clear();
+  TypeIdentifierMap.clear();
+}
+
+/// processModule - Process entire module and collect debug info.
+void DebugInfoFinder::processModule(const Module &M) {
+  if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
+    TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
+    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
+      DICompileUnit CU(CU_Nodes->getOperand(i));
+      addCompileUnit(CU);
+      DIArray GVs = CU.getGlobalVariables();
+      for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
+        DIGlobalVariable DIG(GVs.getElement(i));
+        if (addGlobalVariable(DIG)) {
+          processScope(DIG.getContext());
+          processType(DIG.getType());
+        }
+      }
+      DIArray SPs = CU.getSubprograms();
+      for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
+        processSubprogram(DISubprogram(SPs.getElement(i)));
+      DIArray EnumTypes = CU.getEnumTypes();
+      for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
+        processType(DIType(EnumTypes.getElement(i)));
+      DIArray RetainedTypes = CU.getRetainedTypes();
+      for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
+        processType(DIType(RetainedTypes.getElement(i)));
+      DIArray Imports = CU.getImportedEntities();
+      for (unsigned i = 0, e = Imports.getNumElements(); i != e; ++i) {
+        DIImportedEntity Import = DIImportedEntity(Imports.getElement(i));
+        DIDescriptor Entity = Import.getEntity();
+        if (Entity.isType())
+          processType(DIType(Entity));
+        else if (Entity.isSubprogram())
+          processSubprogram(DISubprogram(Entity));
+        else if (Entity.isNameSpace())
+          processScope(DINameSpace(Entity).getContext());
+      }
+    }
+  }
+}
+
+/// processLocation - Process DILocation.
+void DebugInfoFinder::processLocation(DILocation Loc) {
+  if (!Loc)
+    return;
+  processScope(Loc.getScope());
+  processLocation(Loc.getOrigLocation());
+}
+
+/// processType - Process DIType.
+void DebugInfoFinder::processType(DIType DT) {
+  if (!addType(DT))
+    return;
+  processScope(DT.getContext().resolve(TypeIdentifierMap));
+  if (DT.isCompositeType()) {
+    DICompositeType DCT(DT);
+    processType(DCT.getTypeDerivedFrom().resolve(TypeIdentifierMap));
+    DIArray DA = DCT.getTypeArray();
+    for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {
+      DIDescriptor D = DA.getElement(i);
+      if (D.isType())
+        processType(DIType(D));
+      else if (D.isSubprogram())
+        processSubprogram(DISubprogram(D));
+    }
+  } else if (DT.isDerivedType()) {
+    DIDerivedType DDT(DT);
+    processType(DDT.getTypeDerivedFrom().resolve(TypeIdentifierMap));
+  }
+}
+
+void DebugInfoFinder::processScope(DIScope Scope) {
+  if (Scope.isType()) {
+    DIType Ty(Scope);
+    processType(Ty);
+    return;
+  }
+  if (Scope.isCompileUnit()) {
+    addCompileUnit(DICompileUnit(Scope));
+    return;
+  }
+  if (Scope.isSubprogram()) {
+    processSubprogram(DISubprogram(Scope));
+    return;
+  }
+  if (!addScope(Scope))
+    return;
+  if (Scope.isLexicalBlock()) {
+    DILexicalBlock LB(Scope);
+    processScope(LB.getContext());
+  } else if (Scope.isLexicalBlockFile()) {
+    DILexicalBlockFile LBF = DILexicalBlockFile(Scope);
+    processScope(LBF.getScope());
+  } else if (Scope.isNameSpace()) {
+    DINameSpace NS(Scope);
+    processScope(NS.getContext());
+  }
+}
+
+/// processLexicalBlock
+void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) {
+  DIScope Context = LB.getContext();
+  if (Context.isLexicalBlock())
+    return processLexicalBlock(DILexicalBlock(Context));
+  else if (Context.isLexicalBlockFile()) {
+    DILexicalBlockFile DBF = DILexicalBlockFile(Context);
+    return processLexicalBlock(DILexicalBlock(DBF.getScope()));
+  } else
+    return processSubprogram(DISubprogram(Context));
+}
+
+/// processSubprogram - Process DISubprogram.
+void DebugInfoFinder::processSubprogram(DISubprogram SP) {
+  if (!addSubprogram(SP))
+    return;
+  processScope(SP.getContext().resolve(TypeIdentifierMap));
+  processType(SP.getType());
+  DIArray TParams = SP.getTemplateParams();
+  for (unsigned I = 0, E = TParams.getNumElements(); I != E; ++I) {
+    DIDescriptor Element = TParams.getElement(I);
+    if (Element.isTemplateTypeParameter()) {
+      DITemplateTypeParameter TType(Element);
+      processScope(TType.getContext().resolve(TypeIdentifierMap));
+      processType(TType.getType().resolve(TypeIdentifierMap));
+    } else if (Element.isTemplateValueParameter()) {
+      DITemplateValueParameter TVal(Element);
+      processScope(TVal.getContext().resolve(TypeIdentifierMap));
+      processType(TVal.getType().resolve(TypeIdentifierMap));
+    }
+  }
+}
+
+/// processDeclare - Process DbgDeclareInst.
+void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {
+  MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
+  if (!N)
+    return;
+
+  DIDescriptor DV(N);
+  if (!DV.isVariable())
+    return;
+
+  if (!NodesSeen.insert(DV))
+    return;
+  processScope(DIVariable(N).getContext());
+  processType(DIVariable(N).getType());
+}
+
+void DebugInfoFinder::processValue(const DbgValueInst *DVI) {
+  MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
+  if (!N)
+    return;
+
+  DIDescriptor DV(N);
+  if (!DV.isVariable())
+    return;
+
+  if (!NodesSeen.insert(DV))
+    return;
+  processScope(DIVariable(N).getContext());
+  processType(DIVariable(N).getType());
+}
+
+/// addType - Add type into Tys.
+bool DebugInfoFinder::addType(DIType DT) {
+  if (!DT)
+    return false;
+
+  if (!NodesSeen.insert(DT))
+    return false;
+
+  TYs.push_back(DT);
+  return true;
+}
+
+/// addCompileUnit - Add compile unit into CUs.
+bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {
+  if (!CU)
+    return false;
+  if (!NodesSeen.insert(CU))
+    return false;
+
+  CUs.push_back(CU);
+  return true;
+}
+
+/// addGlobalVariable - Add global variable into GVs.
+bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {
+  if (!DIG)
+    return false;
+
+  if (!NodesSeen.insert(DIG))
+    return false;
+
+  GVs.push_back(DIG);
+  return true;
+}
+
+// addSubprogram - Add subprgoram into SPs.
+bool DebugInfoFinder::addSubprogram(DISubprogram SP) {
+  if (!SP)
+    return false;
+
+  if (!NodesSeen.insert(SP))
+    return false;
+
+  SPs.push_back(SP);
+  return true;
+}
+
+bool DebugInfoFinder::addScope(DIScope Scope) {
+  if (!Scope)
+    return false;
+  // FIXME: Ocaml binding generates a scope with no content, we treat it
+  // as null for now.
+  if (Scope->getNumOperands() == 0)
+    return false;
+  if (!NodesSeen.insert(Scope))
+    return false;
+  Scopes.push_back(Scope);
+  return true;
+}
+
+//===----------------------------------------------------------------------===//
+// DIDescriptor: dump routines for all descriptors.
+//===----------------------------------------------------------------------===//
+
+/// dump - Print descriptor to dbgs() with a newline.
+void DIDescriptor::dump() const {
+  print(dbgs());
+  dbgs() << '\n';
+}
+
+/// print - Print descriptor.
+void DIDescriptor::print(raw_ostream &OS) const {
+  if (!DbgNode)
+    return;
+
+  if (const char *Tag = dwarf::TagString(getTag()))
+    OS << "[ " << Tag << " ]";
+
+  if (this->isSubrange()) {
+    DISubrange(DbgNode).printInternal(OS);
+  } else if (this->isCompileUnit()) {
+    DICompileUnit(DbgNode).printInternal(OS);
+  } else if (this->isFile()) {
+    DIFile(DbgNode).printInternal(OS);
+  } else if (this->isEnumerator()) {
+    DIEnumerator(DbgNode).printInternal(OS);
+  } else if (this->isBasicType()) {
+    DIType(DbgNode).printInternal(OS);
+  } else if (this->isDerivedType()) {
+    DIDerivedType(DbgNode).printInternal(OS);
+  } else if (this->isCompositeType()) {
+    DICompositeType(DbgNode).printInternal(OS);
+  } else if (this->isSubprogram()) {
+    DISubprogram(DbgNode).printInternal(OS);
+  } else if (this->isGlobalVariable()) {
+    DIGlobalVariable(DbgNode).printInternal(OS);
+  } else if (this->isVariable()) {
+    DIVariable(DbgNode).printInternal(OS);
+  } else if (this->isObjCProperty()) {
+    DIObjCProperty(DbgNode).printInternal(OS);
+  } else if (this->isNameSpace()) {
+    DINameSpace(DbgNode).printInternal(OS);
+  } else if (this->isScope()) {
+    DIScope(DbgNode).printInternal(OS);
+  }
+}
+
+void DISubrange::printInternal(raw_ostream &OS) const {
+  int64_t Count = getCount();
+  if (Count != -1)
+    OS << " [" << getLo() << ", " << Count - 1 << ']';
+  else
+    OS << " [unbounded]";
+}
+
+void DIScope::printInternal(raw_ostream &OS) const {
+  OS << " [" << getDirectory() << "/" << getFilename() << ']';
+}
+
+void DICompileUnit::printInternal(raw_ostream &OS) const {
+  DIScope::printInternal(OS);
+  OS << " [";
+  unsigned Lang = getLanguage();
+  if (const char *LangStr = dwarf::LanguageString(Lang))
+    OS << LangStr;
+  else
+    (OS << "lang 0x").write_hex(Lang);
+  OS << ']';
+}
+
+void DIEnumerator::printInternal(raw_ostream &OS) const {
+  OS << " [" << getName() << " :: " << getEnumValue() << ']';
+}
+
+void DIType::printInternal(raw_ostream &OS) const {
+  if (!DbgNode)
+    return;
+
+  StringRef Res = getName();
+  if (!Res.empty())
+    OS << " [" << Res << "]";
+
+  // TODO: Print context?
+
+  OS << " [line " << getLineNumber() << ", size " << getSizeInBits()
+     << ", align " << getAlignInBits() << ", offset " << getOffsetInBits();
+  if (isBasicType())
+    if (const char *Enc =
+            dwarf::AttributeEncodingString(DIBasicType(DbgNode).getEncoding()))
+      OS << ", enc " << Enc;
+  OS << "]";
+
+  if (isPrivate())
+    OS << " [private]";
+  else if (isProtected())
+    OS << " [protected]";
+
+  if (isArtificial())
+    OS << " [artificial]";
+
+  if (isForwardDecl())
+    OS << " [decl]";
+  else if (getTag() == dwarf::DW_TAG_structure_type ||
+           getTag() == dwarf::DW_TAG_union_type ||
+           getTag() == dwarf::DW_TAG_enumeration_type ||
+           getTag() == dwarf::DW_TAG_class_type)
+    OS << " [def]";
+  if (isVector())
+    OS << " [vector]";
+  if (isStaticMember())
+    OS << " [static]";
+}
+
+void DIDerivedType::printInternal(raw_ostream &OS) const {
+  DIType::printInternal(OS);
+  OS << " [from " << getTypeDerivedFrom().getName() << ']';
+}
+
+void DICompositeType::printInternal(raw_ostream &OS) const {
+  DIType::printInternal(OS);
+  DIArray A = getTypeArray();
+  OS << " [" << A.getNumElements() << " elements]";
+}
+
+void DINameSpace::printInternal(raw_ostream &OS) const {
+  StringRef Name = getName();
+  if (!Name.empty())
+    OS << " [" << Name << ']';
+
+  OS << " [line " << getLineNumber() << ']';
+}
+
+void DISubprogram::printInternal(raw_ostream &OS) const {
+  // TODO : Print context
+  OS << " [line " << getLineNumber() << ']';
+
+  if (isLocalToUnit())
+    OS << " [local]";
+
+  if (isDefinition())
+    OS << " [def]";
+
+  if (getScopeLineNumber() != getLineNumber())
+    OS << " [scope " << getScopeLineNumber() << "]";
+
+  if (isPrivate())
+    OS << " [private]";
+  else if (isProtected())
+    OS << " [protected]";
+
+  StringRef Res = getName();
+  if (!Res.empty())
+    OS << " [" << Res << ']';
+}
+
+void DIGlobalVariable::printInternal(raw_ostream &OS) const {
+  StringRef Res = getName();
+  if (!Res.empty())
+    OS << " [" << Res << ']';
+
+  OS << " [line " << getLineNumber() << ']';
+
+  // TODO : Print context
+
+  if (isLocalToUnit())
+    OS << " [local]";
+
+  if (isDefinition())
+    OS << " [def]";
+}
+
+void DIVariable::printInternal(raw_ostream &OS) const {
+  StringRef Res = getName();
+  if (!Res.empty())
+    OS << " [" << Res << ']';
+
+  OS << " [line " << getLineNumber() << ']';
+}
+
+void DIObjCProperty::printInternal(raw_ostream &OS) const {
+  StringRef Name = getObjCPropertyName();
+  if (!Name.empty())
+    OS << " [" << Name << ']';
+
+  OS << " [line " << getLineNumber() << ", properties " << getUnsignedField(6)
+     << ']';
+}
+
+static void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS,
+                          const LLVMContext &Ctx) {
+  if (!DL.isUnknown()) { // Print source line info.
+    DIScope Scope(DL.getScope(Ctx));
+    assert(Scope.isScope() && "Scope of a DebugLoc should be a DIScope.");
+    // Omit the directory, because it's likely to be long and uninteresting.
+    CommentOS << Scope.getFilename();
+    CommentOS << ':' << DL.getLine();
+    if (DL.getCol() != 0)
+      CommentOS << ':' << DL.getCol();
+    DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(DL.getInlinedAt(Ctx));
+    if (!InlinedAtDL.isUnknown()) {
+      CommentOS << " @[ ";
+      printDebugLoc(InlinedAtDL, CommentOS, Ctx);
+      CommentOS << " ]";
+    }
+  }
+}
+
+void DIVariable::printExtendedName(raw_ostream &OS) const {
+  const LLVMContext &Ctx = DbgNode->getContext();
+  StringRef Res = getName();
+  if (!Res.empty())
+    OS << Res << "," << getLineNumber();
+  if (MDNode *InlinedAt = getInlinedAt()) {
+    DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(InlinedAt);
+    if (!InlinedAtDL.isUnknown()) {
+      OS << " @[";
+      printDebugLoc(InlinedAtDL, OS, Ctx);
+      OS << "]";
+    }
+  }
+}
+
+/// Specialize constructor to make sure it has the correct type.
+template <> DIRef<DIScope>::DIRef(const Value *V) : Val(V) {
+  assert(isScopeRef(V) && "DIScopeRef should be a MDString or MDNode");
+}
+template <> DIRef<DIType>::DIRef(const Value *V) : Val(V) {
+  assert(isTypeRef(V) && "DITypeRef should be a MDString or MDNode");
+}
+
+/// Specialize getFieldAs to handle fields that are references to DIScopes.
+template <>
+DIScopeRef DIDescriptor::getFieldAs<DIScopeRef>(unsigned Elt) const {
+  return DIScopeRef(getField(DbgNode, Elt));
+}
+/// Specialize getFieldAs to handle fields that are references to DITypes.
+template <> DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const {
+  return DITypeRef(getField(DbgNode, Elt));
+}