1 //===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for constructing a dwarf compile unit.
12 //===----------------------------------------------------------------------===//
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"
40 #define DEBUG_TYPE "dwarfdebug"
43 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
44 cl::desc("Generate DWARF4 type units."),
47 DIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit &DU,
49 : DwarfExpression(*AP.MF->getSubtarget().getRegisterInfo(),
50 AP.getDwarfDebug()->getDwarfVersion()),
51 AP(AP), DU(DU), DIE(DIE) {}
53 void DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) {
54 DU.addUInt(DIE, dwarf::DW_FORM_data1, Op);
56 void DIEDwarfExpression::EmitSigned(int64_t Value) {
57 DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value);
59 void DIEDwarfExpression::EmitUnsigned(uint64_t Value) {
60 DU.addUInt(DIE, dwarf::DW_FORM_udata, Value);
62 bool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) {
63 return MachineReg == TRI.getFrameRegister(*AP.MF);
67 DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
68 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
69 : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
70 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
71 assert(UnitTag == dwarf::DW_TAG_compile_unit ||
72 UnitTag == dwarf::DW_TAG_type_unit);
73 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
76 DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
77 DwarfDebug *DW, DwarfFile *DWU,
78 MCDwarfDwoLineTable *SplitLineTable)
79 : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
80 CU(CU), SplitLineTable(SplitLineTable) {
82 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
85 DwarfUnit::~DwarfUnit() {
86 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
87 DIEBlocks[j]->~DIEBlock();
88 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
89 DIELocs[j]->~DIELoc();
92 DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
93 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
97 int64_t DwarfUnit::getDefaultLowerBound() const {
98 switch (getLanguage()) {
102 case dwarf::DW_LANG_C89:
103 case dwarf::DW_LANG_C99:
104 case dwarf::DW_LANG_C:
105 case dwarf::DW_LANG_C_plus_plus:
106 case dwarf::DW_LANG_ObjC:
107 case dwarf::DW_LANG_ObjC_plus_plus:
110 case dwarf::DW_LANG_Fortran77:
111 case dwarf::DW_LANG_Fortran90:
112 case dwarf::DW_LANG_Fortran95:
115 // The languages below have valid values only if the DWARF version >= 4.
116 case dwarf::DW_LANG_Java:
117 case dwarf::DW_LANG_Python:
118 case dwarf::DW_LANG_UPC:
119 case dwarf::DW_LANG_D:
120 if (dwarf::DWARF_VERSION >= 4)
124 case dwarf::DW_LANG_Ada83:
125 case dwarf::DW_LANG_Ada95:
126 case dwarf::DW_LANG_Cobol74:
127 case dwarf::DW_LANG_Cobol85:
128 case dwarf::DW_LANG_Modula2:
129 case dwarf::DW_LANG_Pascal83:
130 case dwarf::DW_LANG_PLI:
131 if (dwarf::DWARF_VERSION >= 4)
135 // The languages below have valid values only if the DWARF version >= 5.
136 case dwarf::DW_LANG_OpenCL:
137 case dwarf::DW_LANG_Go:
138 case dwarf::DW_LANG_Haskell:
139 case dwarf::DW_LANG_C_plus_plus_03:
140 case dwarf::DW_LANG_C_plus_plus_11:
141 case dwarf::DW_LANG_OCaml:
142 case dwarf::DW_LANG_Rust:
143 case dwarf::DW_LANG_C11:
144 case dwarf::DW_LANG_Swift:
145 case dwarf::DW_LANG_Dylan:
146 case dwarf::DW_LANG_C_plus_plus_14:
147 if (dwarf::DWARF_VERSION >= 5)
151 case dwarf::DW_LANG_Modula3:
152 case dwarf::DW_LANG_Julia:
153 case dwarf::DW_LANG_Fortran03:
154 case dwarf::DW_LANG_Fortran08:
155 if (dwarf::DWARF_VERSION >= 5)
163 /// Check whether the DIE for this MDNode can be shared across CUs.
164 static bool isShareableAcrossCUs(const DebugNode *D) {
165 // When the MDNode can be part of the type system, the DIE can be shared
167 // Combining type units and cross-CU DIE sharing is lower value (since
168 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
169 // level already) but may be implementable for some value in projects
170 // building multiple independent libraries with LTO and then linking those
172 return (isa<MDType>(D) ||
173 (isa<MDSubprogram>(D) && !cast<MDSubprogram>(D)->isDefinition())) &&
174 !GenerateDwarfTypeUnits;
177 DIE *DwarfUnit::getDIE(const DebugNode *D) const {
178 if (isShareableAcrossCUs(D))
179 return DU->getDIE(D);
180 return MDNodeToDieMap.lookup(D);
183 void DwarfUnit::insertDIE(const DebugNode *Desc, DIE *D) {
184 if (isShareableAcrossCUs(Desc)) {
185 DU->insertDIE(Desc, D);
188 MDNodeToDieMap.insert(std::make_pair(Desc, D));
191 void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
192 if (DD->getDwarfVersion() >= 4)
193 Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
195 Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
198 void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
199 Optional<dwarf::Form> Form, uint64_t Integer) {
201 Form = DIEInteger::BestForm(false, Integer);
202 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
204 Die.addValue(Attribute, *Form, Value);
207 void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
208 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
211 void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
212 Optional<dwarf::Form> Form, int64_t Integer) {
214 Form = DIEInteger::BestForm(true, Integer);
215 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
216 Die.addValue(Attribute, *Form, Value);
219 void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
221 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
224 void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
227 return addLocalString(Die, Attribute, String);
229 addIndexedString(Die, Attribute, String);
232 void DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute,
234 unsigned idx = DU->getStringPool().getIndex(*Asm, String);
235 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
236 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
237 Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
240 void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
242 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
243 MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
245 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
246 Value = new (DIEValueAllocator) DIELabel(Symb);
248 Value = new (DIEValueAllocator)
249 DIEDelta(Symb, TLOF.getDwarfStrSection()->getBeginSymbol());
250 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
251 Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
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);
260 void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
261 addLabel(Die, (dwarf::Attribute)0, Form, Label);
264 void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
266 if (DD->getDwarfVersion() >= 4)
267 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
269 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
272 unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
273 return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
274 : getCU().getOrCreateSourceID(FileName, DirName);
277 void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
278 if (!DD->useSplitDwarf()) {
279 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
280 addLabel(Die, dwarf::DW_FORM_udata, Sym);
282 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
283 addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
284 DD->getAddressPool().getIndex(Sym));
288 void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
289 const MCSymbol *Hi, const MCSymbol *Lo) {
290 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
291 Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
294 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
295 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
298 void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
299 // Flag the type unit reference as a declaration so that if it contains
300 // members (implicit special members, static data member definitions, member
301 // declarations for definitions in this CU, etc) consumers don't get confused
302 // and think this is a full definition.
303 addFlag(Die, dwarf::DW_AT_declaration);
305 Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
306 new (DIEValueAllocator) DIETypeSignature(Type));
309 void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
311 const DIE *DieCU = Die.getUnitOrNull();
312 const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
314 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
315 DieCU = &getUnitDie();
317 EntryCU = &getUnitDie();
318 Die.addValue(Attribute,
319 EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
323 DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DebugNode *N) {
324 assert(Tag != dwarf::DW_TAG_auto_variable &&
325 Tag != dwarf::DW_TAG_arg_variable);
326 Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
327 DIE &Die = *Parent.getChildren().back();
333 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
334 Loc->ComputeSize(Asm);
335 DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
336 Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
339 void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
341 Block->ComputeSize(Asm);
342 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
343 Die.addValue(Attribute, Block->BestForm(), Block);
346 void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
347 StringRef Directory) {
351 unsigned FileID = getOrCreateSourceID(File, Directory);
352 assert(FileID && "Invalid file id");
353 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
354 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
357 void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
360 addSourceLine(Die, V->getLine(), V->getScope()->getFilename(),
361 V->getScope()->getDirectory());
364 void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
367 addSourceLine(Die, G->getLine(), G->getFilename(), G->getDirectory());
370 void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
373 addSourceLine(Die, SP->getLine(), SP->getFilename(), SP->getDirectory());
376 void DwarfUnit::addSourceLine(DIE &Die, const MDType *Ty) {
379 addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory());
382 void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
385 addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory());
388 void DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
389 addSourceLine(Die, NS->getLine(), NS->getFilename(), NS->getDirectory());
392 bool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
393 unsigned SizeInBits, unsigned OffsetInBits) {
394 DIEDwarfExpression Expr(*Asm, *this, TheDie);
395 Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits);
399 bool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
401 DIEDwarfExpression Expr(*Asm, *this, TheDie);
402 return Expr.AddMachineRegIndirect(Reg, Offset);
405 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
406 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
407 gives the variable VarName either the struct, or a pointer to the struct, as
408 its type. This is necessary for various behind-the-scenes things the
409 compiler needs to do with by-reference variables in Blocks.
411 However, as far as the original *programmer* is concerned, the variable
412 should still have type 'SomeType', as originally declared.
414 The function getBlockByrefType dives into the __Block_byref_x_VarName
415 struct to find the original type of the variable, which is then assigned to
416 the variable's Debug Information Entry as its real type. So far, so good.
417 However now the debugger will expect the variable VarName to have the type
418 SomeType. So we need the location attribute for the variable to be an
419 expression that explains to the debugger how to navigate through the
420 pointers and struct to find the actual variable of type SomeType.
422 The following function does just that. We start by getting
423 the "normal" location for the variable. This will be the location
424 of either the struct __Block_byref_x_VarName or the pointer to the
425 struct __Block_byref_x_VarName.
427 The struct will look something like:
429 struct __Block_byref_x_VarName {
431 struct __Block_byref_x_VarName *forwarding;
432 ... <various other fields>
434 ... <maybe more fields>
437 If we are given the struct directly (as our starting point) we
438 need to tell the debugger to:
440 1). Add the offset of the forwarding field.
442 2). Follow that pointer to get the real __Block_byref_x_VarName
443 struct to use (the real one may have been copied onto the heap).
445 3). Add the offset for the field VarName, to find the actual variable.
447 If we started with a pointer to the struct, then we need to
448 dereference that pointer first, before the other steps.
449 Translating this into DWARF ops, we will need to append the following
450 to the current location description for the variable:
452 DW_OP_deref -- optional, if we start with a pointer
453 DW_OP_plus_uconst <forward_fld_offset>
455 DW_OP_plus_uconst <varName_fld_offset>
457 That is what this function does. */
459 void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
460 dwarf::Attribute Attribute,
461 const MachineLocation &Location) {
462 const MDType *Ty = DV.getType();
463 const MDType *TmpTy = Ty;
464 uint16_t Tag = Ty->getTag();
465 bool isPointer = false;
467 StringRef varName = DV.getName();
469 if (Tag == dwarf::DW_TAG_pointer_type) {
470 DIDerivedType DTy = cast<MDDerivedType>(Ty);
471 TmpTy = resolve(DTy->getBaseType());
475 // Find the __forwarding field and the variable field in the __Block_byref
477 DIArray Fields = cast<MDCompositeTypeBase>(TmpTy)->getElements();
478 DIDerivedType varField;
479 DIDerivedType forwardingField;
481 for (unsigned i = 0, N = Fields.size(); i < N; ++i) {
482 DIDerivedType DT = cast<MDDerivedTypeBase>(Fields[i]);
483 StringRef fieldName = DT->getName();
484 if (fieldName == "__forwarding")
485 forwardingField = DT;
486 else if (fieldName == varName)
490 // Get the offsets for the forwarding field and the variable field.
491 unsigned forwardingFieldOffset = forwardingField->getOffsetInBits() >> 3;
492 unsigned varFieldOffset = varField->getOffsetInBits() >> 2;
494 // Decode the original location, and use that as the start of the byref
495 // variable's location.
496 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
499 if (Location.isReg())
500 validReg = addRegisterOpPiece(*Loc, Location.getReg());
502 validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
507 // If we started with a pointer to the __Block_byref... struct, then
508 // the first thing we need to do is dereference the pointer (DW_OP_deref).
510 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
512 // Next add the offset for the '__forwarding' field:
513 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
514 // adding the offset if it's 0.
515 if (forwardingFieldOffset > 0) {
516 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
517 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
520 // Now dereference the __forwarding field to get to the real __Block_byref
521 // struct: DW_OP_deref.
522 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
524 // Now that we've got the real __Block_byref... struct, add the offset
525 // for the variable's field to get to the location of the actual variable:
526 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
527 if (varFieldOffset > 0) {
528 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
529 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
532 // Now attach the location information to the DIE.
533 addBlock(Die, Attribute, Loc);
536 /// Return true if type encoding is unsigned.
537 static bool isUnsignedDIType(DwarfDebug *DD, const MDType *Ty) {
538 if (DIDerivedType DTy = dyn_cast<MDDerivedTypeBase>(Ty)) {
539 dwarf::Tag T = (dwarf::Tag)Ty->getTag();
540 // Encode pointer constants as unsigned bytes. This is used at least for
541 // null pointer constant emission.
542 // (Pieces of) aggregate types that get hacked apart by SROA may also be
543 // represented by a constant. Encode them as unsigned bytes.
544 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
545 // here, but accept them for now due to a bug in SROA producing bogus
547 if (T == dwarf::DW_TAG_array_type ||
548 T == dwarf::DW_TAG_class_type ||
549 T == dwarf::DW_TAG_pointer_type ||
550 T == dwarf::DW_TAG_ptr_to_member_type ||
551 T == dwarf::DW_TAG_reference_type ||
552 T == dwarf::DW_TAG_rvalue_reference_type ||
553 T == dwarf::DW_TAG_structure_type ||
554 T == dwarf::DW_TAG_union_type)
556 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
557 T == dwarf::DW_TAG_volatile_type ||
558 T == dwarf::DW_TAG_restrict_type ||
559 T == dwarf::DW_TAG_enumeration_type);
560 if (MDTypeRef Deriv = DTy->getBaseType())
561 return isUnsignedDIType(DD, DD->resolve(Deriv));
562 // FIXME: Enums without a fixed underlying type have unknown signedness
563 // here, leading to incorrectly emitted constants.
564 assert(DTy->getTag() == dwarf::DW_TAG_enumeration_type);
568 DIBasicType BTy = cast<MDBasicType>(Ty);
569 unsigned Encoding = BTy->getEncoding();
570 assert((Encoding == dwarf::DW_ATE_unsigned ||
571 Encoding == dwarf::DW_ATE_unsigned_char ||
572 Encoding == dwarf::DW_ATE_signed ||
573 Encoding == dwarf::DW_ATE_signed_char ||
574 Encoding == dwarf::DW_ATE_float || Encoding == dwarf::DW_ATE_UTF ||
575 Encoding == dwarf::DW_ATE_boolean ||
576 (Ty->getTag() == dwarf::DW_TAG_unspecified_type &&
577 Ty->getName() == "decltype(nullptr)")) &&
578 "Unsupported encoding");
579 return Encoding == dwarf::DW_ATE_unsigned ||
580 Encoding == dwarf::DW_ATE_unsigned_char ||
581 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
582 Ty->getTag() == dwarf::DW_TAG_unspecified_type;
585 /// If this type is derived from a base type then return base type size.
586 static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
587 unsigned Tag = Ty->getTag();
589 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
590 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
591 Tag != dwarf::DW_TAG_restrict_type)
592 return Ty->getSizeInBits();
594 auto *BaseType = DD->resolve(Ty->getBaseType());
596 assert(BaseType && "Unexpected invalid base type");
598 // If this is a derived type, go ahead and get the base type, unless it's a
599 // reference then it's just the size of the field. Pointer types have no need
600 // of this since they're a different type of qualification on the type.
601 if (BaseType->getTag() == dwarf::DW_TAG_reference_type ||
602 BaseType->getTag() == dwarf::DW_TAG_rvalue_reference_type)
603 return Ty->getSizeInBits();
605 if (auto *DT = dyn_cast<MDDerivedTypeBase>(BaseType))
606 return getBaseTypeSize(DD, DT);
608 return BaseType->getSizeInBits();
611 void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
612 assert(MO.isFPImm() && "Invalid machine operand!");
613 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
614 APFloat FPImm = MO.getFPImm()->getValueAPF();
616 // Get the raw data form of the floating point.
617 const APInt FltVal = FPImm.bitcastToAPInt();
618 const char *FltPtr = (const char *)FltVal.getRawData();
620 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
621 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
622 int Incr = (LittleEndian ? 1 : -1);
623 int Start = (LittleEndian ? 0 : NumBytes - 1);
624 int Stop = (LittleEndian ? NumBytes : -1);
626 // Output the constant to DWARF one byte at a time.
627 for (; Start != Stop; Start += Incr)
628 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
630 addBlock(Die, dwarf::DW_AT_const_value, Block);
633 void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
634 // Pass this down to addConstantValue as an unsigned bag of bits.
635 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
638 void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI,
640 addConstantValue(Die, CI->getValue(), Ty);
643 void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
645 assert(MO.isImm() && "Invalid machine operand!");
647 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
650 void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
651 // FIXME: This is a bit conservative/simple - it emits negative values always
652 // sign extended to 64 bits rather than minimizing the number of bytes.
653 addUInt(Die, dwarf::DW_AT_const_value,
654 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
657 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, const MDType *Ty) {
658 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
661 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
662 unsigned CIBitWidth = Val.getBitWidth();
663 if (CIBitWidth <= 64) {
664 addConstantValue(Die, Unsigned,
665 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
669 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
671 // Get the raw data form of the large APInt.
672 const uint64_t *Ptr64 = Val.getRawData();
674 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
675 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
677 // Output the constant to DWARF one byte at a time.
678 for (int i = 0; i < NumBytes; i++) {
681 c = Ptr64[i / 8] >> (8 * (i & 7));
683 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
684 addUInt(*Block, dwarf::DW_FORM_data1, c);
687 addBlock(Die, dwarf::DW_AT_const_value, Block);
690 void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
691 if (!LinkageName.empty())
693 DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
694 : dwarf::DW_AT_MIPS_linkage_name,
695 GlobalValue::getRealLinkageName(LinkageName));
698 void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
699 // Add template parameters.
700 for (const auto *Element : TParams) {
701 if (auto *TTP = dyn_cast<MDTemplateTypeParameter>(Element))
702 constructTemplateTypeParameterDIE(Buffer, TTP);
703 else if (auto *TVP = dyn_cast<MDTemplateValueParameter>(Element))
704 constructTemplateValueParameterDIE(Buffer, TVP);
708 DIE *DwarfUnit::getOrCreateContextDIE(const MDScope *Context) {
709 if (!Context || isa<MDFile>(Context))
710 return &getUnitDie();
711 if (auto *T = dyn_cast<MDType>(Context))
712 return getOrCreateTypeDIE(T);
713 if (auto *NS = dyn_cast<MDNamespace>(Context))
714 return getOrCreateNameSpace(NS);
715 if (auto *SP = dyn_cast<MDSubprogram>(Context))
716 return getOrCreateSubprogramDIE(SP);
717 return getDIE(Context);
720 DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
721 auto *Context = resolve(Ty->getScope());
722 DIE *ContextDIE = getOrCreateContextDIE(Context);
724 if (DIE *TyDIE = getDIE(Ty))
728 DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
730 constructTypeDIE(TyDIE, Ty);
732 updateAcceleratorTables(Context, Ty, TyDIE);
736 DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
740 auto *Ty = cast<MDType>(TyNode);
741 assert(Ty == resolve(Ty->getRef()) &&
742 "type was not uniqued, possible ODR violation.");
744 // DW_TAG_restrict_type is not supported in DWARF2
745 if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
746 return getOrCreateTypeDIE(
747 resolve(cast<MDDerivedType>(Ty)->getBaseType()));
749 // Construct the context before querying for the existence of the DIE in case
750 // such construction creates the DIE.
751 auto *Context = resolve(Ty->getScope());
752 DIE *ContextDIE = getOrCreateContextDIE(Context);
755 if (DIE *TyDIE = getDIE(Ty))
759 DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
761 updateAcceleratorTables(Context, Ty, TyDIE);
763 if (auto *BT = dyn_cast<MDBasicType>(Ty))
764 constructTypeDIE(TyDIE, BT);
765 else if (DICompositeType CTy = dyn_cast<MDCompositeTypeBase>(Ty)) {
766 if (GenerateDwarfTypeUnits && !Ty->isForwardDecl())
767 if (MDString *TypeId = CTy->getRawIdentifier()) {
768 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
769 // Skip updating the accelerator tables since this is not the full type.
772 constructTypeDIE(TyDIE, CTy);
774 constructTypeDIE(TyDIE, cast<MDDerivedType>(Ty));
780 void DwarfUnit::updateAcceleratorTables(const MDScope *Context,
781 const MDType *Ty, const DIE &TyDIE) {
782 if (!Ty->getName().empty() && !Ty->isForwardDecl()) {
783 bool IsImplementation = 0;
784 if (auto *CT = dyn_cast<MDCompositeTypeBase>(Ty)) {
785 // A runtime language of 0 actually means C/C++ and that any
786 // non-negative value is some version of Objective-C/C++.
787 IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete();
789 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
790 DD->addAccelType(Ty->getName(), TyDIE, Flags);
792 if (!Context || isa<MDCompileUnit>(Context) || isa<MDFile>(Context) ||
793 isa<MDNamespace>(Context))
794 addGlobalType(Ty, TyDIE, Context);
798 void DwarfUnit::addType(DIE &Entity, const MDType *Ty,
799 dwarf::Attribute Attribute) {
800 assert(Ty && "Trying to add a type that doesn't exist?");
802 // Check for pre-existence.
803 DIEEntry *Entry = getDIEEntry(Ty);
804 // If it exists then use the existing value.
806 addDIEEntry(Entity, Attribute, Entry);
811 DIE *Buffer = getOrCreateTypeDIE(Ty);
814 Entry = createDIEEntry(*Buffer);
815 insertDIEEntry(Ty, Entry);
816 addDIEEntry(Entity, Attribute, Entry);
819 std::string DwarfUnit::getParentContextString(const MDScope *Context) const {
823 // FIXME: Decide whether to implement this for non-C++ languages.
824 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
828 SmallVector<const MDScope *, 1> Parents;
829 while (!isa<MDCompileUnit>(Context)) {
830 Parents.push_back(Context);
831 if (Context->getScope())
832 Context = resolve(Context->getScope());
834 // Structure, etc types will have a NULL context if they're at the top
839 // Reverse iterate over our list to go from the outermost construct to the
841 for (auto I = Parents.rbegin(), E = Parents.rend(); I != E; ++I) {
842 const MDScope *Ctx = *I;
843 StringRef Name = Ctx->getName();
844 if (Name.empty() && isa<MDNamespace>(Ctx))
845 Name = "(anonymous namespace)";
854 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
855 // Get core information.
856 StringRef Name = BTy->getName();
857 // Add name if not anonymous or intermediate type.
859 addString(Buffer, dwarf::DW_AT_name, Name);
861 // An unspecified type only has a name attribute.
862 if (BTy->getTag() == dwarf::DW_TAG_unspecified_type)
865 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
868 uint64_t Size = BTy->getSizeInBits() >> 3;
869 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
872 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
873 // Get core information.
874 StringRef Name = DTy->getName();
875 uint64_t Size = DTy->getSizeInBits() >> 3;
876 uint16_t Tag = Buffer.getTag();
878 // Map to main type, void will not have a type.
879 const MDType *FromTy = resolve(DTy->getBaseType());
881 addType(Buffer, FromTy);
883 // Add name if not anonymous or intermediate type.
885 addString(Buffer, dwarf::DW_AT_name, Name);
887 // Add size if non-zero (derived types might be zero-sized.)
888 if (Size && Tag != dwarf::DW_TAG_pointer_type
889 && Tag != dwarf::DW_TAG_ptr_to_member_type)
890 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
892 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
894 Buffer, dwarf::DW_AT_containing_type,
895 *getOrCreateTypeDIE(resolve(cast<MDDerivedType>(DTy)->getClassType())));
896 // Add source line info if available and TyDesc is not a forward declaration.
897 if (!DTy->isForwardDecl())
898 addSourceLine(Buffer, DTy);
901 void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
902 for (unsigned i = 1, N = Args.size(); i < N; ++i) {
903 const MDType *Ty = resolve(Args[i]);
905 assert(i == N-1 && "Unspecified parameter must be the last argument");
906 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
908 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
910 if (Ty->isArtificial())
911 addFlag(Arg, dwarf::DW_AT_artificial);
916 void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
917 // Add name if not anonymous or intermediate type.
918 StringRef Name = CTy->getName();
920 uint64_t Size = CTy->getSizeInBits() >> 3;
921 uint16_t Tag = Buffer.getTag();
924 case dwarf::DW_TAG_array_type:
925 constructArrayTypeDIE(Buffer, CTy);
927 case dwarf::DW_TAG_enumeration_type:
928 constructEnumTypeDIE(Buffer, CTy);
930 case dwarf::DW_TAG_subroutine_type: {
931 // Add return type. A void return won't have a type.
932 auto Elements = cast<MDSubroutineType>(CTy)->getTypeArray();
934 if (auto RTy = resolve(Elements[0]))
935 addType(Buffer, RTy);
937 bool isPrototyped = true;
938 if (Elements.size() == 2 && !Elements[1])
939 isPrototyped = false;
941 constructSubprogramArguments(Buffer, Elements);
943 // Add prototype flag if we're dealing with a C language and the
944 // function has been prototyped.
945 uint16_t Language = getLanguage();
947 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
948 Language == dwarf::DW_LANG_ObjC))
949 addFlag(Buffer, dwarf::DW_AT_prototyped);
951 if (CTy->isLValueReference())
952 addFlag(Buffer, dwarf::DW_AT_reference);
954 if (CTy->isRValueReference())
955 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
957 case dwarf::DW_TAG_structure_type:
958 case dwarf::DW_TAG_union_type:
959 case dwarf::DW_TAG_class_type: {
960 // Add elements to structure type.
961 DIArray Elements = CTy->getElements();
962 for (const auto *Element : Elements) {
965 if (auto *SP = dyn_cast<MDSubprogram>(Element))
966 getOrCreateSubprogramDIE(SP);
967 else if (DIDerivedType DDTy = dyn_cast<MDDerivedTypeBase>(Element)) {
968 if (DDTy->getTag() == dwarf::DW_TAG_friend) {
969 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
970 addType(ElemDie, resolve(DDTy->getBaseType()), dwarf::DW_AT_friend);
971 } else if (DDTy->isStaticMember()) {
972 getOrCreateStaticMemberDIE(DDTy);
974 constructMemberDIE(Buffer, DDTy);
976 } else if (DIObjCProperty Property = dyn_cast<MDObjCProperty>(Element)) {
977 DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer);
978 StringRef PropertyName = Property->getName();
979 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
980 if (Property->getType())
981 addType(ElemDie, Property->getType());
982 addSourceLine(ElemDie, Property);
983 StringRef GetterName = Property->getGetterName();
984 if (!GetterName.empty())
985 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
986 StringRef SetterName = Property->getSetterName();
987 if (!SetterName.empty())
988 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
989 if (unsigned PropertyAttributes = Property->getAttributes())
990 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
993 DIEEntry *Entry = getDIEEntry(Element);
995 Entry = createDIEEntry(ElemDie);
996 insertDIEEntry(Element, Entry);
1001 if (CTy->isAppleBlockExtension())
1002 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
1004 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
1005 // inside C++ composite types to point to the base class with the vtable.
1006 if (DICompositeType ContainingType =
1007 dyn_cast_or_null<MDCompositeType>(resolve(CTy->getVTableHolder())))
1008 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
1009 *getOrCreateTypeDIE(ContainingType));
1011 if (CTy->isObjcClassComplete())
1012 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1014 // Add template parameters to a class, structure or union types.
1015 // FIXME: The support isn't in the metadata for this yet.
1016 if (Tag == dwarf::DW_TAG_class_type ||
1017 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1018 addTemplateParams(Buffer, CTy->getTemplateParams());
1026 // Add name if not anonymous or intermediate type.
1028 addString(Buffer, dwarf::DW_AT_name, Name);
1030 if (Tag == dwarf::DW_TAG_enumeration_type ||
1031 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
1032 Tag == dwarf::DW_TAG_union_type) {
1033 // Add size if non-zero (derived types might be zero-sized.)
1034 // TODO: Do we care about size for enum forward declarations?
1036 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
1037 else if (!CTy->isForwardDecl())
1038 // Add zero size if it is not a forward declaration.
1039 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
1041 // If we're a forward decl, say so.
1042 if (CTy->isForwardDecl())
1043 addFlag(Buffer, dwarf::DW_AT_declaration);
1045 // Add source line info if available.
1046 if (!CTy->isForwardDecl())
1047 addSourceLine(Buffer, CTy);
1049 // No harm in adding the runtime language to the declaration.
1050 unsigned RLang = CTy->getRuntimeLang();
1052 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1057 void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1058 DITemplateTypeParameter TP) {
1060 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
1061 // Add the type if it exists, it could be void and therefore no type.
1063 addType(ParamDIE, resolve(TP->getType()));
1064 if (!TP->getName().empty())
1065 addString(ParamDIE, dwarf::DW_AT_name, TP->getName());
1069 DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1070 DITemplateValueParameter VP) {
1071 DIE &ParamDIE = createAndAddDIE(VP->getTag(), Buffer);
1073 // Add the type if there is one, template template and template parameter
1074 // packs will not have a type.
1075 if (VP->getTag() == dwarf::DW_TAG_template_value_parameter)
1076 addType(ParamDIE, resolve(VP->getType()));
1077 if (!VP->getName().empty())
1078 addString(ParamDIE, dwarf::DW_AT_name, VP->getName());
1079 if (Metadata *Val = VP->getValue()) {
1080 if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
1081 addConstantValue(ParamDIE, CI, resolve(VP->getType()));
1082 else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
1083 // For declaration non-type template parameters (such as global values and
1085 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
1086 addOpAddress(*Loc, Asm->getSymbol(GV));
1087 // Emit DW_OP_stack_value to use the address as the immediate value of the
1088 // parameter, rather than a pointer to it.
1089 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1090 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
1091 } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1092 assert(isa<MDString>(Val));
1093 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1094 cast<MDString>(Val)->getString());
1095 } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1096 addTemplateParams(ParamDIE, cast<MDTuple>(Val));
1101 DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
1102 // Construct the context before querying for the existence of the DIE in case
1103 // such construction creates the DIE.
1104 DIE *ContextDIE = getOrCreateContextDIE(NS->getScope());
1106 if (DIE *NDie = getDIE(NS))
1108 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1110 StringRef Name = NS->getName();
1112 addString(NDie, dwarf::DW_AT_name, NS->getName());
1114 Name = "(anonymous namespace)";
1115 DD->addAccelNamespace(Name, NDie);
1116 addGlobalName(Name, NDie, NS->getScope());
1117 addSourceLine(NDie, NS);
1121 DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
1122 // Construct the context before querying for the existence of the DIE in case
1123 // such construction creates the DIE (as is the case for member function
1126 Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope()));
1128 if (DIE *SPDie = getDIE(SP))
1131 if (auto *SPDecl = SP->getDeclaration()) {
1133 // Add subprogram definitions to the CU die directly.
1134 ContextDIE = &getUnitDie();
1135 // Build the decl now to ensure it precedes the definition.
1136 getOrCreateSubprogramDIE(SPDecl);
1140 // DW_TAG_inlined_subroutine may refer to this DIE.
1141 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
1143 // Stop here and fill this in later, depending on whether or not this
1144 // subprogram turns out to have inlined instances or not.
1145 if (SP->isDefinition())
1148 applySubprogramAttributes(SP, SPDie);
1152 bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
1154 DIE *DeclDie = nullptr;
1155 StringRef DeclLinkageName;
1156 if (auto *SPDecl = SP->getDeclaration()) {
1157 DeclDie = getDIE(SPDecl);
1158 assert(DeclDie && "This DIE should've already been constructed when the "
1159 "definition DIE was created in "
1160 "getOrCreateSubprogramDIE");
1161 DeclLinkageName = SPDecl->getLinkageName();
1164 // Add function template parameters.
1165 addTemplateParams(SPDie, SP->getTemplateParams());
1167 // Add the linkage name if we have one and it isn't in the Decl.
1168 StringRef LinkageName = SP->getLinkageName();
1169 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1170 LinkageName == DeclLinkageName) &&
1171 "decl has a linkage name and it is different");
1172 if (DeclLinkageName.empty())
1173 addLinkageName(SPDie, LinkageName);
1178 // Refer to the function declaration where all the other attributes will be
1180 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1184 void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
1187 if (applySubprogramDefinitionAttributes(SP, SPDie))
1190 // Constructors and operators for anonymous aggregates do not have names.
1191 if (!SP->getName().empty())
1192 addString(SPDie, dwarf::DW_AT_name, SP->getName());
1194 // Skip the rest of the attributes under -gmlt to save space.
1198 addSourceLine(SPDie, SP);
1200 // Add the prototype if we have a prototype and we have a C like
1202 uint16_t Language = getLanguage();
1203 if (SP->isPrototyped() &&
1204 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
1205 Language == dwarf::DW_LANG_ObjC))
1206 addFlag(SPDie, dwarf::DW_AT_prototyped);
1208 DISubroutineType SPTy = SP->getType();
1209 assert(SPTy->getTag() == dwarf::DW_TAG_subroutine_type &&
1210 "the type of a subprogram should be a subroutine");
1212 auto Args = SPTy->getTypeArray();
1213 // Add a return type. If this is a type like a C/C++ void type we don't add a
1216 if (auto Ty = resolve(Args[0]))
1219 unsigned VK = SP->getVirtuality();
1221 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1222 DIELoc *Block = getDIELoc();
1223 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1224 addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
1225 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
1226 ContainingTypeMap.insert(
1227 std::make_pair(&SPDie, resolve(SP->getContainingType())));
1230 if (!SP->isDefinition()) {
1231 addFlag(SPDie, dwarf::DW_AT_declaration);
1233 // Add arguments. Do not add arguments for subprogram definition. They will
1234 // be handled while processing variables.
1235 constructSubprogramArguments(SPDie, Args);
1238 if (SP->isArtificial())
1239 addFlag(SPDie, dwarf::DW_AT_artificial);
1241 if (!SP->isLocalToUnit())
1242 addFlag(SPDie, dwarf::DW_AT_external);
1244 if (SP->isOptimized())
1245 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1247 if (unsigned isa = Asm->getISAEncoding())
1248 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1250 if (SP->isLValueReference())
1251 addFlag(SPDie, dwarf::DW_AT_reference);
1253 if (SP->isRValueReference())
1254 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1256 if (SP->isProtected())
1257 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1258 dwarf::DW_ACCESS_protected);
1259 else if (SP->isPrivate())
1260 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1261 dwarf::DW_ACCESS_private);
1262 else if (SP->isPublic())
1263 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1264 dwarf::DW_ACCESS_public);
1266 if (SP->isExplicit())
1267 addFlag(SPDie, dwarf::DW_AT_explicit);
1270 void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
1271 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
1272 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
1274 // The LowerBound value defines the lower bounds which is typically zero for
1275 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1276 // Count == -1 then the array is unbounded and we do not emit
1277 // DW_AT_lower_bound and DW_AT_count attributes.
1278 int64_t LowerBound = SR->getLowerBound();
1279 int64_t DefaultLowerBound = getDefaultLowerBound();
1280 int64_t Count = SR->getCount();
1282 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1283 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
1286 // FIXME: An unbounded array should reference the expression that defines
1288 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
1291 DIE *DwarfUnit::getIndexTyDie() {
1294 // Construct an integer type to use for indexes.
1295 IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
1296 addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype");
1297 addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1298 addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1299 dwarf::DW_ATE_unsigned);
1303 void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
1304 if (CTy->isVector())
1305 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
1307 // Emit the element type.
1308 addType(Buffer, resolve(CTy->getBaseType()));
1310 // Get an anonymous type for index type.
1311 // FIXME: This type should be passed down from the front end
1312 // as different languages may have different sizes for indexes.
1313 DIE *IdxTy = getIndexTyDie();
1315 // Add subranges to array type.
1316 DIArray Elements = CTy->getElements();
1317 for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1318 // FIXME: Should this really be such a loose cast?
1319 if (auto *Element = dyn_cast_or_null<DebugNode>(Elements[i]))
1320 if (Element->getTag() == dwarf::DW_TAG_subrange_type)
1321 constructSubrangeDIE(Buffer, cast<MDSubrange>(Element), IdxTy);
1325 void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
1326 DIArray Elements = CTy->getElements();
1328 // Add enumerators to enumeration type.
1329 for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1330 auto *Enum = dyn_cast_or_null<MDEnumerator>(Elements[i]);
1332 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
1333 StringRef Name = Enum->getName();
1334 addString(Enumerator, dwarf::DW_AT_name, Name);
1335 int64_t Value = Enum->getValue();
1336 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1340 const MDType *DTy = resolve(CTy->getBaseType());
1342 addType(Buffer, DTy);
1343 addFlag(Buffer, dwarf::DW_AT_enum_class);
1347 void DwarfUnit::constructContainingTypeDIEs() {
1348 for (auto CI = ContainingTypeMap.begin(), CE = ContainingTypeMap.end();
1350 DIE &SPDie = *CI->first;
1351 const DebugNode *D = CI->second;
1354 DIE *NDie = getDIE(D);
1357 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
1361 void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT_) {
1362 // Downcast to MDDerivedType.
1363 const MDDerivedType *DT = cast<MDDerivedType>(DT_);
1365 DIE &MemberDie = createAndAddDIE(DT->getTag(), Buffer);
1366 StringRef Name = DT->getName();
1368 addString(MemberDie, dwarf::DW_AT_name, Name);
1370 addType(MemberDie, resolve(DT->getBaseType()));
1372 addSourceLine(MemberDie, DT);
1374 if (DT->getTag() == dwarf::DW_TAG_inheritance && DT->isVirtual()) {
1376 // For C++, virtual base classes are not at fixed offset. Use following
1377 // expression to extract appropriate offset from vtable.
1378 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1380 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
1381 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1382 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1383 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1384 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT->getOffsetInBits());
1385 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1386 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1387 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1389 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
1391 uint64_t Size = DT->getSizeInBits();
1392 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1393 uint64_t OffsetInBytes;
1395 if (FieldSize && Size != FieldSize) {
1396 // Handle bitfield, assume bytes are 8 bits.
1397 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1398 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
1400 uint64_t Offset = DT->getOffsetInBits();
1401 uint64_t AlignMask = ~(DT->getAlignInBits() - 1);
1402 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1403 uint64_t FieldOffset = (HiMark - FieldSize);
1404 Offset -= FieldOffset;
1406 // Maybe we need to work from the other end.
1407 if (Asm->getDataLayout().isLittleEndian())
1408 Offset = FieldSize - (Offset + Size);
1409 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1411 // Here DW_AT_data_member_location points to the anonymous
1412 // field that includes this bit field.
1413 OffsetInBytes = FieldOffset >> 3;
1415 // This is not a bitfield.
1416 OffsetInBytes = DT->getOffsetInBits() >> 3;
1418 if (DD->getDwarfVersion() <= 2) {
1419 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
1420 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1421 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
1422 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1424 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1428 if (DT->isProtected())
1429 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1430 dwarf::DW_ACCESS_protected);
1431 else if (DT->isPrivate())
1432 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1433 dwarf::DW_ACCESS_private);
1434 // Otherwise C++ member and base classes are considered public.
1435 else if (DT->isPublic())
1436 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1437 dwarf::DW_ACCESS_public);
1438 if (DT->isVirtual())
1439 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1440 dwarf::DW_VIRTUALITY_virtual);
1442 // Objective-C properties.
1443 if (MDNode *PNode = DT->getObjCProperty())
1444 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1445 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1448 if (DT->isArtificial())
1449 addFlag(MemberDie, dwarf::DW_AT_artificial);
1452 DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT_) {
1453 const MDDerivedType *DT = cast_or_null<MDDerivedType>(DT_);
1457 // Construct the context before querying for the existence of the DIE in case
1458 // such construction creates the DIE.
1459 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT->getScope()));
1460 assert(dwarf::isType(ContextDIE->getTag()) &&
1461 "Static member should belong to a type.");
1463 if (DIE *StaticMemberDIE = getDIE(DT))
1464 return StaticMemberDIE;
1466 DIE &StaticMemberDIE = createAndAddDIE(DT->getTag(), *ContextDIE, DT);
1468 const MDType *Ty = resolve(DT->getBaseType());
1470 addString(StaticMemberDIE, dwarf::DW_AT_name, DT->getName());
1471 addType(StaticMemberDIE, Ty);
1472 addSourceLine(StaticMemberDIE, DT);
1473 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1474 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1476 // FIXME: We could omit private if the parent is a class_type, and
1477 // public if the parent is something else.
1478 if (DT->isProtected())
1479 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1480 dwarf::DW_ACCESS_protected);
1481 else if (DT->isPrivate())
1482 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1483 dwarf::DW_ACCESS_private);
1484 else if (DT->isPublic())
1485 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1486 dwarf::DW_ACCESS_public);
1488 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant()))
1489 addConstantValue(StaticMemberDIE, CI, Ty);
1490 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant()))
1491 addConstantFPValue(StaticMemberDIE, CFP);
1493 return &StaticMemberDIE;
1496 void DwarfUnit::emitHeader(bool UseOffsets) {
1497 // Emit size of content not including length itself
1498 Asm->OutStreamer.AddComment("Length of Unit");
1499 Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
1501 Asm->OutStreamer.AddComment("DWARF version number");
1502 Asm->EmitInt16(DD->getDwarfVersion());
1503 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1505 // We share one abbreviations table across all units so it's always at the
1506 // start of the section. Use a relocatable offset where needed to ensure
1507 // linking doesn't invalidate that offset.
1508 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1510 Asm->emitSectionOffset(TLOF.getDwarfAbbrevSection()->getBeginSymbol());
1514 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1515 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1518 void DwarfUnit::initSection(const MCSection *Section) {
1519 assert(!this->Section);
1520 this->Section = Section;
1523 void DwarfTypeUnit::emitHeader(bool UseOffsets) {
1524 DwarfUnit::emitHeader(UseOffsets);
1525 Asm->OutStreamer.AddComment("Type Signature");
1526 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1527 Asm->OutStreamer.AddComment("Type DIE Offset");
1528 // In a skeleton type unit there is no type DIE so emit a zero offset.
1529 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1530 sizeof(Ty->getOffset()));
1533 bool DwarfTypeUnit::isDwoUnit() const {
1534 // Since there are no skeleton type units, all type units are dwo type units
1535 // when split DWARF is being used.
1536 return DD->useSplitDwarf();