IR: Restore the old behavior of getDISubprogram
[oota-llvm.git] / lib / IR / DebugInfo.cpp
index ead426ee5de78193d055502dd90a246a226a6167..60904c2b356b2cf780a91ad4ab9207904777f2a0 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/IR/DebugInfo.h"
+#include "LLVMContextImpl.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/DIBuilder.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/IR/ValueHandle.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/Dwarf.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() || DIExpression(DbgNode).Verify());
+}
+
+static Value *getField(const MDNode *DbgNode, unsigned Elt) {
+  if (!DbgNode || Elt >= DbgNode->getNumOperands())
+    return nullptr;
+  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)
+    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)
+    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)
+    return nullptr;
+
+  if (Elt < DbgNode->getNumOperands())
+    return dyn_cast_or_null<GlobalVariable>(DbgNode->getOperand(Elt));
+  return nullptr;
+}
+
+Constant *DIDescriptor::getConstantField(unsigned Elt) const {
+  if (!DbgNode)
+    return nullptr;
+
+  if (Elt < DbgNode->getNumOperands())
+    return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt));
+  return nullptr;
+}
+
+Function *DIDescriptor::getFunctionField(unsigned Elt) const {
+  if (!DbgNode)
+    return nullptr;
+
+  if (Elt < DbgNode->getNumOperands())
+    return dyn_cast_or_null<Function>(DbgNode->getOperand(Elt));
+  return nullptr;
+}
+
+void DIDescriptor::replaceFunctionField(unsigned Elt, Function *F) {
+  if (!DbgNode)
+    return;
+
+  if (Elt < DbgNode->getNumOperands()) {
+    MDNode *Node = const_cast<MDNode *>(DbgNode);
+    Node->replaceOperandWith(Elt, F);
+  }
+}
+
+static unsigned DIVariableInlinedAtIndex = 4;
+MDNode *DIVariable::getInlinedAt() const {
+  return getNodeField(DbgNode, DIVariableInlinedAtIndex);
+}
+
+/// \brief Return the size reported by the variable's type.
+unsigned DIVariable::getSizeInBits(const DITypeIdentifierMap &Map) {
+  DIType Ty = getType().resolve(Map);
+  // Follow derived types until we reach a type that
+  // reports back a size.
+  while (Ty.isDerivedType() && !Ty.getSizeInBits()) {
+    DIDerivedType DT(&*Ty);
+    Ty = DT.getTypeDerivedFrom().resolve(Map);
+  }
+  assert(Ty.getSizeInBits() && "type with size 0");
+  return Ty.getSizeInBits();
+}
+
+uint64_t DIExpression::getElement(unsigned Idx) const {
+  unsigned I = Idx + 1;
+  assert(I < getNumHeaderFields() &&
+         "non-existing complex address element requested");
+  return getHeaderFieldAs<int64_t>(I);
+}
+
+bool DIExpression::isVariablePiece() const {
+  return getNumElements() && getElement(0) == dwarf::DW_OP_piece;
+}
+
+uint64_t DIExpression::getPieceOffset() const {
+  assert(isVariablePiece());
+  return getElement(1);
+}
+
+uint64_t DIExpression::getPieceSize() const {
+  assert(isVariablePiece());
+  return getElement(2);
+}
+
+//===----------------------------------------------------------------------===//
+// Predicates
+//===----------------------------------------------------------------------===//
+
+bool DIDescriptor::isSubroutineType() const {
+  return isCompositeType() && getTag() == dwarf::DW_TAG_subroutine_type;
+}
+
+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;
+  }
+}
+
+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();
+  }
+}
+
+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;
+  }
+}
+
+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;
+  }
+}
+
+bool DIDescriptor::isType() const {
+  return isBasicType() || isCompositeType() || isDerivedType();
+}
+
+bool DIDescriptor::isSubprogram() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_subprogram;
+}
+
+bool DIDescriptor::isGlobalVariable() const {
+  return DbgNode && (getTag() == dwarf::DW_TAG_variable ||
+                     getTag() == dwarf::DW_TAG_constant);
+}
+
+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();
+}
+
+bool DIDescriptor::isTemplateTypeParameter() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_template_type_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);
+}
+
+bool DIDescriptor::isCompileUnit() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_compile_unit;
+}
+
+bool DIDescriptor::isFile() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_file_type;
+}
+
+bool DIDescriptor::isNameSpace() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_namespace;
+}
+
+bool DIDescriptor::isLexicalBlockFile() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&
+         DbgNode->getNumOperands() == 3 && getNumHeaderFields() == 2;
+}
+
+bool DIDescriptor::isLexicalBlock() const {
+  // FIXME: There are always exactly 4 header fields in DILexicalBlock, but
+  // something relies on this returning true for DILexicalBlockFile.
+  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&
+         DbgNode->getNumOperands() == 3 &&
+         (getNumHeaderFields() == 2 || getNumHeaderFields() == 4);
+}
+
+bool DIDescriptor::isSubrange() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_subrange_type;
+}
+
+bool DIDescriptor::isEnumerator() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_enumerator;
+}
+
+bool DIDescriptor::isObjCProperty() const {
+  return DbgNode && getTag() == dwarf::DW_TAG_APPLE_property;
+}
+
+bool DIDescriptor::isImportedEntity() const {
+  return DbgNode && (getTag() == dwarf::DW_TAG_imported_module ||
+                     getTag() == dwarf::DW_TAG_imported_declaration);
+}
+
+bool DIDescriptor::isExpression() const {
+  return DbgNode && (getTag() == dwarf::DW_TAG_expression);
+}
+
+//===----------------------------------------------------------------------===//
+// Simple Descriptor Constructors and other Methods
+//===----------------------------------------------------------------------===//
+
+void DIDescriptor::replaceAllUsesWith(LLVMContext &VMContext, 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.
+  const MDNode *DN = D;
+  if (DbgNode == DN) {
+    SmallVector<Value*, 10> Ops(DbgNode->getNumOperands());
+    for (size_t i = 0; i != Ops.size(); ++i)
+      Ops[i] = DbgNode->getOperand(i);
+    DN = MDNode::get(VMContext, Ops);
+  }
+
+  MDNode *Node = const_cast<MDNode *>(DbgNode);
+  const Value *V = cast_or_null<Value>(DN);
+  Node->replaceAllUsesWith(const_cast<Value *>(V));
+  MDNode::deleteTemporary(Node);
+  DbgNode = DN;
+}
+
+void DIDescriptor::replaceAllUsesWith(MDNode *D) {
+
+  assert(DbgNode && "Trying to replace an unverified type!");
+  assert(DbgNode != D && "This replacement should always happen");
+  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);
+}
+
+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() == 7 && getNumHeaderFields() == 8;
+}
+
+bool DIObjCProperty::Verify() const {
+  if (!isObjCProperty())
+    return false;
+
+  // Don't worry about the rest of the strings for now.
+  return DbgNode->getNumOperands() == 3 && getNumHeaderFields() == 6;
+}
+
+/// \brief 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;
+}
+
+/// \brief 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);
+}
+
+/// \brief 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());
+}
+
+/// \brief Check if referenced field might be a type.
+static bool fieldIsTypeRef(const MDNode *DbgNode, unsigned Elt) {
+  Value *Fld = getField(DbgNode, Elt);
+  return isTypeRef(Fld);
+}
+
+/// \brief Check if a value can be a ScopeRef.
+static bool isScopeRef(const Value *Val) {
+  return !Val ||
+    (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
+    // Not checking for Val->isScope() here, because it would work
+    // only for lexical scopes and not all subclasses of DIScope.
+    isa<MDNode>(Val);
+}
+
+/// \brief 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);
+}
+
+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())
+    return DIBasicType(DbgNode).Verify();
+  else if (isCompositeType())
+    return DICompositeType(DbgNode).Verify();
+  else if (isDerivedType())
+    return DIDerivedType(DbgNode).Verify();
+  else
+    return false;
+}
+
+bool DIBasicType::Verify() const {
+  return isBasicType() && DbgNode->getNumOperands() == 3 &&
+         getNumHeaderFields() == 8;
+}
+
+bool DIDerivedType::Verify() const {
+  // Make sure DerivedFrom @ field 3 is TypeRef.
+  if (!fieldIsTypeRef(DbgNode, 3))
+    return false;
+  if (getTag() == dwarf::DW_TAG_ptr_to_member_type)
+    // Make sure ClassType @ field 4 is a TypeRef.
+    if (!fieldIsTypeRef(DbgNode, 4))
+      return false;
+
+  return isDerivedType() && DbgNode->getNumOperands() >= 4 &&
+         DbgNode->getNumOperands() <= 8 && getNumHeaderFields() >= 7 &&
+         getNumHeaderFields() <= 8;
+}
+
+bool DICompositeType::Verify() const {
+  if (!isCompositeType())
+    return false;
+
+  // Make sure DerivedFrom @ field 3 and ContainingType @ field 5 are TypeRef.
+  if (!fieldIsTypeRef(DbgNode, 3))
+    return false;
+  if (!fieldIsTypeRef(DbgNode, 5))
+    return false;
+
+  // Make sure the type identifier at field 7 is MDString, it can be null.
+  if (!fieldIsMDString(DbgNode, 7))
+    return false;
+
+  // A subroutine type can't be both & and &&.
+  if (isLValueReference() && isRValueReference())
+    return false;
+
+  return DbgNode->getNumOperands() == 8 && getNumHeaderFields() == 8;
+}
+
+bool DISubprogram::Verify() const {
+  if (!isSubprogram())
+    return false;
+
+  // Make sure context @ field 2 is a ScopeRef and type @ field 3 is a MDNode.
+  if (!fieldIsScopeRef(DbgNode, 2))
+    return false;
+  if (!fieldIsMDNode(DbgNode, 3))
+    return false;
+  // Containing type @ field 4.
+  if (!fieldIsTypeRef(DbgNode, 4))
+    return false;
+
+  // A subprogram can't be both & and &&.
+  if (isLValueReference() && isRValueReference())
+    return false;
+
+  // If a DISubprogram has an llvm::Function*, then scope chains from all
+  // instructions within the function should lead to this DISubprogram.
+  if (auto *F = getFunction()) {
+    LLVMContext &Ctxt = F->getContext();
+    for (auto &BB : *F) {
+      for (auto &I : BB) {
+        DebugLoc DL = I.getDebugLoc();
+        if (DL.isUnknown())
+          continue;
+
+        MDNode *Scope = nullptr;
+        MDNode *IA = nullptr;
+        // walk the inlined-at scopes
+        while (DL.getScopeAndInlinedAt(Scope, IA, F->getContext()), IA)
+          DL = DebugLoc::getFromDILocation(IA);
+        DL.getScopeAndInlinedAt(Scope, IA, Ctxt);
+        assert(!IA);
+        while (!DIDescriptor(Scope).isSubprogram()) {
+          DILexicalBlockFile D(Scope);
+          Scope = D.isLexicalBlockFile()
+                      ? D.getScope()
+                      : DebugLoc::getFromDILexicalBlock(Scope).getScope(Ctxt);
+        }
+        if (!DISubprogram(Scope).describes(F))
+          return false;
+      }
+    }
+  }
+  return DbgNode->getNumOperands() == 9 && getNumHeaderFields() == 12;
+}
+
+bool DIGlobalVariable::Verify() const {
+  if (!isGlobalVariable())
+    return false;
+
+  if (getDisplayName().empty())
+    return false;
+  // Make sure context @ field 1 is an MDNode.
+  if (!fieldIsMDNode(DbgNode, 1))
+    return false;
+  // Make sure that type @ field 3 is a DITypeRef.
+  if (!fieldIsTypeRef(DbgNode, 3))
+    return false;
+  // Make sure StaticDataMemberDeclaration @ field 5 is MDNode.
+  if (!fieldIsMDNode(DbgNode, 5))
+    return false;
+
+  return DbgNode->getNumOperands() == 6 && getNumHeaderFields() == 7;
+}
+
+bool DIVariable::Verify() const {
+  if (!isVariable())
+    return false;
+
+  // Make sure context @ field 1 is an MDNode.
+  if (!fieldIsMDNode(DbgNode, 1))
+    return false;
+  // Make sure that type @ field 3 is a DITypeRef.
+  if (!fieldIsTypeRef(DbgNode, 3))
+    return false;
+
+  // Check the number of header fields, which is common between complex and
+  // simple variables.
+  if (getNumHeaderFields() != 4)
+    return false;
+
+  // Variable without an inline location.
+  if (DbgNode->getNumOperands() == 4)
+    return true;
+
+  // Variable with an inline location.
+  return getInlinedAt() != nullptr && DbgNode->getNumOperands() == 5;
+}
+
+bool DIExpression::Verify() const {
+  // Empty DIExpressions may be represented as a nullptr.
+  if (!DbgNode)
+    return true;
+
+  return isExpression() && DbgNode->getNumOperands() == 1;
+}
+
+bool DILocation::Verify() const {
+  if (!DbgNode)
+    return false;
+
+  return DbgNode->getNumOperands() == 4;
+}
+
+bool DINameSpace::Verify() const {
+  if (!isNameSpace())
+    return false;
+  return DbgNode->getNumOperands() == 3 && getNumHeaderFields() == 3;
+}
+
+MDNode *DIFile::getFileNode() const { return getNodeField(DbgNode, 1); }
+
+bool DIFile::Verify() const {
+  return isFile() && DbgNode->getNumOperands() == 2;
+}
+
+bool DIEnumerator::Verify() const {
+  return isEnumerator() && DbgNode->getNumOperands() == 1 &&
+         getNumHeaderFields() == 3;
+}
+
+bool DISubrange::Verify() const {
+  return isSubrange() && DbgNode->getNumOperands() == 1 &&
+         getNumHeaderFields() == 3;
+}
+
+bool DILexicalBlock::Verify() const {
+  return isLexicalBlock() && DbgNode->getNumOperands() == 3 &&
+         getNumHeaderFields() == 4;
+}
+
+bool DILexicalBlockFile::Verify() const {
+  return isLexicalBlockFile() && DbgNode->getNumOperands() == 3 &&
+         getNumHeaderFields() == 2;
+}
+
+bool DITemplateTypeParameter::Verify() const {
+  return isTemplateTypeParameter() && DbgNode->getNumOperands() == 4 &&
+         getNumHeaderFields() == 4;
+}
+
+bool DITemplateValueParameter::Verify() const {
+  return isTemplateValueParameter() && DbgNode->getNumOperands() == 5 &&
+         getNumHeaderFields() == 4;
+}
+
+bool DIImportedEntity::Verify() const {
+  return isImportedEntity() && DbgNode->getNumOperands() == 3 &&
+         getNumHeaderFields() == 3;
+}
+
+MDNode *DIDerivedType::getObjCProperty() const {
+  return getNodeField(DbgNode, 4);
+}
+
+MDString *DICompositeType::getIdentifier() const {
+  return cast_or_null<MDString>(getField(DbgNode, 7));
+}
+
+#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
+
+void DICompositeType::setArraysHelper(MDNode *Elements, MDNode *TParams) {
+  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(4)))
+      VerifySubsetOf(El, Elements);
+#endif
+    N->replaceOperandWith(4, Elements);
+  }
+  if (TParams)
+    N->replaceOperandWith(6, TParams);
+  DbgNode = N;
+}
+
+DIScopeRef DIScope::getRef() const {
+  if (!isCompositeType())
+    return DIScopeRef(*this);
+  DICompositeType DTy(DbgNode);
+  if (!DTy.getIdentifier())
+    return DIScopeRef(*this);
+  return DIScopeRef(DTy.getIdentifier());
+}
+
+void DICompositeType::setContainingType(DICompositeType ContainingType) {
+  TrackingVH<MDNode> N(*this);
+  N->replaceOperandWith(5, ContainingType.getRef());
+  DbgNode = N;
+}
+
+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);
+}
+
+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;
+}
+
+MDNode *DISubprogram::getVariablesNodes() const {
+  return getNodeField(DbgNode, 8);
+}
+
+DIArray DISubprogram::getVariables() const {
+  return DIArray(getNodeField(DbgNode, 8));
+}
+
+Value *DITemplateValueParameter::getValue() const {
+  return getField(DbgNode, 3);
+}
+
+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(nullptr);
+}
+
+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() < 7)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 2));
+}
+
+DIArray DICompileUnit::getRetainedTypes() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 7)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 3));
+}
+
+DIArray DICompileUnit::getSubprograms() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 7)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 4));
+}
+
+DIArray DICompileUnit::getGlobalVariables() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 7)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 5));
+}
+
+DIArray DICompileUnit::getImportedEntities() const {
+  if (!DbgNode || DbgNode->getNumOperands() < 7)
+    return DIArray();
+
+  return DIArray(getNodeField(DbgNode, 6));
+}
+
+void DICompileUnit::replaceSubprograms(DIArray Subprograms) {
+  assert(Verify() && "Expected compile unit");
+  if (Subprograms == getSubprograms())
+    return;
+
+  const_cast<MDNode *>(DbgNode)->replaceOperandWith(4, Subprograms);
+}
+
+void DICompileUnit::replaceGlobalVariables(DIArray GlobalVariables) {
+  assert(Verify() && "Expected compile unit");
+  if (GlobalVariables == getGlobalVariables())
+    return;
+
+  const_cast<MDNode *>(DbgNode)->replaceOperandWith(5, GlobalVariables);
+}
+
+DILocation DILocation::copyWithNewScope(LLVMContext &Ctx,
+                                        DILexicalBlockFile NewScope) {
+  SmallVector<Value *, 10> Elts;
+  assert(Verify());
+  for (unsigned I = 0; I < DbgNode->getNumOperands(); ++I) {
+    if (I != 2)
+      Elts.push_back(DbgNode->getOperand(I));
+    else
+      Elts.push_back(NewScope);
+  }
+  MDNode *NewDIL = MDNode::get(Ctx, Elts);
+  return DILocation(NewDIL);
+}
+
+unsigned DILocation::computeNewDiscriminator(LLVMContext &Ctx) {
+  std::pair<const char *, unsigned> Key(getFilename().data(), getLineNumber());
+  return ++Ctx.pImpl->DiscriminatorTable[Key];
+}
+
+DIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope,
+                                       LLVMContext &VMContext) {
+  assert(DIVariable(DV).Verify() && "Expected a DIVariable");
+  if (!InlinedScope)
+    return cleanseInlinedVariable(DV, VMContext);
+
+  // Insert inlined scope.
+  SmallVector<Value *, 8> Elts;
+  for (unsigned I = 0, E = DIVariableInlinedAtIndex; I != E; ++I)
+    Elts.push_back(DV->getOperand(I));
+  Elts.push_back(InlinedScope);
+
+  DIVariable Inlined(MDNode::get(VMContext, Elts));
+  assert(Inlined.Verify() && "Expected to create a DIVariable");
+  return Inlined;
+}
+
+DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) {
+  assert(DIVariable(DV).Verify() && "Expected a DIVariable");
+  if (!DIVariable(DV).getInlinedAt())
+    return DIVariable(DV);
+
+  // Remove inlined scope.
+  SmallVector<Value *, 8> Elts;
+  for (unsigned I = 0, E = DIVariableInlinedAtIndex; I != E; ++I)
+    Elts.push_back(DV->getOperand(I));
+
+  DIVariable Cleansed(MDNode::get(VMContext, Elts));
+  assert(Cleansed.Verify() && "Expected to create a DIVariable");
+  return Cleansed;
+}
+
+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();
+}
+
+DISubprogram llvm::getDISubprogram(const Function *F) {
+  // We look for the first instr that has a debug annotation leading back to F.
+  for (auto &BB : *F) {
+    auto Inst = std::find_if(BB.begin(), BB.end(), [](const Instruction &Inst) {
+      return !Inst.getDebugLoc().isUnknown();
+    });
+    if (Inst == BB.end())
+      continue;
+    DebugLoc DLoc = Inst->getDebugLoc();
+    const MDNode *Scope = DLoc.getScopeNode(F->getParent()->getContext());
+    DISubprogram Subprogram = getDISubprogram(Scope);
+    return Subprogram.describes(F) ? Subprogram : DISubprogram();
+  }
+
+  return DISubprogram();
+}
+
+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();
+}
+
+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();
+  TypeMapInitialized = false;
+}
+
+void DebugInfoFinder::InitializeTypeMap(const Module &M) {
+  if (!TypeMapInitialized)
+    if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
+      TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
+      TypeMapInitialized = true;
+    }
+}
+
+void DebugInfoFinder::processModule(const Module &M) {
+  InitializeTypeMap(M);
+  if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
+    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().resolve(TypeIdentifierMap));
+        }
+      }
+      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().resolve(TypeIdentifierMap);
+        if (Entity.isType())
+          processType(DIType(Entity));
+        else if (Entity.isSubprogram())
+          processSubprogram(DISubprogram(Entity));
+        else if (Entity.isNameSpace())
+          processScope(DINameSpace(Entity).getContext());
+      }
+    }
+  }
+}
+
+void DebugInfoFinder::processLocation(const Module &M, DILocation Loc) {
+  if (!Loc)
+    return;
+  InitializeTypeMap(M);
+  processScope(Loc.getScope());
+  processLocation(M, Loc.getOrigLocation());
+}
+
+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));
+    if (DT.isSubroutineType()) {
+      DITypeArray DTA = DISubroutineType(DT).getTypeArray();
+      for (unsigned i = 0, e = DTA.getNumElements(); i != e; ++i)
+        processType(DTA.getElement(i).resolve(TypeIdentifierMap));
+      return;
+    }
+    DIArray DA = DCT.getElements();
+    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());
+  }
+}
+
+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));
+    }
+  }
+}
+
+void DebugInfoFinder::processDeclare(const Module &M,
+                                     const DbgDeclareInst *DDI) {
+  MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
+  if (!N)
+    return;
+  InitializeTypeMap(M);
+
+  DIDescriptor DV(N);
+  if (!DV.isVariable())
+    return;
+
+  if (!NodesSeen.insert(DV))
+    return;
+  processScope(DIVariable(N).getContext());
+  processType(DIVariable(N).getType().resolve(TypeIdentifierMap));
+}
+
+void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) {
+  MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
+  if (!N)
+    return;
+  InitializeTypeMap(M);
+
+  DIDescriptor DV(N);
+  if (!DV.isVariable())
+    return;
+
+  if (!NodesSeen.insert(DV))
+    return;
+  processScope(DIVariable(N).getContext());
+  processType(DIVariable(N).getType().resolve(TypeIdentifierMap));
+}
+
+bool DebugInfoFinder::addType(DIType DT) {
+  if (!DT)
+    return false;
+
+  if (!NodesSeen.insert(DT))
+    return false;
+
+  TYs.push_back(DT);
+  return true;
+}
+
+bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {
+  if (!CU)
+    return false;
+  if (!NodesSeen.insert(CU))
+    return false;
+
+  CUs.push_back(CU);
+  return true;
+}
+
+bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {
+  if (!DIG)
+    return false;
+
+  if (!NodesSeen.insert(DIG))
+    return false;
+
+  GVs.push_back(DIG);
+  return true;
+}
+
+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.
+//===----------------------------------------------------------------------===//
+
+void DIDescriptor::dump() const {
+  print(dbgs());
+  dbgs() << '\n';
+}
+
+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);
+  } else if (this->isExpression()) {
+    DIExpression(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]";
+  else if (isPublic())
+    OS << " [public]";
+
+  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]";
+
+  if (isLValueReference())
+    OS << " [reference]";
+
+  if (isRValueReference())
+    OS << " [rvalue reference]";
+}
+
+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 = getElements();
+  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]";
+  else if (isPublic())
+    OS << " [public]";
+
+  if (isLValueReference())
+    OS << " [reference]";
+
+  if (isRValueReference())
+    OS << " [rvalue reference]";
+
+  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 DIExpression::printInternal(raw_ostream &OS) const {
+  for (unsigned I = 0; I < getNumElements(); ++I) {
+    uint64_t OpCode = getElement(I);
+    OS << " [" << OperationEncodingString(OpCode);
+    switch (OpCode) {
+    case DW_OP_plus: {
+      OS << " " << getElement(++I);
+      break;
+    }
+    case DW_OP_piece: {
+      unsigned Offset = getElement(++I);
+      unsigned Size = getElement(++I);
+      OS << " offset=" << Offset << ", size=" << Size;
+      break;
+    }
+    default:
+      // Else bail out early. This may be a line table entry.
+      OS << "Unknown]";
+      return;
+    }
+    OS << "]";
+  }
+}
+
+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 << "]";
+    }
+  }
+}
+
+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");
+}
+
+template <>
+DIScopeRef DIDescriptor::getFieldAs<DIScopeRef>(unsigned Elt) const {
+  return DIScopeRef(getField(DbgNode, Elt));
+}
+template <> DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const {
+  return DITypeRef(getField(DbgNode, Elt));
+}
+
+bool llvm::StripDebugInfo(Module &M) {
+  bool Changed = false;
+
+  // Remove all of the calls to the debugger intrinsics, and remove them from
+  // the module.
+  if (Function *Declare = M.getFunction("llvm.dbg.declare")) {
+    while (!Declare->use_empty()) {
+      CallInst *CI = cast<CallInst>(Declare->user_back());
+      CI->eraseFromParent();
+    }
+    Declare->eraseFromParent();
+    Changed = true;
+  }
+
+  if (Function *DbgVal = M.getFunction("llvm.dbg.value")) {
+    while (!DbgVal->use_empty()) {
+      CallInst *CI = cast<CallInst>(DbgVal->user_back());
+      CI->eraseFromParent();
+    }
+    DbgVal->eraseFromParent();
+    Changed = true;
+  }
+
+  for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
+         NME = M.named_metadata_end(); NMI != NME;) {
+    NamedMDNode *NMD = NMI;
+    ++NMI;
+    if (NMD->getName().startswith("llvm.dbg.")) {
+      NMD->eraseFromParent();
+      Changed = true;
+    }
+  }
+
+  for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI)
+    for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE;
+         ++FI)
+      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE;
+           ++BI) {
+        if (!BI->getDebugLoc().isUnknown()) {
+          Changed = true;
+          BI->setDebugLoc(DebugLoc());
+        }
+      }
+
+  return Changed;
+}
+
+unsigned llvm::getDebugMetadataVersionFromModule(const Module &M) {
+  Value *Val = M.getModuleFlag("Debug Info Version");
+  if (!Val)
+    return 0;
+  return cast<ConstantInt>(Val)->getZExtValue();
+}
+
+llvm::DenseMap<const llvm::Function *, llvm::DISubprogram>
+llvm::makeSubprogramMap(const Module &M) {
+  DenseMap<const Function *, DISubprogram> R;
+
+  NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu");
+  if (!CU_Nodes)
+    return R;
+
+  for (MDNode *N : CU_Nodes->operands()) {
+    DICompileUnit CUNode(N);
+    DIArray SPs = CUNode.getSubprograms();
+    for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
+      DISubprogram SP(SPs.getElement(i));
+      if (Function *F = SP.getFunction())
+        R.insert(std::make_pair(F, SP));
+    }
+  }
+  return R;
+}