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 "DwarfDebug.h"
17 #include "llvm/ADT/APFloat.h"
18 #include "llvm/IR/Constants.h"
19 #include "llvm/IR/DIBuilder.h"
20 #include "llvm/IR/DataLayout.h"
21 #include "llvm/IR/GlobalVariable.h"
22 #include "llvm/IR/Instructions.h"
23 #include "llvm/IR/Mangler.h"
24 #include "llvm/MC/MCAsmInfo.h"
25 #include "llvm/MC/MCContext.h"
26 #include "llvm/MC/MCSection.h"
27 #include "llvm/MC/MCStreamer.h"
28 #include "llvm/Support/CommandLine.h"
29 #include "llvm/Target/TargetFrameLowering.h"
30 #include "llvm/Target/TargetLoweringObjectFile.h"
31 #include "llvm/Target/TargetMachine.h"
32 #include "llvm/Target/TargetRegisterInfo.h"
33
34 using namespace llvm;
35
36 #define DEBUG_TYPE "dwarfdebug"
37
38 static cl::opt<bool>
39 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
40 cl::desc("Generate DWARF4 type units."),
41 cl::init(false));
42
43 /// Unit - Unit constructor.
DwarfUnit(unsigned UID,dwarf::Tag UnitTag,DICompileUnit Node,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU)44 DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
45 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
46 : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
47 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr),
48 Skeleton(nullptr) {
49 assert(UnitTag == dwarf::DW_TAG_compile_unit ||
50 UnitTag == dwarf::DW_TAG_type_unit);
51 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
52 }
53
DwarfCompileUnit(unsigned UID,DICompileUnit Node,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU)54 DwarfCompileUnit::DwarfCompileUnit(unsigned UID, DICompileUnit Node,
55 AsmPrinter *A, DwarfDebug *DW,
56 DwarfFile *DWU)
57 : DwarfUnit(UID, dwarf::DW_TAG_compile_unit, Node, A, DW, DWU) {
58 insertDIE(Node, &getUnitDie());
59 }
60
DwarfTypeUnit(unsigned UID,DwarfCompileUnit & CU,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU,MCDwarfDwoLineTable * SplitLineTable)61 DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
62 DwarfDebug *DW, DwarfFile *DWU,
63 MCDwarfDwoLineTable *SplitLineTable)
64 : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
65 CU(CU), SplitLineTable(SplitLineTable) {
66 if (SplitLineTable)
67 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
68 }
69
70 /// ~Unit - Destructor for compile unit.
~DwarfUnit()71 DwarfUnit::~DwarfUnit() {
72 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
73 DIEBlocks[j]->~DIEBlock();
74 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
75 DIELocs[j]->~DIELoc();
76 }
77
78 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
79 /// information entry.
createDIEEntry(DIE & Entry)80 DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
81 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
82 return Value;
83 }
84
85 /// getDefaultLowerBound - Return the default lower bound for an array. If the
86 /// DWARF version doesn't handle the language, return -1.
getDefaultLowerBound() const87 int64_t DwarfUnit::getDefaultLowerBound() const {
88 switch (getLanguage()) {
89 default:
90 break;
91
92 case dwarf::DW_LANG_C89:
93 case dwarf::DW_LANG_C99:
94 case dwarf::DW_LANG_C:
95 case dwarf::DW_LANG_C_plus_plus:
96 case dwarf::DW_LANG_ObjC:
97 case dwarf::DW_LANG_ObjC_plus_plus:
98 return 0;
99
100 case dwarf::DW_LANG_Fortran77:
101 case dwarf::DW_LANG_Fortran90:
102 case dwarf::DW_LANG_Fortran95:
103 return 1;
104
105 // The languages below have valid values only if the DWARF version >= 4.
106 case dwarf::DW_LANG_Java:
107 case dwarf::DW_LANG_Python:
108 case dwarf::DW_LANG_UPC:
109 case dwarf::DW_LANG_D:
110 if (dwarf::DWARF_VERSION >= 4)
111 return 0;
112 break;
113
114 case dwarf::DW_LANG_Ada83:
115 case dwarf::DW_LANG_Ada95:
116 case dwarf::DW_LANG_Cobol74:
117 case dwarf::DW_LANG_Cobol85:
118 case dwarf::DW_LANG_Modula2:
119 case dwarf::DW_LANG_Pascal83:
120 case dwarf::DW_LANG_PLI:
121 if (dwarf::DWARF_VERSION >= 4)
122 return 1;
123 break;
124 }
125
126 return -1;
127 }
128
129 /// Check whether the DIE for this MDNode can be shared across CUs.
isShareableAcrossCUs(DIDescriptor D)130 static bool isShareableAcrossCUs(DIDescriptor D) {
131 // When the MDNode can be part of the type system, the DIE can be shared
132 // across CUs.
133 // Combining type units and cross-CU DIE sharing is lower value (since
134 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
135 // level already) but may be implementable for some value in projects
136 // building multiple independent libraries with LTO and then linking those
137 // together.
138 return (D.isType() ||
139 (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
140 !GenerateDwarfTypeUnits;
141 }
142
143 /// getDIE - Returns the debug information entry map slot for the
144 /// specified debug variable. We delegate the request to DwarfDebug
145 /// when the DIE for this MDNode can be shared across CUs. The mappings
146 /// will be kept in DwarfDebug for shareable DIEs.
getDIE(DIDescriptor D) const147 DIE *DwarfUnit::getDIE(DIDescriptor D) const {
148 if (isShareableAcrossCUs(D))
149 return DD->getDIE(D);
150 return MDNodeToDieMap.lookup(D);
151 }
152
153 /// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
154 /// when the DIE for this MDNode can be shared across CUs. The mappings
155 /// will be kept in DwarfDebug for shareable DIEs.
insertDIE(DIDescriptor Desc,DIE * D)156 void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
157 if (isShareableAcrossCUs(Desc)) {
158 DD->insertDIE(Desc, D);
159 return;
160 }
161 MDNodeToDieMap.insert(std::make_pair(Desc, D));
162 }
163
164 /// addFlag - Add a flag that is true.
addFlag(DIE & Die,dwarf::Attribute Attribute)165 void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
166 if (DD->getDwarfVersion() >= 4)
167 Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
168 else
169 Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
170 }
171
172 /// addUInt - Add an unsigned integer attribute data and value.
173 ///
addUInt(DIE & Die,dwarf::Attribute Attribute,Optional<dwarf::Form> Form,uint64_t Integer)174 void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
175 Optional<dwarf::Form> Form, uint64_t Integer) {
176 if (!Form)
177 Form = DIEInteger::BestForm(false, Integer);
178 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
179 DIEInteger(Integer);
180 Die.addValue(Attribute, *Form, Value);
181 }
182
addUInt(DIE & Block,dwarf::Form Form,uint64_t Integer)183 void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
184 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
185 }
186
187 /// addSInt - Add an signed integer attribute data and value.
188 ///
addSInt(DIE & Die,dwarf::Attribute Attribute,Optional<dwarf::Form> Form,int64_t Integer)189 void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
190 Optional<dwarf::Form> Form, int64_t Integer) {
191 if (!Form)
192 Form = DIEInteger::BestForm(true, Integer);
193 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
194 Die.addValue(Attribute, *Form, Value);
195 }
196
addSInt(DIELoc & Die,Optional<dwarf::Form> Form,int64_t Integer)197 void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
198 int64_t Integer) {
199 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
200 }
201
202 /// addString - Add a string attribute data and value. We always emit a
203 /// reference to the string pool instead of immediate strings so that DIEs have
204 /// more predictable sizes. In the case of split dwarf we emit an index
205 /// into another table which gets us the static offset into the string
206 /// table.
addString(DIE & Die,dwarf::Attribute Attribute,StringRef String)207 void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
208 StringRef String) {
209
210 if (!DD->useSplitDwarf())
211 return addLocalString(Die, Attribute, String);
212
213 unsigned idx = DU->getStringPool().getIndex(*Asm, String);
214 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
215 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
216 Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
217 }
218
219 /// addLocalString - Add a string attribute data and value. This is guaranteed
220 /// to be in the local string pool instead of indirected.
addLocalString(DIE & Die,dwarf::Attribute Attribute,StringRef String)221 void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
222 StringRef String) {
223 MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
224 DIEValue *Value;
225 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
226 Value = new (DIEValueAllocator) DIELabel(Symb);
227 else {
228 MCSymbol *StringPool = DU->getStringPool().getSectionSymbol();
229 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
230 }
231 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
232 Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
233 }
234
235 /// addExpr - Add a Dwarf expression attribute data and value.
236 ///
addExpr(DIELoc & Die,dwarf::Form Form,const MCExpr * Expr)237 void DwarfUnit::addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr) {
238 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
239 Die.addValue((dwarf::Attribute)0, Form, Value);
240 }
241
242 /// addLocationList - Add a Dwarf loclistptr attribute data and value.
243 ///
addLocationList(DIE & Die,dwarf::Attribute Attribute,unsigned Index)244 void DwarfUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute,
245 unsigned Index) {
246 DIEValue *Value = new (DIEValueAllocator) DIELocList(Index);
247 dwarf::Form Form = DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
248 : dwarf::DW_FORM_data4;
249 Die.addValue(Attribute, Form, Value);
250 }
251
252 /// addLabel - Add a Dwarf label attribute data and value.
253 ///
addLabel(DIE & Die,dwarf::Attribute Attribute,dwarf::Form Form,const MCSymbol * Label)254 void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
255 const MCSymbol *Label) {
256 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
257 Die.addValue(Attribute, Form, Value);
258 }
259
addLabel(DIELoc & Die,dwarf::Form Form,const MCSymbol * Label)260 void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
261 addLabel(Die, (dwarf::Attribute)0, Form, Label);
262 }
263
264 /// addSectionLabel - Add a Dwarf section label attribute data and value.
265 ///
addSectionLabel(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Label)266 void DwarfUnit::addSectionLabel(DIE &Die, dwarf::Attribute Attribute,
267 const MCSymbol *Label) {
268 if (DD->getDwarfVersion() >= 4)
269 addLabel(Die, Attribute, dwarf::DW_FORM_sec_offset, Label);
270 else
271 addLabel(Die, Attribute, dwarf::DW_FORM_data4, Label);
272 }
273
274 /// addSectionOffset - Add an offset into a section attribute data and value.
275 ///
addSectionOffset(DIE & Die,dwarf::Attribute Attribute,uint64_t Integer)276 void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
277 uint64_t Integer) {
278 if (DD->getDwarfVersion() >= 4)
279 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
280 else
281 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
282 }
283
284 /// addLabelAddress - Add a dwarf label attribute data and value using
285 /// DW_FORM_addr or DW_FORM_GNU_addr_index.
286 ///
addLabelAddress(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Label)287 void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute,
288 const MCSymbol *Label) {
289
290 if (!DD->useSplitDwarf())
291 return addLocalLabelAddress(Die, Attribute, Label);
292
293 if (Label)
294 DD->addArangeLabel(SymbolCU(this, Label));
295
296 unsigned idx = DD->getAddressPool().getIndex(Label);
297 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
298 Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
299 }
300
addLocalLabelAddress(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Label)301 void DwarfCompileUnit::addLocalLabelAddress(DIE &Die,
302 dwarf::Attribute Attribute,
303 const MCSymbol *Label) {
304 if (Label)
305 DD->addArangeLabel(SymbolCU(this, Label));
306
307 Die.addValue(Attribute, dwarf::DW_FORM_addr,
308 Label ? (DIEValue *)new (DIEValueAllocator) DIELabel(Label)
309 : new (DIEValueAllocator) DIEInteger(0));
310 }
311
getOrCreateSourceID(StringRef FileName,StringRef DirName)312 unsigned DwarfCompileUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
313 // If we print assembly, we can't separate .file entries according to
314 // compile units. Thus all files will belong to the default compile unit.
315
316 // FIXME: add a better feature test than hasRawTextSupport. Even better,
317 // extend .file to support this.
318 return Asm->OutStreamer.EmitDwarfFileDirective(
319 0, DirName, FileName,
320 Asm->OutStreamer.hasRawTextSupport() ? 0 : getUniqueID());
321 }
322
getOrCreateSourceID(StringRef FileName,StringRef DirName)323 unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
324 return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
325 : getCU().getOrCreateSourceID(FileName, DirName);
326 }
327
328 /// addOpAddress - Add a dwarf op address data and value using the
329 /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
330 ///
addOpAddress(DIELoc & Die,const MCSymbol * Sym)331 void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
332 if (!DD->useSplitDwarf()) {
333 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
334 addLabel(Die, dwarf::DW_FORM_udata, Sym);
335 } else {
336 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
337 addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
338 DD->getAddressPool().getIndex(Sym));
339 }
340 }
341
342 /// addSectionDelta - Add a section label delta attribute data and value.
343 ///
addSectionDelta(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Hi,const MCSymbol * Lo)344 void DwarfUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute,
345 const MCSymbol *Hi, const MCSymbol *Lo) {
346 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
347 Die.addValue(Attribute, DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
348 : dwarf::DW_FORM_data4,
349 Value);
350 }
351
addLabelDelta(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Hi,const MCSymbol * Lo)352 void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
353 const MCSymbol *Hi, const MCSymbol *Lo) {
354 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
355 Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
356 }
357
358 /// addDIEEntry - Add a DIE attribute data and value.
359 ///
addDIEEntry(DIE & Die,dwarf::Attribute Attribute,DIE & Entry)360 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
361 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
362 }
363
addDIETypeSignature(DIE & Die,const DwarfTypeUnit & Type)364 void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
365 // Flag the type unit reference as a declaration so that if it contains
366 // members (implicit special members, static data member definitions, member
367 // declarations for definitions in this CU, etc) consumers don't get confused
368 // and think this is a full definition.
369 addFlag(Die, dwarf::DW_AT_declaration);
370
371 Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
372 new (DIEValueAllocator) DIETypeSignature(Type));
373 }
374
addDIEEntry(DIE & Die,dwarf::Attribute Attribute,DIEEntry * Entry)375 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
376 DIEEntry *Entry) {
377 const DIE *DieCU = Die.getUnitOrNull();
378 const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
379 if (!DieCU)
380 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
381 DieCU = &getUnitDie();
382 if (!EntryCU)
383 EntryCU = &getUnitDie();
384 Die.addValue(Attribute,
385 EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
386 Entry);
387 }
388
389 /// Create a DIE with the given Tag, add the DIE to its parent, and
390 /// call insertDIE if MD is not null.
createAndAddDIE(unsigned Tag,DIE & Parent,DIDescriptor N)391 DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
392 assert(Tag != dwarf::DW_TAG_auto_variable &&
393 Tag != dwarf::DW_TAG_arg_variable);
394 Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
395 DIE &Die = *Parent.getChildren().back();
396 if (N)
397 insertDIE(N, &Die);
398 return Die;
399 }
400
401 /// addBlock - Add block data.
402 ///
addBlock(DIE & Die,dwarf::Attribute Attribute,DIELoc * Loc)403 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
404 Loc->ComputeSize(Asm);
405 DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
406 Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
407 }
408
addBlock(DIE & Die,dwarf::Attribute Attribute,DIEBlock * Block)409 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
410 DIEBlock *Block) {
411 Block->ComputeSize(Asm);
412 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
413 Die.addValue(Attribute, Block->BestForm(), Block);
414 }
415
416 /// addSourceLine - Add location information to specified debug information
417 /// entry.
addSourceLine(DIE & Die,unsigned Line,StringRef File,StringRef Directory)418 void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
419 StringRef Directory) {
420 if (Line == 0)
421 return;
422
423 unsigned FileID = getOrCreateSourceID(File, Directory);
424 assert(FileID && "Invalid file id");
425 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
426 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
427 }
428
429 /// addSourceLine - Add location information to specified debug information
430 /// entry.
addSourceLine(DIE & Die,DIVariable V)431 void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
432 assert(V.isVariable());
433
434 addSourceLine(Die, V.getLineNumber(), V.getContext().getFilename(),
435 V.getContext().getDirectory());
436 }
437
438 /// addSourceLine - Add location information to specified debug information
439 /// entry.
addSourceLine(DIE & Die,DIGlobalVariable G)440 void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
441 assert(G.isGlobalVariable());
442
443 addSourceLine(Die, G.getLineNumber(), G.getFilename(), G.getDirectory());
444 }
445
446 /// addSourceLine - Add location information to specified debug information
447 /// entry.
addSourceLine(DIE & Die,DISubprogram SP)448 void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
449 assert(SP.isSubprogram());
450
451 addSourceLine(Die, SP.getLineNumber(), SP.getFilename(), SP.getDirectory());
452 }
453
454 /// addSourceLine - Add location information to specified debug information
455 /// entry.
addSourceLine(DIE & Die,DIType Ty)456 void DwarfUnit::addSourceLine(DIE &Die, DIType Ty) {
457 assert(Ty.isType());
458
459 addSourceLine(Die, Ty.getLineNumber(), Ty.getFilename(), Ty.getDirectory());
460 }
461
462 /// addSourceLine - Add location information to specified debug information
463 /// entry.
addSourceLine(DIE & Die,DIObjCProperty Ty)464 void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
465 assert(Ty.isObjCProperty());
466
467 DIFile File = Ty.getFile();
468 addSourceLine(Die, Ty.getLineNumber(), File.getFilename(),
469 File.getDirectory());
470 }
471
472 /// addSourceLine - Add location information to specified debug information
473 /// entry.
addSourceLine(DIE & Die,DINameSpace NS)474 void DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
475 assert(NS.Verify());
476
477 addSourceLine(Die, NS.getLineNumber(), NS.getFilename(), NS.getDirectory());
478 }
479
480 /// addVariableAddress - Add DW_AT_location attribute for a
481 /// DbgVariable based on provided MachineLocation.
addVariableAddress(const DbgVariable & DV,DIE & Die,MachineLocation Location)482 void DwarfUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
483 MachineLocation Location) {
484 if (DV.variableHasComplexAddress())
485 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
486 else if (DV.isBlockByrefVariable())
487 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
488 else
489 addAddress(Die, dwarf::DW_AT_location, Location,
490 DV.getVariable().isIndirect());
491 }
492
493 /// addRegisterOp - Add register operand.
addRegisterOp(DIELoc & TheDie,unsigned Reg)494 void DwarfUnit::addRegisterOp(DIELoc &TheDie, unsigned Reg) {
495 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
496 int DWReg = RI->getDwarfRegNum(Reg, false);
497 bool isSubRegister = DWReg < 0;
498
499 unsigned Idx = 0;
500
501 // Go up the super-register chain until we hit a valid dwarf register number.
502 for (MCSuperRegIterator SR(Reg, RI); SR.isValid() && DWReg < 0; ++SR) {
503 DWReg = RI->getDwarfRegNum(*SR, false);
504 if (DWReg >= 0)
505 Idx = RI->getSubRegIndex(*SR, Reg);
506 }
507
508 if (DWReg < 0) {
509 DEBUG(dbgs() << "Invalid Dwarf register number.\n");
510 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_nop);
511 return;
512 }
513
514 // Emit register
515 if (DWReg < 32)
516 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
517 else {
518 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
519 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
520 }
521
522 // Emit Mask
523 if (isSubRegister) {
524 unsigned Size = RI->getSubRegIdxSize(Idx);
525 unsigned Offset = RI->getSubRegIdxOffset(Idx);
526 if (Offset > 0) {
527 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bit_piece);
528 addUInt(TheDie, dwarf::DW_FORM_data1, Size);
529 addUInt(TheDie, dwarf::DW_FORM_data1, Offset);
530 } else {
531 unsigned ByteSize = Size / 8; // Assuming 8 bits per byte.
532 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_piece);
533 addUInt(TheDie, dwarf::DW_FORM_data1, ByteSize);
534 }
535 }
536 }
537
538 /// addRegisterOffset - Add register offset.
addRegisterOffset(DIELoc & TheDie,unsigned Reg,int64_t Offset)539 void DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
540 int64_t Offset) {
541 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
542 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
543 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
544 if (Reg == TRI->getFrameRegister(*Asm->MF))
545 // If variable offset is based in frame register then use fbreg.
546 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
547 else if (DWReg < 32)
548 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
549 else {
550 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
551 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
552 }
553 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
554 }
555
556 /// addAddress - Add an address attribute to a die based on the location
557 /// provided.
addAddress(DIE & Die,dwarf::Attribute Attribute,const MachineLocation & Location,bool Indirect)558 void DwarfUnit::addAddress(DIE &Die, dwarf::Attribute Attribute,
559 const MachineLocation &Location, bool Indirect) {
560 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
561
562 if (Location.isReg() && !Indirect)
563 addRegisterOp(*Loc, Location.getReg());
564 else {
565 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
566 if (Indirect && !Location.isReg()) {
567 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
568 }
569 }
570
571 // Now attach the location information to the DIE.
572 addBlock(Die, Attribute, Loc);
573 }
574
575 /// addComplexAddress - Start with the address based on the location provided,
576 /// and generate the DWARF information necessary to find the actual variable
577 /// given the extra address information encoded in the DbgVariable, starting
578 /// from the starting location. Add the DWARF information to the die.
579 ///
addComplexAddress(const DbgVariable & DV,DIE & Die,dwarf::Attribute Attribute,const MachineLocation & Location)580 void DwarfUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,
581 dwarf::Attribute Attribute,
582 const MachineLocation &Location) {
583 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
584 unsigned N = DV.getNumAddrElements();
585 unsigned i = 0;
586 if (Location.isReg()) {
587 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
588 // If first address element is OpPlus then emit
589 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
590 addRegisterOffset(*Loc, Location.getReg(), DV.getAddrElement(1));
591 i = 2;
592 } else
593 addRegisterOp(*Loc, Location.getReg());
594 } else
595 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
596
597 for (; i < N; ++i) {
598 uint64_t Element = DV.getAddrElement(i);
599 if (Element == DIBuilder::OpPlus) {
600 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
601 addUInt(*Loc, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
602 } else if (Element == DIBuilder::OpDeref) {
603 if (!Location.isReg())
604 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
605 } else
606 llvm_unreachable("unknown DIBuilder Opcode");
607 }
608
609 // Now attach the location information to the DIE.
610 addBlock(Die, Attribute, Loc);
611 }
612
613 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
614 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
615 gives the variable VarName either the struct, or a pointer to the struct, as
616 its type. This is necessary for various behind-the-scenes things the
617 compiler needs to do with by-reference variables in Blocks.
618
619 However, as far as the original *programmer* is concerned, the variable
620 should still have type 'SomeType', as originally declared.
621
622 The function getBlockByrefType dives into the __Block_byref_x_VarName
623 struct to find the original type of the variable, which is then assigned to
624 the variable's Debug Information Entry as its real type. So far, so good.
625 However now the debugger will expect the variable VarName to have the type
626 SomeType. So we need the location attribute for the variable to be an
627 expression that explains to the debugger how to navigate through the
628 pointers and struct to find the actual variable of type SomeType.
629
630 The following function does just that. We start by getting
631 the "normal" location for the variable. This will be the location
632 of either the struct __Block_byref_x_VarName or the pointer to the
633 struct __Block_byref_x_VarName.
634
635 The struct will look something like:
636
637 struct __Block_byref_x_VarName {
638 ... <various fields>
639 struct __Block_byref_x_VarName *forwarding;
640 ... <various other fields>
641 SomeType VarName;
642 ... <maybe more fields>
643 };
644
645 If we are given the struct directly (as our starting point) we
646 need to tell the debugger to:
647
648 1). Add the offset of the forwarding field.
649
650 2). Follow that pointer to get the real __Block_byref_x_VarName
651 struct to use (the real one may have been copied onto the heap).
652
653 3). Add the offset for the field VarName, to find the actual variable.
654
655 If we started with a pointer to the struct, then we need to
656 dereference that pointer first, before the other steps.
657 Translating this into DWARF ops, we will need to append the following
658 to the current location description for the variable:
659
660 DW_OP_deref -- optional, if we start with a pointer
661 DW_OP_plus_uconst <forward_fld_offset>
662 DW_OP_deref
663 DW_OP_plus_uconst <varName_fld_offset>
664
665 That is what this function does. */
666
667 /// addBlockByrefAddress - Start with the address based on the location
668 /// provided, and generate the DWARF information necessary to find the
669 /// actual Block variable (navigating the Block struct) based on the
670 /// starting location. Add the DWARF information to the die. For
671 /// more information, read large comment just above here.
672 ///
addBlockByrefAddress(const DbgVariable & DV,DIE & Die,dwarf::Attribute Attribute,const MachineLocation & Location)673 void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
674 dwarf::Attribute Attribute,
675 const MachineLocation &Location) {
676 DIType Ty = DV.getType();
677 DIType TmpTy = Ty;
678 uint16_t Tag = Ty.getTag();
679 bool isPointer = false;
680
681 StringRef varName = DV.getName();
682
683 if (Tag == dwarf::DW_TAG_pointer_type) {
684 DIDerivedType DTy(Ty);
685 TmpTy = resolve(DTy.getTypeDerivedFrom());
686 isPointer = true;
687 }
688
689 DICompositeType blockStruct(TmpTy);
690
691 // Find the __forwarding field and the variable field in the __Block_byref
692 // struct.
693 DIArray Fields = blockStruct.getTypeArray();
694 DIDerivedType varField;
695 DIDerivedType forwardingField;
696
697 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
698 DIDerivedType DT(Fields.getElement(i));
699 StringRef fieldName = DT.getName();
700 if (fieldName == "__forwarding")
701 forwardingField = DT;
702 else if (fieldName == varName)
703 varField = DT;
704 }
705
706 // Get the offsets for the forwarding field and the variable field.
707 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
708 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
709
710 // Decode the original location, and use that as the start of the byref
711 // variable's location.
712 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
713
714 if (Location.isReg())
715 addRegisterOp(*Loc, Location.getReg());
716 else
717 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
718
719 // If we started with a pointer to the __Block_byref... struct, then
720 // the first thing we need to do is dereference the pointer (DW_OP_deref).
721 if (isPointer)
722 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
723
724 // Next add the offset for the '__forwarding' field:
725 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
726 // adding the offset if it's 0.
727 if (forwardingFieldOffset > 0) {
728 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
729 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
730 }
731
732 // Now dereference the __forwarding field to get to the real __Block_byref
733 // struct: DW_OP_deref.
734 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
735
736 // Now that we've got the real __Block_byref... struct, add the offset
737 // for the variable's field to get to the location of the actual variable:
738 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
739 if (varFieldOffset > 0) {
740 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
741 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
742 }
743
744 // Now attach the location information to the DIE.
745 addBlock(Die, Attribute, Loc);
746 }
747
748 /// Return true if type encoding is unsigned.
isUnsignedDIType(DwarfDebug * DD,DIType Ty)749 static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
750 DIDerivedType DTy(Ty);
751 if (DTy.isDerivedType()) {
752 dwarf::Tag T = (dwarf::Tag)Ty.getTag();
753 // Encode pointer constants as unsigned bytes. This is used at least for
754 // null pointer constant emission.
755 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
756 // here, but accept them for now due to a bug in SROA producing bogus
757 // dbg.values.
758 if (T == dwarf::DW_TAG_pointer_type ||
759 T == dwarf::DW_TAG_ptr_to_member_type ||
760 T == dwarf::DW_TAG_reference_type ||
761 T == dwarf::DW_TAG_rvalue_reference_type)
762 return true;
763 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
764 T == dwarf::DW_TAG_volatile_type ||
765 T == dwarf::DW_TAG_restrict_type ||
766 T == dwarf::DW_TAG_enumeration_type);
767 if (DITypeRef Deriv = DTy.getTypeDerivedFrom())
768 return isUnsignedDIType(DD, DD->resolve(Deriv));
769 // FIXME: Enums without a fixed underlying type have unknown signedness
770 // here, leading to incorrectly emitted constants.
771 assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type);
772 return false;
773 }
774
775 DIBasicType BTy(Ty);
776 assert(BTy.isBasicType());
777 unsigned Encoding = BTy.getEncoding();
778 assert((Encoding == dwarf::DW_ATE_unsigned ||
779 Encoding == dwarf::DW_ATE_unsigned_char ||
780 Encoding == dwarf::DW_ATE_signed ||
781 Encoding == dwarf::DW_ATE_signed_char ||
782 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean) &&
783 "Unsupported encoding");
784 return (Encoding == dwarf::DW_ATE_unsigned ||
785 Encoding == dwarf::DW_ATE_unsigned_char ||
786 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean);
787 }
788
789 /// If this type is derived from a base type then return base type size.
getBaseTypeSize(DwarfDebug * DD,DIDerivedType Ty)790 static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
791 unsigned Tag = Ty.getTag();
792
793 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
794 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
795 Tag != dwarf::DW_TAG_restrict_type)
796 return Ty.getSizeInBits();
797
798 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
799
800 // If this type is not derived from any type or the type is a declaration then
801 // take conservative approach.
802 if (!BaseType.isValid() || BaseType.isForwardDecl())
803 return Ty.getSizeInBits();
804
805 // If this is a derived type, go ahead and get the base type, unless it's a
806 // reference then it's just the size of the field. Pointer types have no need
807 // of this since they're a different type of qualification on the type.
808 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
809 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
810 return Ty.getSizeInBits();
811
812 if (BaseType.isDerivedType())
813 return getBaseTypeSize(DD, DIDerivedType(BaseType));
814
815 return BaseType.getSizeInBits();
816 }
817
818 /// addConstantFPValue - Add constant value entry in variable DIE.
addConstantFPValue(DIE & Die,const MachineOperand & MO)819 void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
820 assert(MO.isFPImm() && "Invalid machine operand!");
821 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
822 APFloat FPImm = MO.getFPImm()->getValueAPF();
823
824 // Get the raw data form of the floating point.
825 const APInt FltVal = FPImm.bitcastToAPInt();
826 const char *FltPtr = (const char *)FltVal.getRawData();
827
828 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
829 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
830 int Incr = (LittleEndian ? 1 : -1);
831 int Start = (LittleEndian ? 0 : NumBytes - 1);
832 int Stop = (LittleEndian ? NumBytes : -1);
833
834 // Output the constant to DWARF one byte at a time.
835 for (; Start != Stop; Start += Incr)
836 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
837
838 addBlock(Die, dwarf::DW_AT_const_value, Block);
839 }
840
841 /// addConstantFPValue - Add constant value entry in variable DIE.
addConstantFPValue(DIE & Die,const ConstantFP * CFP)842 void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
843 // Pass this down to addConstantValue as an unsigned bag of bits.
844 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
845 }
846
847 /// addConstantValue - Add constant value entry in variable DIE.
addConstantValue(DIE & Die,const ConstantInt * CI,DIType Ty)848 void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
849 addConstantValue(Die, CI->getValue(), Ty);
850 }
851
852 /// addConstantValue - Add constant value entry in variable DIE.
addConstantValue(DIE & Die,const MachineOperand & MO,DIType Ty)853 void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
854 DIType Ty) {
855 assert(MO.isImm() && "Invalid machine operand!");
856
857 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
858 }
859
addConstantValue(DIE & Die,bool Unsigned,uint64_t Val)860 void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
861 // FIXME: This is a bit conservative/simple - it emits negative values always
862 // sign extended to 64 bits rather than minimizing the number of bytes.
863 addUInt(Die, dwarf::DW_AT_const_value,
864 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
865 }
866
addConstantValue(DIE & Die,const APInt & Val,DIType Ty)867 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
868 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
869 }
870
871 // addConstantValue - Add constant value entry in variable DIE.
addConstantValue(DIE & Die,const APInt & Val,bool Unsigned)872 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
873 unsigned CIBitWidth = Val.getBitWidth();
874 if (CIBitWidth <= 64) {
875 addConstantValue(Die, Unsigned,
876 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
877 return;
878 }
879
880 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
881
882 // Get the raw data form of the large APInt.
883 const uint64_t *Ptr64 = Val.getRawData();
884
885 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
886 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
887
888 // Output the constant to DWARF one byte at a time.
889 for (int i = 0; i < NumBytes; i++) {
890 uint8_t c;
891 if (LittleEndian)
892 c = Ptr64[i / 8] >> (8 * (i & 7));
893 else
894 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
895 addUInt(*Block, dwarf::DW_FORM_data1, c);
896 }
897
898 addBlock(Die, dwarf::DW_AT_const_value, Block);
899 }
900
901 /// addTemplateParams - Add template parameters into buffer.
addTemplateParams(DIE & Buffer,DIArray TParams)902 void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
903 // Add template parameters.
904 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
905 DIDescriptor Element = TParams.getElement(i);
906 if (Element.isTemplateTypeParameter())
907 constructTemplateTypeParameterDIE(Buffer,
908 DITemplateTypeParameter(Element));
909 else if (Element.isTemplateValueParameter())
910 constructTemplateValueParameterDIE(Buffer,
911 DITemplateValueParameter(Element));
912 }
913 }
914
915 /// getOrCreateContextDIE - Get context owner's DIE.
getOrCreateContextDIE(DIScope Context)916 DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
917 if (!Context || Context.isFile())
918 return &getUnitDie();
919 if (Context.isType())
920 return getOrCreateTypeDIE(DIType(Context));
921 if (Context.isNameSpace())
922 return getOrCreateNameSpace(DINameSpace(Context));
923 if (Context.isSubprogram())
924 return getOrCreateSubprogramDIE(DISubprogram(Context));
925 return getDIE(Context);
926 }
927
createTypeDIE(DICompositeType Ty)928 DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
929 DIScope Context = resolve(Ty.getContext());
930 DIE *ContextDIE = getOrCreateContextDIE(Context);
931
932 if (DIE *TyDIE = getDIE(Ty))
933 return TyDIE;
934
935 // Create new type.
936 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
937
938 constructTypeDIE(TyDIE, Ty);
939
940 updateAcceleratorTables(Context, Ty, TyDIE);
941 return &TyDIE;
942 }
943
944 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
945 /// given DIType.
getOrCreateTypeDIE(const MDNode * TyNode)946 DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
947 if (!TyNode)
948 return nullptr;
949
950 DIType Ty(TyNode);
951 assert(Ty.isType());
952 assert(Ty == resolve(Ty.getRef()) &&
953 "type was not uniqued, possible ODR violation.");
954
955 // DW_TAG_restrict_type is not supported in DWARF2
956 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
957 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom()));
958
959 // Construct the context before querying for the existence of the DIE in case
960 // such construction creates the DIE.
961 DIScope Context = resolve(Ty.getContext());
962 DIE *ContextDIE = getOrCreateContextDIE(Context);
963 assert(ContextDIE);
964
965 if (DIE *TyDIE = getDIE(Ty))
966 return TyDIE;
967
968 // Create new type.
969 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
970
971 updateAcceleratorTables(Context, Ty, TyDIE);
972
973 if (Ty.isBasicType())
974 constructTypeDIE(TyDIE, DIBasicType(Ty));
975 else if (Ty.isCompositeType()) {
976 DICompositeType CTy(Ty);
977 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
978 if (MDString *TypeId = CTy.getIdentifier()) {
979 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
980 // Skip updating the accelerator tables since this is not the full type.
981 return &TyDIE;
982 }
983 constructTypeDIE(TyDIE, CTy);
984 } else {
985 assert(Ty.isDerivedType() && "Unknown kind of DIType");
986 constructTypeDIE(TyDIE, DIDerivedType(Ty));
987 }
988
989 return &TyDIE;
990 }
991
updateAcceleratorTables(DIScope Context,DIType Ty,const DIE & TyDIE)992 void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
993 const DIE &TyDIE) {
994 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
995 bool IsImplementation = 0;
996 if (Ty.isCompositeType()) {
997 DICompositeType CT(Ty);
998 // A runtime language of 0 actually means C/C++ and that any
999 // non-negative value is some version of Objective-C/C++.
1000 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
1001 }
1002 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
1003 DD->addAccelType(Ty.getName(), TyDIE, Flags);
1004
1005 if ((!Context || Context.isCompileUnit() || Context.isFile() ||
1006 Context.isNameSpace()) &&
1007 getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly)
1008 GlobalTypes[getParentContextString(Context) + Ty.getName().str()] =
1009 &TyDIE;
1010 }
1011 }
1012
1013 /// addType - Add a new type attribute to the specified entity.
addType(DIE & Entity,DIType Ty,dwarf::Attribute Attribute)1014 void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
1015 assert(Ty && "Trying to add a type that doesn't exist?");
1016
1017 // Check for pre-existence.
1018 DIEEntry *Entry = getDIEEntry(Ty);
1019 // If it exists then use the existing value.
1020 if (Entry) {
1021 addDIEEntry(Entity, Attribute, Entry);
1022 return;
1023 }
1024
1025 // Construct type.
1026 DIE *Buffer = getOrCreateTypeDIE(Ty);
1027
1028 // Set up proxy.
1029 Entry = createDIEEntry(*Buffer);
1030 insertDIEEntry(Ty, Entry);
1031 addDIEEntry(Entity, Attribute, Entry);
1032 }
1033
1034 /// addGlobalName - Add a new global name to the compile unit.
addGlobalName(StringRef Name,DIE & Die,DIScope Context)1035 void DwarfUnit::addGlobalName(StringRef Name, DIE &Die, DIScope Context) {
1036 if (getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly)
1037 return;
1038 std::string FullName = getParentContextString(Context) + Name.str();
1039 GlobalNames[FullName] = &Die;
1040 }
1041
1042 /// getParentContextString - Walks the metadata parent chain in a language
1043 /// specific manner (using the compile unit language) and returns
1044 /// it as a string. This is done at the metadata level because DIEs may
1045 /// not currently have been added to the parent context and walking the
1046 /// DIEs looking for names is more expensive than walking the metadata.
getParentContextString(DIScope Context) const1047 std::string DwarfUnit::getParentContextString(DIScope Context) const {
1048 if (!Context)
1049 return "";
1050
1051 // FIXME: Decide whether to implement this for non-C++ languages.
1052 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1053 return "";
1054
1055 std::string CS;
1056 SmallVector<DIScope, 1> Parents;
1057 while (!Context.isCompileUnit()) {
1058 Parents.push_back(Context);
1059 if (Context.getContext())
1060 Context = resolve(Context.getContext());
1061 else
1062 // Structure, etc types will have a NULL context if they're at the top
1063 // level.
1064 break;
1065 }
1066
1067 // Reverse iterate over our list to go from the outermost construct to the
1068 // innermost.
1069 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1070 E = Parents.rend();
1071 I != E; ++I) {
1072 DIScope Ctx = *I;
1073 StringRef Name = Ctx.getName();
1074 if (Name.empty() && Ctx.isNameSpace())
1075 Name = "(anonymous namespace)";
1076 if (!Name.empty()) {
1077 CS += Name;
1078 CS += "::";
1079 }
1080 }
1081 return CS;
1082 }
1083
1084 /// constructTypeDIE - Construct basic type die from DIBasicType.
constructTypeDIE(DIE & Buffer,DIBasicType BTy)1085 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1086 // Get core information.
1087 StringRef Name = BTy.getName();
1088 // Add name if not anonymous or intermediate type.
1089 if (!Name.empty())
1090 addString(Buffer, dwarf::DW_AT_name, Name);
1091
1092 // An unspecified type only has a name attribute.
1093 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
1094 return;
1095
1096 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1097 BTy.getEncoding());
1098
1099 uint64_t Size = BTy.getSizeInBits() >> 3;
1100 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
1101 }
1102
1103 /// constructTypeDIE - Construct derived type die from DIDerivedType.
constructTypeDIE(DIE & Buffer,DIDerivedType DTy)1104 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1105 // Get core information.
1106 StringRef Name = DTy.getName();
1107 uint64_t Size = DTy.getSizeInBits() >> 3;
1108 uint16_t Tag = Buffer.getTag();
1109
1110 // Map to main type, void will not have a type.
1111 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
1112 if (FromTy)
1113 addType(Buffer, FromTy);
1114
1115 // Add name if not anonymous or intermediate type.
1116 if (!Name.empty())
1117 addString(Buffer, dwarf::DW_AT_name, Name);
1118
1119 // Add size if non-zero (derived types might be zero-sized.)
1120 if (Size && Tag != dwarf::DW_TAG_pointer_type)
1121 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
1122
1123 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
1124 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
1125 *getOrCreateTypeDIE(resolve(DTy.getClassType())));
1126 // Add source line info if available and TyDesc is not a forward declaration.
1127 if (!DTy.isForwardDecl())
1128 addSourceLine(Buffer, DTy);
1129 }
1130
1131 /// constructSubprogramArguments - Construct function argument DIEs.
constructSubprogramArguments(DIE & Buffer,DIArray Args)1132 void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DIArray Args) {
1133 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1134 DIDescriptor Ty = Args.getElement(i);
1135 if (Ty.isUnspecifiedParameter()) {
1136 assert(i == N-1 && "Unspecified parameter must be the last argument");
1137 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
1138 } else {
1139 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
1140 addType(Arg, DIType(Ty));
1141 if (DIType(Ty).isArtificial())
1142 addFlag(Arg, dwarf::DW_AT_artificial);
1143 }
1144 }
1145 }
1146
1147 /// constructTypeDIE - Construct type DIE from DICompositeType.
constructTypeDIE(DIE & Buffer,DICompositeType CTy)1148 void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1149 // Add name if not anonymous or intermediate type.
1150 StringRef Name = CTy.getName();
1151
1152 uint64_t Size = CTy.getSizeInBits() >> 3;
1153 uint16_t Tag = Buffer.getTag();
1154
1155 switch (Tag) {
1156 case dwarf::DW_TAG_array_type:
1157 constructArrayTypeDIE(Buffer, CTy);
1158 break;
1159 case dwarf::DW_TAG_enumeration_type:
1160 constructEnumTypeDIE(Buffer, CTy);
1161 break;
1162 case dwarf::DW_TAG_subroutine_type: {
1163 // Add return type. A void return won't have a type.
1164 DIArray Elements = CTy.getTypeArray();
1165 DIType RTy(Elements.getElement(0));
1166 if (RTy)
1167 addType(Buffer, RTy);
1168
1169 bool isPrototyped = true;
1170 if (Elements.getNumElements() == 2 &&
1171 Elements.getElement(1).isUnspecifiedParameter())
1172 isPrototyped = false;
1173
1174 constructSubprogramArguments(Buffer, Elements);
1175
1176 // Add prototype flag if we're dealing with a C language and the
1177 // function has been prototyped.
1178 uint16_t Language = getLanguage();
1179 if (isPrototyped &&
1180 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
1181 Language == dwarf::DW_LANG_ObjC))
1182 addFlag(Buffer, dwarf::DW_AT_prototyped);
1183
1184 if (CTy.isLValueReference())
1185 addFlag(Buffer, dwarf::DW_AT_reference);
1186
1187 if (CTy.isRValueReference())
1188 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
1189 } break;
1190 case dwarf::DW_TAG_structure_type:
1191 case dwarf::DW_TAG_union_type:
1192 case dwarf::DW_TAG_class_type: {
1193 // Add elements to structure type.
1194 DIArray Elements = CTy.getTypeArray();
1195 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1196 DIDescriptor Element = Elements.getElement(i);
1197 if (Element.isSubprogram())
1198 getOrCreateSubprogramDIE(DISubprogram(Element));
1199 else if (Element.isDerivedType()) {
1200 DIDerivedType DDTy(Element);
1201 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1202 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
1203 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
1204 dwarf::DW_AT_friend);
1205 } else if (DDTy.isStaticMember()) {
1206 getOrCreateStaticMemberDIE(DDTy);
1207 } else {
1208 constructMemberDIE(Buffer, DDTy);
1209 }
1210 } else if (Element.isObjCProperty()) {
1211 DIObjCProperty Property(Element);
1212 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer);
1213 StringRef PropertyName = Property.getObjCPropertyName();
1214 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1215 if (Property.getType())
1216 addType(ElemDie, Property.getType());
1217 addSourceLine(ElemDie, Property);
1218 StringRef GetterName = Property.getObjCPropertyGetterName();
1219 if (!GetterName.empty())
1220 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1221 StringRef SetterName = Property.getObjCPropertySetterName();
1222 if (!SetterName.empty())
1223 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1224 unsigned PropertyAttributes = 0;
1225 if (Property.isReadOnlyObjCProperty())
1226 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1227 if (Property.isReadWriteObjCProperty())
1228 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1229 if (Property.isAssignObjCProperty())
1230 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1231 if (Property.isRetainObjCProperty())
1232 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1233 if (Property.isCopyObjCProperty())
1234 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1235 if (Property.isNonAtomicObjCProperty())
1236 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1237 if (PropertyAttributes)
1238 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
1239 PropertyAttributes);
1240
1241 DIEEntry *Entry = getDIEEntry(Element);
1242 if (!Entry) {
1243 Entry = createDIEEntry(ElemDie);
1244 insertDIEEntry(Element, Entry);
1245 }
1246 } else
1247 continue;
1248 }
1249
1250 if (CTy.isAppleBlockExtension())
1251 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
1252
1253 DICompositeType ContainingType(resolve(CTy.getContainingType()));
1254 if (ContainingType)
1255 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
1256 *getOrCreateTypeDIE(ContainingType));
1257
1258 if (CTy.isObjcClassComplete())
1259 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1260
1261 // Add template parameters to a class, structure or union types.
1262 // FIXME: The support isn't in the metadata for this yet.
1263 if (Tag == dwarf::DW_TAG_class_type ||
1264 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1265 addTemplateParams(Buffer, CTy.getTemplateParams());
1266
1267 break;
1268 }
1269 default:
1270 break;
1271 }
1272
1273 // Add name if not anonymous or intermediate type.
1274 if (!Name.empty())
1275 addString(Buffer, dwarf::DW_AT_name, Name);
1276
1277 if (Tag == dwarf::DW_TAG_enumeration_type ||
1278 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
1279 Tag == dwarf::DW_TAG_union_type) {
1280 // Add size if non-zero (derived types might be zero-sized.)
1281 // TODO: Do we care about size for enum forward declarations?
1282 if (Size)
1283 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
1284 else if (!CTy.isForwardDecl())
1285 // Add zero size if it is not a forward declaration.
1286 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
1287
1288 // If we're a forward decl, say so.
1289 if (CTy.isForwardDecl())
1290 addFlag(Buffer, dwarf::DW_AT_declaration);
1291
1292 // Add source line info if available.
1293 if (!CTy.isForwardDecl())
1294 addSourceLine(Buffer, CTy);
1295
1296 // No harm in adding the runtime language to the declaration.
1297 unsigned RLang = CTy.getRunTimeLang();
1298 if (RLang)
1299 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1300 RLang);
1301 }
1302 }
1303
1304 /// constructTemplateTypeParameterDIE - Construct new DIE for the given
1305 /// DITemplateTypeParameter.
constructTemplateTypeParameterDIE(DIE & Buffer,DITemplateTypeParameter TP)1306 void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1307 DITemplateTypeParameter TP) {
1308 DIE &ParamDIE =
1309 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
1310 // Add the type if it exists, it could be void and therefore no type.
1311 if (TP.getType())
1312 addType(ParamDIE, resolve(TP.getType()));
1313 if (!TP.getName().empty())
1314 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
1315 }
1316
1317 /// constructTemplateValueParameterDIE - Construct new DIE for the given
1318 /// DITemplateValueParameter.
1319 void
constructTemplateValueParameterDIE(DIE & Buffer,DITemplateValueParameter VP)1320 DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1321 DITemplateValueParameter VP) {
1322 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
1323
1324 // Add the type if there is one, template template and template parameter
1325 // packs will not have a type.
1326 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
1327 addType(ParamDIE, resolve(VP.getType()));
1328 if (!VP.getName().empty())
1329 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1330 if (Value *Val = VP.getValue()) {
1331 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
1332 addConstantValue(ParamDIE, CI, resolve(VP.getType()));
1333 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1334 // For declaration non-type template parameters (such as global values and
1335 // functions)
1336 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
1337 addOpAddress(*Loc, Asm->getSymbol(GV));
1338 // Emit DW_OP_stack_value to use the address as the immediate value of the
1339 // parameter, rather than a pointer to it.
1340 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1341 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
1342 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1343 assert(isa<MDString>(Val));
1344 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1345 cast<MDString>(Val)->getString());
1346 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1347 assert(isa<MDNode>(Val));
1348 DIArray A(cast<MDNode>(Val));
1349 addTemplateParams(ParamDIE, A);
1350 }
1351 }
1352 }
1353
1354 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
getOrCreateNameSpace(DINameSpace NS)1355 DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
1356 // Construct the context before querying for the existence of the DIE in case
1357 // such construction creates the DIE.
1358 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
1359
1360 if (DIE *NDie = getDIE(NS))
1361 return NDie;
1362 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1363
1364 StringRef Name = NS.getName();
1365 if (!Name.empty())
1366 addString(NDie, dwarf::DW_AT_name, NS.getName());
1367 else
1368 Name = "(anonymous namespace)";
1369 DD->addAccelNamespace(Name, NDie);
1370 addGlobalName(Name, NDie, NS.getContext());
1371 addSourceLine(NDie, NS);
1372 return &NDie;
1373 }
1374
1375 /// getOrCreateSubprogramDIE - Create new DIE using SP.
getOrCreateSubprogramDIE(DISubprogram SP)1376 DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1377 // Construct the context before querying for the existence of the DIE in case
1378 // such construction creates the DIE (as is the case for member function
1379 // declarations).
1380 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
1381
1382 if (DIE *SPDie = getDIE(SP))
1383 return SPDie;
1384
1385 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
1386 // Add subprogram definitions to the CU die directly.
1387 ContextDIE = &getUnitDie();
1388 // Build the decl now to ensure it precedes the definition.
1389 getOrCreateSubprogramDIE(SPDecl);
1390 }
1391
1392 // DW_TAG_inlined_subroutine may refer to this DIE.
1393 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
1394
1395 // Stop here and fill this in later, depending on whether or not this
1396 // subprogram turns out to have inlined instances or not.
1397 if (SP.isDefinition())
1398 return &SPDie;
1399
1400 applySubprogramAttributes(SP, SPDie);
1401 return &SPDie;
1402 }
1403
applySubprogramAttributesToDefinition(DISubprogram SP,DIE & SPDie)1404 void DwarfUnit::applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie) {
1405 DISubprogram SPDecl = SP.getFunctionDeclaration();
1406 DIScope Context = resolve(SPDecl ? SPDecl.getContext() : SP.getContext());
1407 applySubprogramAttributes(SP, SPDie);
1408 addGlobalName(SP.getName(), SPDie, Context);
1409 }
1410
applySubprogramAttributes(DISubprogram SP,DIE & SPDie)1411 void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie) {
1412 DIE *DeclDie = nullptr;
1413 StringRef DeclLinkageName;
1414 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
1415 DeclDie = getDIE(SPDecl);
1416 assert(DeclDie && "This DIE should've already been constructed when the "
1417 "definition DIE was created in "
1418 "getOrCreateSubprogramDIE");
1419 DeclLinkageName = SPDecl.getLinkageName();
1420 }
1421
1422 // Add function template parameters.
1423 addTemplateParams(SPDie, SP.getTemplateParams());
1424
1425 // Add the linkage name if we have one and it isn't in the Decl.
1426 StringRef LinkageName = SP.getLinkageName();
1427 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1428 LinkageName == DeclLinkageName) &&
1429 "decl has a linkage name and it is different");
1430 if (!LinkageName.empty() && DeclLinkageName.empty())
1431 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1432 GlobalValue::getRealLinkageName(LinkageName));
1433
1434 if (DeclDie) {
1435 // Refer to the function declaration where all the other attributes will be
1436 // found.
1437 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1438 return;
1439 }
1440
1441 // Constructors and operators for anonymous aggregates do not have names.
1442 if (!SP.getName().empty())
1443 addString(SPDie, dwarf::DW_AT_name, SP.getName());
1444
1445 addSourceLine(SPDie, SP);
1446
1447 // Add the prototype if we have a prototype and we have a C like
1448 // language.
1449 uint16_t Language = getLanguage();
1450 if (SP.isPrototyped() &&
1451 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
1452 Language == dwarf::DW_LANG_ObjC))
1453 addFlag(SPDie, dwarf::DW_AT_prototyped);
1454
1455 DICompositeType SPTy = SP.getType();
1456 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1457 "the type of a subprogram should be a subroutine");
1458
1459 DIArray Args = SPTy.getTypeArray();
1460 // Add a return type. If this is a type like a C/C++ void type we don't add a
1461 // return type.
1462 if (Args.getElement(0))
1463 addType(SPDie, DIType(Args.getElement(0)));
1464
1465 unsigned VK = SP.getVirtuality();
1466 if (VK) {
1467 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1468 DIELoc *Block = getDIELoc();
1469 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1470 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1471 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
1472 ContainingTypeMap.insert(
1473 std::make_pair(&SPDie, resolve(SP.getContainingType())));
1474 }
1475
1476 if (!SP.isDefinition()) {
1477 addFlag(SPDie, dwarf::DW_AT_declaration);
1478
1479 // Add arguments. Do not add arguments for subprogram definition. They will
1480 // be handled while processing variables.
1481 constructSubprogramArguments(SPDie, Args);
1482 }
1483
1484 if (SP.isArtificial())
1485 addFlag(SPDie, dwarf::DW_AT_artificial);
1486
1487 if (!SP.isLocalToUnit())
1488 addFlag(SPDie, dwarf::DW_AT_external);
1489
1490 if (SP.isOptimized())
1491 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1492
1493 if (unsigned isa = Asm->getISAEncoding()) {
1494 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1495 }
1496
1497 if (SP.isLValueReference())
1498 addFlag(SPDie, dwarf::DW_AT_reference);
1499
1500 if (SP.isRValueReference())
1501 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1502
1503 if (SP.isProtected())
1504 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1505 dwarf::DW_ACCESS_protected);
1506 else if (SP.isPrivate())
1507 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1508 dwarf::DW_ACCESS_private);
1509 else
1510 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1511 dwarf::DW_ACCESS_public);
1512
1513 if (SP.isExplicit())
1514 addFlag(SPDie, dwarf::DW_AT_explicit);
1515 }
1516
applyVariableAttributes(const DbgVariable & Var,DIE & VariableDie)1517 void DwarfUnit::applyVariableAttributes(const DbgVariable &Var,
1518 DIE &VariableDie) {
1519 StringRef Name = Var.getName();
1520 if (!Name.empty())
1521 addString(VariableDie, dwarf::DW_AT_name, Name);
1522 addSourceLine(VariableDie, Var.getVariable());
1523 addType(VariableDie, Var.getType());
1524 if (Var.isArtificial())
1525 addFlag(VariableDie, dwarf::DW_AT_artificial);
1526 }
1527
1528 // Return const expression if value is a GEP to access merged global
1529 // constant. e.g.
1530 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
getMergedGlobalExpr(const Value * V)1531 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1532 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1533 if (!CE || CE->getNumOperands() != 3 ||
1534 CE->getOpcode() != Instruction::GetElementPtr)
1535 return nullptr;
1536
1537 // First operand points to a global struct.
1538 Value *Ptr = CE->getOperand(0);
1539 if (!isa<GlobalValue>(Ptr) ||
1540 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1541 return nullptr;
1542
1543 // Second operand is zero.
1544 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1545 if (!CI || !CI->isZero())
1546 return nullptr;
1547
1548 // Third operand is offset.
1549 if (!isa<ConstantInt>(CE->getOperand(2)))
1550 return nullptr;
1551
1552 return CE;
1553 }
1554
1555 /// createGlobalVariableDIE - create global variable DIE.
createGlobalVariableDIE(DIGlobalVariable GV)1556 void DwarfCompileUnit::createGlobalVariableDIE(DIGlobalVariable GV) {
1557 // Check for pre-existence.
1558 if (getDIE(GV))
1559 return;
1560
1561 assert(GV.isGlobalVariable());
1562
1563 DIScope GVContext = GV.getContext();
1564 DIType GTy = DD->resolve(GV.getType());
1565
1566 // If this is a static data member definition, some attributes belong
1567 // to the declaration DIE.
1568 DIE *VariableDIE = nullptr;
1569 bool IsStaticMember = false;
1570 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1571 if (SDMDecl.Verify()) {
1572 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1573 // We need the declaration DIE that is in the static member's class.
1574 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
1575 IsStaticMember = true;
1576 }
1577
1578 // If this is not a static data member definition, create the variable
1579 // DIE and add the initial set of attributes to it.
1580 if (!VariableDIE) {
1581 // Construct the context before querying for the existence of the DIE in
1582 // case such construction creates the DIE.
1583 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
1584
1585 // Add to map.
1586 VariableDIE = &createAndAddDIE(GV.getTag(), *ContextDIE, GV);
1587
1588 // Add name and type.
1589 addString(*VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1590 addType(*VariableDIE, GTy);
1591
1592 // Add scoping info.
1593 if (!GV.isLocalToUnit())
1594 addFlag(*VariableDIE, dwarf::DW_AT_external);
1595
1596 // Add line number info.
1597 addSourceLine(*VariableDIE, GV);
1598 }
1599
1600 // Add location.
1601 bool addToAccelTable = false;
1602 DIE *VariableSpecDIE = nullptr;
1603 bool isGlobalVariable = GV.getGlobal() != nullptr;
1604 if (isGlobalVariable) {
1605 addToAccelTable = true;
1606 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
1607 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
1608 if (GV.getGlobal()->isThreadLocal()) {
1609 // FIXME: Make this work with -gsplit-dwarf.
1610 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1611 assert((PointerSize == 4 || PointerSize == 8) &&
1612 "Add support for other sizes if necessary");
1613 // Based on GCC's support for TLS:
1614 if (!DD->useSplitDwarf()) {
1615 // 1) Start with a constNu of the appropriate pointer size
1616 addUInt(*Loc, dwarf::DW_FORM_data1,
1617 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1618 // 2) containing the (relocated) offset of the TLS variable
1619 // within the module's TLS block.
1620 addExpr(*Loc, dwarf::DW_FORM_udata,
1621 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym));
1622 } else {
1623 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1624 addUInt(*Loc, dwarf::DW_FORM_udata,
1625 DD->getAddressPool().getIndex(Sym, /* TLS */ true));
1626 }
1627 // 3) followed by a custom OP to make the debugger do a TLS lookup.
1628 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
1629 } else {
1630 DD->addArangeLabel(SymbolCU(this, Sym));
1631 addOpAddress(*Loc, Sym);
1632 }
1633 // Do not create specification DIE if context is either compile unit
1634 // or a subprogram.
1635 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
1636 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
1637 // Create specification DIE.
1638 VariableSpecDIE = &createAndAddDIE(dwarf::DW_TAG_variable, UnitDie);
1639 addDIEEntry(*VariableSpecDIE, dwarf::DW_AT_specification, *VariableDIE);
1640 addBlock(*VariableSpecDIE, dwarf::DW_AT_location, Loc);
1641 // A static member's declaration is already flagged as such.
1642 if (!SDMDecl.Verify())
1643 addFlag(*VariableDIE, dwarf::DW_AT_declaration);
1644 } else {
1645 addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);
1646 }
1647 // Add the linkage name.
1648 StringRef LinkageName = GV.getLinkageName();
1649 if (!LinkageName.empty())
1650 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1651 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1652 // TAG_variable.
1653 addString(IsStaticMember && VariableSpecDIE ? *VariableSpecDIE
1654 : *VariableDIE,
1655 DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
1656 : dwarf::DW_AT_MIPS_linkage_name,
1657 GlobalValue::getRealLinkageName(LinkageName));
1658 } else if (const ConstantInt *CI =
1659 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
1660 // AT_const_value was added when the static member was created. To avoid
1661 // emitting AT_const_value multiple times, we only add AT_const_value when
1662 // it is not a static member.
1663 if (!IsStaticMember)
1664 addConstantValue(*VariableDIE, CI, GTy);
1665 } else if (const ConstantExpr *CE = getMergedGlobalExpr(GV->getOperand(11))) {
1666 addToAccelTable = true;
1667 // GV is a merged global.
1668 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
1669 Value *Ptr = CE->getOperand(0);
1670 MCSymbol *Sym = Asm->getSymbol(cast<GlobalValue>(Ptr));
1671 DD->addArangeLabel(SymbolCU(this, Sym));
1672 addOpAddress(*Loc, Sym);
1673 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1674 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
1675 addUInt(*Loc, dwarf::DW_FORM_udata,
1676 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
1677 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1678 addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);
1679 }
1680
1681 if (addToAccelTable) {
1682 DIE &AddrDIE = VariableSpecDIE ? *VariableSpecDIE : *VariableDIE;
1683 DD->addAccelName(GV.getName(), AddrDIE);
1684
1685 // If the linkage name is different than the name, go ahead and output
1686 // that as well into the name table.
1687 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1688 DD->addAccelName(GV.getLinkageName(), AddrDIE);
1689 }
1690
1691 addGlobalName(GV.getName(), VariableSpecDIE ? *VariableSpecDIE : *VariableDIE,
1692 GV.getContext());
1693 }
1694
1695 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
constructSubrangeDIE(DIE & Buffer,DISubrange SR,DIE * IndexTy)1696 void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
1697 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
1698 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
1699
1700 // The LowerBound value defines the lower bounds which is typically zero for
1701 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1702 // Count == -1 then the array is unbounded and we do not emit
1703 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1704 // Count == 0, then the array has zero elements in which case we do not emit
1705 // an upper bound.
1706 int64_t LowerBound = SR.getLo();
1707 int64_t DefaultLowerBound = getDefaultLowerBound();
1708 int64_t Count = SR.getCount();
1709
1710 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1711 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
1712
1713 if (Count != -1 && Count != 0)
1714 // FIXME: An unbounded array should reference the expression that defines
1715 // the array.
1716 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None,
1717 LowerBound + Count - 1);
1718 }
1719
1720 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
constructArrayTypeDIE(DIE & Buffer,DICompositeType CTy)1721 void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
1722 if (CTy.isVector())
1723 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
1724
1725 // Emit the element type.
1726 addType(Buffer, resolve(CTy.getTypeDerivedFrom()));
1727
1728 // Get an anonymous type for index type.
1729 // FIXME: This type should be passed down from the front end
1730 // as different languages may have different sizes for indexes.
1731 DIE *IdxTy = getIndexTyDie();
1732 if (!IdxTy) {
1733 // Construct an integer type to use for indexes.
1734 IdxTy = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
1735 addString(*IdxTy, dwarf::DW_AT_name, "sizetype");
1736 addUInt(*IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1737 addUInt(*IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1738 dwarf::DW_ATE_unsigned);
1739 setIndexTyDie(IdxTy);
1740 }
1741
1742 // Add subranges to array type.
1743 DIArray Elements = CTy.getTypeArray();
1744 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1745 DIDescriptor Element = Elements.getElement(i);
1746 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1747 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1748 }
1749 }
1750
1751 /// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
constructEnumTypeDIE(DIE & Buffer,DICompositeType CTy)1752 void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
1753 DIArray Elements = CTy.getTypeArray();
1754
1755 // Add enumerators to enumeration type.
1756 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1757 DIEnumerator Enum(Elements.getElement(i));
1758 if (Enum.isEnumerator()) {
1759 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
1760 StringRef Name = Enum.getName();
1761 addString(Enumerator, dwarf::DW_AT_name, Name);
1762 int64_t Value = Enum.getEnumValue();
1763 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1764 Value);
1765 }
1766 }
1767 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1768 if (DTy) {
1769 addType(Buffer, DTy);
1770 addFlag(Buffer, dwarf::DW_AT_enum_class);
1771 }
1772 }
1773
1774 /// constructContainingTypeDIEs - Construct DIEs for types that contain
1775 /// vtables.
constructContainingTypeDIEs()1776 void DwarfUnit::constructContainingTypeDIEs() {
1777 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1778 CE = ContainingTypeMap.end();
1779 CI != CE; ++CI) {
1780 DIE &SPDie = *CI->first;
1781 DIDescriptor D(CI->second);
1782 if (!D)
1783 continue;
1784 DIE *NDie = getDIE(D);
1785 if (!NDie)
1786 continue;
1787 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
1788 }
1789 }
1790
1791 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
constructVariableDIE(DbgVariable & DV,bool Abstract)1792 std::unique_ptr<DIE> DwarfUnit::constructVariableDIE(DbgVariable &DV,
1793 bool Abstract) {
1794 auto D = constructVariableDIEImpl(DV, Abstract);
1795 DV.setDIE(*D);
1796 return D;
1797 }
1798
constructVariableDIEImpl(const DbgVariable & DV,bool Abstract)1799 std::unique_ptr<DIE> DwarfUnit::constructVariableDIEImpl(const DbgVariable &DV,
1800 bool Abstract) {
1801 // Define variable debug information entry.
1802 auto VariableDie = make_unique<DIE>(DV.getTag());
1803
1804 if (Abstract) {
1805 applyVariableAttributes(DV, *VariableDie);
1806 return VariableDie;
1807 }
1808
1809 // Add variable address.
1810
1811 unsigned Offset = DV.getDotDebugLocOffset();
1812 if (Offset != ~0U) {
1813 addLocationList(*VariableDie, dwarf::DW_AT_location, Offset);
1814 return VariableDie;
1815 }
1816
1817 // Check if variable is described by a DBG_VALUE instruction.
1818 if (const MachineInstr *DVInsn = DV.getMInsn()) {
1819 assert(DVInsn->getNumOperands() == 3);
1820 if (DVInsn->getOperand(0).isReg()) {
1821 const MachineOperand RegOp = DVInsn->getOperand(0);
1822 // If the second operand is an immediate, this is an indirect value.
1823 if (DVInsn->getOperand(1).isImm()) {
1824 MachineLocation Location(RegOp.getReg(),
1825 DVInsn->getOperand(1).getImm());
1826 addVariableAddress(DV, *VariableDie, Location);
1827 } else if (RegOp.getReg())
1828 addVariableAddress(DV, *VariableDie, MachineLocation(RegOp.getReg()));
1829 } else if (DVInsn->getOperand(0).isImm())
1830 addConstantValue(*VariableDie, DVInsn->getOperand(0), DV.getType());
1831 else if (DVInsn->getOperand(0).isFPImm())
1832 addConstantFPValue(*VariableDie, DVInsn->getOperand(0));
1833 else if (DVInsn->getOperand(0).isCImm())
1834 addConstantValue(*VariableDie, DVInsn->getOperand(0).getCImm(),
1835 DV.getType());
1836
1837 return VariableDie;
1838 }
1839
1840 // .. else use frame index.
1841 int FI = DV.getFrameIndex();
1842 if (FI != ~0) {
1843 unsigned FrameReg = 0;
1844 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1845 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1846 MachineLocation Location(FrameReg, Offset);
1847 addVariableAddress(DV, *VariableDie, Location);
1848 }
1849
1850 return VariableDie;
1851 }
1852
1853 /// constructMemberDIE - Construct member DIE from DIDerivedType.
constructMemberDIE(DIE & Buffer,DIDerivedType DT)1854 void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
1855 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer);
1856 StringRef Name = DT.getName();
1857 if (!Name.empty())
1858 addString(MemberDie, dwarf::DW_AT_name, Name);
1859
1860 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
1861
1862 addSourceLine(MemberDie, DT);
1863
1864 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
1865
1866 // For C++, virtual base classes are not at fixed offset. Use following
1867 // expression to extract appropriate offset from vtable.
1868 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1869
1870 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
1871 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1872 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1873 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1874 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1875 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1876 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1877 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1878
1879 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
1880 } else {
1881 uint64_t Size = DT.getSizeInBits();
1882 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1883 uint64_t OffsetInBytes;
1884
1885 if (Size != FieldSize) {
1886 // Handle bitfield, assume bytes are 8 bits.
1887 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1888 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
1889
1890 uint64_t Offset = DT.getOffsetInBits();
1891 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1892 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1893 uint64_t FieldOffset = (HiMark - FieldSize);
1894 Offset -= FieldOffset;
1895
1896 // Maybe we need to work from the other end.
1897 if (Asm->getDataLayout().isLittleEndian())
1898 Offset = FieldSize - (Offset + Size);
1899 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1900
1901 // Here DW_AT_data_member_location points to the anonymous
1902 // field that includes this bit field.
1903 OffsetInBytes = FieldOffset >> 3;
1904 } else
1905 // This is not a bitfield.
1906 OffsetInBytes = DT.getOffsetInBits() >> 3;
1907
1908 if (DD->getDwarfVersion() <= 2) {
1909 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
1910 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1911 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
1912 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1913 } else
1914 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1915 OffsetInBytes);
1916 }
1917
1918 if (DT.isProtected())
1919 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1920 dwarf::DW_ACCESS_protected);
1921 else if (DT.isPrivate())
1922 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1923 dwarf::DW_ACCESS_private);
1924 // Otherwise C++ member and base classes are considered public.
1925 else
1926 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1927 dwarf::DW_ACCESS_public);
1928 if (DT.isVirtual())
1929 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1930 dwarf::DW_VIRTUALITY_virtual);
1931
1932 // Objective-C properties.
1933 if (MDNode *PNode = DT.getObjCProperty())
1934 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1935 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1936 PropertyDie);
1937
1938 if (DT.isArtificial())
1939 addFlag(MemberDie, dwarf::DW_AT_artificial);
1940 }
1941
1942 /// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
getOrCreateStaticMemberDIE(DIDerivedType DT)1943 DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
1944 if (!DT.Verify())
1945 return nullptr;
1946
1947 // Construct the context before querying for the existence of the DIE in case
1948 // such construction creates the DIE.
1949 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1950 assert(dwarf::isType(ContextDIE->getTag()) &&
1951 "Static member should belong to a type.");
1952
1953 if (DIE *StaticMemberDIE = getDIE(DT))
1954 return StaticMemberDIE;
1955
1956 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
1957
1958 DIType Ty = resolve(DT.getTypeDerivedFrom());
1959
1960 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1961 addType(StaticMemberDIE, Ty);
1962 addSourceLine(StaticMemberDIE, DT);
1963 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1964 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1965
1966 // FIXME: We could omit private if the parent is a class_type, and
1967 // public if the parent is something else.
1968 if (DT.isProtected())
1969 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1970 dwarf::DW_ACCESS_protected);
1971 else if (DT.isPrivate())
1972 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1973 dwarf::DW_ACCESS_private);
1974 else
1975 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1976 dwarf::DW_ACCESS_public);
1977
1978 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1979 addConstantValue(StaticMemberDIE, CI, Ty);
1980 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1981 addConstantFPValue(StaticMemberDIE, CFP);
1982
1983 return &StaticMemberDIE;
1984 }
1985
emitHeader(const MCSymbol * ASectionSym) const1986 void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const {
1987 Asm->OutStreamer.AddComment("DWARF version number");
1988 Asm->EmitInt16(DD->getDwarfVersion());
1989 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1990 // We share one abbreviations table across all units so it's always at the
1991 // start of the section. Use a relocatable offset where needed to ensure
1992 // linking doesn't invalidate that offset.
1993 if (ASectionSym)
1994 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
1995 else
1996 // Use a constant value when no symbol is provided.
1997 Asm->EmitInt32(0);
1998 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1999 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2000 }
2001
addRange(RangeSpan Range)2002 void DwarfUnit::addRange(RangeSpan Range) {
2003 // Only add a range for this unit if we're emitting full debug.
2004 if (getCUNode().getEmissionKind() == DIBuilder::FullDebug) {
2005 // If we have no current ranges just add the range and return, otherwise,
2006 // check the current section and CU against the previous section and CU we
2007 // emitted into and the subprogram was contained within. If these are the
2008 // same then extend our current range, otherwise add this as a new range.
2009 if (CURanges.size() == 0 ||
2010 this != DD->getPrevCU() ||
2011 Asm->getCurrentSection() != DD->getPrevSection()) {
2012 CURanges.push_back(Range);
2013 return;
2014 }
2015
2016 assert(&(CURanges.back().getEnd()->getSection()) ==
2017 &(Range.getEnd()->getSection()) &&
2018 "We can only append to a range in the same section!");
2019 CURanges.back().setEnd(Range.getEnd());
2020 }
2021 }
2022
initStmtList(MCSymbol * DwarfLineSectionSym)2023 void DwarfCompileUnit::initStmtList(MCSymbol *DwarfLineSectionSym) {
2024 // Define start line table label for each Compile Unit.
2025 MCSymbol *LineTableStartSym =
2026 Asm->OutStreamer.getDwarfLineTableSymbol(getUniqueID());
2027
2028 stmtListIndex = UnitDie.getValues().size();
2029
2030 // DW_AT_stmt_list is a offset of line number information for this
2031 // compile unit in debug_line section. For split dwarf this is
2032 // left in the skeleton CU and so not included.
2033 // The line table entries are not always emitted in assembly, so it
2034 // is not okay to use line_table_start here.
2035 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2036 addSectionLabel(UnitDie, dwarf::DW_AT_stmt_list, LineTableStartSym);
2037 else
2038 addSectionDelta(UnitDie, dwarf::DW_AT_stmt_list, LineTableStartSym,
2039 DwarfLineSectionSym);
2040 }
2041
applyStmtList(DIE & D)2042 void DwarfCompileUnit::applyStmtList(DIE &D) {
2043 D.addValue(dwarf::DW_AT_stmt_list,
2044 UnitDie.getAbbrev().getData()[stmtListIndex].getForm(),
2045 UnitDie.getValues()[stmtListIndex]);
2046 }
2047
emitHeader(const MCSymbol * ASectionSym) const2048 void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const {
2049 DwarfUnit::emitHeader(ASectionSym);
2050 Asm->OutStreamer.AddComment("Type Signature");
2051 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
2052 Asm->OutStreamer.AddComment("Type DIE Offset");
2053 // In a skeleton type unit there is no type DIE so emit a zero offset.
2054 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
2055 sizeof(Ty->getOffset()));
2056 }
2057
initSection(const MCSection * Section)2058 void DwarfTypeUnit::initSection(const MCSection *Section) {
2059 assert(!this->Section);
2060 this->Section = Section;
2061 // Since each type unit is contained in its own COMDAT section, the begin
2062 // label and the section label are the same. Using the begin label emission in
2063 // DwarfDebug to emit the section label as well is slightly subtle/sneaky, but
2064 // the only other alternative of lazily constructing start-of-section labels
2065 // and storing a mapping in DwarfDebug (or AsmPrinter).
2066 this->SectionSym = this->LabelBegin =
2067 Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID());
2068 this->LabelEnd =
2069 Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID());
2070 }
2071