1 //===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Units -----------===//
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 contains support for constructing a dwarf compile unit.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "DwarfCompileUnit.h"
15 #include "DwarfExpression.h"
16 #include "llvm/CodeGen/MachineFunction.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/DataLayout.h"
19 #include "llvm/IR/GlobalValue.h"
20 #include "llvm/IR/GlobalVariable.h"
21 #include "llvm/IR/Instruction.h"
22 #include "llvm/MC/MCAsmInfo.h"
23 #include "llvm/MC/MCStreamer.h"
24 #include "llvm/Target/TargetFrameLowering.h"
25 #include "llvm/Target/TargetLoweringObjectFile.h"
26 #include "llvm/Target/TargetMachine.h"
27 #include "llvm/Target/TargetRegisterInfo.h"
28 #include "llvm/Target/TargetSubtargetInfo.h"
29 
30 namespace llvm {
31 
32 DwarfCompileUnit::DwarfCompileUnit(unsigned UID, const DICompileUnit *Node,
33                                    AsmPrinter *A, DwarfDebug *DW,
34                                    DwarfFile *DWU)
35     : DwarfUnit(dwarf::DW_TAG_compile_unit, Node, A, DW, DWU), UniqueID(UID),
36       Skeleton(nullptr), BaseAddress(nullptr) {
37   insertDIE(Node, &getUnitDie());
38   MacroLabelBegin = Asm->createTempSymbol("cu_macro_begin");
39 }
40 
41 /// addLabelAddress - Add a dwarf label attribute data and value using
42 /// DW_FORM_addr or DW_FORM_GNU_addr_index.
43 ///
44 void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute,
45                                        const MCSymbol *Label) {
46 
47   // Don't use the address pool in non-fission or in the skeleton unit itself.
48   // FIXME: Once GDB supports this, it's probably worthwhile using the address
49   // pool from the skeleton - maybe even in non-fission (possibly fewer
50   // relocations by sharing them in the pool, but we have other ideas about how
51   // to reduce the number of relocations as well/instead).
52   if (!DD->useSplitDwarf() || !Skeleton)
53     return addLocalLabelAddress(Die, Attribute, Label);
54 
55   if (Label)
56     DD->addArangeLabel(SymbolCU(this, Label));
57 
58   unsigned idx = DD->getAddressPool().getIndex(Label);
59   Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_GNU_addr_index,
60                DIEInteger(idx));
61 }
62 
63 void DwarfCompileUnit::addLocalLabelAddress(DIE &Die,
64                                             dwarf::Attribute Attribute,
65                                             const MCSymbol *Label) {
66   if (Label)
67     DD->addArangeLabel(SymbolCU(this, Label));
68 
69   if (Label)
70     Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr,
71                  DIELabel(Label));
72   else
73     Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr,
74                  DIEInteger(0));
75 }
76 
77 unsigned DwarfCompileUnit::getOrCreateSourceID(StringRef FileName,
78                                                StringRef DirName) {
79   // If we print assembly, we can't separate .file entries according to
80   // compile units. Thus all files will belong to the default compile unit.
81 
82   // FIXME: add a better feature test than hasRawTextSupport. Even better,
83   // extend .file to support this.
84   return Asm->OutStreamer->EmitDwarfFileDirective(
85       0, DirName, FileName,
86       Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID());
87 }
88 
89 DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
90     const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) {
91   // Check for pre-existence.
92   if (DIE *Die = getDIE(GV))
93     return Die;
94 
95   assert(GV);
96 
97   auto *GVContext = GV->getScope();
98   auto *GTy = DD->resolve(GV->getType());
99 
100   // Construct the context before querying for the existence of the DIE in
101   // case such construction creates the DIE.
102   DIE *ContextDIE = getOrCreateContextDIE(GVContext);
103 
104   // Add to map.
105   DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV);
106   DIScope *DeclContext;
107   if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) {
108     DeclContext = resolve(SDMDecl->getScope());
109     assert(SDMDecl->isStaticMember() && "Expected static member decl");
110     assert(GV->isDefinition());
111     // We need the declaration DIE that is in the static member's class.
112     DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl);
113     addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
114     // If the global variable's type is different from the one in the class
115     // member type, assume that it's more specific and also emit it.
116     if (GTy != DD->resolve(SDMDecl->getBaseType()))
117       addType(*VariableDIE, GTy);
118   } else {
119     DeclContext = GV->getScope();
120     // Add name and type.
121     addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName());
122     addType(*VariableDIE, GTy);
123 
124     // Add scoping info.
125     if (!GV->isLocalToUnit())
126       addFlag(*VariableDIE, dwarf::DW_AT_external);
127 
128     // Add line number info.
129     addSourceLine(*VariableDIE, GV);
130   }
131 
132   if (!GV->isDefinition())
133     addFlag(*VariableDIE, dwarf::DW_AT_declaration);
134   else
135     addGlobalName(GV->getName(), *VariableDIE, DeclContext);
136 
137   if (uint32_t AlignInBytes = GV->getAlignInBytes())
138     addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
139             AlignInBytes);
140 
141   // Add location.
142   bool addToAccelTable = false;
143   DIELoc *Loc = nullptr;
144   std::unique_ptr<DIEDwarfExpression> DwarfExpr;
145   for (const auto &GE : GlobalExprs) {
146     const GlobalVariable *Global = GE.Var;
147     const DIExpression *Expr = GE.Expr;
148 
149     // For compatibility with DWARF 3 and earlier,
150     // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) becomes
151     // DW_AT_const_value(X).
152     if (GlobalExprs.size() == 1 && Expr && Expr->isConstant()) {
153       addToAccelTable = true;
154       addConstantValue(*VariableDIE, /*Unsigned=*/true, Expr->getElement(1));
155       break;
156     }
157 
158     // We cannot describe the location of dllimport'd variables: the
159     // computation of their address requires loads from the IAT.
160     if (Global && Global->hasDLLImportStorageClass())
161       continue;
162 
163     // Nothing to describe without address or constant.
164     if (!Global && (!Expr || !Expr->isConstant()))
165       continue;
166 
167     if (!Loc) {
168       addToAccelTable = true;
169       Loc = new (DIEValueAllocator) DIELoc;
170       DwarfExpr = llvm::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc);
171     }
172 
173     if (Global) {
174       const MCSymbol *Sym = Asm->getSymbol(Global);
175       if (Global->isThreadLocal()) {
176         if (Asm->TM.Options.EmulatedTLS) {
177           // TODO: add debug info for emulated thread local mode.
178         } else {
179           // FIXME: Make this work with -gsplit-dwarf.
180           unsigned PointerSize = Asm->getDataLayout().getPointerSize();
181           assert((PointerSize == 4 || PointerSize == 8) &&
182                  "Add support for other sizes if necessary");
183           // Based on GCC's support for TLS:
184           if (!DD->useSplitDwarf()) {
185             // 1) Start with a constNu of the appropriate pointer size
186             addUInt(*Loc, dwarf::DW_FORM_data1,
187                     PointerSize == 4 ? dwarf::DW_OP_const4u
188                                      : dwarf::DW_OP_const8u);
189             // 2) containing the (relocated) offset of the TLS variable
190             //    within the module's TLS block.
191             addExpr(*Loc, dwarf::DW_FORM_udata,
192                     Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym));
193           } else {
194             addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
195             addUInt(*Loc, dwarf::DW_FORM_udata,
196                     DD->getAddressPool().getIndex(Sym, /* TLS */ true));
197           }
198           // 3) followed by an OP to make the debugger do a TLS lookup.
199           addUInt(*Loc, dwarf::DW_FORM_data1,
200                   DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address
201                                         : dwarf::DW_OP_form_tls_address);
202         }
203       } else {
204         DD->addArangeLabel(SymbolCU(this, Sym));
205         addOpAddress(*Loc, Sym);
206       }
207     }
208     if (Expr) {
209       DwarfExpr->addFragmentOffset(Expr);
210       DwarfExpr->addExpression(Expr);
211     }
212   }
213   if (Loc)
214     addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
215 
216   if (DD->useAllLinkageNames())
217     addLinkageName(*VariableDIE, GV->getLinkageName());
218 
219   if (addToAccelTable) {
220     DD->addAccelName(GV->getName(), *VariableDIE);
221 
222     // If the linkage name is different than the name, go ahead and output
223     // that as well into the name table.
224     if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName())
225       DD->addAccelName(GV->getLinkageName(), *VariableDIE);
226   }
227 
228   return VariableDIE;
229 }
230 
231 void DwarfCompileUnit::addRange(RangeSpan Range) {
232   bool SameAsPrevCU = this == DD->getPrevCU();
233   DD->setPrevCU(this);
234   // If we have no current ranges just add the range and return, otherwise,
235   // check the current section and CU against the previous section and CU we
236   // emitted into and the subprogram was contained within. If these are the
237   // same then extend our current range, otherwise add this as a new range.
238   if (CURanges.empty() || !SameAsPrevCU ||
239       (&CURanges.back().getEnd()->getSection() !=
240        &Range.getEnd()->getSection())) {
241     CURanges.push_back(Range);
242     return;
243   }
244 
245   CURanges.back().setEnd(Range.getEnd());
246 }
247 
248 void DwarfCompileUnit::initStmtList() {
249   // Define start line table label for each Compile Unit.
250   MCSymbol *LineTableStartSym =
251       Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID());
252 
253   // DW_AT_stmt_list is a offset of line number information for this
254   // compile unit in debug_line section. For split dwarf this is
255   // left in the skeleton CU and so not included.
256   // The line table entries are not always emitted in assembly, so it
257   // is not okay to use line_table_start here.
258   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
259   StmtListValue =
260       addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
261                       TLOF.getDwarfLineSection()->getBeginSymbol());
262 }
263 
264 void DwarfCompileUnit::applyStmtList(DIE &D) {
265   D.addValue(DIEValueAllocator, *StmtListValue);
266 }
267 
268 void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin,
269                                        const MCSymbol *End) {
270   assert(Begin && "Begin label should not be null!");
271   assert(End && "End label should not be null!");
272   assert(Begin->isDefined() && "Invalid starting label");
273   assert(End->isDefined() && "Invalid end label");
274 
275   addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
276   if (DD->getDwarfVersion() < 4)
277     addLabelAddress(D, dwarf::DW_AT_high_pc, End);
278   else
279     addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
280 }
281 
282 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
283 // and DW_AT_high_pc attributes. If there are global variables in this
284 // scope then create and insert DIEs for these variables.
285 DIE &DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram *SP) {
286   DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes());
287 
288   attachLowHighPC(*SPDie, Asm->getFunctionBegin(), Asm->getFunctionEnd());
289   if (DD->useAppleExtensionAttributes() &&
290       !DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim(
291           *DD->getCurrentFunction()))
292     addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
293 
294   // Only include DW_AT_frame_base in full debug info
295   if (!includeMinimalInlineScopes()) {
296     const TargetRegisterInfo *RI = Asm->MF->getSubtarget().getRegisterInfo();
297     MachineLocation Location(RI->getFrameRegister(*Asm->MF));
298     if (RI->isPhysicalRegister(Location.getReg()))
299       addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
300   }
301 
302   // Add name to the name table, we do this here because we're guaranteed
303   // to have concrete versions of our DW_TAG_subprogram nodes.
304   DD->addSubprogramNames(SP, *SPDie);
305 
306   return *SPDie;
307 }
308 
309 // Construct a DIE for this scope.
310 void DwarfCompileUnit::constructScopeDIE(
311     LexicalScope *Scope, SmallVectorImpl<DIE *> &FinalChildren) {
312   if (!Scope || !Scope->getScopeNode())
313     return;
314 
315   auto *DS = Scope->getScopeNode();
316 
317   assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) &&
318          "Only handle inlined subprograms here, use "
319          "constructSubprogramScopeDIE for non-inlined "
320          "subprograms");
321 
322   SmallVector<DIE *, 8> Children;
323 
324   // We try to create the scope DIE first, then the children DIEs. This will
325   // avoid creating un-used children then removing them later when we find out
326   // the scope DIE is null.
327   DIE *ScopeDIE;
328   if (Scope->getParent() && isa<DISubprogram>(DS)) {
329     ScopeDIE = constructInlinedScopeDIE(Scope);
330     if (!ScopeDIE)
331       return;
332     // We create children when the scope DIE is not null.
333     createScopeChildrenDIE(Scope, Children);
334   } else {
335     // Early exit when we know the scope DIE is going to be null.
336     if (DD->isLexicalScopeDIENull(Scope))
337       return;
338 
339     bool HasNonScopeChildren = false;
340 
341     // We create children here when we know the scope DIE is not going to be
342     // null and the children will be added to the scope DIE.
343     createScopeChildrenDIE(Scope, Children, &HasNonScopeChildren);
344 
345     // If there are only other scopes as children, put them directly in the
346     // parent instead, as this scope would serve no purpose.
347     if (!HasNonScopeChildren) {
348       FinalChildren.insert(FinalChildren.end(),
349                            std::make_move_iterator(Children.begin()),
350                            std::make_move_iterator(Children.end()));
351       return;
352     }
353     ScopeDIE = constructLexicalScopeDIE(Scope);
354     assert(ScopeDIE && "Scope DIE should not be null.");
355   }
356 
357   // Add children
358   for (auto &I : Children)
359     ScopeDIE->addChild(std::move(I));
360 
361   FinalChildren.push_back(std::move(ScopeDIE));
362 }
363 
364 void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE,
365                                          SmallVector<RangeSpan, 2> Range) {
366   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
367 
368   // Emit offset in .debug_range as a relocatable label. emitDIE will handle
369   // emitting it appropriately.
370   const MCSymbol *RangeSectionSym =
371       TLOF.getDwarfRangesSection()->getBeginSymbol();
372 
373   RangeSpanList List(Asm->createTempSymbol("debug_ranges"), std::move(Range));
374 
375   // Under fission, ranges are specified by constant offsets relative to the
376   // CU's DW_AT_GNU_ranges_base.
377   if (isDwoUnit())
378     addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.getSym(),
379                     RangeSectionSym);
380   else
381     addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.getSym(),
382                     RangeSectionSym);
383 
384   // Add the range list to the set of ranges to be emitted.
385   (Skeleton ? Skeleton : this)->CURangeLists.push_back(std::move(List));
386 }
387 
388 void DwarfCompileUnit::attachRangesOrLowHighPC(
389     DIE &Die, SmallVector<RangeSpan, 2> Ranges) {
390   if (Ranges.size() == 1) {
391     const auto &single = Ranges.front();
392     attachLowHighPC(Die, single.getStart(), single.getEnd());
393   } else
394     addScopeRangeList(Die, std::move(Ranges));
395 }
396 
397 void DwarfCompileUnit::attachRangesOrLowHighPC(
398     DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) {
399   SmallVector<RangeSpan, 2> List;
400   List.reserve(Ranges.size());
401   for (const InsnRange &R : Ranges)
402     List.push_back(RangeSpan(DD->getLabelBeforeInsn(R.first),
403                              DD->getLabelAfterInsn(R.second)));
404   attachRangesOrLowHighPC(Die, std::move(List));
405 }
406 
407 // This scope represents inlined body of a function. Construct DIE to
408 // represent this concrete inlined copy of the function.
409 DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope) {
410   assert(Scope->getScopeNode());
411   auto *DS = Scope->getScopeNode();
412   auto *InlinedSP = getDISubprogram(DS);
413   // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
414   // was inlined from another compile unit.
415   DIE *OriginDIE = getAbstractSPDies()[InlinedSP];
416   assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
417 
418   auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine);
419   addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
420 
421   attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
422 
423   // Add the call site information to the DIE.
424   const DILocation *IA = Scope->getInlinedAt();
425   addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
426           getOrCreateSourceID(IA->getFilename(), IA->getDirectory()));
427   addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, IA->getLine());
428   if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4)
429     addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, None,
430             IA->getDiscriminator());
431 
432   // Add name to the name table, we do this here because we're guaranteed
433   // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
434   DD->addSubprogramNames(InlinedSP, *ScopeDIE);
435 
436   return ScopeDIE;
437 }
438 
439 // Construct new DW_TAG_lexical_block for this scope and attach
440 // DW_AT_low_pc/DW_AT_high_pc labels.
441 DIE *DwarfCompileUnit::constructLexicalScopeDIE(LexicalScope *Scope) {
442   if (DD->isLexicalScopeDIENull(Scope))
443     return nullptr;
444 
445   auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block);
446   if (Scope->isAbstractScope())
447     return ScopeDIE;
448 
449   attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
450 
451   return ScopeDIE;
452 }
453 
454 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
455 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, bool Abstract) {
456   auto D = constructVariableDIEImpl(DV, Abstract);
457   DV.setDIE(*D);
458   return D;
459 }
460 
461 DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV,
462                                                 bool Abstract) {
463   // Define variable debug information entry.
464   auto VariableDie = DIE::get(DIEValueAllocator, DV.getTag());
465 
466   if (Abstract) {
467     applyVariableAttributes(DV, *VariableDie);
468     return VariableDie;
469   }
470 
471   // Add variable address.
472 
473   unsigned Offset = DV.getDebugLocListIndex();
474   if (Offset != ~0U) {
475     addLocationList(*VariableDie, dwarf::DW_AT_location, Offset);
476     return VariableDie;
477   }
478 
479   // Check if variable is described by a DBG_VALUE instruction.
480   if (const MachineInstr *DVInsn = DV.getMInsn()) {
481     assert(DVInsn->getNumOperands() == 4);
482     if (DVInsn->getOperand(0).isReg()) {
483       const MachineOperand RegOp = DVInsn->getOperand(0);
484       // If the second operand is an immediate, this is an indirect value.
485       if (DVInsn->getOperand(1).isImm()) {
486         MachineLocation Location(RegOp.getReg(),
487                                  DVInsn->getOperand(1).getImm());
488         addVariableAddress(DV, *VariableDie, Location);
489       } else if (RegOp.getReg())
490         addVariableAddress(DV, *VariableDie, MachineLocation(RegOp.getReg()));
491     } else if (DVInsn->getOperand(0).isImm()) {
492       // This variable is described by a single constant.
493       // Check whether it has a DIExpression.
494       auto *Expr = DV.getSingleExpression();
495       if (Expr && Expr->getNumElements()) {
496         DIELoc *Loc = new (DIEValueAllocator) DIELoc;
497         DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
498         // If there is an expression, emit raw unsigned bytes.
499         DwarfExpr.addFragmentOffset(Expr);
500         DwarfExpr.addUnsignedConstant(DVInsn->getOperand(0).getImm());
501         DwarfExpr.addExpression(Expr);
502         addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
503       } else
504         addConstantValue(*VariableDie, DVInsn->getOperand(0), DV.getType());
505     } else if (DVInsn->getOperand(0).isFPImm())
506       addConstantFPValue(*VariableDie, DVInsn->getOperand(0));
507     else if (DVInsn->getOperand(0).isCImm())
508       addConstantValue(*VariableDie, DVInsn->getOperand(0).getCImm(),
509                        DV.getType());
510 
511     return VariableDie;
512   }
513 
514   // .. else use frame index.
515   if (!DV.hasFrameIndexExprs())
516     return VariableDie;
517 
518   DIELoc *Loc = new (DIEValueAllocator) DIELoc;
519   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
520   for (auto &Fragment : DV.getFrameIndexExprs()) {
521     unsigned FrameReg = 0;
522     const DIExpression *Expr = Fragment.Expr;
523     const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering();
524     int Offset = TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg);
525     DwarfExpr.addFragmentOffset(Expr);
526     SmallVector<uint64_t, 8> Ops;
527     Ops.push_back(dwarf::DW_OP_plus_uconst);
528     Ops.push_back(Offset);
529     Ops.append(Expr->elements_begin(), Expr->elements_end());
530     DIExpressionCursor Cursor(Ops);
531     DwarfExpr.setMemoryLocationKind();
532     DwarfExpr.addMachineRegExpression(
533         *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg);
534     DwarfExpr.addExpression(std::move(Cursor));
535   }
536   addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
537 
538   return VariableDie;
539 }
540 
541 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV,
542                                             const LexicalScope &Scope,
543                                             DIE *&ObjectPointer) {
544   auto Var = constructVariableDIE(DV, Scope.isAbstractScope());
545   if (DV.isObjectPointer())
546     ObjectPointer = Var;
547   return Var;
548 }
549 
550 DIE *DwarfCompileUnit::createScopeChildrenDIE(LexicalScope *Scope,
551                                               SmallVectorImpl<DIE *> &Children,
552                                               bool *HasNonScopeChildren) {
553   assert(Children.empty());
554   DIE *ObjectPointer = nullptr;
555 
556   for (DbgVariable *DV : DU->getScopeVariables().lookup(Scope))
557     Children.push_back(constructVariableDIE(*DV, *Scope, ObjectPointer));
558 
559   // Skip imported directives in gmlt-like data.
560   if (!includeMinimalInlineScopes()) {
561     // There is no need to emit empty lexical block DIE.
562     for (const auto *IE : ImportedEntities[Scope->getScopeNode()])
563       Children.push_back(
564           constructImportedEntityDIE(cast<DIImportedEntity>(IE)));
565   }
566 
567   if (HasNonScopeChildren)
568     *HasNonScopeChildren = !Children.empty();
569 
570   for (LexicalScope *LS : Scope->getChildren())
571     constructScopeDIE(LS, Children);
572 
573   return ObjectPointer;
574 }
575 
576 void DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub, LexicalScope *Scope) {
577   DIE &ScopeDIE = updateSubprogramScopeDIE(Sub);
578 
579   if (Scope) {
580     assert(!Scope->getInlinedAt());
581     assert(!Scope->isAbstractScope());
582     // Collect lexical scope children first.
583     // ObjectPointer might be a local (non-argument) local variable if it's a
584     // block's synthetic this pointer.
585     if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE))
586       addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
587   }
588 
589   // If this is a variadic function, add an unspecified parameter.
590   DITypeRefArray FnArgs = Sub->getType()->getTypeArray();
591 
592   // If we have a single element of null, it is a function that returns void.
593   // If we have more than one elements and the last one is null, it is a
594   // variadic function.
595   if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] &&
596       !includeMinimalInlineScopes())
597     ScopeDIE.addChild(
598         DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters));
599 }
600 
601 DIE *DwarfCompileUnit::createAndAddScopeChildren(LexicalScope *Scope,
602                                                  DIE &ScopeDIE) {
603   // We create children when the scope DIE is not null.
604   SmallVector<DIE *, 8> Children;
605   DIE *ObjectPointer = createScopeChildrenDIE(Scope, Children);
606 
607   // Add children
608   for (auto &I : Children)
609     ScopeDIE.addChild(std::move(I));
610 
611   return ObjectPointer;
612 }
613 
614 void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
615     LexicalScope *Scope) {
616   DIE *&AbsDef = getAbstractSPDies()[Scope->getScopeNode()];
617   if (AbsDef)
618     return;
619 
620   auto *SP = cast<DISubprogram>(Scope->getScopeNode());
621 
622   DIE *ContextDIE;
623 
624   if (includeMinimalInlineScopes())
625     ContextDIE = &getUnitDie();
626   // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
627   // the important distinction that the debug node is not associated with the
628   // DIE (since the debug node will be associated with the concrete DIE, if
629   // any). It could be refactored to some common utility function.
630   else if (auto *SPDecl = SP->getDeclaration()) {
631     ContextDIE = &getUnitDie();
632     getOrCreateSubprogramDIE(SPDecl);
633   } else
634     ContextDIE = getOrCreateContextDIE(resolve(SP->getScope()));
635 
636   // Passing null as the associated node because the abstract definition
637   // shouldn't be found by lookup.
638   AbsDef = &createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
639   applySubprogramAttributesToDefinition(SP, *AbsDef);
640 
641   if (!includeMinimalInlineScopes())
642     addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
643   if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, *AbsDef))
644     addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
645 }
646 
647 DIE *DwarfCompileUnit::constructImportedEntityDIE(
648     const DIImportedEntity *Module) {
649   DIE *IMDie = DIE::get(DIEValueAllocator, (dwarf::Tag)Module->getTag());
650   insertDIE(Module, IMDie);
651   DIE *EntityDie;
652   auto *Entity = resolve(Module->getEntity());
653   if (auto *NS = dyn_cast<DINamespace>(Entity))
654     EntityDie = getOrCreateNameSpace(NS);
655   else if (auto *M = dyn_cast<DIModule>(Entity))
656     EntityDie = getOrCreateModule(M);
657   else if (auto *SP = dyn_cast<DISubprogram>(Entity))
658     EntityDie = getOrCreateSubprogramDIE(SP);
659   else if (auto *T = dyn_cast<DIType>(Entity))
660     EntityDie = getOrCreateTypeDIE(T);
661   else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity))
662     EntityDie = getOrCreateGlobalVariableDIE(GV, {});
663   else
664     EntityDie = getDIE(Entity);
665   assert(EntityDie);
666   auto *File = Module->getFile();
667   addSourceLine(*IMDie, Module->getLine(), File ? File->getFilename() : "",
668                 File ? File->getDirectory() : "");
669   addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
670   StringRef Name = Module->getName();
671   if (!Name.empty())
672     addString(*IMDie, dwarf::DW_AT_name, Name);
673 
674   return IMDie;
675 }
676 
677 void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram *SP) {
678   DIE *D = getDIE(SP);
679   if (DIE *AbsSPDIE = getAbstractSPDies().lookup(SP)) {
680     if (D)
681       // If this subprogram has an abstract definition, reference that
682       addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
683   } else {
684     assert(D || includeMinimalInlineScopes());
685     if (D)
686       // And attach the attributes
687       applySubprogramAttributesToDefinition(SP, *D);
688   }
689 }
690 
691 void DwarfCompileUnit::finishVariableDefinition(const DbgVariable &Var) {
692   DbgVariable *AbsVar = getExistingAbstractVariable(
693       InlinedVariable(Var.getVariable(), Var.getInlinedAt()));
694   auto *VariableDie = Var.getDIE();
695   if (AbsVar && AbsVar->getDIE()) {
696     addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
697                       *AbsVar->getDIE());
698   } else
699     applyVariableAttributes(Var, *VariableDie);
700 }
701 
702 DbgVariable *DwarfCompileUnit::getExistingAbstractVariable(InlinedVariable IV) {
703   const DILocalVariable *Cleansed;
704   return getExistingAbstractVariable(IV, Cleansed);
705 }
706 
707 // Find abstract variable, if any, associated with Var.
708 DbgVariable *DwarfCompileUnit::getExistingAbstractVariable(
709     InlinedVariable IV, const DILocalVariable *&Cleansed) {
710   // More then one inlined variable corresponds to one abstract variable.
711   Cleansed = IV.first;
712   auto &AbstractVariables = getAbstractVariables();
713   auto I = AbstractVariables.find(Cleansed);
714   if (I != AbstractVariables.end())
715     return I->second.get();
716   return nullptr;
717 }
718 
719 void DwarfCompileUnit::createAbstractVariable(const DILocalVariable *Var,
720                                         LexicalScope *Scope) {
721   assert(Scope && Scope->isAbstractScope());
722   auto AbsDbgVariable = make_unique<DbgVariable>(Var, /* IA */ nullptr);
723   DU->addScopeVariable(Scope, AbsDbgVariable.get());
724   getAbstractVariables()[Var] = std::move(AbsDbgVariable);
725 }
726 
727 void DwarfCompileUnit::emitHeader(bool UseOffsets) {
728   // Don't bother labeling the .dwo unit, as its offset isn't used.
729   if (!Skeleton) {
730     LabelBegin = Asm->createTempSymbol("cu_begin");
731     Asm->OutStreamer->EmitLabel(LabelBegin);
732   }
733 
734   dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile
735                                 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton
736                                                       : dwarf::DW_UT_compile;
737   DwarfUnit::emitCommonHeader(UseOffsets, UT);
738 }
739 
740 /// addGlobalName - Add a new global name to the compile unit.
741 void DwarfCompileUnit::addGlobalName(StringRef Name, const DIE &Die,
742                                      const DIScope *Context) {
743   if (!DD->hasDwarfPubSections(includeMinimalInlineScopes()))
744     return;
745   std::string FullName = getParentContextString(Context) + Name.str();
746   GlobalNames[FullName] = &Die;
747 }
748 
749 void DwarfCompileUnit::addGlobalNameForTypeUnit(StringRef Name,
750                                                 const DIScope *Context) {
751   if (!DD->hasDwarfPubSections(includeMinimalInlineScopes()))
752     return;
753   std::string FullName = getParentContextString(Context) + Name.str();
754   // Insert, allowing the entry to remain as-is if it's already present
755   // This way the CU-level type DIE is preferred over the "can't describe this
756   // type as a unit offset because it's not really in the CU at all, it's only
757   // in a type unit"
758   GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie()));
759 }
760 
761 /// Add a new global type to the unit.
762 void DwarfCompileUnit::addGlobalType(const DIType *Ty, const DIE &Die,
763                                      const DIScope *Context) {
764   if (!DD->hasDwarfPubSections(includeMinimalInlineScopes()))
765     return;
766   std::string FullName = getParentContextString(Context) + Ty->getName().str();
767   GlobalTypes[FullName] = &Die;
768 }
769 
770 void DwarfCompileUnit::addGlobalTypeUnitType(const DIType *Ty,
771                                              const DIScope *Context) {
772   if (!DD->hasDwarfPubSections(includeMinimalInlineScopes()))
773     return;
774   std::string FullName = getParentContextString(Context) + Ty->getName().str();
775   // Insert, allowing the entry to remain as-is if it's already present
776   // This way the CU-level type DIE is preferred over the "can't describe this
777   // type as a unit offset because it's not really in the CU at all, it's only
778   // in a type unit"
779   GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie()));
780 }
781 
782 /// addVariableAddress - Add DW_AT_location attribute for a
783 /// DbgVariable based on provided MachineLocation.
784 void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
785                                           MachineLocation Location) {
786   if (DV.hasComplexAddress())
787     addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
788   else if (DV.isBlockByrefVariable())
789     addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
790   else
791     addAddress(Die, dwarf::DW_AT_location, Location);
792 }
793 
794 /// Add an address attribute to a die based on the location provided.
795 void DwarfCompileUnit::addAddress(DIE &Die, dwarf::Attribute Attribute,
796                                   const MachineLocation &Location) {
797   DIELoc *Loc = new (DIEValueAllocator) DIELoc;
798   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
799   if (Location.isIndirect())
800     DwarfExpr.setMemoryLocationKind();
801 
802   SmallVector<uint64_t, 8> Ops;
803   if (Location.isIndirect() && Location.getOffset()) {
804     Ops.push_back(dwarf::DW_OP_plus_uconst);
805     Ops.push_back(Location.getOffset());
806   }
807   DIExpressionCursor Cursor(Ops);
808   const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
809   if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
810     return;
811   DwarfExpr.addExpression(std::move(Cursor));
812 
813   // Now attach the location information to the DIE.
814   addBlock(Die, Attribute, DwarfExpr.finalize());
815 }
816 
817 /// Start with the address based on the location provided, and generate the
818 /// DWARF information necessary to find the actual variable given the extra
819 /// address information encoded in the DbgVariable, starting from the starting
820 /// location.  Add the DWARF information to the die.
821 void DwarfCompileUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,
822                                          dwarf::Attribute Attribute,
823                                          const MachineLocation &Location) {
824   DIELoc *Loc = new (DIEValueAllocator) DIELoc;
825   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
826   const DIExpression *DIExpr = DV.getSingleExpression();
827   DwarfExpr.addFragmentOffset(DIExpr);
828   if (Location.isIndirect())
829     DwarfExpr.setMemoryLocationKind();
830 
831   SmallVector<uint64_t, 8> Ops;
832   if (Location.isIndirect() && Location.getOffset()) {
833     Ops.push_back(dwarf::DW_OP_plus_uconst);
834     Ops.push_back(Location.getOffset());
835   }
836   Ops.append(DIExpr->elements_begin(), DIExpr->elements_end());
837   DIExpressionCursor Cursor(Ops);
838   const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
839   if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
840     return;
841   DwarfExpr.addExpression(std::move(Cursor));
842 
843   // Now attach the location information to the DIE.
844   addBlock(Die, Attribute, DwarfExpr.finalize());
845 }
846 
847 /// Add a Dwarf loclistptr attribute data and value.
848 void DwarfCompileUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute,
849                                        unsigned Index) {
850   dwarf::Form Form = DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
851                                                 : dwarf::DW_FORM_data4;
852   Die.addValue(DIEValueAllocator, Attribute, Form, DIELocList(Index));
853 }
854 
855 void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var,
856                                                DIE &VariableDie) {
857   StringRef Name = Var.getName();
858   if (!Name.empty())
859     addString(VariableDie, dwarf::DW_AT_name, Name);
860   const auto *DIVar = Var.getVariable();
861   if (DIVar)
862     if (uint32_t AlignInBytes = DIVar->getAlignInBytes())
863       addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
864               AlignInBytes);
865 
866   addSourceLine(VariableDie, DIVar);
867   addType(VariableDie, Var.getType());
868   if (Var.isArtificial())
869     addFlag(VariableDie, dwarf::DW_AT_artificial);
870 }
871 
872 /// Add a Dwarf expression attribute data and value.
873 void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form,
874                                const MCExpr *Expr) {
875   Die.addValue(DIEValueAllocator, (dwarf::Attribute)0, Form, DIEExpr(Expr));
876 }
877 
878 void DwarfCompileUnit::applySubprogramAttributesToDefinition(
879     const DISubprogram *SP, DIE &SPDie) {
880   auto *SPDecl = SP->getDeclaration();
881   auto *Context = resolve(SPDecl ? SPDecl->getScope() : SP->getScope());
882   applySubprogramAttributes(SP, SPDie, includeMinimalInlineScopes());
883   addGlobalName(SP->getName(), SPDie, Context);
884 }
885 
886 bool DwarfCompileUnit::isDwoUnit() const {
887   return DD->useSplitDwarf() && Skeleton;
888 }
889 
890 bool DwarfCompileUnit::includeMinimalInlineScopes() const {
891   return getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly ||
892          (DD->useSplitDwarf() && !Skeleton);
893 }
894 } // end llvm namespace
895