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