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