1 //===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and 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 "DwarfUnit.h"
15 #include "DwarfAccelTable.h"
16 #include "DwarfCompileUnit.h"
17 #include "DwarfDebug.h"
18 #include "DwarfExpression.h"
19 #include "llvm/ADT/APFloat.h"
20 #include "llvm/CodeGen/MachineFunction.h"
21 #include "llvm/IR/Constants.h"
22 #include "llvm/IR/DIBuilder.h"
23 #include "llvm/IR/DataLayout.h"
24 #include "llvm/IR/GlobalVariable.h"
25 #include "llvm/IR/Instructions.h"
26 #include "llvm/IR/Mangler.h"
27 #include "llvm/MC/MCAsmInfo.h"
28 #include "llvm/MC/MCContext.h"
29 #include "llvm/MC/MCSection.h"
30 #include "llvm/MC/MCStreamer.h"
31 #include "llvm/Support/CommandLine.h"
32 #include "llvm/Target/TargetFrameLowering.h"
33 #include "llvm/Target/TargetLoweringObjectFile.h"
34 #include "llvm/Target/TargetMachine.h"
35 #include "llvm/Target/TargetRegisterInfo.h"
36 #include "llvm/Target/TargetSubtargetInfo.h"
37 
38 using namespace llvm;
39 
40 #define DEBUG_TYPE "dwarfdebug"
41 
42 static cl::opt<bool>
43 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
44                        cl::desc("Generate DWARF4 type units."),
45                        cl::init(false));
46 
DIEDwarfExpression(const AsmPrinter & AP,DwarfUnit & DU,DIELoc & DIE)47 DIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit &DU,
48                                        DIELoc &DIE)
49     : DwarfExpression(*AP.MF->getSubtarget().getRegisterInfo(),
50                       AP.getDwarfDebug()->getDwarfVersion()),
51       AP(AP), DU(DU), DIE(DIE) {}
52 
EmitOp(uint8_t Op,const char * Comment)53 void DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) {
54   DU.addUInt(DIE, dwarf::DW_FORM_data1, Op);
55 }
EmitSigned(int64_t Value)56 void DIEDwarfExpression::EmitSigned(int64_t Value) {
57   DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value);
58 }
EmitUnsigned(uint64_t Value)59 void DIEDwarfExpression::EmitUnsigned(uint64_t Value) {
60   DU.addUInt(DIE, dwarf::DW_FORM_udata, Value);
61 }
isFrameRegister(unsigned MachineReg)62 bool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) {
63   return MachineReg == TRI.getFrameRegister(*AP.MF);
64 }
65 
66 
67 /// Unit - Unit constructor.
DwarfUnit(unsigned UID,dwarf::Tag UnitTag,DICompileUnit Node,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU)68 DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
69                      AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
70     : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
71       DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
72   assert(UnitTag == dwarf::DW_TAG_compile_unit ||
73          UnitTag == dwarf::DW_TAG_type_unit);
74   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
75 }
76 
DwarfTypeUnit(unsigned UID,DwarfCompileUnit & CU,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU,MCDwarfDwoLineTable * SplitLineTable)77 DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
78                              DwarfDebug *DW, DwarfFile *DWU,
79                              MCDwarfDwoLineTable *SplitLineTable)
80     : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
81       CU(CU), SplitLineTable(SplitLineTable) {
82   if (SplitLineTable)
83     addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
84 }
85 
86 /// ~Unit - Destructor for compile unit.
~DwarfUnit()87 DwarfUnit::~DwarfUnit() {
88   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
89     DIEBlocks[j]->~DIEBlock();
90   for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
91     DIELocs[j]->~DIELoc();
92 }
93 
94 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
95 /// information entry.
createDIEEntry(DIE & Entry)96 DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
97   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
98   return Value;
99 }
100 
101 /// getDefaultLowerBound - Return the default lower bound for an array. If the
102 /// DWARF version doesn't handle the language, return -1.
getDefaultLowerBound() const103 int64_t DwarfUnit::getDefaultLowerBound() const {
104   switch (getLanguage()) {
105   default:
106     break;
107 
108   case dwarf::DW_LANG_C89:
109   case dwarf::DW_LANG_C99:
110   case dwarf::DW_LANG_C:
111   case dwarf::DW_LANG_C_plus_plus:
112   case dwarf::DW_LANG_ObjC:
113   case dwarf::DW_LANG_ObjC_plus_plus:
114     return 0;
115 
116   case dwarf::DW_LANG_Fortran77:
117   case dwarf::DW_LANG_Fortran90:
118   case dwarf::DW_LANG_Fortran95:
119     return 1;
120 
121   // The languages below have valid values only if the DWARF version >= 4.
122   case dwarf::DW_LANG_Java:
123   case dwarf::DW_LANG_Python:
124   case dwarf::DW_LANG_UPC:
125   case dwarf::DW_LANG_D:
126     if (dwarf::DWARF_VERSION >= 4)
127       return 0;
128     break;
129 
130   case dwarf::DW_LANG_Ada83:
131   case dwarf::DW_LANG_Ada95:
132   case dwarf::DW_LANG_Cobol74:
133   case dwarf::DW_LANG_Cobol85:
134   case dwarf::DW_LANG_Modula2:
135   case dwarf::DW_LANG_Pascal83:
136   case dwarf::DW_LANG_PLI:
137     if (dwarf::DWARF_VERSION >= 4)
138       return 1;
139     break;
140 
141   // The languages below have valid values only if the DWARF version >= 5.
142   case dwarf::DW_LANG_OpenCL:
143   case dwarf::DW_LANG_Go:
144   case dwarf::DW_LANG_Haskell:
145   case dwarf::DW_LANG_C_plus_plus_03:
146   case dwarf::DW_LANG_C_plus_plus_11:
147   case dwarf::DW_LANG_OCaml:
148   case dwarf::DW_LANG_Rust:
149   case dwarf::DW_LANG_C11:
150   case dwarf::DW_LANG_Swift:
151   case dwarf::DW_LANG_Dylan:
152   case dwarf::DW_LANG_C_plus_plus_14:
153     if (dwarf::DWARF_VERSION >= 5)
154       return 0;
155     break;
156 
157   case dwarf::DW_LANG_Modula3:
158   case dwarf::DW_LANG_Julia:
159   case dwarf::DW_LANG_Fortran03:
160   case dwarf::DW_LANG_Fortran08:
161     if (dwarf::DWARF_VERSION >= 5)
162       return 1;
163     break;
164   }
165 
166   return -1;
167 }
168 
169 /// Check whether the DIE for this MDNode can be shared across CUs.
isShareableAcrossCUs(DIDescriptor D)170 static bool isShareableAcrossCUs(DIDescriptor D) {
171   // When the MDNode can be part of the type system, the DIE can be shared
172   // across CUs.
173   // Combining type units and cross-CU DIE sharing is lower value (since
174   // cross-CU DIE sharing is used in LTO and removes type redundancy at that
175   // level already) but may be implementable for some value in projects
176   // building multiple independent libraries with LTO and then linking those
177   // together.
178   return (isa<MDType>(D) ||
179           (isa<MDSubprogram>(D) && !cast<MDSubprogram>(D)->isDefinition())) &&
180          !GenerateDwarfTypeUnits;
181 }
182 
183 /// getDIE - Returns the debug information entry map slot for the
184 /// specified debug variable. We delegate the request to DwarfDebug
185 /// when the DIE for this MDNode can be shared across CUs. The mappings
186 /// will be kept in DwarfDebug for shareable DIEs.
getDIE(DIDescriptor D) const187 DIE *DwarfUnit::getDIE(DIDescriptor D) const {
188   if (isShareableAcrossCUs(D))
189     return DU->getDIE(D);
190   return MDNodeToDieMap.lookup(D);
191 }
192 
193 /// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
194 /// when the DIE for this MDNode can be shared across CUs. The mappings
195 /// will be kept in DwarfDebug for shareable DIEs.
insertDIE(DIDescriptor Desc,DIE * D)196 void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
197   if (isShareableAcrossCUs(Desc)) {
198     DU->insertDIE(Desc, D);
199     return;
200   }
201   MDNodeToDieMap.insert(std::make_pair(Desc, D));
202 }
203 
204 /// addFlag - Add a flag that is true.
addFlag(DIE & Die,dwarf::Attribute Attribute)205 void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
206   if (DD->getDwarfVersion() >= 4)
207     Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
208   else
209     Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
210 }
211 
212 /// addUInt - Add an unsigned integer attribute data and value.
213 ///
addUInt(DIE & Die,dwarf::Attribute Attribute,Optional<dwarf::Form> Form,uint64_t Integer)214 void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
215                         Optional<dwarf::Form> Form, uint64_t Integer) {
216   if (!Form)
217     Form = DIEInteger::BestForm(false, Integer);
218   DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
219                         DIEInteger(Integer);
220   Die.addValue(Attribute, *Form, Value);
221 }
222 
addUInt(DIE & Block,dwarf::Form Form,uint64_t Integer)223 void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
224   addUInt(Block, (dwarf::Attribute)0, Form, Integer);
225 }
226 
227 /// addSInt - Add an signed integer attribute data and value.
228 ///
addSInt(DIE & Die,dwarf::Attribute Attribute,Optional<dwarf::Form> Form,int64_t Integer)229 void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
230                         Optional<dwarf::Form> Form, int64_t Integer) {
231   if (!Form)
232     Form = DIEInteger::BestForm(true, Integer);
233   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
234   Die.addValue(Attribute, *Form, Value);
235 }
236 
addSInt(DIELoc & Die,Optional<dwarf::Form> Form,int64_t Integer)237 void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
238                         int64_t Integer) {
239   addSInt(Die, (dwarf::Attribute)0, Form, Integer);
240 }
241 
242 /// addString - Add a string attribute data and value. We always emit a
243 /// reference to the string pool instead of immediate strings so that DIEs have
244 /// more predictable sizes. In the case of split dwarf we emit an index
245 /// into another table which gets us the static offset into the string
246 /// table.
addString(DIE & Die,dwarf::Attribute Attribute,StringRef String)247 void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
248                           StringRef String) {
249   if (!isDwoUnit())
250     return addLocalString(Die, Attribute, String);
251 
252   addIndexedString(Die, Attribute, String);
253 }
254 
addIndexedString(DIE & Die,dwarf::Attribute Attribute,StringRef String)255 void DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute,
256                                  StringRef String) {
257   unsigned idx = DU->getStringPool().getIndex(*Asm, String);
258   DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
259   DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
260   Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
261 }
262 
263 /// addLocalString - Add a string attribute data and value. This is guaranteed
264 /// to be in the local string pool instead of indirected.
addLocalString(DIE & Die,dwarf::Attribute Attribute,StringRef String)265 void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
266                                StringRef String) {
267   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
268   MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
269   DIEValue *Value;
270   if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
271     Value = new (DIEValueAllocator) DIELabel(Symb);
272   else
273     Value = new (DIEValueAllocator)
274         DIEDelta(Symb, TLOF.getDwarfStrSection()->getBeginSymbol());
275   DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
276   Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
277 }
278 
279 /// addLabel - Add a Dwarf label attribute data and value.
280 ///
addLabel(DIE & Die,dwarf::Attribute Attribute,dwarf::Form Form,const MCSymbol * Label)281 void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
282                          const MCSymbol *Label) {
283   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
284   Die.addValue(Attribute, Form, Value);
285 }
286 
addLabel(DIELoc & Die,dwarf::Form Form,const MCSymbol * Label)287 void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
288   addLabel(Die, (dwarf::Attribute)0, Form, Label);
289 }
290 
291 /// addSectionOffset - Add an offset into a section attribute data and value.
292 ///
addSectionOffset(DIE & Die,dwarf::Attribute Attribute,uint64_t Integer)293 void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
294                                  uint64_t Integer) {
295   if (DD->getDwarfVersion() >= 4)
296     addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
297   else
298     addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
299 }
300 
getOrCreateSourceID(StringRef FileName,StringRef DirName)301 unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
302   return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
303                         : getCU().getOrCreateSourceID(FileName, DirName);
304 }
305 
306 /// addOpAddress - Add a dwarf op address data and value using the
307 /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
308 ///
addOpAddress(DIELoc & Die,const MCSymbol * Sym)309 void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
310   if (!DD->useSplitDwarf()) {
311     addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
312     addLabel(Die, dwarf::DW_FORM_udata, Sym);
313   } else {
314     addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
315     addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
316             DD->getAddressPool().getIndex(Sym));
317   }
318 }
319 
addLabelDelta(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Hi,const MCSymbol * Lo)320 void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
321                               const MCSymbol *Hi, const MCSymbol *Lo) {
322   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
323   Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
324 }
325 
326 /// addDIEEntry - Add a DIE attribute data and value.
327 ///
addDIEEntry(DIE & Die,dwarf::Attribute Attribute,DIE & Entry)328 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
329   addDIEEntry(Die, Attribute, createDIEEntry(Entry));
330 }
331 
addDIETypeSignature(DIE & Die,const DwarfTypeUnit & Type)332 void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
333   // Flag the type unit reference as a declaration so that if it contains
334   // members (implicit special members, static data member definitions, member
335   // declarations for definitions in this CU, etc) consumers don't get confused
336   // and think this is a full definition.
337   addFlag(Die, dwarf::DW_AT_declaration);
338 
339   Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
340                new (DIEValueAllocator) DIETypeSignature(Type));
341 }
342 
addDIEEntry(DIE & Die,dwarf::Attribute Attribute,DIEEntry * Entry)343 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
344                             DIEEntry *Entry) {
345   const DIE *DieCU = Die.getUnitOrNull();
346   const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
347   if (!DieCU)
348     // We assume that Die belongs to this CU, if it is not linked to any CU yet.
349     DieCU = &getUnitDie();
350   if (!EntryCU)
351     EntryCU = &getUnitDie();
352   Die.addValue(Attribute,
353                EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
354                Entry);
355 }
356 
357 /// Create a DIE with the given Tag, add the DIE to its parent, and
358 /// call insertDIE if MD is not null.
createAndAddDIE(unsigned Tag,DIE & Parent,DIDescriptor N)359 DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
360   assert(Tag != dwarf::DW_TAG_auto_variable &&
361          Tag != dwarf::DW_TAG_arg_variable);
362   Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
363   DIE &Die = *Parent.getChildren().back();
364   if (N)
365     insertDIE(N, &Die);
366   return Die;
367 }
368 
369 /// addBlock - Add block data.
370 ///
addBlock(DIE & Die,dwarf::Attribute Attribute,DIELoc * Loc)371 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
372   Loc->ComputeSize(Asm);
373   DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
374   Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
375 }
376 
addBlock(DIE & Die,dwarf::Attribute Attribute,DIEBlock * Block)377 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
378                          DIEBlock *Block) {
379   Block->ComputeSize(Asm);
380   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
381   Die.addValue(Attribute, Block->BestForm(), Block);
382 }
383 
384 /// addSourceLine - Add location information to specified debug information
385 /// entry.
addSourceLine(DIE & Die,unsigned Line,StringRef File,StringRef Directory)386 void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
387                               StringRef Directory) {
388   if (Line == 0)
389     return;
390 
391   unsigned FileID = getOrCreateSourceID(File, Directory);
392   assert(FileID && "Invalid file id");
393   addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
394   addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
395 }
396 
397 /// addSourceLine - Add location information to specified debug information
398 /// entry.
addSourceLine(DIE & Die,DIVariable V)399 void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
400   assert(V);
401 
402   addSourceLine(Die, V->getLine(), V->getScope()->getFilename(),
403                 V->getScope()->getDirectory());
404 }
405 
406 /// addSourceLine - Add location information to specified debug information
407 /// entry.
addSourceLine(DIE & Die,DIGlobalVariable G)408 void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
409   assert(G);
410 
411   addSourceLine(Die, G->getLine(), G->getFilename(), G->getDirectory());
412 }
413 
414 /// addSourceLine - Add location information to specified debug information
415 /// entry.
addSourceLine(DIE & Die,DISubprogram SP)416 void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
417   assert(SP);
418 
419   addSourceLine(Die, SP->getLine(), SP->getFilename(), SP->getDirectory());
420 }
421 
422 /// addSourceLine - Add location information to specified debug information
423 /// entry.
addSourceLine(DIE & Die,DIType Ty)424 void DwarfUnit::addSourceLine(DIE &Die, DIType Ty) {
425   assert(Ty);
426 
427   addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory());
428 }
429 
430 /// addSourceLine - Add location information to specified debug information
431 /// entry.
addSourceLine(DIE & Die,DIObjCProperty Ty)432 void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
433   assert(Ty);
434 
435   addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory());
436 }
437 
438 /// addSourceLine - Add location information to specified debug information
439 /// entry.
addSourceLine(DIE & Die,DINameSpace NS)440 void DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
441   addSourceLine(Die, NS->getLine(), NS->getFilename(), NS->getDirectory());
442 }
443 
444 /// addRegisterOp - Add register operand.
addRegisterOpPiece(DIELoc & TheDie,unsigned Reg,unsigned SizeInBits,unsigned OffsetInBits)445 bool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
446                                    unsigned SizeInBits, unsigned OffsetInBits) {
447   DIEDwarfExpression Expr(*Asm, *this, TheDie);
448   Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits);
449   return true;
450 }
451 
452 /// addRegisterOffset - Add register offset.
addRegisterOffset(DIELoc & TheDie,unsigned Reg,int64_t Offset)453 bool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
454                                   int64_t Offset) {
455   DIEDwarfExpression Expr(*Asm, *this, TheDie);
456   return Expr.AddMachineRegIndirect(Reg, Offset);
457 }
458 
459 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
460    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
461    gives the variable VarName either the struct, or a pointer to the struct, as
462    its type.  This is necessary for various behind-the-scenes things the
463    compiler needs to do with by-reference variables in Blocks.
464 
465    However, as far as the original *programmer* is concerned, the variable
466    should still have type 'SomeType', as originally declared.
467 
468    The function getBlockByrefType dives into the __Block_byref_x_VarName
469    struct to find the original type of the variable, which is then assigned to
470    the variable's Debug Information Entry as its real type.  So far, so good.
471    However now the debugger will expect the variable VarName to have the type
472    SomeType.  So we need the location attribute for the variable to be an
473    expression that explains to the debugger how to navigate through the
474    pointers and struct to find the actual variable of type SomeType.
475 
476    The following function does just that.  We start by getting
477    the "normal" location for the variable. This will be the location
478    of either the struct __Block_byref_x_VarName or the pointer to the
479    struct __Block_byref_x_VarName.
480 
481    The struct will look something like:
482 
483    struct __Block_byref_x_VarName {
484      ... <various fields>
485      struct __Block_byref_x_VarName *forwarding;
486      ... <various other fields>
487      SomeType VarName;
488      ... <maybe more fields>
489    };
490 
491    If we are given the struct directly (as our starting point) we
492    need to tell the debugger to:
493 
494    1).  Add the offset of the forwarding field.
495 
496    2).  Follow that pointer to get the real __Block_byref_x_VarName
497    struct to use (the real one may have been copied onto the heap).
498 
499    3).  Add the offset for the field VarName, to find the actual variable.
500 
501    If we started with a pointer to the struct, then we need to
502    dereference that pointer first, before the other steps.
503    Translating this into DWARF ops, we will need to append the following
504    to the current location description for the variable:
505 
506    DW_OP_deref                    -- optional, if we start with a pointer
507    DW_OP_plus_uconst <forward_fld_offset>
508    DW_OP_deref
509    DW_OP_plus_uconst <varName_fld_offset>
510 
511    That is what this function does.  */
512 
513 /// addBlockByrefAddress - Start with the address based on the location
514 /// provided, and generate the DWARF information necessary to find the
515 /// actual Block variable (navigating the Block struct) based on the
516 /// starting location.  Add the DWARF information to the die.  For
517 /// more information, read large comment just above here.
518 ///
addBlockByrefAddress(const DbgVariable & DV,DIE & Die,dwarf::Attribute Attribute,const MachineLocation & Location)519 void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
520                                      dwarf::Attribute Attribute,
521                                      const MachineLocation &Location) {
522   DIType Ty = DV.getType();
523   DIType TmpTy = Ty;
524   uint16_t Tag = Ty->getTag();
525   bool isPointer = false;
526 
527   StringRef varName = DV.getName();
528 
529   if (Tag == dwarf::DW_TAG_pointer_type) {
530     DIDerivedType DTy = cast<MDDerivedType>(Ty);
531     TmpTy = resolve(DTy->getBaseType());
532     isPointer = true;
533   }
534 
535   // Find the __forwarding field and the variable field in the __Block_byref
536   // struct.
537   DIArray Fields = cast<MDCompositeTypeBase>(TmpTy)->getElements();
538   DIDerivedType varField;
539   DIDerivedType forwardingField;
540 
541   for (unsigned i = 0, N = Fields.size(); i < N; ++i) {
542     DIDerivedType DT = cast<MDDerivedTypeBase>(Fields[i]);
543     StringRef fieldName = DT->getName();
544     if (fieldName == "__forwarding")
545       forwardingField = DT;
546     else if (fieldName == varName)
547       varField = DT;
548   }
549 
550   // Get the offsets for the forwarding field and the variable field.
551   unsigned forwardingFieldOffset = forwardingField->getOffsetInBits() >> 3;
552   unsigned varFieldOffset = varField->getOffsetInBits() >> 2;
553 
554   // Decode the original location, and use that as the start of the byref
555   // variable's location.
556   DIELoc *Loc = new (DIEValueAllocator) DIELoc();
557 
558   bool validReg;
559   if (Location.isReg())
560     validReg = addRegisterOpPiece(*Loc, Location.getReg());
561   else
562     validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
563 
564   if (!validReg)
565     return;
566 
567   // If we started with a pointer to the __Block_byref... struct, then
568   // the first thing we need to do is dereference the pointer (DW_OP_deref).
569   if (isPointer)
570     addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
571 
572   // Next add the offset for the '__forwarding' field:
573   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
574   // adding the offset if it's 0.
575   if (forwardingFieldOffset > 0) {
576     addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
577     addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
578   }
579 
580   // Now dereference the __forwarding field to get to the real __Block_byref
581   // struct:  DW_OP_deref.
582   addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
583 
584   // Now that we've got the real __Block_byref... struct, add the offset
585   // for the variable's field to get to the location of the actual variable:
586   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
587   if (varFieldOffset > 0) {
588     addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
589     addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
590   }
591 
592   // Now attach the location information to the DIE.
593   addBlock(Die, Attribute, Loc);
594 }
595 
596 /// Return true if type encoding is unsigned.
isUnsignedDIType(DwarfDebug * DD,DIType Ty)597 static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
598   if (DIDerivedType DTy = dyn_cast<MDDerivedTypeBase>(Ty)) {
599     dwarf::Tag T = (dwarf::Tag)Ty->getTag();
600     // Encode pointer constants as unsigned bytes. This is used at least for
601     // null pointer constant emission.
602     // (Pieces of) aggregate types that get hacked apart by SROA may also be
603     // represented by a constant. Encode them as unsigned bytes.
604     // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
605     // here, but accept them for now due to a bug in SROA producing bogus
606     // dbg.values.
607     if (T == dwarf::DW_TAG_array_type ||
608         T == dwarf::DW_TAG_class_type ||
609         T == dwarf::DW_TAG_pointer_type ||
610         T == dwarf::DW_TAG_ptr_to_member_type ||
611         T == dwarf::DW_TAG_reference_type ||
612         T == dwarf::DW_TAG_rvalue_reference_type ||
613         T == dwarf::DW_TAG_structure_type ||
614         T == dwarf::DW_TAG_union_type)
615       return true;
616     assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
617            T == dwarf::DW_TAG_volatile_type ||
618            T == dwarf::DW_TAG_restrict_type ||
619            T == dwarf::DW_TAG_enumeration_type);
620     if (DITypeRef Deriv = DTy->getBaseType())
621       return isUnsignedDIType(DD, DD->resolve(Deriv));
622     // FIXME: Enums without a fixed underlying type have unknown signedness
623     // here, leading to incorrectly emitted constants.
624     assert(DTy->getTag() == dwarf::DW_TAG_enumeration_type);
625     return false;
626   }
627 
628   DIBasicType BTy = cast<MDBasicType>(Ty);
629   unsigned Encoding = BTy->getEncoding();
630   assert((Encoding == dwarf::DW_ATE_unsigned ||
631           Encoding == dwarf::DW_ATE_unsigned_char ||
632           Encoding == dwarf::DW_ATE_signed ||
633           Encoding == dwarf::DW_ATE_signed_char ||
634           Encoding == dwarf::DW_ATE_float || Encoding == dwarf::DW_ATE_UTF ||
635           Encoding == dwarf::DW_ATE_boolean ||
636           (Ty->getTag() == dwarf::DW_TAG_unspecified_type &&
637            Ty->getName() == "decltype(nullptr)")) &&
638          "Unsupported encoding");
639   return Encoding == dwarf::DW_ATE_unsigned ||
640          Encoding == dwarf::DW_ATE_unsigned_char ||
641          Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
642          Ty->getTag() == dwarf::DW_TAG_unspecified_type;
643 }
644 
645 /// If this type is derived from a base type then return base type size.
getBaseTypeSize(DwarfDebug * DD,DIDerivedType Ty)646 static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
647   unsigned Tag = Ty->getTag();
648 
649   if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
650       Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
651       Tag != dwarf::DW_TAG_restrict_type)
652     return Ty->getSizeInBits();
653 
654   auto *BaseType = DD->resolve(Ty->getBaseType());
655 
656   assert(BaseType && "Unexpected invalid base type");
657 
658   // If this is a derived type, go ahead and get the base type, unless it's a
659   // reference then it's just the size of the field. Pointer types have no need
660   // of this since they're a different type of qualification on the type.
661   if (BaseType->getTag() == dwarf::DW_TAG_reference_type ||
662       BaseType->getTag() == dwarf::DW_TAG_rvalue_reference_type)
663     return Ty->getSizeInBits();
664 
665   if (auto *DT = dyn_cast<MDDerivedTypeBase>(BaseType))
666     return getBaseTypeSize(DD, DT);
667 
668   return BaseType->getSizeInBits();
669 }
670 
671 /// addConstantFPValue - Add constant value entry in variable DIE.
addConstantFPValue(DIE & Die,const MachineOperand & MO)672 void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
673   assert(MO.isFPImm() && "Invalid machine operand!");
674   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
675   APFloat FPImm = MO.getFPImm()->getValueAPF();
676 
677   // Get the raw data form of the floating point.
678   const APInt FltVal = FPImm.bitcastToAPInt();
679   const char *FltPtr = (const char *)FltVal.getRawData();
680 
681   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
682   bool LittleEndian = Asm->getDataLayout().isLittleEndian();
683   int Incr = (LittleEndian ? 1 : -1);
684   int Start = (LittleEndian ? 0 : NumBytes - 1);
685   int Stop = (LittleEndian ? NumBytes : -1);
686 
687   // Output the constant to DWARF one byte at a time.
688   for (; Start != Stop; Start += Incr)
689     addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
690 
691   addBlock(Die, dwarf::DW_AT_const_value, Block);
692 }
693 
694 /// addConstantFPValue - Add constant value entry in variable DIE.
addConstantFPValue(DIE & Die,const ConstantFP * CFP)695 void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
696   // Pass this down to addConstantValue as an unsigned bag of bits.
697   addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
698 }
699 
700 /// addConstantValue - Add constant value entry in variable DIE.
addConstantValue(DIE & Die,const ConstantInt * CI,DIType Ty)701 void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
702   addConstantValue(Die, CI->getValue(), Ty);
703 }
704 
705 /// addConstantValue - Add constant value entry in variable DIE.
addConstantValue(DIE & Die,const MachineOperand & MO,DIType Ty)706 void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
707                                  DIType Ty) {
708   assert(MO.isImm() && "Invalid machine operand!");
709 
710   addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
711 }
712 
addConstantValue(DIE & Die,bool Unsigned,uint64_t Val)713 void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
714   // FIXME: This is a bit conservative/simple - it emits negative values always
715   // sign extended to 64 bits rather than minimizing the number of bytes.
716   addUInt(Die, dwarf::DW_AT_const_value,
717           Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
718 }
719 
addConstantValue(DIE & Die,const APInt & Val,DIType Ty)720 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
721   addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
722 }
723 
724 // addConstantValue - Add constant value entry in variable DIE.
addConstantValue(DIE & Die,const APInt & Val,bool Unsigned)725 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
726   unsigned CIBitWidth = Val.getBitWidth();
727   if (CIBitWidth <= 64) {
728     addConstantValue(Die, Unsigned,
729                      Unsigned ? Val.getZExtValue() : Val.getSExtValue());
730     return;
731   }
732 
733   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
734 
735   // Get the raw data form of the large APInt.
736   const uint64_t *Ptr64 = Val.getRawData();
737 
738   int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
739   bool LittleEndian = Asm->getDataLayout().isLittleEndian();
740 
741   // Output the constant to DWARF one byte at a time.
742   for (int i = 0; i < NumBytes; i++) {
743     uint8_t c;
744     if (LittleEndian)
745       c = Ptr64[i / 8] >> (8 * (i & 7));
746     else
747       c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
748     addUInt(*Block, dwarf::DW_FORM_data1, c);
749   }
750 
751   addBlock(Die, dwarf::DW_AT_const_value, Block);
752 }
753 
754 // Add a linkage name to the DIE.
addLinkageName(DIE & Die,StringRef LinkageName)755 void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
756   if (!LinkageName.empty())
757     addString(Die,
758               DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
759                                          : dwarf::DW_AT_MIPS_linkage_name,
760               GlobalValue::getRealLinkageName(LinkageName));
761 }
762 
763 /// addTemplateParams - Add template parameters into buffer.
addTemplateParams(DIE & Buffer,DIArray TParams)764 void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
765   // Add template parameters.
766   for (unsigned i = 0, e = TParams.size(); i != e; ++i) {
767     DIDescriptor Element = TParams[i];
768     if (auto *TTP = dyn_cast<MDTemplateTypeParameter>(Element))
769       constructTemplateTypeParameterDIE(Buffer, TTP);
770     else if (auto *TVP = dyn_cast<MDTemplateValueParameter>(Element))
771       constructTemplateValueParameterDIE(Buffer, TVP);
772   }
773 }
774 
775 /// getOrCreateContextDIE - Get context owner's DIE.
getOrCreateContextDIE(DIScope Context)776 DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
777   if (!Context || isa<MDFile>(Context))
778     return &getUnitDie();
779   if (auto *T = dyn_cast<MDType>(Context))
780     return getOrCreateTypeDIE(T);
781   if (auto *NS = dyn_cast<MDNamespace>(Context))
782     return getOrCreateNameSpace(NS);
783   if (auto *SP = dyn_cast<MDSubprogram>(Context))
784     return getOrCreateSubprogramDIE(SP);
785   return getDIE(Context);
786 }
787 
createTypeDIE(DICompositeType Ty)788 DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
789   DIScope Context = resolve(Ty->getScope());
790   DIE *ContextDIE = getOrCreateContextDIE(Context);
791 
792   if (DIE *TyDIE = getDIE(Ty))
793     return TyDIE;
794 
795   // Create new type.
796   DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
797 
798   constructTypeDIE(TyDIE, Ty);
799 
800   updateAcceleratorTables(Context, Ty, TyDIE);
801   return &TyDIE;
802 }
803 
804 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
805 /// given DIType.
getOrCreateTypeDIE(const MDNode * TyNode)806 DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
807   if (!TyNode)
808     return nullptr;
809 
810   auto *Ty = cast<MDType>(TyNode);
811   assert(Ty == resolve(Ty->getRef()) &&
812          "type was not uniqued, possible ODR violation.");
813 
814   // DW_TAG_restrict_type is not supported in DWARF2
815   if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
816     return getOrCreateTypeDIE(
817         resolve(DITypeRef(cast<MDDerivedType>(Ty)->getBaseType())));
818 
819   // Construct the context before querying for the existence of the DIE in case
820   // such construction creates the DIE.
821   DIScope Context = resolve(Ty->getScope());
822   DIE *ContextDIE = getOrCreateContextDIE(Context);
823   assert(ContextDIE);
824 
825   if (DIE *TyDIE = getDIE(Ty))
826     return TyDIE;
827 
828   // Create new type.
829   DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
830 
831   updateAcceleratorTables(Context, Ty, TyDIE);
832 
833   if (auto *BT = dyn_cast<MDBasicType>(Ty))
834     constructTypeDIE(TyDIE, BT);
835   else if (DICompositeType CTy = dyn_cast<MDCompositeTypeBase>(Ty)) {
836     if (GenerateDwarfTypeUnits && !Ty->isForwardDecl())
837       if (MDString *TypeId = CTy->getRawIdentifier()) {
838         DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
839         // Skip updating the accelerator tables since this is not the full type.
840         return &TyDIE;
841       }
842     constructTypeDIE(TyDIE, CTy);
843   } else {
844     constructTypeDIE(TyDIE, cast<MDDerivedType>(Ty));
845   }
846 
847   return &TyDIE;
848 }
849 
updateAcceleratorTables(DIScope Context,DIType Ty,const DIE & TyDIE)850 void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
851                                         const DIE &TyDIE) {
852   if (!Ty->getName().empty() && !Ty->isForwardDecl()) {
853     bool IsImplementation = 0;
854     if (auto *CT = dyn_cast<MDCompositeTypeBase>(Ty)) {
855       // A runtime language of 0 actually means C/C++ and that any
856       // non-negative value is some version of Objective-C/C++.
857       IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete();
858     }
859     unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
860     DD->addAccelType(Ty->getName(), TyDIE, Flags);
861 
862     if (!Context || isa<MDCompileUnit>(Context) || isa<MDFile>(Context) ||
863         isa<MDNamespace>(Context))
864       addGlobalType(Ty, TyDIE, Context);
865   }
866 }
867 
868 /// addType - Add a new type attribute to the specified entity.
addType(DIE & Entity,DIType Ty,dwarf::Attribute Attribute)869 void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
870   assert(Ty && "Trying to add a type that doesn't exist?");
871 
872   // Check for pre-existence.
873   DIEEntry *Entry = getDIEEntry(Ty);
874   // If it exists then use the existing value.
875   if (Entry) {
876     addDIEEntry(Entity, Attribute, Entry);
877     return;
878   }
879 
880   // Construct type.
881   DIE *Buffer = getOrCreateTypeDIE(Ty);
882 
883   // Set up proxy.
884   Entry = createDIEEntry(*Buffer);
885   insertDIEEntry(Ty, Entry);
886   addDIEEntry(Entity, Attribute, Entry);
887 }
888 
889 /// getParentContextString - Walks the metadata parent chain in a language
890 /// specific manner (using the compile unit language) and returns
891 /// it as a string. This is done at the metadata level because DIEs may
892 /// not currently have been added to the parent context and walking the
893 /// DIEs looking for names is more expensive than walking the metadata.
getParentContextString(DIScope Context) const894 std::string DwarfUnit::getParentContextString(DIScope Context) const {
895   if (!Context)
896     return "";
897 
898   // FIXME: Decide whether to implement this for non-C++ languages.
899   if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
900     return "";
901 
902   std::string CS;
903   SmallVector<DIScope, 1> Parents;
904   while (!isa<MDCompileUnit>(Context)) {
905     Parents.push_back(Context);
906     if (Context->getScope())
907       Context = resolve(Context->getScope());
908     else
909       // Structure, etc types will have a NULL context if they're at the top
910       // level.
911       break;
912   }
913 
914   // Reverse iterate over our list to go from the outermost construct to the
915   // innermost.
916   for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
917                                                   E = Parents.rend();
918        I != E; ++I) {
919     const MDScope *Ctx = *I;
920     StringRef Name = Ctx->getName();
921     if (Name.empty() && isa<MDNamespace>(Ctx))
922       Name = "(anonymous namespace)";
923     if (!Name.empty()) {
924       CS += Name;
925       CS += "::";
926     }
927   }
928   return CS;
929 }
930 
931 /// constructTypeDIE - Construct basic type die from DIBasicType.
constructTypeDIE(DIE & Buffer,DIBasicType BTy)932 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
933   // Get core information.
934   StringRef Name = BTy->getName();
935   // Add name if not anonymous or intermediate type.
936   if (!Name.empty())
937     addString(Buffer, dwarf::DW_AT_name, Name);
938 
939   // An unspecified type only has a name attribute.
940   if (BTy->getTag() == dwarf::DW_TAG_unspecified_type)
941     return;
942 
943   addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
944           BTy->getEncoding());
945 
946   uint64_t Size = BTy->getSizeInBits() >> 3;
947   addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
948 }
949 
950 /// constructTypeDIE - Construct derived type die from DIDerivedType.
constructTypeDIE(DIE & Buffer,DIDerivedType DTy)951 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
952   // Get core information.
953   StringRef Name = DTy->getName();
954   uint64_t Size = DTy->getSizeInBits() >> 3;
955   uint16_t Tag = Buffer.getTag();
956 
957   // Map to main type, void will not have a type.
958   DIType FromTy = resolve(DTy->getBaseType());
959   if (FromTy)
960     addType(Buffer, FromTy);
961 
962   // Add name if not anonymous or intermediate type.
963   if (!Name.empty())
964     addString(Buffer, dwarf::DW_AT_name, Name);
965 
966   // Add size if non-zero (derived types might be zero-sized.)
967   if (Size && Tag != dwarf::DW_TAG_pointer_type
968            && Tag != dwarf::DW_TAG_ptr_to_member_type)
969     addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
970 
971   if (Tag == dwarf::DW_TAG_ptr_to_member_type)
972     addDIEEntry(
973         Buffer, dwarf::DW_AT_containing_type,
974         *getOrCreateTypeDIE(resolve(cast<MDDerivedType>(DTy)->getClassType())));
975   // Add source line info if available and TyDesc is not a forward declaration.
976   if (!DTy->isForwardDecl())
977     addSourceLine(Buffer, DTy);
978 }
979 
980 /// constructSubprogramArguments - Construct function argument DIEs.
constructSubprogramArguments(DIE & Buffer,DITypeArray Args)981 void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
982   for (unsigned i = 1, N = Args.size(); i < N; ++i) {
983     DIType Ty = resolve(Args[i]);
984     if (!Ty) {
985       assert(i == N-1 && "Unspecified parameter must be the last argument");
986       createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
987     } else {
988       DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
989       addType(Arg, Ty);
990       if (Ty->isArtificial())
991         addFlag(Arg, dwarf::DW_AT_artificial);
992     }
993   }
994 }
995 
996 /// constructTypeDIE - Construct type DIE from DICompositeType.
constructTypeDIE(DIE & Buffer,DICompositeType CTy)997 void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
998   // Add name if not anonymous or intermediate type.
999   StringRef Name = CTy->getName();
1000 
1001   uint64_t Size = CTy->getSizeInBits() >> 3;
1002   uint16_t Tag = Buffer.getTag();
1003 
1004   switch (Tag) {
1005   case dwarf::DW_TAG_array_type:
1006     constructArrayTypeDIE(Buffer, CTy);
1007     break;
1008   case dwarf::DW_TAG_enumeration_type:
1009     constructEnumTypeDIE(Buffer, CTy);
1010     break;
1011   case dwarf::DW_TAG_subroutine_type: {
1012     // Add return type. A void return won't have a type.
1013     auto Elements = cast<MDSubroutineType>(CTy)->getTypeArray();
1014     if (Elements.size())
1015       if (auto RTy = resolve(Elements[0]))
1016         addType(Buffer, RTy);
1017 
1018     bool isPrototyped = true;
1019     if (Elements.size() == 2 && !Elements[1])
1020       isPrototyped = false;
1021 
1022     constructSubprogramArguments(Buffer, Elements);
1023 
1024     // Add prototype flag if we're dealing with a C language and the
1025     // function has been prototyped.
1026     uint16_t Language = getLanguage();
1027     if (isPrototyped &&
1028         (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
1029          Language == dwarf::DW_LANG_ObjC))
1030       addFlag(Buffer, dwarf::DW_AT_prototyped);
1031 
1032     if (CTy->isLValueReference())
1033       addFlag(Buffer, dwarf::DW_AT_reference);
1034 
1035     if (CTy->isRValueReference())
1036       addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
1037   } break;
1038   case dwarf::DW_TAG_structure_type:
1039   case dwarf::DW_TAG_union_type:
1040   case dwarf::DW_TAG_class_type: {
1041     // Add elements to structure type.
1042     DIArray Elements = CTy->getElements();
1043     for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1044       DIDescriptor Element = Elements[i];
1045       if (!Element)
1046         continue;
1047       if (auto *SP = dyn_cast<MDSubprogram>(Element))
1048         getOrCreateSubprogramDIE(SP);
1049       else if (DIDerivedType DDTy = dyn_cast<MDDerivedTypeBase>(Element)) {
1050         if (DDTy->getTag() == dwarf::DW_TAG_friend) {
1051           DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
1052           addType(ElemDie, resolve(DDTy->getBaseType()), dwarf::DW_AT_friend);
1053         } else if (DDTy->isStaticMember()) {
1054           getOrCreateStaticMemberDIE(DDTy);
1055         } else {
1056           constructMemberDIE(Buffer, DDTy);
1057         }
1058       } else if (DIObjCProperty Property = dyn_cast<MDObjCProperty>(Element)) {
1059         DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer);
1060         StringRef PropertyName = Property->getName();
1061         addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1062         if (Property->getType())
1063           addType(ElemDie, Property->getType());
1064         addSourceLine(ElemDie, Property);
1065         StringRef GetterName = Property->getGetterName();
1066         if (!GetterName.empty())
1067           addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1068         StringRef SetterName = Property->getSetterName();
1069         if (!SetterName.empty())
1070           addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1071         if (unsigned PropertyAttributes = Property->getAttributes())
1072           addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
1073                   PropertyAttributes);
1074 
1075         DIEEntry *Entry = getDIEEntry(Element);
1076         if (!Entry) {
1077           Entry = createDIEEntry(ElemDie);
1078           insertDIEEntry(Element, Entry);
1079         }
1080       }
1081     }
1082 
1083     if (CTy->isAppleBlockExtension())
1084       addFlag(Buffer, dwarf::DW_AT_APPLE_block);
1085 
1086     // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
1087     // inside C++ composite types to point to the base class with the vtable.
1088     if (DICompositeType ContainingType =
1089             dyn_cast_or_null<MDCompositeType>(resolve(CTy->getVTableHolder())))
1090       addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
1091                   *getOrCreateTypeDIE(ContainingType));
1092 
1093     if (CTy->isObjcClassComplete())
1094       addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1095 
1096     // Add template parameters to a class, structure or union types.
1097     // FIXME: The support isn't in the metadata for this yet.
1098     if (Tag == dwarf::DW_TAG_class_type ||
1099         Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1100       addTemplateParams(Buffer, CTy->getTemplateParams());
1101 
1102     break;
1103   }
1104   default:
1105     break;
1106   }
1107 
1108   // Add name if not anonymous or intermediate type.
1109   if (!Name.empty())
1110     addString(Buffer, dwarf::DW_AT_name, Name);
1111 
1112   if (Tag == dwarf::DW_TAG_enumeration_type ||
1113       Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
1114       Tag == dwarf::DW_TAG_union_type) {
1115     // Add size if non-zero (derived types might be zero-sized.)
1116     // TODO: Do we care about size for enum forward declarations?
1117     if (Size)
1118       addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
1119     else if (!CTy->isForwardDecl())
1120       // Add zero size if it is not a forward declaration.
1121       addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
1122 
1123     // If we're a forward decl, say so.
1124     if (CTy->isForwardDecl())
1125       addFlag(Buffer, dwarf::DW_AT_declaration);
1126 
1127     // Add source line info if available.
1128     if (!CTy->isForwardDecl())
1129       addSourceLine(Buffer, CTy);
1130 
1131     // No harm in adding the runtime language to the declaration.
1132     unsigned RLang = CTy->getRuntimeLang();
1133     if (RLang)
1134       addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1135               RLang);
1136   }
1137 }
1138 
1139 /// constructTemplateTypeParameterDIE - Construct new DIE for the given
1140 /// DITemplateTypeParameter.
constructTemplateTypeParameterDIE(DIE & Buffer,DITemplateTypeParameter TP)1141 void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1142                                                   DITemplateTypeParameter TP) {
1143   DIE &ParamDIE =
1144       createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
1145   // Add the type if it exists, it could be void and therefore no type.
1146   if (TP->getType())
1147     addType(ParamDIE, resolve(TP->getType()));
1148   if (!TP->getName().empty())
1149     addString(ParamDIE, dwarf::DW_AT_name, TP->getName());
1150 }
1151 
1152 /// constructTemplateValueParameterDIE - Construct new DIE for the given
1153 /// DITemplateValueParameter.
1154 void
constructTemplateValueParameterDIE(DIE & Buffer,DITemplateValueParameter VP)1155 DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1156                                               DITemplateValueParameter VP) {
1157   DIE &ParamDIE = createAndAddDIE(VP->getTag(), Buffer);
1158 
1159   // Add the type if there is one, template template and template parameter
1160   // packs will not have a type.
1161   if (VP->getTag() == dwarf::DW_TAG_template_value_parameter)
1162     addType(ParamDIE, resolve(VP->getType()));
1163   if (!VP->getName().empty())
1164     addString(ParamDIE, dwarf::DW_AT_name, VP->getName());
1165   if (Metadata *Val = VP->getValue()) {
1166     if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
1167       addConstantValue(ParamDIE, CI, resolve(VP->getType()));
1168     else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
1169       // For declaration non-type template parameters (such as global values and
1170       // functions)
1171       DIELoc *Loc = new (DIEValueAllocator) DIELoc();
1172       addOpAddress(*Loc, Asm->getSymbol(GV));
1173       // Emit DW_OP_stack_value to use the address as the immediate value of the
1174       // parameter, rather than a pointer to it.
1175       addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1176       addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
1177     } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1178       assert(isa<MDString>(Val));
1179       addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1180                 cast<MDString>(Val)->getString());
1181     } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1182       addTemplateParams(ParamDIE, cast<MDTuple>(Val));
1183     }
1184   }
1185 }
1186 
1187 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
getOrCreateNameSpace(DINameSpace NS)1188 DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
1189   // Construct the context before querying for the existence of the DIE in case
1190   // such construction creates the DIE.
1191   DIE *ContextDIE = getOrCreateContextDIE(NS->getScope());
1192 
1193   if (DIE *NDie = getDIE(NS))
1194     return NDie;
1195   DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1196 
1197   StringRef Name = NS->getName();
1198   if (!Name.empty())
1199     addString(NDie, dwarf::DW_AT_name, NS->getName());
1200   else
1201     Name = "(anonymous namespace)";
1202   DD->addAccelNamespace(Name, NDie);
1203   addGlobalName(Name, NDie, NS->getScope());
1204   addSourceLine(NDie, NS);
1205   return &NDie;
1206 }
1207 
1208 /// getOrCreateSubprogramDIE - Create new DIE using SP.
getOrCreateSubprogramDIE(DISubprogram SP,bool Minimal)1209 DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
1210   // Construct the context before querying for the existence of the DIE in case
1211   // such construction creates the DIE (as is the case for member function
1212   // declarations).
1213   DIE *ContextDIE =
1214       Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope()));
1215 
1216   if (DIE *SPDie = getDIE(SP))
1217     return SPDie;
1218 
1219   if (auto *SPDecl = SP->getDeclaration()) {
1220     if (!Minimal) {
1221       // Add subprogram definitions to the CU die directly.
1222       ContextDIE = &getUnitDie();
1223       // Build the decl now to ensure it precedes the definition.
1224       getOrCreateSubprogramDIE(SPDecl);
1225     }
1226   }
1227 
1228   // DW_TAG_inlined_subroutine may refer to this DIE.
1229   DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
1230 
1231   // Stop here and fill this in later, depending on whether or not this
1232   // subprogram turns out to have inlined instances or not.
1233   if (SP->isDefinition())
1234     return &SPDie;
1235 
1236   applySubprogramAttributes(SP, SPDie);
1237   return &SPDie;
1238 }
1239 
applySubprogramDefinitionAttributes(DISubprogram SP,DIE & SPDie)1240 bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
1241                                                     DIE &SPDie) {
1242   DIE *DeclDie = nullptr;
1243   StringRef DeclLinkageName;
1244   if (auto *SPDecl = SP->getDeclaration()) {
1245     DeclDie = getDIE(SPDecl);
1246     assert(DeclDie && "This DIE should've already been constructed when the "
1247                       "definition DIE was created in "
1248                       "getOrCreateSubprogramDIE");
1249     DeclLinkageName = SPDecl->getLinkageName();
1250   }
1251 
1252   // Add function template parameters.
1253   addTemplateParams(SPDie, SP->getTemplateParams());
1254 
1255   // Add the linkage name if we have one and it isn't in the Decl.
1256   StringRef LinkageName = SP->getLinkageName();
1257   assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1258           LinkageName == DeclLinkageName) &&
1259          "decl has a linkage name and it is different");
1260   if (DeclLinkageName.empty())
1261     addLinkageName(SPDie, LinkageName);
1262 
1263   if (!DeclDie)
1264     return false;
1265 
1266   // Refer to the function declaration where all the other attributes will be
1267   // found.
1268   addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1269   return true;
1270 }
1271 
applySubprogramAttributes(DISubprogram SP,DIE & SPDie,bool Minimal)1272 void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
1273                                           bool Minimal) {
1274   if (!Minimal)
1275     if (applySubprogramDefinitionAttributes(SP, SPDie))
1276       return;
1277 
1278   // Constructors and operators for anonymous aggregates do not have names.
1279   if (!SP->getName().empty())
1280     addString(SPDie, dwarf::DW_AT_name, SP->getName());
1281 
1282   // Skip the rest of the attributes under -gmlt to save space.
1283   if (Minimal)
1284     return;
1285 
1286   addSourceLine(SPDie, SP);
1287 
1288   // Add the prototype if we have a prototype and we have a C like
1289   // language.
1290   uint16_t Language = getLanguage();
1291   if (SP->isPrototyped() &&
1292       (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
1293        Language == dwarf::DW_LANG_ObjC))
1294     addFlag(SPDie, dwarf::DW_AT_prototyped);
1295 
1296   DISubroutineType SPTy = SP->getType();
1297   assert(SPTy->getTag() == dwarf::DW_TAG_subroutine_type &&
1298          "the type of a subprogram should be a subroutine");
1299 
1300   auto Args = SPTy->getTypeArray();
1301   // Add a return type. If this is a type like a C/C++ void type we don't add a
1302   // return type.
1303   if (Args.size())
1304     if (auto Ty = resolve(Args[0]))
1305       addType(SPDie, Ty);
1306 
1307   unsigned VK = SP->getVirtuality();
1308   if (VK) {
1309     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1310     DIELoc *Block = getDIELoc();
1311     addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1312     addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
1313     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
1314     ContainingTypeMap.insert(
1315         std::make_pair(&SPDie, resolve(SP->getContainingType())));
1316   }
1317 
1318   if (!SP->isDefinition()) {
1319     addFlag(SPDie, dwarf::DW_AT_declaration);
1320 
1321     // Add arguments. Do not add arguments for subprogram definition. They will
1322     // be handled while processing variables.
1323     constructSubprogramArguments(SPDie, Args);
1324   }
1325 
1326   if (SP->isArtificial())
1327     addFlag(SPDie, dwarf::DW_AT_artificial);
1328 
1329   if (!SP->isLocalToUnit())
1330     addFlag(SPDie, dwarf::DW_AT_external);
1331 
1332   if (SP->isOptimized())
1333     addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1334 
1335   if (unsigned isa = Asm->getISAEncoding())
1336     addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1337 
1338   if (SP->isLValueReference())
1339     addFlag(SPDie, dwarf::DW_AT_reference);
1340 
1341   if (SP->isRValueReference())
1342     addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1343 
1344   if (SP->isProtected())
1345     addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1346             dwarf::DW_ACCESS_protected);
1347   else if (SP->isPrivate())
1348     addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1349             dwarf::DW_ACCESS_private);
1350   else if (SP->isPublic())
1351     addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1352             dwarf::DW_ACCESS_public);
1353 
1354   if (SP->isExplicit())
1355     addFlag(SPDie, dwarf::DW_AT_explicit);
1356 }
1357 
1358 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
constructSubrangeDIE(DIE & Buffer,DISubrange SR,DIE * IndexTy)1359 void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
1360   DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
1361   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
1362 
1363   // The LowerBound value defines the lower bounds which is typically zero for
1364   // C/C++. The Count value is the number of elements.  Values are 64 bit. If
1365   // Count == -1 then the array is unbounded and we do not emit
1366   // DW_AT_lower_bound and DW_AT_count attributes.
1367   int64_t LowerBound = SR->getLowerBound();
1368   int64_t DefaultLowerBound = getDefaultLowerBound();
1369   int64_t Count = SR->getCount();
1370 
1371   if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1372     addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
1373 
1374   if (Count != -1)
1375     // FIXME: An unbounded array should reference the expression that defines
1376     // the array.
1377     addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
1378 }
1379 
getIndexTyDie()1380 DIE *DwarfUnit::getIndexTyDie() {
1381   if (IndexTyDie)
1382     return IndexTyDie;
1383   // Construct an integer type to use for indexes.
1384   IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
1385   addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype");
1386   addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1387   addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1388           dwarf::DW_ATE_unsigned);
1389   return IndexTyDie;
1390 }
1391 
1392 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
constructArrayTypeDIE(DIE & Buffer,DICompositeType CTy)1393 void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
1394   if (CTy->isVector())
1395     addFlag(Buffer, dwarf::DW_AT_GNU_vector);
1396 
1397   // Emit the element type.
1398   addType(Buffer, resolve(CTy->getBaseType()));
1399 
1400   // Get an anonymous type for index type.
1401   // FIXME: This type should be passed down from the front end
1402   // as different languages may have different sizes for indexes.
1403   DIE *IdxTy = getIndexTyDie();
1404 
1405   // Add subranges to array type.
1406   DIArray Elements = CTy->getElements();
1407   for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1408     // FIXME: Should this really be such a loose cast?
1409     if (auto *Element = dyn_cast_or_null<DebugNode>(Elements[i]))
1410       if (Element->getTag() == dwarf::DW_TAG_subrange_type)
1411         constructSubrangeDIE(Buffer, cast<MDSubrange>(Element), IdxTy);
1412   }
1413 }
1414 
1415 /// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
constructEnumTypeDIE(DIE & Buffer,DICompositeType CTy)1416 void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
1417   DIArray Elements = CTy->getElements();
1418 
1419   // Add enumerators to enumeration type.
1420   for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1421     auto *Enum = dyn_cast_or_null<MDEnumerator>(Elements[i]);
1422     if (Enum) {
1423       DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
1424       StringRef Name = Enum->getName();
1425       addString(Enumerator, dwarf::DW_AT_name, Name);
1426       int64_t Value = Enum->getValue();
1427       addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1428               Value);
1429     }
1430   }
1431   DIType DTy = resolve(CTy->getBaseType());
1432   if (DTy) {
1433     addType(Buffer, DTy);
1434     addFlag(Buffer, dwarf::DW_AT_enum_class);
1435   }
1436 }
1437 
1438 /// constructContainingTypeDIEs - Construct DIEs for types that contain
1439 /// vtables.
constructContainingTypeDIEs()1440 void DwarfUnit::constructContainingTypeDIEs() {
1441   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1442                                                  CE = ContainingTypeMap.end();
1443        CI != CE; ++CI) {
1444     DIE &SPDie = *CI->first;
1445     DIDescriptor D(CI->second);
1446     if (!D)
1447       continue;
1448     DIE *NDie = getDIE(D);
1449     if (!NDie)
1450       continue;
1451     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
1452   }
1453 }
1454 
1455 /// constructMemberDIE - Construct member DIE from DIDerivedType.
constructMemberDIE(DIE & Buffer,DIDerivedType DT_)1456 void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT_) {
1457   // Downcast to MDDerivedType.
1458   const MDDerivedType *DT = cast<MDDerivedType>(DT_);
1459 
1460   DIE &MemberDie = createAndAddDIE(DT->getTag(), Buffer);
1461   StringRef Name = DT->getName();
1462   if (!Name.empty())
1463     addString(MemberDie, dwarf::DW_AT_name, Name);
1464 
1465   addType(MemberDie, resolve(DT->getBaseType()));
1466 
1467   addSourceLine(MemberDie, DT);
1468 
1469   if (DT->getTag() == dwarf::DW_TAG_inheritance && DT->isVirtual()) {
1470 
1471     // For C++, virtual base classes are not at fixed offset. Use following
1472     // expression to extract appropriate offset from vtable.
1473     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1474 
1475     DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
1476     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1477     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1478     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1479     addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT->getOffsetInBits());
1480     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1481     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1482     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1483 
1484     addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
1485   } else {
1486     uint64_t Size = DT->getSizeInBits();
1487     uint64_t FieldSize = getBaseTypeSize(DD, DT);
1488     uint64_t OffsetInBytes;
1489 
1490     if (FieldSize && Size != FieldSize) {
1491       // Handle bitfield, assume bytes are 8 bits.
1492       addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1493       addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
1494 
1495       uint64_t Offset = DT->getOffsetInBits();
1496       uint64_t AlignMask = ~(DT->getAlignInBits() - 1);
1497       uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1498       uint64_t FieldOffset = (HiMark - FieldSize);
1499       Offset -= FieldOffset;
1500 
1501       // Maybe we need to work from the other end.
1502       if (Asm->getDataLayout().isLittleEndian())
1503         Offset = FieldSize - (Offset + Size);
1504       addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1505 
1506       // Here DW_AT_data_member_location points to the anonymous
1507       // field that includes this bit field.
1508       OffsetInBytes = FieldOffset >> 3;
1509     } else
1510       // This is not a bitfield.
1511       OffsetInBytes = DT->getOffsetInBits() >> 3;
1512 
1513     if (DD->getDwarfVersion() <= 2) {
1514       DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
1515       addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1516       addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
1517       addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1518     } else
1519       addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1520               OffsetInBytes);
1521   }
1522 
1523   if (DT->isProtected())
1524     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1525             dwarf::DW_ACCESS_protected);
1526   else if (DT->isPrivate())
1527     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1528             dwarf::DW_ACCESS_private);
1529   // Otherwise C++ member and base classes are considered public.
1530   else if (DT->isPublic())
1531     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1532             dwarf::DW_ACCESS_public);
1533   if (DT->isVirtual())
1534     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1535             dwarf::DW_VIRTUALITY_virtual);
1536 
1537   // Objective-C properties.
1538   if (MDNode *PNode = DT->getObjCProperty())
1539     if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1540       MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1541                          PropertyDie);
1542 
1543   if (DT->isArtificial())
1544     addFlag(MemberDie, dwarf::DW_AT_artificial);
1545 }
1546 
1547 /// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
getOrCreateStaticMemberDIE(DIDerivedType DT_)1548 DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT_) {
1549   const MDDerivedType *DT = cast_or_null<MDDerivedType>(DT_);
1550   if (!DT)
1551     return nullptr;
1552 
1553   // Construct the context before querying for the existence of the DIE in case
1554   // such construction creates the DIE.
1555   DIE *ContextDIE = getOrCreateContextDIE(resolve(DT->getScope()));
1556   assert(dwarf::isType(ContextDIE->getTag()) &&
1557          "Static member should belong to a type.");
1558 
1559   if (DIE *StaticMemberDIE = getDIE(DT))
1560     return StaticMemberDIE;
1561 
1562   DIE &StaticMemberDIE = createAndAddDIE(DT->getTag(), *ContextDIE, DT);
1563 
1564   DIType Ty = resolve(DT->getBaseType());
1565 
1566   addString(StaticMemberDIE, dwarf::DW_AT_name, DT->getName());
1567   addType(StaticMemberDIE, Ty);
1568   addSourceLine(StaticMemberDIE, DT);
1569   addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1570   addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1571 
1572   // FIXME: We could omit private if the parent is a class_type, and
1573   // public if the parent is something else.
1574   if (DT->isProtected())
1575     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1576             dwarf::DW_ACCESS_protected);
1577   else if (DT->isPrivate())
1578     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1579             dwarf::DW_ACCESS_private);
1580   else if (DT->isPublic())
1581     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1582             dwarf::DW_ACCESS_public);
1583 
1584   if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant()))
1585     addConstantValue(StaticMemberDIE, CI, Ty);
1586   if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant()))
1587     addConstantFPValue(StaticMemberDIE, CFP);
1588 
1589   return &StaticMemberDIE;
1590 }
1591 
emitHeader(bool UseOffsets)1592 void DwarfUnit::emitHeader(bool UseOffsets) {
1593   // Emit size of content not including length itself
1594   Asm->OutStreamer.AddComment("Length of Unit");
1595   Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
1596 
1597   Asm->OutStreamer.AddComment("DWARF version number");
1598   Asm->EmitInt16(DD->getDwarfVersion());
1599   Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1600 
1601   // We share one abbreviations table across all units so it's always at the
1602   // start of the section. Use a relocatable offset where needed to ensure
1603   // linking doesn't invalidate that offset.
1604   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1605   if (!UseOffsets)
1606     Asm->emitSectionOffset(TLOF.getDwarfAbbrevSection()->getBeginSymbol());
1607   else
1608     Asm->EmitInt32(0);
1609 
1610   Asm->OutStreamer.AddComment("Address Size (in bytes)");
1611   Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1612 }
1613 
initSection(const MCSection * Section)1614 void DwarfUnit::initSection(const MCSection *Section) {
1615   assert(!this->Section);
1616   this->Section = Section;
1617 }
1618 
emitHeader(bool UseOffsets)1619 void DwarfTypeUnit::emitHeader(bool UseOffsets) {
1620   DwarfUnit::emitHeader(UseOffsets);
1621   Asm->OutStreamer.AddComment("Type Signature");
1622   Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1623   Asm->OutStreamer.AddComment("Type DIE Offset");
1624   // In a skeleton type unit there is no type DIE so emit a zero offset.
1625   Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1626                                 sizeof(Ty->getOffset()));
1627 }
1628 
isDwoUnit() const1629 bool DwarfTypeUnit::isDwoUnit() const {
1630   // Since there are no skeleton type units, all type units are dwo type units
1631   // when split DWARF is being used.
1632   return DD->useSplitDwarf();
1633 }
1634