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" 2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/DIBuilder.h" 235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/DerivedTypes.h" 245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Instructions.h" 255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/IntrinsicInst.h" 265f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Intrinsics.h" 272c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/IR/GVMaterializer.h" 285f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/IR/Module.h" 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/ValueHandle.h" 305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Support/Debug.h" 315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Support/Dwarf.h" 325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling#include "llvm/Support/raw_ostream.h" 335f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingusing namespace llvm; 345f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingusing namespace llvm::dwarf; 355f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 365f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDISubprogram llvm::getDISubprogram(const MDNode *Scope) { 372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *LocalScope = dyn_cast_or_null<MDLocalScope>(Scope)) 382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return LocalScope->getSubprogram(); 392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return nullptr; 405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDISubprogram llvm::getDISubprogram(const Function *F) { 4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // We look for the first instr that has a debug annotation leading back to F. 4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (auto &BB : *F) { 4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto Inst = std::find_if(BB.begin(), BB.end(), [](const Instruction &Inst) { 462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return Inst.getDebugLoc(); 4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines }); 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Inst == BB.end()) 4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines continue; 5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DebugLoc DLoc = Inst->getDebugLoc(); 512c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDNode *Scope = DLoc.getInlinedAtScope(); 5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DISubprogram Subprogram = getDISubprogram(Scope); 532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return Subprogram->describes(F) ? Subprogram : DISubprogram(); 5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return DISubprogram(); 5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 595f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDICompositeType llvm::getDICompositeType(DIType T) { 602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *C = dyn_cast_or_null<MDCompositeTypeBase>(T)) 612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return C; 625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *D = dyn_cast_or_null<MDDerivedTypeBase>(T)) { 645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // This function is currently used by dragonegg and dragonegg does 655f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // not generate identifier for types, so using an empty map to resolve 665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // DerivedFrom should be fine. 675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling DITypeIdentifierMap EmptyMap; 682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return getDICompositeType(D->getBaseType().resolve(EmptyMap)); 695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return nullptr; 725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 745f7259180c59b2830bf206b44439be32ffa9161eBill WendlingDITypeIdentifierMap 755f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingllvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) { 765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling DITypeIdentifierMap Map; 775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) { 782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto *CU = cast<MDCompileUnit>(CU_Nodes->getOperand(CUi)); 792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIArray Retain = CU->getRetainedTypes(); 802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (unsigned Ti = 0, Te = Retain.size(); Ti != Te; ++Ti) { 812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!isa<MDCompositeType>(Retain[Ti])) 825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling continue; 832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto *Ty = cast<MDCompositeType>(Retain[Ti]); 842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (MDString *TypeId = Ty->getRawIdentifier()) { 855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // Definition has priority over declaration. 865f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // Try to insert (TypeId, Ty) to Map. 875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling std::pair<DITypeIdentifierMap::iterator, bool> P = 885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling Map.insert(std::make_pair(TypeId, Ty)); 895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // If TypeId already exists in Map and this is a definition, replace 905f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // whatever we had (declaration or definition) with the definition. 912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!P.second && !Ty->isForwardDecl()) 925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling P.first->second = Ty; 935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return Map; 975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===// 1005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling// DebugInfoFinder implementations. 1015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling//===----------------------------------------------------------------------===// 1025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 1035f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::reset() { 1045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling CUs.clear(); 1055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling SPs.clear(); 1065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling GVs.clear(); 1075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling TYs.clear(); 1085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling Scopes.clear(); 1095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling NodesSeen.clear(); 1105f7259180c59b2830bf206b44439be32ffa9161eBill Wendling TypeIdentifierMap.clear(); 1112b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren TypeMapInitialized = false; 1122b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren} 1132b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren 1146950be28511caf355abdf405404b5f37cc136bc5Manman Renvoid DebugInfoFinder::InitializeTypeMap(const Module &M) { 1152b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren if (!TypeMapInitialized) 1162b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { 1172b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes); 1182b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren TypeMapInitialized = true; 1192b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren } 1205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 1215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 1225f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processModule(const Module &M) { 1236950be28511caf355abdf405404b5f37cc136bc5Manman Ren InitializeTypeMap(M); 1245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { 1255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { 1262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DICompileUnit CU = cast<MDCompileUnit>(CU_Nodes->getOperand(i)); 1275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling addCompileUnit(CU); 1282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (DIGlobalVariable DIG : CU->getGlobalVariables()) { 1295f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (addGlobalVariable(DIG)) { 1302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(DIG->getScope()); 1312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(DIG->getType().resolve(TypeIdentifierMap)); 1325f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (auto *SP : CU->getSubprograms()) 1352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processSubprogram(SP); 1362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (auto *ET : CU->getEnumTypes()) 1372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(ET); 1382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (auto *RT : CU->getRetainedTypes()) 1392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(RT); 1402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (DIImportedEntity Import : CU->getImportedEntities()) { 1412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto *Entity = Import->getEntity().resolve(TypeIdentifierMap); 1422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *T = dyn_cast<MDType>(Entity)) 1432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(T); 1442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (auto *SP = dyn_cast<MDSubprogram>(Entity)) 1452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processSubprogram(SP); 1462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (auto *NS = dyn_cast<MDNamespace>(Entity)) 1472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(NS->getScope()); 1485f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1505f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1515f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 1525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 1532b31b8227fb5507c26a8c4724574fc87fb90f482Manman Renvoid DebugInfoFinder::processLocation(const Module &M, DILocation Loc) { 1545f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!Loc) 1555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 1566950be28511caf355abdf405404b5f37cc136bc5Manman Ren InitializeTypeMap(M); 1572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(Loc->getScope()); 1582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processLocation(M, Loc->getInlinedAt()); 1595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 1605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 1615f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processType(DIType DT) { 1625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!addType(DT)) 1635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 1642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(DT->getScope().resolve(TypeIdentifierMap)); 1652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *DCT = dyn_cast<MDCompositeTypeBase>(DT)) { 1662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(DCT->getBaseType().resolve(TypeIdentifierMap)); 1672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *ST = dyn_cast<MDSubroutineType>(DCT)) { 1682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (MDTypeRef Ref : ST->getTypeArray()) 1692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(Ref.resolve(TypeIdentifierMap)); 17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return; 17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 1722c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (Metadata *D : DCT->getElements()) { 1732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *T = dyn_cast<MDType>(D)) 1742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(T); 1752c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar else if (DISubprogram SP = dyn_cast<MDSubprogram>(D)) 1762c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processSubprogram(SP); 1775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (auto *DDT = dyn_cast<MDDerivedTypeBase>(DT)) { 1792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(DDT->getBaseType().resolve(TypeIdentifierMap)); 1805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 1825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 1835f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processScope(DIScope Scope) { 1842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!Scope) 1852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return; 1862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DIType Ty = dyn_cast<MDType>(Scope)) { 1875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling processType(Ty); 1885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 1895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1902c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DICompileUnit CU = dyn_cast<MDCompileUnit>(Scope)) { 1912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar addCompileUnit(CU); 1925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 1935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1942c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (DISubprogram SP = dyn_cast<MDSubprogram>(Scope)) { 1952c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processSubprogram(SP); 1965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 1975f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 1985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!addScope(Scope)) 1995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *LB = dyn_cast<MDLexicalBlockBase>(Scope)) { 2012c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(LB->getScope()); 2022c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (auto *NS = dyn_cast<MDNamespace>(Scope)) { 2032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(NS->getScope()); 2045f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 2055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2075f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingvoid DebugInfoFinder::processSubprogram(DISubprogram SP) { 2085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!addSubprogram(SP)) 2095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(SP->getScope().resolve(TypeIdentifierMap)); 2112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(SP->getType()); 2122c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (auto *Element : SP->getTemplateParams()) { 2132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (auto *TType = dyn_cast<MDTemplateTypeParameter>(Element)) { 2142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(TType->getType().resolve(TypeIdentifierMap)); 2152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } else if (auto *TVal = dyn_cast<MDTemplateValueParameter>(Element)) { 2162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(TVal->getType().resolve(TypeIdentifierMap)); 2175f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 2185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 2195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2205f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2212b31b8227fb5507c26a8c4724574fc87fb90f482Manman Renvoid DebugInfoFinder::processDeclare(const Module &M, 2222b31b8227fb5507c26a8c4724574fc87fb90f482Manman Ren const DbgDeclareInst *DDI) { 2235f7259180c59b2830bf206b44439be32ffa9161eBill Wendling MDNode *N = dyn_cast<MDNode>(DDI->getVariable()); 2245f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!N) 2255f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2266950be28511caf355abdf405404b5f37cc136bc5Manman Ren InitializeTypeMap(M); 2275f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIVariable DV = dyn_cast<MDLocalVariable>(N); 2292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!DV) 2305f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2315f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 23237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(DV).second) 2335f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(DV->getScope()); 2352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(DV->getType().resolve(TypeIdentifierMap)); 2365f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2375f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2382b31b8227fb5507c26a8c4724574fc87fb90f482Manman Renvoid DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) { 2395f7259180c59b2830bf206b44439be32ffa9161eBill Wendling MDNode *N = dyn_cast<MDNode>(DVI->getVariable()); 2405f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!N) 2415f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2426950be28511caf355abdf405404b5f37cc136bc5Manman Ren InitializeTypeMap(M); 2435f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DIVariable DV = dyn_cast<MDLocalVariable>(N); 2452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (!DV) 2465f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2475f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 24837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(DV).second) 2495f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return; 2502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processScope(DV->getScope()); 2512c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar processType(DV->getType().resolve(TypeIdentifierMap)); 2525f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2535f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2545f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addType(DIType DT) { 2555f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!DT) 2565f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2575f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 25837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(DT).second) 2595f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2605f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2615f7259180c59b2830bf206b44439be32ffa9161eBill Wendling TYs.push_back(DT); 2625f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return true; 2635f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2645f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2655f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addCompileUnit(DICompileUnit CU) { 2665f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!CU) 2675f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 26837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(CU).second) 2695f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2705f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2715f7259180c59b2830bf206b44439be32ffa9161eBill Wendling CUs.push_back(CU); 2725f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return true; 2735f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2745f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2755f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) { 2765f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!DIG) 2775f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2785f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 27937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(DIG).second) 2805f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2815f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2825f7259180c59b2830bf206b44439be32ffa9161eBill Wendling GVs.push_back(DIG); 2835f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return true; 2845f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2855f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2865f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addSubprogram(DISubprogram SP) { 2875f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!SP) 2885f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2895f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 29037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(SP).second) 2915f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 2925f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2935f7259180c59b2830bf206b44439be32ffa9161eBill Wendling SPs.push_back(SP); 2945f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return true; 2955f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 2965f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 2975f7259180c59b2830bf206b44439be32ffa9161eBill Wendlingbool DebugInfoFinder::addScope(DIScope Scope) { 2985f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (!Scope) 2995f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 3005f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // FIXME: Ocaml binding generates a scope with no content, we treat it 3015f7259180c59b2830bf206b44439be32ffa9161eBill Wendling // as null for now. 3025f7259180c59b2830bf206b44439be32ffa9161eBill Wendling if (Scope->getNumOperands() == 0) 3035f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 30437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!NodesSeen.insert(Scope).second) 3055f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return false; 3065f7259180c59b2830bf206b44439be32ffa9161eBill Wendling Scopes.push_back(Scope); 3075f7259180c59b2830bf206b44439be32ffa9161eBill Wendling return true; 3085f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 3095f7259180c59b2830bf206b44439be32ffa9161eBill Wendling 3102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarbool llvm::stripDebugInfo(Function &F) { 3112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar bool Changed = false; 3122c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (BasicBlock &BB : F) { 3132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (Instruction &I : BB) { 3142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (I.getDebugLoc()) { 3152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Changed = true; 3162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar I.setDebugLoc(DebugLoc()); 3172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } 3185f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 3195f7259180c59b2830bf206b44439be32ffa9161eBill Wendling } 3202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return Changed; 3215f7259180c59b2830bf206b44439be32ffa9161eBill Wendling} 322c877b10446669bf107c19cab78b920ce9cffb989Manman Ren 323c877b10446669bf107c19cab78b920ce9cffb989Manman Renbool llvm::StripDebugInfo(Module &M) { 324c877b10446669bf107c19cab78b920ce9cffb989Manman Ren bool Changed = false; 325c877b10446669bf107c19cab78b920ce9cffb989Manman Ren 326c877b10446669bf107c19cab78b920ce9cffb989Manman Ren // Remove all of the calls to the debugger intrinsics, and remove them from 327c877b10446669bf107c19cab78b920ce9cffb989Manman Ren // the module. 328c877b10446669bf107c19cab78b920ce9cffb989Manman Ren if (Function *Declare = M.getFunction("llvm.dbg.declare")) { 329c877b10446669bf107c19cab78b920ce9cffb989Manman Ren while (!Declare->use_empty()) { 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CallInst *CI = cast<CallInst>(Declare->user_back()); 331c877b10446669bf107c19cab78b920ce9cffb989Manman Ren CI->eraseFromParent(); 332c877b10446669bf107c19cab78b920ce9cffb989Manman Ren } 333c877b10446669bf107c19cab78b920ce9cffb989Manman Ren Declare->eraseFromParent(); 334c877b10446669bf107c19cab78b920ce9cffb989Manman Ren Changed = true; 335c877b10446669bf107c19cab78b920ce9cffb989Manman Ren } 336c877b10446669bf107c19cab78b920ce9cffb989Manman Ren 337c877b10446669bf107c19cab78b920ce9cffb989Manman Ren if (Function *DbgVal = M.getFunction("llvm.dbg.value")) { 338c877b10446669bf107c19cab78b920ce9cffb989Manman Ren while (!DbgVal->use_empty()) { 33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CallInst *CI = cast<CallInst>(DbgVal->user_back()); 340c877b10446669bf107c19cab78b920ce9cffb989Manman Ren CI->eraseFromParent(); 341c877b10446669bf107c19cab78b920ce9cffb989Manman Ren } 342c877b10446669bf107c19cab78b920ce9cffb989Manman Ren DbgVal->eraseFromParent(); 343c877b10446669bf107c19cab78b920ce9cffb989Manman Ren Changed = true; 344c877b10446669bf107c19cab78b920ce9cffb989Manman Ren } 345c877b10446669bf107c19cab78b920ce9cffb989Manman Ren 346c877b10446669bf107c19cab78b920ce9cffb989Manman Ren for (Module::named_metadata_iterator NMI = M.named_metadata_begin(), 347c877b10446669bf107c19cab78b920ce9cffb989Manman Ren NME = M.named_metadata_end(); NMI != NME;) { 348c877b10446669bf107c19cab78b920ce9cffb989Manman Ren NamedMDNode *NMD = NMI; 349c877b10446669bf107c19cab78b920ce9cffb989Manman Ren ++NMI; 350c877b10446669bf107c19cab78b920ce9cffb989Manman Ren if (NMD->getName().startswith("llvm.dbg.")) { 351c877b10446669bf107c19cab78b920ce9cffb989Manman Ren NMD->eraseFromParent(); 352c877b10446669bf107c19cab78b920ce9cffb989Manman Ren Changed = true; 353c877b10446669bf107c19cab78b920ce9cffb989Manman Ren } 354c877b10446669bf107c19cab78b920ce9cffb989Manman Ren } 355c877b10446669bf107c19cab78b920ce9cffb989Manman Ren 3562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (Function &F : M) 3572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Changed |= stripDebugInfo(F); 3582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar 3592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (GVMaterializer *Materializer = M.getMaterializer()) 3602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Materializer->setStripDebugInfo(); 361c877b10446669bf107c19cab78b920ce9cffb989Manman Ren 362c877b10446669bf107c19cab78b920ce9cffb989Manman Ren return Changed; 363c877b10446669bf107c19cab78b920ce9cffb989Manman Ren} 36427457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren 36551fce2c886e4ca33272975cc80bc1cc5abfcdffdManman Renunsigned llvm::getDebugMetadataVersionFromModule(const Module &M) { 366ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (auto *Val = mdconst::dyn_extract_or_null<ConstantInt>( 367ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines M.getModuleFlag("Debug Info Version"))) 368ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return Val->getZExtValue(); 369ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return 0; 37027457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren} 371c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 372c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesllvm::DenseMap<const llvm::Function *, llvm::DISubprogram> 373c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesllvm::makeSubprogramMap(const Module &M) { 374c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines DenseMap<const Function *, DISubprogram> R; 375c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 376c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu"); 377c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!CU_Nodes) 378c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return R; 379c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 380c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines for (MDNode *N : CU_Nodes->operands()) { 3812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar DICompileUnit CUNode = cast<MDCompileUnit>(N); 3822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (DISubprogram SP : CUNode->getSubprograms()) { 3832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar if (Function *F = SP->getFunction()) 384c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines R.insert(std::make_pair(F, SP)); 385c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 386c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 387c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return R; 388c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines} 389