1 //===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the helper classes used to build and interpret debug
11 // information in LLVM IR form.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "llvm/IR/DebugInfo.h"
16 #include "LLVMContextImpl.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/SmallPtrSet.h"
19 #include "llvm/IR/Constants.h"
20 #include "llvm/IR/DIBuilder.h"
21 #include "llvm/IR/DerivedTypes.h"
22 #include "llvm/IR/GVMaterializer.h"
23 #include "llvm/IR/Instructions.h"
24 #include "llvm/IR/IntrinsicInst.h"
25 #include "llvm/IR/Intrinsics.h"
26 #include "llvm/IR/Module.h"
27 #include "llvm/IR/ValueHandle.h"
28 #include "llvm/Support/Debug.h"
29 #include "llvm/Support/Dwarf.h"
30 #include "llvm/Support/raw_ostream.h"
31 using namespace llvm;
32 using namespace llvm::dwarf;
33 
34 DISubprogram *llvm::getDISubprogram(const MDNode *Scope) {
35   if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
36     return LocalScope->getSubprogram();
37   return nullptr;
38 }
39 
40 //===----------------------------------------------------------------------===//
41 // DebugInfoFinder implementations.
42 //===----------------------------------------------------------------------===//
43 
44 void DebugInfoFinder::reset() {
45   CUs.clear();
46   SPs.clear();
47   GVs.clear();
48   TYs.clear();
49   Scopes.clear();
50   NodesSeen.clear();
51 }
52 
53 void DebugInfoFinder::processModule(const Module &M) {
54   for (auto *CU : M.debug_compile_units()) {
55     addCompileUnit(CU);
56     for (auto *DIG : CU->getGlobalVariables()) {
57       if (addGlobalVariable(DIG)) {
58         processScope(DIG->getScope());
59         processType(DIG->getType().resolve());
60       }
61     }
62     for (auto *ET : CU->getEnumTypes())
63       processType(ET);
64     for (auto *RT : CU->getRetainedTypes())
65       if (auto *T = dyn_cast<DIType>(RT))
66         processType(T);
67       else
68         processSubprogram(cast<DISubprogram>(RT));
69     for (auto *Import : CU->getImportedEntities()) {
70       auto *Entity = Import->getEntity().resolve();
71       if (auto *T = dyn_cast<DIType>(Entity))
72         processType(T);
73       else if (auto *SP = dyn_cast<DISubprogram>(Entity))
74         processSubprogram(SP);
75       else if (auto *NS = dyn_cast<DINamespace>(Entity))
76         processScope(NS->getScope());
77       else if (auto *M = dyn_cast<DIModule>(Entity))
78         processScope(M->getScope());
79     }
80   }
81   for (auto &F : M.functions())
82     if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
83       processSubprogram(SP);
84 }
85 
86 void DebugInfoFinder::processLocation(const Module &M, const DILocation *Loc) {
87   if (!Loc)
88     return;
89   processScope(Loc->getScope());
90   processLocation(M, Loc->getInlinedAt());
91 }
92 
93 void DebugInfoFinder::processType(DIType *DT) {
94   if (!addType(DT))
95     return;
96   processScope(DT->getScope().resolve());
97   if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
98     for (DITypeRef Ref : ST->getTypeArray())
99       processType(Ref.resolve());
100     return;
101   }
102   if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
103     processType(DCT->getBaseType().resolve());
104     for (Metadata *D : DCT->getElements()) {
105       if (auto *T = dyn_cast<DIType>(D))
106         processType(T);
107       else if (auto *SP = dyn_cast<DISubprogram>(D))
108         processSubprogram(SP);
109     }
110     return;
111   }
112   if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
113     processType(DDT->getBaseType().resolve());
114   }
115 }
116 
117 void DebugInfoFinder::processScope(DIScope *Scope) {
118   if (!Scope)
119     return;
120   if (auto *Ty = dyn_cast<DIType>(Scope)) {
121     processType(Ty);
122     return;
123   }
124   if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
125     addCompileUnit(CU);
126     return;
127   }
128   if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
129     processSubprogram(SP);
130     return;
131   }
132   if (!addScope(Scope))
133     return;
134   if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
135     processScope(LB->getScope());
136   } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
137     processScope(NS->getScope());
138   } else if (auto *M = dyn_cast<DIModule>(Scope)) {
139     processScope(M->getScope());
140   }
141 }
142 
143 void DebugInfoFinder::processSubprogram(DISubprogram *SP) {
144   if (!addSubprogram(SP))
145     return;
146   processScope(SP->getScope().resolve());
147   processType(SP->getType());
148   for (auto *Element : SP->getTemplateParams()) {
149     if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
150       processType(TType->getType().resolve());
151     } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
152       processType(TVal->getType().resolve());
153     }
154   }
155 }
156 
157 void DebugInfoFinder::processDeclare(const Module &M,
158                                      const DbgDeclareInst *DDI) {
159   auto *N = dyn_cast<MDNode>(DDI->getVariable());
160   if (!N)
161     return;
162 
163   auto *DV = dyn_cast<DILocalVariable>(N);
164   if (!DV)
165     return;
166 
167   if (!NodesSeen.insert(DV).second)
168     return;
169   processScope(DV->getScope());
170   processType(DV->getType().resolve());
171 }
172 
173 void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) {
174   auto *N = dyn_cast<MDNode>(DVI->getVariable());
175   if (!N)
176     return;
177 
178   auto *DV = dyn_cast<DILocalVariable>(N);
179   if (!DV)
180     return;
181 
182   if (!NodesSeen.insert(DV).second)
183     return;
184   processScope(DV->getScope());
185   processType(DV->getType().resolve());
186 }
187 
188 bool DebugInfoFinder::addType(DIType *DT) {
189   if (!DT)
190     return false;
191 
192   if (!NodesSeen.insert(DT).second)
193     return false;
194 
195   TYs.push_back(const_cast<DIType *>(DT));
196   return true;
197 }
198 
199 bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
200   if (!CU)
201     return false;
202   if (!NodesSeen.insert(CU).second)
203     return false;
204 
205   CUs.push_back(CU);
206   return true;
207 }
208 
209 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable *DIG) {
210   if (!DIG)
211     return false;
212 
213   if (!NodesSeen.insert(DIG).second)
214     return false;
215 
216   GVs.push_back(DIG);
217   return true;
218 }
219 
220 bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
221   if (!SP)
222     return false;
223 
224   if (!NodesSeen.insert(SP).second)
225     return false;
226 
227   SPs.push_back(SP);
228   return true;
229 }
230 
231 bool DebugInfoFinder::addScope(DIScope *Scope) {
232   if (!Scope)
233     return false;
234   // FIXME: Ocaml binding generates a scope with no content, we treat it
235   // as null for now.
236   if (Scope->getNumOperands() == 0)
237     return false;
238   if (!NodesSeen.insert(Scope).second)
239     return false;
240   Scopes.push_back(Scope);
241   return true;
242 }
243 
244 bool llvm::stripDebugInfo(Function &F) {
245   bool Changed = false;
246   if (F.getSubprogram()) {
247     Changed = true;
248     F.setSubprogram(nullptr);
249   }
250 
251   for (BasicBlock &BB : F) {
252     for (auto II = BB.begin(), End = BB.end(); II != End;) {
253       Instruction &I = *II++; // We may delete the instruction, increment now.
254       if (isa<DbgInfoIntrinsic>(&I)) {
255         I.eraseFromParent();
256         Changed = true;
257         continue;
258       }
259       if (I.getDebugLoc()) {
260         Changed = true;
261         I.setDebugLoc(DebugLoc());
262       }
263     }
264   }
265   return Changed;
266 }
267 
268 bool llvm::StripDebugInfo(Module &M) {
269   bool Changed = false;
270 
271   for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
272          NME = M.named_metadata_end(); NMI != NME;) {
273     NamedMDNode *NMD = &*NMI;
274     ++NMI;
275 
276     // We're stripping debug info, and without them, coverage information
277     // doesn't quite make sense.
278     if (NMD->getName().startswith("llvm.dbg.") ||
279         NMD->getName() == "llvm.gcov") {
280       NMD->eraseFromParent();
281       Changed = true;
282     }
283   }
284 
285   for (Function &F : M)
286     Changed |= stripDebugInfo(F);
287 
288   for (auto &GV : M.globals()) {
289     SmallVector<MDNode *, 1> MDs;
290     GV.getMetadata(LLVMContext::MD_dbg, MDs);
291     if (!MDs.empty()) {
292       GV.eraseMetadata(LLVMContext::MD_dbg);
293       Changed = true;
294     }
295   }
296 
297   if (GVMaterializer *Materializer = M.getMaterializer())
298     Materializer->setStripDebugInfo();
299 
300   return Changed;
301 }
302 
303 namespace {
304 
305 /// Helper class to downgrade -g metadata to -gline-tables-only metadata.
306 class DebugTypeInfoRemoval {
307   DenseMap<Metadata *, Metadata *> Replacements;
308 
309 public:
310   /// The (void)() type.
311   MDNode *EmptySubroutineType;
312 
313 private:
314   /// Remember what linkage name we originally had before stripping. If we end
315   /// up making two subprograms identical who originally had different linkage
316   /// names, then we need to make one of them distinct, to avoid them getting
317   /// uniqued. Maps the new node to the old linkage name.
318   DenseMap<DISubprogram *, StringRef> NewToLinkageName;
319 
320   // TODO: Remember the distinct subprogram we created for a given linkage name,
321   // so that we can continue to unique whenever possible. Map <newly created
322   // node, old linkage name> to the first (possibly distinct) mdsubprogram
323   // created for that combination. This is not strictly needed for correctness,
324   // but can cut down on the number of MDNodes and let us diff cleanly with the
325   // output of -gline-tables-only.
326 
327 public:
328   DebugTypeInfoRemoval(LLVMContext &C)
329       : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
330                                                   MDNode::get(C, {}))) {}
331 
332   Metadata *map(Metadata *M) {
333     if (!M)
334       return nullptr;
335     auto Replacement = Replacements.find(M);
336     if (Replacement != Replacements.end())
337       return Replacement->second;
338 
339     return M;
340   }
341   MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
342 
343   /// Recursively remap N and all its referenced children. Does a DF post-order
344   /// traversal, so as to remap bottoms up.
345   void traverseAndRemap(MDNode *N) { traverse(N); }
346 
347 private:
348   // Create a new DISubprogram, to replace the one given.
349   DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
350     auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
351     StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : "";
352     DISubprogram *Declaration = nullptr;
353     auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
354     DITypeRef ContainingType(map(MDS->getContainingType()));
355     auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
356     auto Variables = nullptr;
357     auto TemplateParams = nullptr;
358 
359     // Make a distinct DISubprogram, for situations that warrent it.
360     auto distinctMDSubprogram = [&]() {
361       return DISubprogram::getDistinct(
362           MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
363           FileAndScope, MDS->getLine(), Type, MDS->isLocalToUnit(),
364           MDS->isDefinition(), MDS->getScopeLine(), ContainingType,
365           MDS->getVirtuality(), MDS->getVirtualIndex(),
366           MDS->getThisAdjustment(), MDS->getFlags(), MDS->isOptimized(), Unit,
367           TemplateParams, Declaration, Variables);
368     };
369 
370     if (MDS->isDistinct())
371       return distinctMDSubprogram();
372 
373     auto *NewMDS = DISubprogram::get(
374         MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
375         FileAndScope, MDS->getLine(), Type, MDS->isLocalToUnit(),
376         MDS->isDefinition(), MDS->getScopeLine(), ContainingType,
377         MDS->getVirtuality(), MDS->getVirtualIndex(), MDS->getThisAdjustment(),
378         MDS->getFlags(), MDS->isOptimized(), Unit, TemplateParams, Declaration,
379         Variables);
380 
381     StringRef OldLinkageName = MDS->getLinkageName();
382 
383     // See if we need to make a distinct one.
384     auto OrigLinkage = NewToLinkageName.find(NewMDS);
385     if (OrigLinkage != NewToLinkageName.end()) {
386       if (OrigLinkage->second == OldLinkageName)
387         // We're good.
388         return NewMDS;
389 
390       // Otherwise, need to make a distinct one.
391       // TODO: Query the map to see if we already have one.
392       return distinctMDSubprogram();
393     }
394 
395     NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
396     return NewMDS;
397   }
398 
399   /// Create a new compile unit, to replace the one given
400   DICompileUnit *getReplacementCU(DICompileUnit *CU) {
401     // Drop skeleton CUs.
402     if (CU->getDWOId())
403       return nullptr;
404 
405     auto *File = cast_or_null<DIFile>(map(CU->getFile()));
406     MDTuple *EnumTypes = nullptr;
407     MDTuple *RetainedTypes = nullptr;
408     MDTuple *GlobalVariables = nullptr;
409     MDTuple *ImportedEntities = nullptr;
410     return DICompileUnit::getDistinct(
411         CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
412         CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
413         CU->getSplitDebugFilename(), DICompileUnit::LineTablesOnly, EnumTypes,
414         RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
415         CU->getDWOId(), CU->getSplitDebugInlining());
416   }
417 
418   DILocation *getReplacementMDLocation(DILocation *MLD) {
419     auto *Scope = map(MLD->getScope());
420     auto *InlinedAt = map(MLD->getInlinedAt());
421     if (MLD->isDistinct())
422       return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
423                                      MLD->getColumn(), Scope, InlinedAt);
424     return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
425                            Scope, InlinedAt);
426   }
427 
428   /// Create a new generic MDNode, to replace the one given
429   MDNode *getReplacementMDNode(MDNode *N) {
430     SmallVector<Metadata *, 8> Ops;
431     Ops.reserve(N->getNumOperands());
432     for (auto &I : N->operands())
433       if (I)
434         Ops.push_back(map(I));
435     auto *Ret = MDNode::get(N->getContext(), Ops);
436     return Ret;
437   }
438 
439   /// Attempt to re-map N to a newly created node.
440   void remap(MDNode *N) {
441     if (Replacements.count(N))
442       return;
443 
444     auto doRemap = [&](MDNode *N) -> MDNode * {
445       if (!N)
446         return nullptr;
447       if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
448         remap(MDSub->getUnit());
449         return getReplacementSubprogram(MDSub);
450       }
451       if (isa<DISubroutineType>(N))
452         return EmptySubroutineType;
453       if (auto *CU = dyn_cast<DICompileUnit>(N))
454         return getReplacementCU(CU);
455       if (isa<DIFile>(N))
456         return N;
457       if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
458         // Remap to our referenced scope (recursively).
459         return mapNode(MDLB->getScope());
460       if (auto *MLD = dyn_cast<DILocation>(N))
461         return getReplacementMDLocation(MLD);
462 
463       // Otherwise, if we see these, just drop them now. Not strictly necessary,
464       // but this speeds things up a little.
465       if (isa<DINode>(N))
466         return nullptr;
467 
468       return getReplacementMDNode(N);
469     };
470     Replacements[N] = doRemap(N);
471   }
472 
473   /// Do the remapping traversal.
474   void traverse(MDNode *);
475 };
476 
477 } // Anonymous namespace.
478 
479 void DebugTypeInfoRemoval::traverse(MDNode *N) {
480   if (!N || Replacements.count(N))
481     return;
482 
483   // To avoid cycles, as well as for efficiency sake, we will sometimes prune
484   // parts of the graph.
485   auto prune = [](MDNode *Parent, MDNode *Child) {
486     if (auto *MDS = dyn_cast<DISubprogram>(Parent))
487       return Child == MDS->getVariables().get();
488     return false;
489   };
490 
491   SmallVector<MDNode *, 16> ToVisit;
492   DenseSet<MDNode *> Opened;
493 
494   // Visit each node starting at N in post order, and map them.
495   ToVisit.push_back(N);
496   while (!ToVisit.empty()) {
497     auto *N = ToVisit.back();
498     if (!Opened.insert(N).second) {
499       // Close it.
500       remap(N);
501       ToVisit.pop_back();
502       continue;
503     }
504     for (auto &I : N->operands())
505       if (auto *MDN = dyn_cast_or_null<MDNode>(I))
506         if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
507             !isa<DICompileUnit>(MDN))
508           ToVisit.push_back(MDN);
509   }
510 }
511 
512 bool llvm::stripNonLineTableDebugInfo(Module &M) {
513   bool Changed = false;
514 
515   // First off, delete the debug intrinsics.
516   auto RemoveUses = [&](StringRef Name) {
517     if (auto *DbgVal = M.getFunction(Name)) {
518       while (!DbgVal->use_empty())
519         cast<Instruction>(DbgVal->user_back())->eraseFromParent();
520       DbgVal->eraseFromParent();
521       Changed = true;
522     }
523   };
524   RemoveUses("llvm.dbg.declare");
525   RemoveUses("llvm.dbg.value");
526 
527   // Delete non-CU debug info named metadata nodes.
528   for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
529        NMI != NME;) {
530     NamedMDNode *NMD = &*NMI;
531     ++NMI;
532     // Specifically keep dbg.cu around.
533     if (NMD->getName() == "llvm.dbg.cu")
534       continue;
535   }
536 
537   // Drop all dbg attachments from global variables.
538   for (auto &GV : M.globals())
539     GV.eraseMetadata(LLVMContext::MD_dbg);
540 
541   DebugTypeInfoRemoval Mapper(M.getContext());
542   auto remap = [&](llvm::MDNode *Node) -> llvm::MDNode * {
543     if (!Node)
544       return nullptr;
545     Mapper.traverseAndRemap(Node);
546     auto *NewNode = Mapper.mapNode(Node);
547     Changed |= Node != NewNode;
548     Node = NewNode;
549     return NewNode;
550   };
551 
552   // Rewrite the DebugLocs to be equivalent to what
553   // -gline-tables-only would have created.
554   for (auto &F : M) {
555     if (auto *SP = F.getSubprogram()) {
556       Mapper.traverseAndRemap(SP);
557       auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
558       Changed |= SP != NewSP;
559       F.setSubprogram(NewSP);
560     }
561     for (auto &BB : F) {
562       for (auto &I : BB) {
563         if (I.getDebugLoc() == DebugLoc())
564           continue;
565 
566         // Make a replacement.
567         auto &DL = I.getDebugLoc();
568         auto *Scope = DL.getScope();
569         MDNode *InlinedAt = DL.getInlinedAt();
570         Scope = remap(Scope);
571         InlinedAt = remap(InlinedAt);
572         I.setDebugLoc(
573             DebugLoc::get(DL.getLine(), DL.getCol(), Scope, InlinedAt));
574       }
575     }
576   }
577 
578   // Create a new llvm.dbg.cu, which is equivalent to the one
579   // -gline-tables-only would have created.
580   for (auto &NMD : M.getNamedMDList()) {
581     SmallVector<MDNode *, 8> Ops;
582     for (MDNode *Op : NMD.operands())
583       Ops.push_back(remap(Op));
584 
585     if (!Changed)
586       continue;
587 
588     NMD.clearOperands();
589     for (auto *Op : Ops)
590       if (Op)
591         NMD.addOperand(Op);
592   }
593   return Changed;
594 }
595 
596 unsigned llvm::getDebugMetadataVersionFromModule(const Module &M) {
597   if (auto *Val = mdconst::dyn_extract_or_null<ConstantInt>(
598           M.getModuleFlag("Debug Info Version")))
599     return Val->getZExtValue();
600   return 0;
601 }
602