15f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===//
25f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//
35f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//                     The LLVM Compiler Infrastructure
45f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//
55f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// This file is distributed under the University of Illinois Open Source
65f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// License. See LICENSE.TXT for details.
75f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//
85f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
95f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//
105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// This file implements the helper classes used to build and interpret debug
115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// information in LLVM IR form.
125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//
135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugInfo.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "LLVMContextImpl.h"
175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/ADT/STLExtras.h"
185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/ADT/SmallPtrSet.h"
195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/ADT/SmallString.h"
205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Analysis/ValueTracking.h"
215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Constants.h"
225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/DerivedTypes.h"
235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Instructions.h"
245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/IntrinsicInst.h"
255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Intrinsics.h"
265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Module.h"
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/ValueHandle.h"
285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Support/Debug.h"
295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Support/Dwarf.h"
305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Support/raw_ostream.h"
315f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingusing namespace llvm;
325f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingusing namespace llvm::dwarf;
335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// DIDescriptor
365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
385f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::Verify() const {
395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode &&
405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         (DIDerivedType(DbgNode).Verify() ||
415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DICompositeType(DbgNode).Verify() || DIBasicType(DbgNode).Verify() ||
425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DIVariable(DbgNode).Verify() || DISubprogram(DbgNode).Verify() ||
435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DIGlobalVariable(DbgNode).Verify() || DIFile(DbgNode).Verify() ||
445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DICompileUnit(DbgNode).Verify() || DINameSpace(DbgNode).Verify() ||
455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DILexicalBlock(DbgNode).Verify() ||
465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DILexicalBlockFile(DbgNode).Verify() ||
475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DISubrange(DbgNode).Verify() || DIEnumerator(DbgNode).Verify() ||
485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DIObjCProperty(DbgNode).Verify() ||
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          DIUnspecifiedParameter(DbgNode).Verify() ||
505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DITemplateTypeParameter(DbgNode).Verify() ||
515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DITemplateValueParameter(DbgNode).Verify() ||
525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          DIImportedEntity(DbgNode).Verify());
535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
555f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic Value *getField(const MDNode *DbgNode, unsigned Elt) {
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode || Elt >= DbgNode->getNumOperands())
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getOperand(Elt);
595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
615f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic MDNode *getNodeField(const MDNode *DbgNode, unsigned Elt) {
625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return dyn_cast_or_null<MDNode>(getField(DbgNode, Elt));
635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
655f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic StringRef getStringField(const MDNode *DbgNode, unsigned Elt) {
665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (MDString *MDS = dyn_cast_or_null<MDString>(getField(DbgNode, Elt)))
675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return MDS->getString();
685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return StringRef();
695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
715f7259180c59b2830bf206b44439be32ffa9161eBill WendlingStringRef DIDescriptor::getStringField(unsigned Elt) const {
725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return ::getStringField(DbgNode, Elt);
735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
755f7259180c59b2830bf206b44439be32ffa9161eBill Wendlinguint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode)
775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return 0;
785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elt < DbgNode->getNumOperands())
805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (ConstantInt *CI =
815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling            dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt)))
825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      return CI->getZExtValue();
835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return 0;
855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
875f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingint64_t DIDescriptor::getInt64Field(unsigned Elt) const {
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode)
895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return 0;
905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elt < DbgNode->getNumOperands())
925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (ConstantInt *CI =
935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling            dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(Elt)))
945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      return CI->getSExtValue();
955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return 0;
975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
995f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const {
1005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  MDNode *Field = getNodeField(DbgNode, Elt);
1015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIDescriptor(Field);
1025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1045f7259180c59b2830bf206b44439be32ffa9161eBill WendlingGlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {
105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode)
106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
1075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elt < DbgNode->getNumOperands())
1095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return dyn_cast_or_null<GlobalVariable>(DbgNode->getOperand(Elt));
110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
1115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1135f7259180c59b2830bf206b44439be32ffa9161eBill WendlingConstant *DIDescriptor::getConstantField(unsigned Elt) const {
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode)
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
1165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elt < DbgNode->getNumOperands())
1185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt));
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
1205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1225f7259180c59b2830bf206b44439be32ffa9161eBill WendlingFunction *DIDescriptor::getFunctionField(unsigned Elt) const {
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode)
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
1255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elt < DbgNode->getNumOperands())
1275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return dyn_cast_or_null<Function>(DbgNode->getOperand(Elt));
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
1295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1315f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIDescriptor::replaceFunctionField(unsigned Elt, Function *F) {
132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DbgNode)
1335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
1345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elt < DbgNode->getNumOperands()) {
1365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    MDNode *Node = const_cast<MDNode *>(DbgNode);
1375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    Node->replaceOperandWith(Elt, F);
1385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
1395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesuint64_t DIVariable::getAddrElement(unsigned Idx) const {
142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  DIDescriptor ComplexExpr = getDescriptorField(8);
143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (Idx < ComplexExpr->getNumOperands())
144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (auto *CI = dyn_cast_or_null<ConstantInt>(ComplexExpr->getOperand(Idx)))
145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return CI->getZExtValue();
146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  assert(false && "non-existing complex address element requested");
148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return 0;
1495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// getInlinedAt - If this variable is inlined then return inline location.
1525f7259180c59b2830bf206b44439be32ffa9161eBill WendlingMDNode *DIVariable::getInlinedAt() const { return getNodeField(DbgNode, 7); }
1535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
1555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// Predicates
1565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
1575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isBasicType - Return true if the specified tag is legal for
1595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DIBasicType.
1605f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isBasicType() const {
1615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
1625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
1635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  switch (getTag()) {
1645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_base_type:
1655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_unspecified_type:
1665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
1675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  default:
1685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
1695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
1705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isDerivedType - Return true if the specified tag is legal for DIDerivedType.
1735f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isDerivedType() const {
1745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
1755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
1765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  switch (getTag()) {
1775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_typedef:
1785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_pointer_type:
1795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_ptr_to_member_type:
1805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_reference_type:
1815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_rvalue_reference_type:
1825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_const_type:
1835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_volatile_type:
1845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_restrict_type:
1855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_member:
1865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_inheritance:
1875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_friend:
1885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
1895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  default:
1905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // CompositeTypes are currently modelled as DerivedTypes.
1915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return isCompositeType();
1925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
1935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
1955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isCompositeType - Return true if the specified tag is legal for
1965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DICompositeType.
1975f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isCompositeType() const {
1985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
1995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
2005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  switch (getTag()) {
2015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_array_type:
2025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_structure_type:
2035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_union_type:
2045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_enumeration_type:
2055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_subroutine_type:
2065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_class_type:
2075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
2085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  default:
2095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
2105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
2115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isVariable - Return true if the specified tag is legal for DIVariable.
2145f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isVariable() const {
2155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
2165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
2175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  switch (getTag()) {
2185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_auto_variable:
2195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_arg_variable:
2205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
2215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  default:
2225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
2235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
2245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isType - Return true if the specified tag is legal for DIType.
2275f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isType() const {
2285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isBasicType() || isCompositeType() || isDerivedType();
2295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isSubprogram - Return true if the specified tag is legal for
2325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DISubprogram.
2335f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isSubprogram() const {
2345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_subprogram;
2355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isGlobalVariable - Return true if the specified tag is legal for
2385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DIGlobalVariable.
2395f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isGlobalVariable() const {
2405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && (getTag() == dwarf::DW_TAG_variable ||
2415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                     getTag() == dwarf::DW_TAG_constant);
2425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isUnspecifiedParmeter - Return true if the specified tag is
2455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DW_TAG_unspecified_parameters.
2465f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isUnspecifiedParameter() const {
2475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_unspecified_parameters;
2485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isScope - Return true if the specified tag is one of the scope
2515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// related tag.
2525f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isScope() const {
2535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
2545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
2555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  switch (getTag()) {
2565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_compile_unit:
2575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_lexical_block:
2585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_subprogram:
2595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_namespace:
2605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  case dwarf::DW_TAG_file_type:
2615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
2625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  default:
2635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    break;
2645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
2655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isType();
2665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isTemplateTypeParameter - Return true if the specified tag is
2695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DW_TAG_template_type_parameter.
2705f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isTemplateTypeParameter() const {
2715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_template_type_parameter;
2725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isTemplateValueParameter - Return true if the specified tag is
2755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DW_TAG_template_value_parameter.
2765f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isTemplateValueParameter() const {
2775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && (getTag() == dwarf::DW_TAG_template_value_parameter ||
2785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                     getTag() == dwarf::DW_TAG_GNU_template_template_param ||
2795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                     getTag() == dwarf::DW_TAG_GNU_template_parameter_pack);
2805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isCompileUnit - Return true if the specified tag is DW_TAG_compile_unit.
2835f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isCompileUnit() const {
2845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_compile_unit;
2855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isFile - Return true if the specified tag is DW_TAG_file_type.
2885f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isFile() const {
2895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_file_type;
2905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isNameSpace - Return true if the specified tag is DW_TAG_namespace.
2935f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isNameSpace() const {
2945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_namespace;
2955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
2965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
2975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isLexicalBlockFile - Return true if the specified descriptor is a
2985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// lexical block with an extra file.
2995f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isLexicalBlockFile() const {
3005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&
3015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         (DbgNode->getNumOperands() == 3);
3025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isLexicalBlock - Return true if the specified tag is DW_TAG_lexical_block.
3055f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isLexicalBlock() const {
3065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_lexical_block &&
3075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         (DbgNode->getNumOperands() > 3);
3085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isSubrange - Return true if the specified tag is DW_TAG_subrange_type.
3115f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isSubrange() const {
3125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_subrange_type;
3135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isEnumerator - Return true if the specified tag is DW_TAG_enumerator.
3165f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isEnumerator() const {
3175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_enumerator;
3185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isObjCProperty - Return true if the specified tag is DW_TAG_APPLE_property.
3215f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isObjCProperty() const {
3225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && getTag() == dwarf::DW_TAG_APPLE_property;
3235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Return true if the specified tag is DW_TAG_imported_module or
3265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// DW_TAG_imported_declaration.
3275f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDescriptor::isImportedEntity() const {
3285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode && (getTag() == dwarf::DW_TAG_imported_module ||
3295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                     getTag() == dwarf::DW_TAG_imported_declaration);
3305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
3335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// Simple Descriptor Constructors and other Methods
3345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
3355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3365f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingunsigned DIArray::getNumElements() const {
3375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
3385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return 0;
3395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands();
3405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// replaceAllUsesWith - Replace all uses of the MDNode used by this
3435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// type with the one in the passed descriptor.
344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DIType::replaceAllUsesWith(LLVMContext &VMContext, DIDescriptor D) {
3455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(DbgNode && "Trying to replace an unverified type!");
3475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Since we use a TrackingVH for the node, its easy for clients to manufacture
3495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // legitimate situations where they want to replaceAllUsesWith() on something
3505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // which, due to uniquing, has merged with the source. We shield clients from
3515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // this detail by allowing a value to be replaced with replaceAllUsesWith()
3525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // itself.
353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MDNode *DN = D;
354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DbgNode == DN) {
355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SmallVector<Value*, 10> Ops(DbgNode->getNumOperands());
356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    for (size_t i = 0; i != Ops.size(); ++i)
357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Ops[i] = DbgNode->getOperand(i);
358dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    DN = MDNode::get(VMContext, Ops);
3595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MDNode *Node = const_cast<MDNode *>(DbgNode);
362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const Value *V = cast_or_null<Value>(DN);
363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Node->replaceAllUsesWith(const_cast<Value *>(V));
364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MDNode::deleteTemporary(Node);
365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DbgNode = D;
3665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// replaceAllUsesWith - Replace all uses of the MDNode used by this
3695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// type with the one in D.
3705f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIType::replaceAllUsesWith(MDNode *D) {
3715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(DbgNode && "Trying to replace an unverified type!");
373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(DbgNode != D && "This replacement should always happen");
374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MDNode *Node = const_cast<MDNode *>(DbgNode);
375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MDNode *DN = D;
376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const Value *V = cast_or_null<Value>(DN);
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Node->replaceAllUsesWith(const_cast<Value *>(V));
378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MDNode::deleteTemporary(Node);
3795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a compile unit is well formed.
3825f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DICompileUnit::Verify() const {
3835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isCompileUnit())
3845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
3855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Don't bother verifying the compilation directory or producer string
3875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // as those could be empty.
3885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (getFilename().empty())
3895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
3905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return DbgNode->getNumOperands() == 14;
3925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
3935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that an ObjC property is well formed.
3955f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIObjCProperty::Verify() const {
3965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isObjCProperty())
3975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
3985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
3995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Don't worry about the rest of the strings for now.
4005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands() == 8;
4015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Check if a field at position Elt of a MDNode is a MDNode.
4045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// We currently allow an empty string and an integer.
4055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// But we don't allow a non-empty string in a MDNode field.
4065f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic bool fieldIsMDNode(const MDNode *DbgNode, unsigned Elt) {
4075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // FIXME: This function should return true, if the field is null or the field
4085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // is indeed a MDNode: return !Fld || isa<MDNode>(Fld).
4095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Value *Fld = getField(DbgNode, Elt);
4105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Fld && isa<MDString>(Fld) && !cast<MDString>(Fld)->getString().empty())
4115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
4125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return true;
4135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Check if a field at position Elt of a MDNode is a MDString.
4165f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic bool fieldIsMDString(const MDNode *DbgNode, unsigned Elt) {
4175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Value *Fld = getField(DbgNode, Elt);
4185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return !Fld || isa<MDString>(Fld);
4195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Check if a value can be a reference to a type.
4225f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic bool isTypeRef(const Value *Val) {
4235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return !Val ||
4245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
4255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         (isa<MDNode>(Val) && DIType(cast<MDNode>(Val)).isType());
4265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Check if a field at position Elt of a MDNode can be a reference to a type.
4295f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic bool fieldIsTypeRef(const MDNode *DbgNode, unsigned Elt) {
4305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Value *Fld = getField(DbgNode, Elt);
4315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isTypeRef(Fld);
4325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Check if a value can be a ScopeRef.
4355f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic bool isScopeRef(const Value *Val) {
4365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return !Val ||
43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Not checking for Val->isScope() here, because it would work
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // only for lexical scopes and not all subclasses of DIScope.
44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    isa<MDNode>(Val);
4415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Check if a field at position Elt of a MDNode can be a ScopeRef.
4445f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic bool fieldIsScopeRef(const MDNode *DbgNode, unsigned Elt) {
4455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Value *Fld = getField(DbgNode, Elt);
4465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isScopeRef(Fld);
4475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a type descriptor is well formed.
4505f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIType::Verify() const {
4515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isType())
4525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
4535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Make sure Context @ field 2 is MDNode.
4545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsScopeRef(DbgNode, 2))
4555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
4565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // FIXME: Sink this into the various subclass verifies.
4585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  uint16_t Tag = getTag();
4595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isBasicType() && Tag != dwarf::DW_TAG_const_type &&
4605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_volatile_type && Tag != dwarf::DW_TAG_pointer_type &&
4615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_ptr_to_member_type &&
4625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_reference_type &&
4635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_rvalue_reference_type &&
4645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_restrict_type && Tag != dwarf::DW_TAG_array_type &&
4655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_enumeration_type &&
4665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_subroutine_type &&
4675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Tag != dwarf::DW_TAG_inheritance && Tag != dwarf::DW_TAG_friend &&
4685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      getFilename().empty())
4695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
4705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // DIType is abstract, it should be a BasicType, a DerivedType or
4715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // a CompositeType.
4725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isBasicType())
47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return DIBasicType(DbgNode).Verify();
4745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else if (isCompositeType())
47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return DICompositeType(DbgNode).Verify();
4765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else if (isDerivedType())
47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return DIDerivedType(DbgNode).Verify();
4785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else
4795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
4805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a basic type descriptor is well formed.
4835f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIBasicType::Verify() const {
4845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isBasicType() && DbgNode->getNumOperands() == 10;
4855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
4865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a derived type descriptor is well formed.
4885f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIDerivedType::Verify() const {
4895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Make sure DerivedFrom @ field 9 is TypeRef.
4905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsTypeRef(DbgNode, 9))
4915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
4925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (getTag() == dwarf::DW_TAG_ptr_to_member_type)
4935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // Make sure ClassType @ field 10 is a TypeRef.
4945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (!fieldIsTypeRef(DbgNode, 10))
4955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      return false;
4965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
4975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isDerivedType() && DbgNode->getNumOperands() >= 10 &&
4985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         DbgNode->getNumOperands() <= 14;
4995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a composite type descriptor is well formed.
5025f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DICompositeType::Verify() const {
5035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isCompositeType())
5045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Make sure DerivedFrom @ field 9 and ContainingType @ field 12 are TypeRef.
5075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsTypeRef(DbgNode, 9))
5085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsTypeRef(DbgNode, 12))
5105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Make sure the type identifier at field 14 is MDString, it can be null.
5135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsMDString(DbgNode, 14))
5145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
51636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // A subroutine type can't be both & and &&.
51736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isLValueReference() && isRValueReference())
51836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
51936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands() == 15;
5215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a subprogram descriptor is well formed.
5245f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DISubprogram::Verify() const {
5255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isSubprogram())
5265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Make sure context @ field 2 is a ScopeRef and type @ field 7 is a MDNode.
5295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsScopeRef(DbgNode, 2))
5305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsMDNode(DbgNode, 7))
5325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Containing type @ field 12.
5345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsTypeRef(DbgNode, 12))
5355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
53636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
53736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // A subprogram can't be both & and &&.
53836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isLValueReference() && isRValueReference())
53936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands() == 20;
5425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a global variable descriptor is well formed.
5455f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIGlobalVariable::Verify() const {
5465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isGlobalVariable())
5475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (getDisplayName().empty())
5505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
55136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Make sure context @ field 2 is an MDNode.
5525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsMDNode(DbgNode, 2))
5535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
55436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Make sure that type @ field 8 is a DITypeRef.
55536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!fieldIsTypeRef(DbgNode, 8))
5565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Make sure StaticDataMemberDeclaration @ field 12 is MDNode.
5585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsMDNode(DbgNode, 12))
5595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands() == 13;
5625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a variable descriptor is well formed.
5655f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIVariable::Verify() const {
5665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isVariable())
5675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
56936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Make sure context @ field 1 is an MDNode.
5705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!fieldIsMDNode(DbgNode, 1))
5715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
57236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Make sure that type @ field 5 is a DITypeRef.
57336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!fieldIsTypeRef(DbgNode, 5))
5745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
575cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
576cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Variable without a complex expression.
577cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (DbgNode->getNumOperands() == 8)
578cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return true;
579cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
580cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Make sure the complex expression is an MDNode.
581cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return (DbgNode->getNumOperands() == 9 && fieldIsMDNode(DbgNode, 8));
5825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a location descriptor is well formed.
5855f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DILocation::Verify() const {
5865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
5875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands() == 4;
5905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Verify - Verify that a namespace descriptor is well formed.
5935f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DINameSpace::Verify() const {
5945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isNameSpace())
5955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
5965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DbgNode->getNumOperands() == 5;
5975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
5985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
5995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Retrieve the MDNode for the directory/file pair.
6005f7259180c59b2830bf206b44439be32ffa9161eBill WendlingMDNode *DIFile::getFileNode() const { return getNodeField(DbgNode, 1); }
6015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the file descriptor is well formed.
6035f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIFile::Verify() const {
6045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isFile() && DbgNode->getNumOperands() == 2;
6055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the enumerator descriptor is well formed.
6085f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIEnumerator::Verify() const {
6095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isEnumerator() && DbgNode->getNumOperands() == 3;
6105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the subrange descriptor is well formed.
6135f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DISubrange::Verify() const {
6145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isSubrange() && DbgNode->getNumOperands() == 3;
6155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the lexical block descriptor is well formed.
6185f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DILexicalBlock::Verify() const {
61936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return isLexicalBlock() && DbgNode->getNumOperands() == 7;
6205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the file-scoped lexical block descriptor is well formed.
6235f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DILexicalBlockFile::Verify() const {
6245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isLexicalBlockFile() && DbgNode->getNumOperands() == 3;
6255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
62736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Verify that an unspecified parameter descriptor is well formed.
62836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool DIUnspecifiedParameter::Verify() const {
62936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return isUnspecifiedParameter() && DbgNode->getNumOperands() == 1;
63036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
63136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the template type parameter descriptor is well formed.
6335f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DITemplateTypeParameter::Verify() const {
6345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isTemplateTypeParameter() && DbgNode->getNumOperands() == 7;
6355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the template value parameter descriptor is well formed.
6385f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DITemplateValueParameter::Verify() const {
6395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isTemplateValueParameter() && DbgNode->getNumOperands() == 8;
6405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Verify that the imported module descriptor is well formed.
6435f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIImportedEntity::Verify() const {
6445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return isImportedEntity() &&
6455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         (DbgNode->getNumOperands() == 4 || DbgNode->getNumOperands() == 5);
6465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// getObjCProperty - Return property node, if this ivar is associated with one.
6495f7259180c59b2830bf206b44439be32ffa9161eBill WendlingMDNode *DIDerivedType::getObjCProperty() const {
6505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return getNodeField(DbgNode, 10);
6515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6535f7259180c59b2830bf206b44439be32ffa9161eBill WendlingMDString *DICompositeType::getIdentifier() const {
6545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return cast_or_null<MDString>(getField(DbgNode, 14));
6555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#ifndef NDEBUG
6585f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic void VerifySubsetOf(const MDNode *LHS, const MDNode *RHS) {
6595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  for (unsigned i = 0; i != LHS->getNumOperands(); ++i) {
6605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // Skip the 'empty' list (that's a single i32 0, rather than truly empty).
6615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (i == 0 && isa<ConstantInt>(LHS->getOperand(i)))
6625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      continue;
6635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    const MDNode *E = cast<MDNode>(LHS->getOperand(i));
6645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    bool found = false;
6655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    for (unsigned j = 0; !found && j != RHS->getNumOperands(); ++j)
6665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      found = E == RHS->getOperand(j);
6675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    assert(found && "Losing a member during member list replacement");
6685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
6695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#endif
6715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Set the array of member DITypes.
6735f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) {
6745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert((!TParams || DbgNode->getNumOperands() == 15) &&
6755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         "If you're setting the template parameters this should include a slot "
6765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         "for that!");
6775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  TrackingVH<MDNode> N(*this);
6785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Elements) {
6795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#ifndef NDEBUG
6805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // Check that the new list of members contains all the old members as well.
6815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (const MDNode *El = cast_or_null<MDNode>(N->getOperand(10)))
6825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      VerifySubsetOf(El, Elements);
6835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#endif
6845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    N->replaceOperandWith(10, Elements);
6855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
6865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (TParams)
6875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    N->replaceOperandWith(13, TParams);
6885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DbgNode = N;
6895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
6905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
6915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Generate a reference to this DIType. Uses the type identifier instead
6925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// of the actual MDNode if possible, to help type uniquing.
6935f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIScopeRef DIScope::getRef() const {
6945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!isCompositeType())
6955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIScopeRef(*this);
6965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DICompositeType DTy(DbgNode);
6975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DTy.getIdentifier())
6985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIScopeRef(*this);
6995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIScopeRef(DTy.getIdentifier());
7005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// \brief Set the containing type.
7035f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DICompositeType::setContainingType(DICompositeType ContainingType) {
7045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  TrackingVH<MDNode> N(*this);
7055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  N->replaceOperandWith(12, ContainingType.getRef());
7065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DbgNode = N;
7075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// isInlinedFnArgument - Return true if this variable provides debugging
7105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// information for an inlined function arguments.
7115f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DIVariable::isInlinedFnArgument(const Function *CurFn) {
7125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(CurFn && "Invalid function");
7135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!getContext().isSubprogram())
7145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
7155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // This variable is not inlined function argument if its scope
7165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // does not describe current function.
7175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return !DISubprogram(getContext()).describes(CurFn);
7185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// describes - Return true if this subprogram provides debugging
7215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// information for the function F.
7225f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DISubprogram::describes(const Function *F) {
7235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(F && "Invalid function");
7245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (F == getFunction())
7255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
7265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Name = getLinkageName();
7275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Name.empty())
7285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    Name = getName();
7295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (F->getName() == Name)
7305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return true;
7315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return false;
7325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7345f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingunsigned DISubprogram::isOptimized() const {
7355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(DbgNode && "Invalid subprogram descriptor!");
7365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (DbgNode->getNumOperands() == 15)
7375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return getUnsignedField(14);
7385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return 0;
7395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7415f7259180c59b2830bf206b44439be32ffa9161eBill WendlingMDNode *DISubprogram::getVariablesNodes() const {
7425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return getNodeField(DbgNode, 18);
7435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7455f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIArray DISubprogram::getVariables() const {
7465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIArray(getNodeField(DbgNode, 18));
7475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7495f7259180c59b2830bf206b44439be32ffa9161eBill WendlingValue *DITemplateValueParameter::getValue() const {
7505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return getField(DbgNode, 4);
7515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// If the current node has a parent scope then return that,
7545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// else return an empty scope.
7555f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIScopeRef DIScope::getContext() const {
7565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isType())
7585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIType(DbgNode).getContext();
7595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isSubprogram())
7615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIScopeRef(DISubprogram(DbgNode).getContext());
7625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isLexicalBlock())
7645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIScopeRef(DILexicalBlock(DbgNode).getContext());
7655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isLexicalBlockFile())
7675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIScopeRef(DILexicalBlockFile(DbgNode).getContext());
7685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isNameSpace())
7705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIScopeRef(DINameSpace(DbgNode).getContext());
7715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert((isFile() || isCompileUnit()) && "Unhandled type of scope.");
773dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return DIScopeRef(nullptr);
7745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// If the scope node has a name, return that, else return an empty string.
7775f7259180c59b2830bf206b44439be32ffa9161eBill WendlingStringRef DIScope::getName() const {
7785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isType())
7795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIType(DbgNode).getName();
7805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isSubprogram())
7815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DISubprogram(DbgNode).getName();
7825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isNameSpace())
7835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DINameSpace(DbgNode).getName();
7845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert((isLexicalBlock() || isLexicalBlockFile() || isFile() ||
7855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          isCompileUnit()) &&
7865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling         "Unhandled type of scope.");
7875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return StringRef();
7885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7905f7259180c59b2830bf206b44439be32ffa9161eBill WendlingStringRef DIScope::getFilename() const {
7915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
7925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return StringRef();
7935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return ::getStringField(getNodeField(DbgNode, 1), 0);
7945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
7955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
7965f7259180c59b2830bf206b44439be32ffa9161eBill WendlingStringRef DIScope::getDirectory() const {
7975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
7985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return StringRef();
7995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return ::getStringField(getNodeField(DbgNode, 1), 1);
8005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8025f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIArray DICompileUnit::getEnumTypes() const {
8035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode || DbgNode->getNumOperands() < 13)
8045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIArray();
8055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIArray(getNodeField(DbgNode, 7));
8075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8095f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIArray DICompileUnit::getRetainedTypes() const {
8105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode || DbgNode->getNumOperands() < 13)
8115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIArray();
8125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIArray(getNodeField(DbgNode, 8));
8145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8165f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIArray DICompileUnit::getSubprograms() const {
8175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode || DbgNode->getNumOperands() < 13)
8185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIArray();
8195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIArray(getNodeField(DbgNode, 9));
8215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8235f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIArray DICompileUnit::getGlobalVariables() const {
8245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode || DbgNode->getNumOperands() < 13)
8255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIArray();
8265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIArray(getNodeField(DbgNode, 10));
8285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8305f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIArray DICompileUnit::getImportedEntities() const {
8315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode || DbgNode->getNumOperands() < 13)
8325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DIArray();
8335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIArray(getNodeField(DbgNode, 11));
8355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
83736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// copyWithNewScope - Return a copy of this location, replacing the
83836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// current scope with the given one.
83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDILocation DILocation::copyWithNewScope(LLVMContext &Ctx,
84036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                        DILexicalBlock NewScope) {
84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<Value *, 10> Elts;
84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert(Verify());
84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (unsigned I = 0; I < DbgNode->getNumOperands(); ++I) {
84436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (I != 2)
84536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Elts.push_back(DbgNode->getOperand(I));
84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else
84736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Elts.push_back(NewScope);
84836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
84936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MDNode *NewDIL = MDNode::get(Ctx, Elts);
85036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return DILocation(NewDIL);
85136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
85236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
85336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// computeNewDiscriminator - Generate a new discriminator value for this
85436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// file and line location.
85536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned DILocation::computeNewDiscriminator(LLVMContext &Ctx) {
85636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::pair<const char *, unsigned> Key(getFilename().data(), getLineNumber());
85736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return ++Ctx.pImpl->DiscriminatorTable[Key];
85836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
85936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// fixupSubprogramName - Replace contains special characters used
8615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// in a typical Objective-C names with '.' in a given string.
8625f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic void fixupSubprogramName(DISubprogram Fn, SmallVectorImpl<char> &Out) {
8635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef FName =
8645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Fn.getFunction() ? Fn.getFunction()->getName() : Fn.getName();
8655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  FName = Function::getRealLinkageName(FName);
8665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Prefix("llvm.dbg.lv.");
8685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Out.reserve(FName.size() + Prefix.size());
8695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Out.append(Prefix.begin(), Prefix.end());
8705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  bool isObjCLike = false;
8725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  for (size_t i = 0, e = FName.size(); i < e; ++i) {
8735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    char C = FName[i];
8745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (C == '[')
8755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      isObjCLike = true;
8765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (isObjCLike && (C == '[' || C == ']' || C == ' ' || C == ':' ||
8785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                       C == '+' || C == '(' || C == ')'))
8795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Out.push_back('.');
8805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    else
8815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      Out.push_back(C);
8825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
8835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
8865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// suitable to hold function specific information.
8875f7259180c59b2830bf206b44439be32ffa9161eBill WendlingNamedMDNode *llvm::getFnSpecificMDNode(const Module &M, DISubprogram Fn) {
8885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  SmallString<32> Name;
8895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  fixupSubprogramName(Fn, Name);
8905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return M.getNamedMetadata(Name.str());
8915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
8925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
8935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
8945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// to hold function specific information.
8955f7259180c59b2830bf206b44439be32ffa9161eBill WendlingNamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, DISubprogram Fn) {
8965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  SmallString<32> Name;
8975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  fixupSubprogramName(Fn, Name);
8985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return M.getOrInsertNamedMetadata(Name.str());
8995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
9005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// createInlinedVariable - Create a new inlined variable based on current
9025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// variable.
9035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// @param DV            Current Variable.
9045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// @param InlinedScope  Location at current variable is inlined.
9055f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIVariable llvm::createInlinedVariable(MDNode *DV, MDNode *InlinedScope,
9065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                                       LLVMContext &VMContext) {
9075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  SmallVector<Value *, 16> Elts;
9085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Insert inlined scope as 7th element.
9095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)
9105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    i == 7 ? Elts.push_back(InlinedScope) : Elts.push_back(DV->getOperand(i));
9115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIVariable(MDNode::get(VMContext, Elts));
9125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
9135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// cleanseInlinedVariable - Remove inlined scope from the variable.
9155f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) {
9165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  SmallVector<Value *, 16> Elts;
9175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // Insert inlined scope as 7th element.
9185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  for (unsigned i = 0, e = DV->getNumOperands(); i != e; ++i)
9195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    i == 7 ? Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)))
9205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling           : Elts.push_back(DV->getOperand(i));
9215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIVariable(MDNode::get(VMContext, Elts));
9225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
9235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// getDISubprogram - Find subprogram that is enclosing this scope.
9255f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDISubprogram llvm::getDISubprogram(const MDNode *Scope) {
9265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIDescriptor D(Scope);
9275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (D.isSubprogram())
9285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DISubprogram(Scope);
9295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (D.isLexicalBlockFile())
9315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return getDISubprogram(DILexicalBlockFile(Scope).getContext());
9325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (D.isLexicalBlock())
9345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return getDISubprogram(DILexicalBlock(Scope).getContext());
9355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DISubprogram();
9375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
9385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// getDICompositeType - Find underlying composite type.
9405f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDICompositeType llvm::getDICompositeType(DIType T) {
9415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (T.isCompositeType())
9425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return DICompositeType(T);
9435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (T.isDerivedType()) {
9455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // This function is currently used by dragonegg and dragonegg does
9465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // not generate identifier for types, so using an empty map to resolve
9475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // DerivedFrom should be fine.
9485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DITypeIdentifierMap EmptyMap;
9495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return getDICompositeType(
9505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        DIDerivedType(T).getTypeDerivedFrom().resolve(EmptyMap));
9515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
9525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DICompositeType();
9545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
9555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Update DITypeIdentifierMap by going through retained types of each CU.
9575f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDITypeIdentifierMap
9585f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingllvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) {
9595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DITypeIdentifierMap Map;
9605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) {
9615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DICompileUnit CU(CU_Nodes->getOperand(CUi));
9625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIArray Retain = CU.getRetainedTypes();
9635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    for (unsigned Ti = 0, Te = Retain.getNumElements(); Ti != Te; ++Ti) {
9645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      if (!Retain.getElement(Ti).isCompositeType())
9655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        continue;
9665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DICompositeType Ty(Retain.getElement(Ti));
9675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      if (MDString *TypeId = Ty.getIdentifier()) {
9685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        // Definition has priority over declaration.
9695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        // Try to insert (TypeId, Ty) to Map.
9705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        std::pair<DITypeIdentifierMap::iterator, bool> P =
9715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling            Map.insert(std::make_pair(TypeId, Ty));
9725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        // If TypeId already exists in Map and this is a definition, replace
9735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        // whatever we had (declaration or definition) with the definition.
9745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        if (!P.second && !Ty.isForwardDecl())
9755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          P.first->second = Ty;
9765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      }
9775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    }
9785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
9795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return Map;
9805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
9815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
9835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// DebugInfoFinder implementations.
9845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
9855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
9865f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::reset() {
9875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  CUs.clear();
9885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  SPs.clear();
9895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  GVs.clear();
9905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  TYs.clear();
9915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Scopes.clear();
9925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  NodesSeen.clear();
9935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  TypeIdentifierMap.clear();
9942b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  TypeMapInitialized = false;
9952b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren}
9962b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren
9976950be28511caf355abdf405404b5f37cc136bc5Manman Renvoid DebugInfoFinder::InitializeTypeMap(const Module &M) {
9982b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  if (!TypeMapInitialized)
9992b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren    if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
10002b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren      TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
10012b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren      TypeMapInitialized = true;
10022b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren    }
10035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
10045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
10055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// processModule - Process entire module and collect debug info.
10065f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processModule(const Module &M) {
10076950be28511caf355abdf405404b5f37cc136bc5Manman Ren  InitializeTypeMap(M);
10085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
10095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
10105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DICompileUnit CU(CU_Nodes->getOperand(i));
10115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      addCompileUnit(CU);
10125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DIArray GVs = CU.getGlobalVariables();
10135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
10145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        DIGlobalVariable DIG(GVs.getElement(i));
10155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        if (addGlobalVariable(DIG)) {
10165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          processScope(DIG.getContext());
101736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          processType(DIG.getType().resolve(TypeIdentifierMap));
10185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        }
10195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      }
10205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DIArray SPs = CU.getSubprograms();
10215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
10225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        processSubprogram(DISubprogram(SPs.getElement(i)));
10235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DIArray EnumTypes = CU.getEnumTypes();
10245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
10255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        processType(DIType(EnumTypes.getElement(i)));
10265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DIArray RetainedTypes = CU.getRetainedTypes();
10275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
10285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        processType(DIType(RetainedTypes.getElement(i)));
10295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DIArray Imports = CU.getImportedEntities();
10305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      for (unsigned i = 0, e = Imports.getNumElements(); i != e; ++i) {
10315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        DIImportedEntity Import = DIImportedEntity(Imports.getElement(i));
103236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        DIDescriptor Entity = Import.getEntity().resolve(TypeIdentifierMap);
10335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        if (Entity.isType())
10345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          processType(DIType(Entity));
10355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        else if (Entity.isSubprogram())
10365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          processSubprogram(DISubprogram(Entity));
10375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        else if (Entity.isNameSpace())
10385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling          processScope(DINameSpace(Entity).getContext());
10395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      }
10405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    }
10415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
10425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
10435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
10445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// processLocation - Process DILocation.
10452b31b8227fb5507c26a8c4724574fc87fb90f482Manman Renvoid DebugInfoFinder::processLocation(const Module &M, DILocation Loc) {
10465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Loc)
10475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
10486950be28511caf355abdf405404b5f37cc136bc5Manman Ren  InitializeTypeMap(M);
10495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  processScope(Loc.getScope());
10502b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren  processLocation(M, Loc.getOrigLocation());
10515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
10525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
10535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// processType - Process DIType.
10545f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processType(DIType DT) {
10555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!addType(DT))
10565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
10575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  processScope(DT.getContext().resolve(TypeIdentifierMap));
10585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (DT.isCompositeType()) {
10595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DICompositeType DCT(DT);
10605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processType(DCT.getTypeDerivedFrom().resolve(TypeIdentifierMap));
10615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIArray DA = DCT.getTypeArray();
10625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {
10635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DIDescriptor D = DA.getElement(i);
10645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      if (D.isType())
10655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        processType(DIType(D));
10665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      else if (D.isSubprogram())
10675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling        processSubprogram(DISubprogram(D));
10685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    }
10695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (DT.isDerivedType()) {
10705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIDerivedType DDT(DT);
10715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processType(DDT.getTypeDerivedFrom().resolve(TypeIdentifierMap));
10725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
10735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
10745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
10755f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processScope(DIScope Scope) {
10765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Scope.isType()) {
10775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIType Ty(Scope);
10785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processType(Ty);
10795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
10805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
10815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Scope.isCompileUnit()) {
10825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    addCompileUnit(DICompileUnit(Scope));
10835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
10845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
10855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Scope.isSubprogram()) {
10865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processSubprogram(DISubprogram(Scope));
10875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
10885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
10895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!addScope(Scope))
10905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
10915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Scope.isLexicalBlock()) {
10925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DILexicalBlock LB(Scope);
10935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processScope(LB.getContext());
10945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (Scope.isLexicalBlockFile()) {
10955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DILexicalBlockFile LBF = DILexicalBlockFile(Scope);
10965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processScope(LBF.getScope());
10975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (Scope.isNameSpace()) {
10985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DINameSpace NS(Scope);
10995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    processScope(NS.getContext());
11005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
11015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// processSubprogram - Process DISubprogram.
11045f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processSubprogram(DISubprogram SP) {
11055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!addSubprogram(SP))
11065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  processScope(SP.getContext().resolve(TypeIdentifierMap));
11085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  processType(SP.getType());
11095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIArray TParams = SP.getTemplateParams();
11105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  for (unsigned I = 0, E = TParams.getNumElements(); I != E; ++I) {
11115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIDescriptor Element = TParams.getElement(I);
11125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (Element.isTemplateTypeParameter()) {
11135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DITemplateTypeParameter TType(Element);
11145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      processScope(TType.getContext().resolve(TypeIdentifierMap));
11155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      processType(TType.getType().resolve(TypeIdentifierMap));
11165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    } else if (Element.isTemplateValueParameter()) {
11175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      DITemplateValueParameter TVal(Element);
11185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      processScope(TVal.getContext().resolve(TypeIdentifierMap));
11195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      processType(TVal.getType().resolve(TypeIdentifierMap));
11205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    }
11215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
11225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// processDeclare - Process DbgDeclareInst.
11252b31b8227fb5507c26a8c4724574fc87fb90f482Manman Renvoid DebugInfoFinder::processDeclare(const Module &M,
11262b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren                                     const DbgDeclareInst *DDI) {
11275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
11285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!N)
11295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11306950be28511caf355abdf405404b5f37cc136bc5Manman Ren  InitializeTypeMap(M);
11315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIDescriptor DV(N);
11335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DV.isVariable())
11345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(DV))
11375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  processScope(DIVariable(N).getContext());
113936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  processType(DIVariable(N).getType().resolve(TypeIdentifierMap));
11405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11422b31b8227fb5507c26a8c4724574fc87fb90f482Manman Renvoid DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) {
11435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
11445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!N)
11455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11466950be28511caf355abdf405404b5f37cc136bc5Manman Ren  InitializeTypeMap(M);
11475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIDescriptor DV(N);
11495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DV.isVariable())
11505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(DV))
11535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
11545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  processScope(DIVariable(N).getContext());
115536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  processType(DIVariable(N).getType().resolve(TypeIdentifierMap));
11565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// addType - Add type into Tys.
11595f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addType(DIType DT) {
11605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DT)
11615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(DT))
11645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  TYs.push_back(DT);
11675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return true;
11685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// addCompileUnit - Add compile unit into CUs.
11715f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {
11725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!CU)
11735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(CU))
11755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  CUs.push_back(CU);
11785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return true;
11795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// addGlobalVariable - Add global variable into GVs.
11825f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {
11835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DIG)
11845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(DIG))
11875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  GVs.push_back(DIG);
11905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return true;
11915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
11925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// addSubprogram - Add subprgoram into SPs.
11945f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addSubprogram(DISubprogram SP) {
11955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!SP)
11965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
11975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
11985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(SP))
11995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
12005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  SPs.push_back(SP);
12025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return true;
12035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12055f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addScope(DIScope Scope) {
12065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Scope)
12075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
12085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // FIXME: Ocaml binding generates a scope with no content, we treat it
12095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // as null for now.
12105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Scope->getNumOperands() == 0)
12115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
12125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!NodesSeen.insert(Scope))
12135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return false;
12145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  Scopes.push_back(Scope);
12155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return true;
12165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
12195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// DIDescriptor: dump routines for all descriptors.
12205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===//
12215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// dump - Print descriptor to dbgs() with a newline.
12235f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIDescriptor::dump() const {
12245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  print(dbgs());
12255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  dbgs() << '\n';
12265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// print - Print descriptor.
12295f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIDescriptor::print(raw_ostream &OS) const {
12305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
12315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
12325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (const char *Tag = dwarf::TagString(getTag()))
12345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << "[ " << Tag << " ]";
12355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (this->isSubrange()) {
12375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DISubrange(DbgNode).printInternal(OS);
12385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isCompileUnit()) {
12395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DICompileUnit(DbgNode).printInternal(OS);
12405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isFile()) {
12415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIFile(DbgNode).printInternal(OS);
12425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isEnumerator()) {
12435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIEnumerator(DbgNode).printInternal(OS);
12445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isBasicType()) {
12455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIType(DbgNode).printInternal(OS);
12465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isDerivedType()) {
12475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIDerivedType(DbgNode).printInternal(OS);
12485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isCompositeType()) {
12495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DICompositeType(DbgNode).printInternal(OS);
12505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isSubprogram()) {
12515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DISubprogram(DbgNode).printInternal(OS);
12525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isGlobalVariable()) {
12535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIGlobalVariable(DbgNode).printInternal(OS);
12545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isVariable()) {
12555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIVariable(DbgNode).printInternal(OS);
12565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isObjCProperty()) {
12575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIObjCProperty(DbgNode).printInternal(OS);
12585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isNameSpace()) {
12595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DINameSpace(DbgNode).printInternal(OS);
12605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  } else if (this->isScope()) {
12615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIScope(DbgNode).printInternal(OS);
12625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
12635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12655f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DISubrange::printInternal(raw_ostream &OS) const {
12665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  int64_t Count = getCount();
12675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (Count != -1)
12685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << getLo() << ", " << Count - 1 << ']';
12695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else
12705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [unbounded]";
12715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12735f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIScope::printInternal(raw_ostream &OS) const {
12745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [" << getDirectory() << "/" << getFilename() << ']';
12755f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12775f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DICompileUnit::printInternal(raw_ostream &OS) const {
12785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIScope::printInternal(OS);
12795f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [";
12805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  unsigned Lang = getLanguage();
12815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (const char *LangStr = dwarf::LanguageString(Lang))
12825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << LangStr;
12835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else
12845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    (OS << "lang 0x").write_hex(Lang);
12855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << ']';
12865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12885f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIEnumerator::printInternal(raw_ostream &OS) const {
12895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [" << getName() << " :: " << getEnumValue() << ']';
12905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
12915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12925f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIType::printInternal(raw_ostream &OS) const {
12935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DbgNode)
12945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    return;
12955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
12965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Res = getName();
12975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Res.empty())
12985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << Res << "]";
12995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // TODO: Print context?
13015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [line " << getLineNumber() << ", size " << getSizeInBits()
13035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling     << ", align " << getAlignInBits() << ", offset " << getOffsetInBits();
13045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isBasicType())
13055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (const char *Enc =
13065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling            dwarf::AttributeEncodingString(DIBasicType(DbgNode).getEncoding()))
13075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      OS << ", enc " << Enc;
13085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << "]";
13095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isPrivate())
13115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [private]";
13125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else if (isProtected())
13135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [protected]";
13145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isArtificial())
13165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [artificial]";
13175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isForwardDecl())
13195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [decl]";
13205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else if (getTag() == dwarf::DW_TAG_structure_type ||
13215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling           getTag() == dwarf::DW_TAG_union_type ||
13225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling           getTag() == dwarf::DW_TAG_enumeration_type ||
13235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling           getTag() == dwarf::DW_TAG_class_type)
13245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [def]";
13255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isVector())
13265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [vector]";
13275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isStaticMember())
13285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [static]";
132936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
133036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isLValueReference())
133136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OS << " [reference]";
133236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
133336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isRValueReference())
133436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OS << " [rvalue reference]";
13355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
13365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13375f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIDerivedType::printInternal(raw_ostream &OS) const {
13385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIType::printInternal(OS);
13395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [from " << getTypeDerivedFrom().getName() << ']';
13405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
13415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13425f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DICompositeType::printInternal(raw_ostream &OS) const {
13435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIType::printInternal(OS);
13445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  DIArray A = getTypeArray();
13455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [" << A.getNumElements() << " elements]";
13465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
13475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13485f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DINameSpace::printInternal(raw_ostream &OS) const {
13495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Name = getName();
13505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Name.empty())
13515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << Name << ']';
13525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [line " << getLineNumber() << ']';
13545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
13555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13565f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DISubprogram::printInternal(raw_ostream &OS) const {
13575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // TODO : Print context
13585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [line " << getLineNumber() << ']';
13595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isLocalToUnit())
13615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [local]";
13625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isDefinition())
13645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [def]";
13655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (getScopeLineNumber() != getLineNumber())
13675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [scope " << getScopeLineNumber() << "]";
13685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isPrivate())
13705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [private]";
13715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  else if (isProtected())
13725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [protected]";
13735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
137436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isLValueReference())
137536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OS << " [reference]";
137636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
137736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isRValueReference())
137836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OS << " [rvalue reference]";
137936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Res = getName();
13815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Res.empty())
13825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << Res << ']';
13835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
13845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13855f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIGlobalVariable::printInternal(raw_ostream &OS) const {
13865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Res = getName();
13875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Res.empty())
13885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << Res << ']';
13895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [line " << getLineNumber() << ']';
13915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  // TODO : Print context
13935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isLocalToUnit())
13955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [local]";
13965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
13975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (isDefinition())
13985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [def]";
13995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14015f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIVariable::printInternal(raw_ostream &OS) const {
14025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Res = getName();
14035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Res.empty())
14045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << Res << ']';
14055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [line " << getLineNumber() << ']';
14075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14095f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIObjCProperty::printInternal(raw_ostream &OS) const {
14105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Name = getObjCPropertyName();
14115f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Name.empty())
14125f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << " [" << Name << ']';
14135f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14145f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  OS << " [line " << getLineNumber() << ", properties " << getUnsignedField(6)
14155f7259180c59b2830bf206b44439be32ffa9161eBill Wendling     << ']';
14165f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14185f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingstatic void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS,
14195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling                          const LLVMContext &Ctx) {
14205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!DL.isUnknown()) { // Print source line info.
14215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DIScope Scope(DL.getScope(Ctx));
14225f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    assert(Scope.isScope() && "Scope of a DebugLoc should be a DIScope.");
14235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    // Omit the directory, because it's likely to be long and uninteresting.
14245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    CommentOS << Scope.getFilename();
14255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    CommentOS << ':' << DL.getLine();
14265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (DL.getCol() != 0)
14275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      CommentOS << ':' << DL.getCol();
14285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(DL.getInlinedAt(Ctx));
14295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (!InlinedAtDL.isUnknown()) {
14305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      CommentOS << " @[ ";
14315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      printDebugLoc(InlinedAtDL, CommentOS, Ctx);
14325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      CommentOS << " ]";
14335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    }
14345f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
14355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14375f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DIVariable::printExtendedName(raw_ostream &OS) const {
14385f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  const LLVMContext &Ctx = DbgNode->getContext();
14395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  StringRef Res = getName();
14405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (!Res.empty())
14415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    OS << Res << "," << getLineNumber();
14425f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  if (MDNode *InlinedAt = getInlinedAt()) {
14435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    DebugLoc InlinedAtDL = DebugLoc::getFromDILocation(InlinedAt);
14445f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    if (!InlinedAtDL.isUnknown()) {
14455f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      OS << " @[";
14465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      printDebugLoc(InlinedAtDL, OS, Ctx);
14475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling      OS << "]";
14485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling    }
14495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  }
14505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Specialize constructor to make sure it has the correct type.
14535f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingtemplate <> DIRef<DIScope>::DIRef(const Value *V) : Val(V) {
14545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(isScopeRef(V) && "DIScopeRef should be a MDString or MDNode");
14555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14565f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingtemplate <> DIRef<DIType>::DIRef(const Value *V) : Val(V) {
14575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  assert(isTypeRef(V) && "DITypeRef should be a MDString or MDNode");
14585f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling
14605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Specialize getFieldAs to handle fields that are references to DIScopes.
14615f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingtemplate <>
14625f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDIScopeRef DIDescriptor::getFieldAs<DIScopeRef>(unsigned Elt) const {
14635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DIScopeRef(getField(DbgNode, Elt));
14645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
14655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling/// Specialize getFieldAs to handle fields that are references to DITypes.
14665f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingtemplate <> DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const {
14675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling  return DITypeRef(getField(DbgNode, Elt));
14685f7259180c59b2830bf206b44439be32ffa9161eBill Wendling}
1469c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1470c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// Strip debug info in the module if it exists.
1471c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// To do this, we remove all calls to the debugger intrinsics and any named
1472c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// metadata for debugging. We also remove debug locations for instructions.
1473c877b10446669bf107c19cab78b920ce9cffb989Manman Ren/// Return true if module is modified.
1474c877b10446669bf107c19cab78b920ce9cffb989Manman Renbool llvm::StripDebugInfo(Module &M) {
1475c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1476c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  bool Changed = false;
1477c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1478c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  // Remove all of the calls to the debugger intrinsics, and remove them from
1479c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  // the module.
1480c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  if (Function *Declare = M.getFunction("llvm.dbg.declare")) {
1481c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    while (!Declare->use_empty()) {
148236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      CallInst *CI = cast<CallInst>(Declare->user_back());
1483c877b10446669bf107c19cab78b920ce9cffb989Manman Ren      CI->eraseFromParent();
1484c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    }
1485c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    Declare->eraseFromParent();
1486c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    Changed = true;
1487c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  }
1488c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1489c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  if (Function *DbgVal = M.getFunction("llvm.dbg.value")) {
1490c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    while (!DbgVal->use_empty()) {
149136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      CallInst *CI = cast<CallInst>(DbgVal->user_back());
1492c877b10446669bf107c19cab78b920ce9cffb989Manman Ren      CI->eraseFromParent();
1493c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    }
1494c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    DbgVal->eraseFromParent();
1495c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    Changed = true;
1496c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  }
1497c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1498c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
1499c877b10446669bf107c19cab78b920ce9cffb989Manman Ren         NME = M.named_metadata_end(); NMI != NME;) {
1500c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    NamedMDNode *NMD = NMI;
1501c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    ++NMI;
1502c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    if (NMD->getName().startswith("llvm.dbg.")) {
1503c877b10446669bf107c19cab78b920ce9cffb989Manman Ren      NMD->eraseFromParent();
1504c877b10446669bf107c19cab78b920ce9cffb989Manman Ren      Changed = true;
1505c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    }
1506c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  }
1507c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1508c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI)
1509c877b10446669bf107c19cab78b920ce9cffb989Manman Ren    for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE;
1510c877b10446669bf107c19cab78b920ce9cffb989Manman Ren         ++FI)
1511c877b10446669bf107c19cab78b920ce9cffb989Manman Ren      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE;
1512c877b10446669bf107c19cab78b920ce9cffb989Manman Ren           ++BI) {
1513c877b10446669bf107c19cab78b920ce9cffb989Manman Ren        if (!BI->getDebugLoc().isUnknown()) {
1514c877b10446669bf107c19cab78b920ce9cffb989Manman Ren          Changed = true;
1515c877b10446669bf107c19cab78b920ce9cffb989Manman Ren          BI->setDebugLoc(DebugLoc());
1516c877b10446669bf107c19cab78b920ce9cffb989Manman Ren        }
1517c877b10446669bf107c19cab78b920ce9cffb989Manman Ren      }
1518c877b10446669bf107c19cab78b920ce9cffb989Manman Ren
1519c877b10446669bf107c19cab78b920ce9cffb989Manman Ren  return Changed;
1520c877b10446669bf107c19cab78b920ce9cffb989Manman Ren}
152127457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren
152251fce2c886e4ca33272975cc80bc1cc5abfcdffdManman Ren/// Return Debug Info Metadata Version by checking module flags.
152351fce2c886e4ca33272975cc80bc1cc5abfcdffdManman Renunsigned llvm::getDebugMetadataVersionFromModule(const Module &M) {
152427457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren  Value *Val = M.getModuleFlag("Debug Info Version");
152527457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren  if (!Val)
152627457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren    return 0;
152727457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren  return cast<ConstantInt>(Val)->getZExtValue();
152827457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren}
1529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1530cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesllvm::DenseMap<const llvm::Function *, llvm::DISubprogram>
1531cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesllvm::makeSubprogramMap(const Module &M) {
1532cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  DenseMap<const Function *, DISubprogram> R;
1533cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1534cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu");
1535cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!CU_Nodes)
1536cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return R;
1537cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
1538cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  for (MDNode *N : CU_Nodes->operands()) {
1539cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    DICompileUnit CUNode(N);
1540cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    DIArray SPs = CUNode.getSubprograms();
1541cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
1542cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      DISubprogram SP(SPs.getElement(i));
1543cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (Function *F = SP.getFunction())
1544cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        R.insert(std::make_pair(F, SP));
1545cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
1546cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
1547cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return R;
1548cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
1549