191bc56edSDimitry Andric //===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===//
291bc56edSDimitry Andric //
391bc56edSDimitry Andric //                     The LLVM Compiler Infrastructure
491bc56edSDimitry Andric //
591bc56edSDimitry Andric // This file is distributed under the University of Illinois Open Source
691bc56edSDimitry Andric // License. See LICENSE.TXT for details.
791bc56edSDimitry Andric //
891bc56edSDimitry Andric //===----------------------------------------------------------------------===//
991bc56edSDimitry Andric //
1091bc56edSDimitry Andric // This file contains support for constructing a dwarf compile unit.
1191bc56edSDimitry Andric //
1291bc56edSDimitry Andric //===----------------------------------------------------------------------===//
1391bc56edSDimitry Andric 
1491bc56edSDimitry Andric #include "DwarfUnit.h"
15d88c1a5aSDimitry Andric #include "AddressPool.h"
1639d628a0SDimitry Andric #include "DwarfCompileUnit.h"
1791bc56edSDimitry Andric #include "DwarfDebug.h"
1839d628a0SDimitry Andric #include "DwarfExpression.h"
1991bc56edSDimitry Andric #include "llvm/ADT/APFloat.h"
20d88c1a5aSDimitry Andric #include "llvm/ADT/APInt.h"
21d88c1a5aSDimitry Andric #include "llvm/ADT/None.h"
224ba319b5SDimitry Andric #include "llvm/ADT/StringExtras.h"
23db17bf38SDimitry Andric #include "llvm/ADT/iterator_range.h"
24ff0cc061SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
25d88c1a5aSDimitry Andric #include "llvm/CodeGen/MachineOperand.h"
262cab237bSDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h"
272cab237bSDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
2891bc56edSDimitry Andric #include "llvm/IR/Constants.h"
2991bc56edSDimitry Andric #include "llvm/IR/DataLayout.h"
30d88c1a5aSDimitry Andric #include "llvm/IR/GlobalValue.h"
31d88c1a5aSDimitry Andric #include "llvm/IR/Metadata.h"
326bc11b14SDimitry Andric #include "llvm/MC/MCAsmInfo.h"
334ba319b5SDimitry Andric #include "llvm/MC/MCContext.h"
34d88c1a5aSDimitry Andric #include "llvm/MC/MCDwarf.h"
3591bc56edSDimitry Andric #include "llvm/MC/MCSection.h"
3691bc56edSDimitry Andric #include "llvm/MC/MCStreamer.h"
37db17bf38SDimitry Andric #include "llvm/MC/MachineLocation.h"
38d88c1a5aSDimitry Andric #include "llvm/Support/Casting.h"
3991bc56edSDimitry Andric #include "llvm/Support/CommandLine.h"
404ba319b5SDimitry Andric #include "llvm/Target/TargetLoweringObjectFile.h"
41d88c1a5aSDimitry Andric #include <cassert>
42d88c1a5aSDimitry Andric #include <cstdint>
43d88c1a5aSDimitry Andric #include <string>
44d88c1a5aSDimitry Andric #include <utility>
4591bc56edSDimitry Andric 
4691bc56edSDimitry Andric using namespace llvm;
4791bc56edSDimitry Andric 
4891bc56edSDimitry Andric #define DEBUG_TYPE "dwarfdebug"
4991bc56edSDimitry Andric 
DIEDwarfExpression(const AsmPrinter & AP,DwarfUnit & DU,DIELoc & DIE)50ff0cc061SDimitry Andric DIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit &DU,
51ff0cc061SDimitry Andric                                        DIELoc &DIE)
52d88c1a5aSDimitry Andric     : DwarfExpression(AP.getDwarfVersion()), AP(AP), DU(DU),
533ca95b02SDimitry Andric       DIE(DIE) {}
54ff0cc061SDimitry Andric 
emitOp(uint8_t Op,const char * Comment)557a7e6055SDimitry Andric void DIEDwarfExpression::emitOp(uint8_t Op, const char* Comment) {
5639d628a0SDimitry Andric   DU.addUInt(DIE, dwarf::DW_FORM_data1, Op);
5739d628a0SDimitry Andric }
58d88c1a5aSDimitry Andric 
emitSigned(int64_t Value)597a7e6055SDimitry Andric void DIEDwarfExpression::emitSigned(int64_t Value) {
6039d628a0SDimitry Andric   DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value);
6139d628a0SDimitry Andric }
62d88c1a5aSDimitry Andric 
emitUnsigned(uint64_t Value)637a7e6055SDimitry Andric void DIEDwarfExpression::emitUnsigned(uint64_t Value) {
6439d628a0SDimitry Andric   DU.addUInt(DIE, dwarf::DW_FORM_udata, Value);
6539d628a0SDimitry Andric }
66d88c1a5aSDimitry Andric 
isFrameRegister(const TargetRegisterInfo & TRI,unsigned MachineReg)673ca95b02SDimitry Andric bool DIEDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI,
683ca95b02SDimitry Andric                                          unsigned MachineReg) {
69ff0cc061SDimitry Andric   return MachineReg == TRI.getFrameRegister(*AP.MF);
7039d628a0SDimitry Andric }
7139d628a0SDimitry Andric 
DwarfUnit(dwarf::Tag UnitTag,const DICompileUnit * Node,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU)723ca95b02SDimitry Andric DwarfUnit::DwarfUnit(dwarf::Tag UnitTag, const DICompileUnit *Node,
733ca95b02SDimitry Andric                      AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
746bc11b14SDimitry Andric     : DIEUnit(A->getDwarfVersion(), A->MAI->getCodePointerSize(), UnitTag),
756bc11b14SDimitry Andric       CUNode(Node), Asm(A), DD(DW), DU(DWU), IndexTyDie(nullptr) {
7691bc56edSDimitry Andric }
7791bc56edSDimitry Andric 
DwarfTypeUnit(DwarfCompileUnit & CU,AsmPrinter * A,DwarfDebug * DW,DwarfFile * DWU,MCDwarfDwoLineTable * SplitLineTable)783ca95b02SDimitry Andric DwarfTypeUnit::DwarfTypeUnit(DwarfCompileUnit &CU, AsmPrinter *A,
7991bc56edSDimitry Andric                              DwarfDebug *DW, DwarfFile *DWU,
8091bc56edSDimitry Andric                              MCDwarfDwoLineTable *SplitLineTable)
813ca95b02SDimitry Andric     : DwarfUnit(dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU), CU(CU),
823ca95b02SDimitry Andric       SplitLineTable(SplitLineTable) {
8391bc56edSDimitry Andric }
8491bc56edSDimitry Andric 
~DwarfUnit()8591bc56edSDimitry Andric DwarfUnit::~DwarfUnit() {
8691bc56edSDimitry Andric   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
8791bc56edSDimitry Andric     DIEBlocks[j]->~DIEBlock();
8891bc56edSDimitry Andric   for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
8991bc56edSDimitry Andric     DIELocs[j]->~DIELoc();
9091bc56edSDimitry Andric }
9191bc56edSDimitry Andric 
getDefaultLowerBound() const9291bc56edSDimitry Andric int64_t DwarfUnit::getDefaultLowerBound() const {
9391bc56edSDimitry Andric   switch (getLanguage()) {
9491bc56edSDimitry Andric   default:
9591bc56edSDimitry Andric     break;
9691bc56edSDimitry Andric 
977a7e6055SDimitry Andric   // The languages below have valid values in all DWARF versions.
9891bc56edSDimitry Andric   case dwarf::DW_LANG_C:
997a7e6055SDimitry Andric   case dwarf::DW_LANG_C89:
10091bc56edSDimitry Andric   case dwarf::DW_LANG_C_plus_plus:
10191bc56edSDimitry Andric     return 0;
10291bc56edSDimitry Andric 
10391bc56edSDimitry Andric   case dwarf::DW_LANG_Fortran77:
10491bc56edSDimitry Andric   case dwarf::DW_LANG_Fortran90:
10591bc56edSDimitry Andric     return 1;
10691bc56edSDimitry Andric 
1077a7e6055SDimitry Andric   // The languages below have valid values only if the DWARF version >= 3.
1087a7e6055SDimitry Andric   case dwarf::DW_LANG_C99:
1097a7e6055SDimitry Andric   case dwarf::DW_LANG_ObjC:
1107a7e6055SDimitry Andric   case dwarf::DW_LANG_ObjC_plus_plus:
1117a7e6055SDimitry Andric     if (DD->getDwarfVersion() >= 3)
1127a7e6055SDimitry Andric       return 0;
1137a7e6055SDimitry Andric     break;
1147a7e6055SDimitry Andric 
1157a7e6055SDimitry Andric   case dwarf::DW_LANG_Fortran95:
1167a7e6055SDimitry Andric     if (DD->getDwarfVersion() >= 3)
1177a7e6055SDimitry Andric       return 1;
1187a7e6055SDimitry Andric     break;
1197a7e6055SDimitry Andric 
1207a7e6055SDimitry Andric   // Starting with DWARF v4, all defined languages have valid values.
1217a7e6055SDimitry Andric   case dwarf::DW_LANG_D:
12291bc56edSDimitry Andric   case dwarf::DW_LANG_Java:
12391bc56edSDimitry Andric   case dwarf::DW_LANG_Python:
12491bc56edSDimitry Andric   case dwarf::DW_LANG_UPC:
1257a7e6055SDimitry Andric     if (DD->getDwarfVersion() >= 4)
12691bc56edSDimitry Andric       return 0;
12791bc56edSDimitry Andric     break;
12891bc56edSDimitry Andric 
12991bc56edSDimitry Andric   case dwarf::DW_LANG_Ada83:
13091bc56edSDimitry Andric   case dwarf::DW_LANG_Ada95:
13191bc56edSDimitry Andric   case dwarf::DW_LANG_Cobol74:
13291bc56edSDimitry Andric   case dwarf::DW_LANG_Cobol85:
13391bc56edSDimitry Andric   case dwarf::DW_LANG_Modula2:
13491bc56edSDimitry Andric   case dwarf::DW_LANG_Pascal83:
13591bc56edSDimitry Andric   case dwarf::DW_LANG_PLI:
1367a7e6055SDimitry Andric     if (DD->getDwarfVersion() >= 4)
13791bc56edSDimitry Andric       return 1;
13891bc56edSDimitry Andric     break;
139ff0cc061SDimitry Andric 
1407a7e6055SDimitry Andric   // The languages below are new in DWARF v5.
1417a7e6055SDimitry Andric   case dwarf::DW_LANG_BLISS:
1427a7e6055SDimitry Andric   case dwarf::DW_LANG_C11:
143ff0cc061SDimitry Andric   case dwarf::DW_LANG_C_plus_plus_03:
144ff0cc061SDimitry Andric   case dwarf::DW_LANG_C_plus_plus_11:
145ff0cc061SDimitry Andric   case dwarf::DW_LANG_C_plus_plus_14:
1467a7e6055SDimitry Andric   case dwarf::DW_LANG_Dylan:
1477a7e6055SDimitry Andric   case dwarf::DW_LANG_Go:
1487a7e6055SDimitry Andric   case dwarf::DW_LANG_Haskell:
1497a7e6055SDimitry Andric   case dwarf::DW_LANG_OCaml:
1507a7e6055SDimitry Andric   case dwarf::DW_LANG_OpenCL:
1517a7e6055SDimitry Andric   case dwarf::DW_LANG_RenderScript:
1527a7e6055SDimitry Andric   case dwarf::DW_LANG_Rust:
1537a7e6055SDimitry Andric   case dwarf::DW_LANG_Swift:
1547a7e6055SDimitry Andric     if (DD->getDwarfVersion() >= 5)
155ff0cc061SDimitry Andric       return 0;
156ff0cc061SDimitry Andric     break;
157ff0cc061SDimitry Andric 
158ff0cc061SDimitry Andric   case dwarf::DW_LANG_Fortran03:
159ff0cc061SDimitry Andric   case dwarf::DW_LANG_Fortran08:
1607a7e6055SDimitry Andric   case dwarf::DW_LANG_Julia:
1617a7e6055SDimitry Andric   case dwarf::DW_LANG_Modula3:
1627a7e6055SDimitry Andric     if (DD->getDwarfVersion() >= 5)
163ff0cc061SDimitry Andric       return 1;
164ff0cc061SDimitry Andric     break;
16591bc56edSDimitry Andric   }
16691bc56edSDimitry Andric 
16791bc56edSDimitry Andric   return -1;
16891bc56edSDimitry Andric }
16991bc56edSDimitry Andric 
17091bc56edSDimitry Andric /// Check whether the DIE for this MDNode can be shared across CUs.
isShareableAcrossCUs(const DINode * D) const1715517e702SDimitry Andric bool DwarfUnit::isShareableAcrossCUs(const DINode *D) const {
17291bc56edSDimitry Andric   // When the MDNode can be part of the type system, the DIE can be shared
17391bc56edSDimitry Andric   // across CUs.
17491bc56edSDimitry Andric   // Combining type units and cross-CU DIE sharing is lower value (since
17591bc56edSDimitry Andric   // cross-CU DIE sharing is used in LTO and removes type redundancy at that
17691bc56edSDimitry Andric   // level already) but may be implementable for some value in projects
17791bc56edSDimitry Andric   // building multiple independent libraries with LTO and then linking those
17891bc56edSDimitry Andric   // together.
1795517e702SDimitry Andric   if (isDwoUnit() && !DD->shareAcrossDWOCUs())
1805517e702SDimitry Andric     return false;
181ff0cc061SDimitry Andric   return (isa<DIType>(D) ||
182ff0cc061SDimitry Andric           (isa<DISubprogram>(D) && !cast<DISubprogram>(D)->isDefinition())) &&
1834ba319b5SDimitry Andric          !DD->generateTypeUnits();
18491bc56edSDimitry Andric }
18591bc56edSDimitry Andric 
getDIE(const DINode * D) const186ff0cc061SDimitry Andric DIE *DwarfUnit::getDIE(const DINode *D) const {
18791bc56edSDimitry Andric   if (isShareableAcrossCUs(D))
18839d628a0SDimitry Andric     return DU->getDIE(D);
18991bc56edSDimitry Andric   return MDNodeToDieMap.lookup(D);
19091bc56edSDimitry Andric }
19191bc56edSDimitry Andric 
insertDIE(const DINode * Desc,DIE * D)192ff0cc061SDimitry Andric void DwarfUnit::insertDIE(const DINode *Desc, DIE *D) {
19391bc56edSDimitry Andric   if (isShareableAcrossCUs(Desc)) {
19439d628a0SDimitry Andric     DU->insertDIE(Desc, D);
19591bc56edSDimitry Andric     return;
19691bc56edSDimitry Andric   }
19791bc56edSDimitry Andric   MDNodeToDieMap.insert(std::make_pair(Desc, D));
19891bc56edSDimitry Andric }
19991bc56edSDimitry Andric 
addFlag(DIE & Die,dwarf::Attribute Attribute)20091bc56edSDimitry Andric void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
20191bc56edSDimitry Andric   if (DD->getDwarfVersion() >= 4)
2023dac3a9bSDimitry Andric     Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag_present,
2033dac3a9bSDimitry Andric                  DIEInteger(1));
20491bc56edSDimitry Andric   else
2053dac3a9bSDimitry Andric     Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag,
2063dac3a9bSDimitry Andric                  DIEInteger(1));
20791bc56edSDimitry Andric }
20891bc56edSDimitry Andric 
addUInt(DIEValueList & Die,dwarf::Attribute Attribute,Optional<dwarf::Form> Form,uint64_t Integer)2097d523365SDimitry Andric void DwarfUnit::addUInt(DIEValueList &Die, dwarf::Attribute Attribute,
21091bc56edSDimitry Andric                         Optional<dwarf::Form> Form, uint64_t Integer) {
21191bc56edSDimitry Andric   if (!Form)
21291bc56edSDimitry Andric     Form = DIEInteger::BestForm(false, Integer);
213f1a29dd3SDimitry Andric   assert(Form != dwarf::DW_FORM_implicit_const &&
214f1a29dd3SDimitry Andric          "DW_FORM_implicit_const is used only for signed integers");
2153dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer));
21691bc56edSDimitry Andric }
21791bc56edSDimitry Andric 
addUInt(DIEValueList & Block,dwarf::Form Form,uint64_t Integer)2187d523365SDimitry Andric void DwarfUnit::addUInt(DIEValueList &Block, dwarf::Form Form,
2197d523365SDimitry Andric                         uint64_t Integer) {
22091bc56edSDimitry Andric   addUInt(Block, (dwarf::Attribute)0, Form, Integer);
22191bc56edSDimitry Andric }
22291bc56edSDimitry Andric 
addSInt(DIEValueList & Die,dwarf::Attribute Attribute,Optional<dwarf::Form> Form,int64_t Integer)2237d523365SDimitry Andric void DwarfUnit::addSInt(DIEValueList &Die, dwarf::Attribute Attribute,
22491bc56edSDimitry Andric                         Optional<dwarf::Form> Form, int64_t Integer) {
22591bc56edSDimitry Andric   if (!Form)
22691bc56edSDimitry Andric     Form = DIEInteger::BestForm(true, Integer);
2273dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer));
22891bc56edSDimitry Andric }
22991bc56edSDimitry Andric 
addSInt(DIELoc & Die,Optional<dwarf::Form> Form,int64_t Integer)23091bc56edSDimitry Andric void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
23191bc56edSDimitry Andric                         int64_t Integer) {
23291bc56edSDimitry Andric   addSInt(Die, (dwarf::Attribute)0, Form, Integer);
23391bc56edSDimitry Andric }
23491bc56edSDimitry Andric 
addString(DIE & Die,dwarf::Attribute Attribute,StringRef String)23591bc56edSDimitry Andric void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
23691bc56edSDimitry Andric                           StringRef String) {
237*b5893f02SDimitry Andric   if (CUNode->isDebugDirectivesOnly())
238*b5893f02SDimitry Andric     return;
239*b5893f02SDimitry Andric 
2404ba319b5SDimitry Andric   if (DD->useInlineStrings()) {
2414ba319b5SDimitry Andric     Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_string,
2424ba319b5SDimitry Andric                  new (DIEValueAllocator)
2434ba319b5SDimitry Andric                      DIEInlineString(String, DIEValueAllocator));
2444ba319b5SDimitry Andric     return;
2454ba319b5SDimitry Andric   }
2464ba319b5SDimitry Andric   dwarf::Form IxForm =
2474ba319b5SDimitry Andric       isDwoUnit() ? dwarf::DW_FORM_GNU_str_index : dwarf::DW_FORM_strp;
248*b5893f02SDimitry Andric 
249*b5893f02SDimitry Andric   auto StringPoolEntry =
250*b5893f02SDimitry Andric       useSegmentedStringOffsetsTable() || IxForm == dwarf::DW_FORM_GNU_str_index
251*b5893f02SDimitry Andric           ? DU->getStringPool().getIndexedEntry(*Asm, String)
252*b5893f02SDimitry Andric           : DU->getStringPool().getEntry(*Asm, String);
253*b5893f02SDimitry Andric 
2544ba319b5SDimitry Andric   // For DWARF v5 and beyond, use the smallest strx? form possible.
2554ba319b5SDimitry Andric   if (useSegmentedStringOffsetsTable()) {
2564ba319b5SDimitry Andric     IxForm = dwarf::DW_FORM_strx1;
2574ba319b5SDimitry Andric     unsigned Index = StringPoolEntry.getIndex();
2584ba319b5SDimitry Andric     if (Index > 0xffffff)
2594ba319b5SDimitry Andric       IxForm = dwarf::DW_FORM_strx4;
2604ba319b5SDimitry Andric     else if (Index > 0xffff)
2614ba319b5SDimitry Andric       IxForm = dwarf::DW_FORM_strx3;
2624ba319b5SDimitry Andric     else if (Index > 0xff)
2634ba319b5SDimitry Andric       IxForm = dwarf::DW_FORM_strx2;
2644ba319b5SDimitry Andric   }
2654ba319b5SDimitry Andric   Die.addValue(DIEValueAllocator, Attribute, IxForm,
2664ba319b5SDimitry Andric                DIEString(StringPoolEntry));
26739d628a0SDimitry Andric }
26839d628a0SDimitry Andric 
addLabel(DIEValueList & Die,dwarf::Attribute Attribute,dwarf::Form Form,const MCSymbol * Label)2697d523365SDimitry Andric DIEValueList::value_iterator DwarfUnit::addLabel(DIEValueList &Die,
2707d523365SDimitry Andric                                                  dwarf::Attribute Attribute,
2713dac3a9bSDimitry Andric                                                  dwarf::Form Form,
27291bc56edSDimitry Andric                                                  const MCSymbol *Label) {
2733dac3a9bSDimitry Andric   return Die.addValue(DIEValueAllocator, Attribute, Form, DIELabel(Label));
27491bc56edSDimitry Andric }
27591bc56edSDimitry Andric 
addLabel(DIELoc & Die,dwarf::Form Form,const MCSymbol * Label)27691bc56edSDimitry Andric void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
27791bc56edSDimitry Andric   addLabel(Die, (dwarf::Attribute)0, Form, Label);
27891bc56edSDimitry Andric }
27991bc56edSDimitry Andric 
addSectionOffset(DIE & Die,dwarf::Attribute Attribute,uint64_t Integer)28091bc56edSDimitry Andric void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
28191bc56edSDimitry Andric                                  uint64_t Integer) {
28291bc56edSDimitry Andric   if (DD->getDwarfVersion() >= 4)
28391bc56edSDimitry Andric     addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
28491bc56edSDimitry Andric   else
28591bc56edSDimitry Andric     addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
28691bc56edSDimitry Andric }
28791bc56edSDimitry Andric 
getMD5AsBytes(const DIFile * File) const2884ba319b5SDimitry Andric MD5::MD5Result *DwarfUnit::getMD5AsBytes(const DIFile *File) const {
2894ba319b5SDimitry Andric   assert(File);
2904ba319b5SDimitry Andric   if (DD->getDwarfVersion() < 5)
2914ba319b5SDimitry Andric     return nullptr;
2924ba319b5SDimitry Andric   Optional<DIFile::ChecksumInfo<StringRef>> Checksum = File->getChecksum();
2934ba319b5SDimitry Andric   if (!Checksum || Checksum->Kind != DIFile::CSK_MD5)
2944ba319b5SDimitry Andric     return nullptr;
2954ba319b5SDimitry Andric 
2964ba319b5SDimitry Andric   // Convert the string checksum to an MD5Result for the streamer.
2974ba319b5SDimitry Andric   // The verifier validates the checksum so we assume it's okay.
2984ba319b5SDimitry Andric   // An MD5 checksum is 16 bytes.
2994ba319b5SDimitry Andric   std::string ChecksumString = fromHex(Checksum->Value);
3004ba319b5SDimitry Andric   void *CKMem = Asm->OutStreamer->getContext().allocate(16, 1);
3014ba319b5SDimitry Andric   memcpy(CKMem, ChecksumString.data(), 16);
3024ba319b5SDimitry Andric   return reinterpret_cast<MD5::MD5Result *>(CKMem);
3034ba319b5SDimitry Andric }
3044ba319b5SDimitry Andric 
getOrCreateSourceID(const DIFile * File)3054ba319b5SDimitry Andric unsigned DwarfTypeUnit::getOrCreateSourceID(const DIFile *File) {
3064ba319b5SDimitry Andric   if (!SplitLineTable)
3074ba319b5SDimitry Andric     return getCU().getOrCreateSourceID(File);
3084ba319b5SDimitry Andric   if (!UsedLineTable) {
3094ba319b5SDimitry Andric     UsedLineTable = true;
3104ba319b5SDimitry Andric     // This is a split type unit that needs a line table.
3114ba319b5SDimitry Andric     addSectionOffset(getUnitDie(), dwarf::DW_AT_stmt_list, 0);
3124ba319b5SDimitry Andric   }
3134ba319b5SDimitry Andric   return SplitLineTable->getFile(File->getDirectory(), File->getFilename(),
3144ba319b5SDimitry Andric                                  getMD5AsBytes(File), File->getSource());
31591bc56edSDimitry Andric }
31691bc56edSDimitry Andric 
addOpAddress(DIELoc & Die,const MCSymbol * Sym)31791bc56edSDimitry Andric void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
318*b5893f02SDimitry Andric   if (DD->getDwarfVersion() >= 5) {
319*b5893f02SDimitry Andric     addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addrx);
320*b5893f02SDimitry Andric     addUInt(Die, dwarf::DW_FORM_addrx, DD->getAddressPool().getIndex(Sym));
321*b5893f02SDimitry Andric     return;
322*b5893f02SDimitry Andric   }
323*b5893f02SDimitry Andric 
324*b5893f02SDimitry Andric   if (DD->useSplitDwarf()) {
32591bc56edSDimitry Andric     addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
32691bc56edSDimitry Andric     addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
32791bc56edSDimitry Andric             DD->getAddressPool().getIndex(Sym));
328*b5893f02SDimitry Andric     return;
32991bc56edSDimitry Andric   }
330*b5893f02SDimitry Andric 
331*b5893f02SDimitry Andric   addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
332*b5893f02SDimitry Andric   addLabel(Die, dwarf::DW_FORM_udata, Sym);
33391bc56edSDimitry Andric }
33491bc56edSDimitry Andric 
addLabelDelta(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Hi,const MCSymbol * Lo)33591bc56edSDimitry Andric void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
33691bc56edSDimitry Andric                               const MCSymbol *Hi, const MCSymbol *Lo) {
3373dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_data4,
33897bc6c73SDimitry Andric                new (DIEValueAllocator) DIEDelta(Hi, Lo));
33991bc56edSDimitry Andric }
34091bc56edSDimitry Andric 
addDIEEntry(DIE & Die,dwarf::Attribute Attribute,DIE & Entry)34191bc56edSDimitry Andric void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
34297bc6c73SDimitry Andric   addDIEEntry(Die, Attribute, DIEEntry(Entry));
34391bc56edSDimitry Andric }
34491bc56edSDimitry Andric 
addDIETypeSignature(DIE & Die,uint64_t Signature)3453ca95b02SDimitry Andric void DwarfUnit::addDIETypeSignature(DIE &Die, uint64_t Signature) {
34691bc56edSDimitry Andric   // Flag the type unit reference as a declaration so that if it contains
34791bc56edSDimitry Andric   // members (implicit special members, static data member definitions, member
34891bc56edSDimitry Andric   // declarations for definitions in this CU, etc) consumers don't get confused
34991bc56edSDimitry Andric   // and think this is a full definition.
35091bc56edSDimitry Andric   addFlag(Die, dwarf::DW_AT_declaration);
35191bc56edSDimitry Andric 
3523dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, dwarf::DW_AT_signature,
3533ca95b02SDimitry Andric                dwarf::DW_FORM_ref_sig8, DIEInteger(Signature));
35491bc56edSDimitry Andric }
35591bc56edSDimitry Andric 
addDIEEntry(DIE & Die,dwarf::Attribute Attribute,DIEEntry Entry)35691bc56edSDimitry Andric void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
35797bc6c73SDimitry Andric                             DIEEntry Entry) {
358d88c1a5aSDimitry Andric   const DIEUnit *CU = Die.getUnit();
359d88c1a5aSDimitry Andric   const DIEUnit *EntryCU = Entry.getEntry().getUnit();
360d88c1a5aSDimitry Andric   if (!CU)
36191bc56edSDimitry Andric     // We assume that Die belongs to this CU, if it is not linked to any CU yet.
362d88c1a5aSDimitry Andric     CU = getUnitDie().getUnit();
36391bc56edSDimitry Andric   if (!EntryCU)
364d88c1a5aSDimitry Andric     EntryCU = getUnitDie().getUnit();
3653dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, Attribute,
366d88c1a5aSDimitry Andric                EntryCU == CU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
36791bc56edSDimitry Andric                Entry);
36891bc56edSDimitry Andric }
36991bc56edSDimitry Andric 
createAndAddDIE(unsigned Tag,DIE & Parent,const DINode * N)370ff0cc061SDimitry Andric DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DINode *N) {
3713dac3a9bSDimitry Andric   DIE &Die = Parent.addChild(DIE::get(DIEValueAllocator, (dwarf::Tag)Tag));
37291bc56edSDimitry Andric   if (N)
37391bc56edSDimitry Andric     insertDIE(N, &Die);
37491bc56edSDimitry Andric   return Die;
37591bc56edSDimitry Andric }
37691bc56edSDimitry Andric 
addBlock(DIE & Die,dwarf::Attribute Attribute,DIELoc * Loc)37791bc56edSDimitry Andric void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
37891bc56edSDimitry Andric   Loc->ComputeSize(Asm);
37991bc56edSDimitry Andric   DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
3803dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, Attribute,
3813dac3a9bSDimitry Andric                Loc->BestForm(DD->getDwarfVersion()), Loc);
38291bc56edSDimitry Andric }
38391bc56edSDimitry Andric 
addBlock(DIE & Die,dwarf::Attribute Attribute,DIEBlock * Block)38491bc56edSDimitry Andric void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
38591bc56edSDimitry Andric                          DIEBlock *Block) {
38691bc56edSDimitry Andric   Block->ComputeSize(Asm);
38791bc56edSDimitry Andric   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
3883dac3a9bSDimitry Andric   Die.addValue(DIEValueAllocator, Attribute, Block->BestForm(), Block);
38991bc56edSDimitry Andric }
39091bc56edSDimitry Andric 
addSourceLine(DIE & Die,unsigned Line,const DIFile * File)3914ba319b5SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, const DIFile *File) {
39291bc56edSDimitry Andric   if (Line == 0)
39391bc56edSDimitry Andric     return;
39491bc56edSDimitry Andric 
3954ba319b5SDimitry Andric   unsigned FileID = getOrCreateSourceID(File);
39691bc56edSDimitry Andric   assert(FileID && "Invalid file id");
39791bc56edSDimitry Andric   addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
39891bc56edSDimitry Andric   addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
39991bc56edSDimitry Andric }
40091bc56edSDimitry Andric 
addSourceLine(DIE & Die,const DILocalVariable * V)401ff0cc061SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, const DILocalVariable *V) {
402ff0cc061SDimitry Andric   assert(V);
40391bc56edSDimitry Andric 
4044ba319b5SDimitry Andric   addSourceLine(Die, V->getLine(), V->getFile());
40591bc56edSDimitry Andric }
40691bc56edSDimitry Andric 
addSourceLine(DIE & Die,const DIGlobalVariable * G)407ff0cc061SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, const DIGlobalVariable *G) {
408ff0cc061SDimitry Andric   assert(G);
40991bc56edSDimitry Andric 
4104ba319b5SDimitry Andric   addSourceLine(Die, G->getLine(), G->getFile());
41191bc56edSDimitry Andric }
41291bc56edSDimitry Andric 
addSourceLine(DIE & Die,const DISubprogram * SP)413ff0cc061SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, const DISubprogram *SP) {
414ff0cc061SDimitry Andric   assert(SP);
41591bc56edSDimitry Andric 
4164ba319b5SDimitry Andric   addSourceLine(Die, SP->getLine(), SP->getFile());
41791bc56edSDimitry Andric }
41891bc56edSDimitry Andric 
addSourceLine(DIE & Die,const DILabel * L)419*b5893f02SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, const DILabel *L) {
420*b5893f02SDimitry Andric   assert(L);
421*b5893f02SDimitry Andric 
422*b5893f02SDimitry Andric   addSourceLine(Die, L->getLine(), L->getFile());
423*b5893f02SDimitry Andric }
424*b5893f02SDimitry Andric 
addSourceLine(DIE & Die,const DIType * Ty)425ff0cc061SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, const DIType *Ty) {
426ff0cc061SDimitry Andric   assert(Ty);
42791bc56edSDimitry Andric 
4284ba319b5SDimitry Andric   addSourceLine(Die, Ty->getLine(), Ty->getFile());
42991bc56edSDimitry Andric }
43091bc56edSDimitry Andric 
addSourceLine(DIE & Die,const DIObjCProperty * Ty)431ff0cc061SDimitry Andric void DwarfUnit::addSourceLine(DIE &Die, const DIObjCProperty *Ty) {
432ff0cc061SDimitry Andric   assert(Ty);
43391bc56edSDimitry Andric 
4344ba319b5SDimitry Andric   addSourceLine(Die, Ty->getLine(), Ty->getFile());
43591bc56edSDimitry Andric }
43691bc56edSDimitry Andric 
43791bc56edSDimitry Andric /// Return true if type encoding is unsigned.
isUnsignedDIType(DwarfDebug * DD,const DIType * Ty)438ff0cc061SDimitry Andric static bool isUnsignedDIType(DwarfDebug *DD, const DIType *Ty) {
4397d523365SDimitry Andric   if (auto *CTy = dyn_cast<DICompositeType>(Ty)) {
4407d523365SDimitry Andric     // FIXME: Enums without a fixed underlying type have unknown signedness
4417d523365SDimitry Andric     // here, leading to incorrectly emitted constants.
4427d523365SDimitry Andric     if (CTy->getTag() == dwarf::DW_TAG_enumeration_type)
4437d523365SDimitry Andric       return false;
4447d523365SDimitry Andric 
4457d523365SDimitry Andric     // (Pieces of) aggregate types that get hacked apart by SROA may be
4467d523365SDimitry Andric     // represented by a constant. Encode them as unsigned bytes.
4477d523365SDimitry Andric     return true;
4487d523365SDimitry Andric   }
4497d523365SDimitry Andric 
4507d523365SDimitry Andric   if (auto *DTy = dyn_cast<DIDerivedType>(Ty)) {
451ff0cc061SDimitry Andric     dwarf::Tag T = (dwarf::Tag)Ty->getTag();
45291bc56edSDimitry Andric     // Encode pointer constants as unsigned bytes. This is used at least for
45391bc56edSDimitry Andric     // null pointer constant emission.
45491bc56edSDimitry Andric     // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
45591bc56edSDimitry Andric     // here, but accept them for now due to a bug in SROA producing bogus
45691bc56edSDimitry Andric     // dbg.values.
4577d523365SDimitry Andric     if (T == dwarf::DW_TAG_pointer_type ||
45891bc56edSDimitry Andric         T == dwarf::DW_TAG_ptr_to_member_type ||
45991bc56edSDimitry Andric         T == dwarf::DW_TAG_reference_type ||
4607d523365SDimitry Andric         T == dwarf::DW_TAG_rvalue_reference_type)
46191bc56edSDimitry Andric       return true;
46291bc56edSDimitry Andric     assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
46391bc56edSDimitry Andric            T == dwarf::DW_TAG_volatile_type ||
464d88c1a5aSDimitry Andric            T == dwarf::DW_TAG_restrict_type || T == dwarf::DW_TAG_atomic_type);
4657d523365SDimitry Andric     DITypeRef Deriv = DTy->getBaseType();
4667d523365SDimitry Andric     assert(Deriv && "Expected valid base type");
46791bc56edSDimitry Andric     return isUnsignedDIType(DD, DD->resolve(Deriv));
46891bc56edSDimitry Andric   }
46991bc56edSDimitry Andric 
470ff0cc061SDimitry Andric   auto *BTy = cast<DIBasicType>(Ty);
471ff0cc061SDimitry Andric   unsigned Encoding = BTy->getEncoding();
47291bc56edSDimitry Andric   assert((Encoding == dwarf::DW_ATE_unsigned ||
47391bc56edSDimitry Andric           Encoding == dwarf::DW_ATE_unsigned_char ||
47491bc56edSDimitry Andric           Encoding == dwarf::DW_ATE_signed ||
47591bc56edSDimitry Andric           Encoding == dwarf::DW_ATE_signed_char ||
476ff0cc061SDimitry Andric           Encoding == dwarf::DW_ATE_float || Encoding == dwarf::DW_ATE_UTF ||
477ff0cc061SDimitry Andric           Encoding == dwarf::DW_ATE_boolean ||
478ff0cc061SDimitry Andric           (Ty->getTag() == dwarf::DW_TAG_unspecified_type &&
479ff0cc061SDimitry Andric            Ty->getName() == "decltype(nullptr)")) &&
48091bc56edSDimitry Andric          "Unsupported encoding");
481ff0cc061SDimitry Andric   return Encoding == dwarf::DW_ATE_unsigned ||
48291bc56edSDimitry Andric          Encoding == dwarf::DW_ATE_unsigned_char ||
48339d628a0SDimitry Andric          Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
484ff0cc061SDimitry Andric          Ty->getTag() == dwarf::DW_TAG_unspecified_type;
48591bc56edSDimitry Andric }
48691bc56edSDimitry Andric 
addConstantFPValue(DIE & Die,const MachineOperand & MO)48791bc56edSDimitry Andric void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
48891bc56edSDimitry Andric   assert(MO.isFPImm() && "Invalid machine operand!");
48997bc6c73SDimitry Andric   DIEBlock *Block = new (DIEValueAllocator) DIEBlock;
49091bc56edSDimitry Andric   APFloat FPImm = MO.getFPImm()->getValueAPF();
49191bc56edSDimitry Andric 
49291bc56edSDimitry Andric   // Get the raw data form of the floating point.
49391bc56edSDimitry Andric   const APInt FltVal = FPImm.bitcastToAPInt();
49491bc56edSDimitry Andric   const char *FltPtr = (const char *)FltVal.getRawData();
49591bc56edSDimitry Andric 
49691bc56edSDimitry Andric   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
49791bc56edSDimitry Andric   bool LittleEndian = Asm->getDataLayout().isLittleEndian();
49891bc56edSDimitry Andric   int Incr = (LittleEndian ? 1 : -1);
49991bc56edSDimitry Andric   int Start = (LittleEndian ? 0 : NumBytes - 1);
50091bc56edSDimitry Andric   int Stop = (LittleEndian ? NumBytes : -1);
50191bc56edSDimitry Andric 
50291bc56edSDimitry Andric   // Output the constant to DWARF one byte at a time.
50391bc56edSDimitry Andric   for (; Start != Stop; Start += Incr)
50491bc56edSDimitry Andric     addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
50591bc56edSDimitry Andric 
50691bc56edSDimitry Andric   addBlock(Die, dwarf::DW_AT_const_value, Block);
50791bc56edSDimitry Andric }
50891bc56edSDimitry Andric 
addConstantFPValue(DIE & Die,const ConstantFP * CFP)50991bc56edSDimitry Andric void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
51091bc56edSDimitry Andric   // Pass this down to addConstantValue as an unsigned bag of bits.
51191bc56edSDimitry Andric   addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
51291bc56edSDimitry Andric }
51391bc56edSDimitry Andric 
addConstantValue(DIE & Die,const ConstantInt * CI,const DIType * Ty)514ff0cc061SDimitry Andric void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI,
515ff0cc061SDimitry Andric                                  const DIType *Ty) {
51691bc56edSDimitry Andric   addConstantValue(Die, CI->getValue(), Ty);
51791bc56edSDimitry Andric }
51891bc56edSDimitry Andric 
addConstantValue(DIE & Die,const MachineOperand & MO,const DIType * Ty)51991bc56edSDimitry Andric void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
520ff0cc061SDimitry Andric                                  const DIType *Ty) {
52191bc56edSDimitry Andric   assert(MO.isImm() && "Invalid machine operand!");
52291bc56edSDimitry Andric 
52391bc56edSDimitry Andric   addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
52491bc56edSDimitry Andric }
52591bc56edSDimitry Andric 
addConstantValue(DIE & Die,bool Unsigned,uint64_t Val)52691bc56edSDimitry Andric void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
52791bc56edSDimitry Andric   // FIXME: This is a bit conservative/simple - it emits negative values always
52891bc56edSDimitry Andric   // sign extended to 64 bits rather than minimizing the number of bytes.
52991bc56edSDimitry Andric   addUInt(Die, dwarf::DW_AT_const_value,
53091bc56edSDimitry Andric           Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
53191bc56edSDimitry Andric }
53291bc56edSDimitry Andric 
addConstantValue(DIE & Die,const APInt & Val,const DIType * Ty)533ff0cc061SDimitry Andric void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty) {
53491bc56edSDimitry Andric   addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
53591bc56edSDimitry Andric }
53691bc56edSDimitry Andric 
addConstantValue(DIE & Die,const APInt & Val,bool Unsigned)53791bc56edSDimitry Andric void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
53891bc56edSDimitry Andric   unsigned CIBitWidth = Val.getBitWidth();
53991bc56edSDimitry Andric   if (CIBitWidth <= 64) {
54091bc56edSDimitry Andric     addConstantValue(Die, Unsigned,
54191bc56edSDimitry Andric                      Unsigned ? Val.getZExtValue() : Val.getSExtValue());
54291bc56edSDimitry Andric     return;
54391bc56edSDimitry Andric   }
54491bc56edSDimitry Andric 
54597bc6c73SDimitry Andric   DIEBlock *Block = new (DIEValueAllocator) DIEBlock;
54691bc56edSDimitry Andric 
54791bc56edSDimitry Andric   // Get the raw data form of the large APInt.
54891bc56edSDimitry Andric   const uint64_t *Ptr64 = Val.getRawData();
54991bc56edSDimitry Andric 
55091bc56edSDimitry Andric   int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
55191bc56edSDimitry Andric   bool LittleEndian = Asm->getDataLayout().isLittleEndian();
55291bc56edSDimitry Andric 
55391bc56edSDimitry Andric   // Output the constant to DWARF one byte at a time.
55491bc56edSDimitry Andric   for (int i = 0; i < NumBytes; i++) {
55591bc56edSDimitry Andric     uint8_t c;
55691bc56edSDimitry Andric     if (LittleEndian)
55791bc56edSDimitry Andric       c = Ptr64[i / 8] >> (8 * (i & 7));
55891bc56edSDimitry Andric     else
55991bc56edSDimitry Andric       c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
56091bc56edSDimitry Andric     addUInt(*Block, dwarf::DW_FORM_data1, c);
56191bc56edSDimitry Andric   }
56291bc56edSDimitry Andric 
56391bc56edSDimitry Andric   addBlock(Die, dwarf::DW_AT_const_value, Block);
56491bc56edSDimitry Andric }
56591bc56edSDimitry Andric 
addLinkageName(DIE & Die,StringRef LinkageName)566ff0cc061SDimitry Andric void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
5673ca95b02SDimitry Andric   if (!LinkageName.empty())
568ff0cc061SDimitry Andric     addString(Die,
569ff0cc061SDimitry Andric               DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
570ff0cc061SDimitry Andric                                          : dwarf::DW_AT_MIPS_linkage_name,
5715517e702SDimitry Andric               GlobalValue::dropLLVMManglingEscape(LinkageName));
572ff0cc061SDimitry Andric }
573ff0cc061SDimitry Andric 
addTemplateParams(DIE & Buffer,DINodeArray TParams)574ff0cc061SDimitry Andric void DwarfUnit::addTemplateParams(DIE &Buffer, DINodeArray TParams) {
57591bc56edSDimitry Andric   // Add template parameters.
576ff0cc061SDimitry Andric   for (const auto *Element : TParams) {
577ff0cc061SDimitry Andric     if (auto *TTP = dyn_cast<DITemplateTypeParameter>(Element))
578ff0cc061SDimitry Andric       constructTemplateTypeParameterDIE(Buffer, TTP);
579ff0cc061SDimitry Andric     else if (auto *TVP = dyn_cast<DITemplateValueParameter>(Element))
580ff0cc061SDimitry Andric       constructTemplateValueParameterDIE(Buffer, TVP);
58191bc56edSDimitry Andric   }
58291bc56edSDimitry Andric }
58391bc56edSDimitry Andric 
584f37b6182SDimitry Andric /// Add thrown types.
addThrownTypes(DIE & Die,DINodeArray ThrownTypes)585f37b6182SDimitry Andric void DwarfUnit::addThrownTypes(DIE &Die, DINodeArray ThrownTypes) {
586f37b6182SDimitry Andric   for (const auto *Ty : ThrownTypes) {
587f37b6182SDimitry Andric     DIE &TT = createAndAddDIE(dwarf::DW_TAG_thrown_type, Die);
588f37b6182SDimitry Andric     addType(TT, cast<DIType>(Ty));
589f37b6182SDimitry Andric   }
590f37b6182SDimitry Andric }
591f37b6182SDimitry Andric 
getOrCreateContextDIE(const DIScope * Context)592ff0cc061SDimitry Andric DIE *DwarfUnit::getOrCreateContextDIE(const DIScope *Context) {
593ff0cc061SDimitry Andric   if (!Context || isa<DIFile>(Context))
59491bc56edSDimitry Andric     return &getUnitDie();
595ff0cc061SDimitry Andric   if (auto *T = dyn_cast<DIType>(Context))
596ff0cc061SDimitry Andric     return getOrCreateTypeDIE(T);
597ff0cc061SDimitry Andric   if (auto *NS = dyn_cast<DINamespace>(Context))
598ff0cc061SDimitry Andric     return getOrCreateNameSpace(NS);
599ff0cc061SDimitry Andric   if (auto *SP = dyn_cast<DISubprogram>(Context))
600ff0cc061SDimitry Andric     return getOrCreateSubprogramDIE(SP);
6017d523365SDimitry Andric   if (auto *M = dyn_cast<DIModule>(Context))
6027d523365SDimitry Andric     return getOrCreateModule(M);
60391bc56edSDimitry Andric   return getDIE(Context);
60491bc56edSDimitry Andric }
60591bc56edSDimitry Andric 
createTypeDIE(const DICompositeType * Ty)6067a7e6055SDimitry Andric DIE *DwarfTypeUnit::createTypeDIE(const DICompositeType *Ty) {
607ff0cc061SDimitry Andric   auto *Context = resolve(Ty->getScope());
60891bc56edSDimitry Andric   DIE *ContextDIE = getOrCreateContextDIE(Context);
60991bc56edSDimitry Andric 
61091bc56edSDimitry Andric   if (DIE *TyDIE = getDIE(Ty))
61191bc56edSDimitry Andric     return TyDIE;
61291bc56edSDimitry Andric 
61391bc56edSDimitry Andric   // Create new type.
614ff0cc061SDimitry Andric   DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
61591bc56edSDimitry Andric 
616ff0cc061SDimitry Andric   constructTypeDIE(TyDIE, cast<DICompositeType>(Ty));
61791bc56edSDimitry Andric 
61891bc56edSDimitry Andric   updateAcceleratorTables(Context, Ty, TyDIE);
61991bc56edSDimitry Andric   return &TyDIE;
62091bc56edSDimitry Andric }
62191bc56edSDimitry Andric 
getOrCreateTypeDIE(const MDNode * TyNode)62291bc56edSDimitry Andric DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
62391bc56edSDimitry Andric   if (!TyNode)
62491bc56edSDimitry Andric     return nullptr;
62591bc56edSDimitry Andric 
626ff0cc061SDimitry Andric   auto *Ty = cast<DIType>(TyNode);
62791bc56edSDimitry Andric 
62891bc56edSDimitry Andric   // DW_TAG_restrict_type is not supported in DWARF2
629ff0cc061SDimitry Andric   if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
630ff0cc061SDimitry Andric     return getOrCreateTypeDIE(resolve(cast<DIDerivedType>(Ty)->getBaseType()));
63191bc56edSDimitry Andric 
632d88c1a5aSDimitry Andric   // DW_TAG_atomic_type is not supported in DWARF < 5
633d88c1a5aSDimitry Andric   if (Ty->getTag() == dwarf::DW_TAG_atomic_type && DD->getDwarfVersion() < 5)
634d88c1a5aSDimitry Andric     return getOrCreateTypeDIE(resolve(cast<DIDerivedType>(Ty)->getBaseType()));
635d88c1a5aSDimitry Andric 
63691bc56edSDimitry Andric   // Construct the context before querying for the existence of the DIE in case
63791bc56edSDimitry Andric   // such construction creates the DIE.
638ff0cc061SDimitry Andric   auto *Context = resolve(Ty->getScope());
63991bc56edSDimitry Andric   DIE *ContextDIE = getOrCreateContextDIE(Context);
64091bc56edSDimitry Andric   assert(ContextDIE);
64191bc56edSDimitry Andric 
64291bc56edSDimitry Andric   if (DIE *TyDIE = getDIE(Ty))
64391bc56edSDimitry Andric     return TyDIE;
64491bc56edSDimitry Andric 
64591bc56edSDimitry Andric   // Create new type.
646ff0cc061SDimitry Andric   DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
64791bc56edSDimitry Andric 
64891bc56edSDimitry Andric   updateAcceleratorTables(Context, Ty, TyDIE);
64991bc56edSDimitry Andric 
650ff0cc061SDimitry Andric   if (auto *BT = dyn_cast<DIBasicType>(Ty))
651ff0cc061SDimitry Andric     constructTypeDIE(TyDIE, BT);
652ff0cc061SDimitry Andric   else if (auto *STy = dyn_cast<DISubroutineType>(Ty))
653ff0cc061SDimitry Andric     constructTypeDIE(TyDIE, STy);
654ff0cc061SDimitry Andric   else if (auto *CTy = dyn_cast<DICompositeType>(Ty)) {
6554ba319b5SDimitry Andric     if (DD->generateTypeUnits() && !Ty->isForwardDecl())
656ff0cc061SDimitry Andric       if (MDString *TypeId = CTy->getRawIdentifier()) {
65791bc56edSDimitry Andric         DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
65891bc56edSDimitry Andric         // Skip updating the accelerator tables since this is not the full type.
65991bc56edSDimitry Andric         return &TyDIE;
66091bc56edSDimitry Andric       }
66191bc56edSDimitry Andric     constructTypeDIE(TyDIE, CTy);
66291bc56edSDimitry Andric   } else {
663ff0cc061SDimitry Andric     constructTypeDIE(TyDIE, cast<DIDerivedType>(Ty));
66491bc56edSDimitry Andric   }
66591bc56edSDimitry Andric 
66691bc56edSDimitry Andric   return &TyDIE;
66791bc56edSDimitry Andric }
66891bc56edSDimitry Andric 
updateAcceleratorTables(const DIScope * Context,const DIType * Ty,const DIE & TyDIE)669ff0cc061SDimitry Andric void DwarfUnit::updateAcceleratorTables(const DIScope *Context,
670ff0cc061SDimitry Andric                                         const DIType *Ty, const DIE &TyDIE) {
671ff0cc061SDimitry Andric   if (!Ty->getName().empty() && !Ty->isForwardDecl()) {
672d88c1a5aSDimitry Andric     bool IsImplementation = false;
6737d523365SDimitry Andric     if (auto *CT = dyn_cast<DICompositeType>(Ty)) {
67491bc56edSDimitry Andric       // A runtime language of 0 actually means C/C++ and that any
67591bc56edSDimitry Andric       // non-negative value is some version of Objective-C/C++.
676ff0cc061SDimitry Andric       IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete();
67791bc56edSDimitry Andric     }
67891bc56edSDimitry Andric     unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
679*b5893f02SDimitry Andric     DD->addAccelType(*CUNode, Ty->getName(), TyDIE, Flags);
68091bc56edSDimitry Andric 
681ff0cc061SDimitry Andric     if (!Context || isa<DICompileUnit>(Context) || isa<DIFile>(Context) ||
682ff0cc061SDimitry Andric         isa<DINamespace>(Context))
68339d628a0SDimitry Andric       addGlobalType(Ty, TyDIE, Context);
68491bc56edSDimitry Andric   }
68591bc56edSDimitry Andric }
68691bc56edSDimitry Andric 
addType(DIE & Entity,const DIType * Ty,dwarf::Attribute Attribute)687ff0cc061SDimitry Andric void DwarfUnit::addType(DIE &Entity, const DIType *Ty,
688ff0cc061SDimitry Andric                         dwarf::Attribute Attribute) {
68991bc56edSDimitry Andric   assert(Ty && "Trying to add a type that doesn't exist?");
69097bc6c73SDimitry Andric   addDIEEntry(Entity, Attribute, DIEEntry(*getOrCreateTypeDIE(Ty)));
69191bc56edSDimitry Andric }
69291bc56edSDimitry Andric 
getParentContextString(const DIScope * Context) const693ff0cc061SDimitry Andric std::string DwarfUnit::getParentContextString(const DIScope *Context) const {
69491bc56edSDimitry Andric   if (!Context)
69591bc56edSDimitry Andric     return "";
69691bc56edSDimitry Andric 
69791bc56edSDimitry Andric   // FIXME: Decide whether to implement this for non-C++ languages.
69891bc56edSDimitry Andric   if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
69991bc56edSDimitry Andric     return "";
70091bc56edSDimitry Andric 
70191bc56edSDimitry Andric   std::string CS;
702ff0cc061SDimitry Andric   SmallVector<const DIScope *, 1> Parents;
703ff0cc061SDimitry Andric   while (!isa<DICompileUnit>(Context)) {
70491bc56edSDimitry Andric     Parents.push_back(Context);
705ff0cc061SDimitry Andric     if (Context->getScope())
706ff0cc061SDimitry Andric       Context = resolve(Context->getScope());
70791bc56edSDimitry Andric     else
70891bc56edSDimitry Andric       // Structure, etc types will have a NULL context if they're at the top
70991bc56edSDimitry Andric       // level.
71091bc56edSDimitry Andric       break;
71191bc56edSDimitry Andric   }
71291bc56edSDimitry Andric 
71391bc56edSDimitry Andric   // Reverse iterate over our list to go from the outermost construct to the
71491bc56edSDimitry Andric   // innermost.
7157d523365SDimitry Andric   for (const DIScope *Ctx : make_range(Parents.rbegin(), Parents.rend())) {
716ff0cc061SDimitry Andric     StringRef Name = Ctx->getName();
717ff0cc061SDimitry Andric     if (Name.empty() && isa<DINamespace>(Ctx))
71891bc56edSDimitry Andric       Name = "(anonymous namespace)";
71991bc56edSDimitry Andric     if (!Name.empty()) {
72091bc56edSDimitry Andric       CS += Name;
72191bc56edSDimitry Andric       CS += "::";
72291bc56edSDimitry Andric     }
72391bc56edSDimitry Andric   }
72491bc56edSDimitry Andric   return CS;
72591bc56edSDimitry Andric }
72691bc56edSDimitry Andric 
constructTypeDIE(DIE & Buffer,const DIBasicType * BTy)727ff0cc061SDimitry Andric void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIBasicType *BTy) {
72891bc56edSDimitry Andric   // Get core information.
729ff0cc061SDimitry Andric   StringRef Name = BTy->getName();
73091bc56edSDimitry Andric   // Add name if not anonymous or intermediate type.
73191bc56edSDimitry Andric   if (!Name.empty())
73291bc56edSDimitry Andric     addString(Buffer, dwarf::DW_AT_name, Name);
73391bc56edSDimitry Andric 
73491bc56edSDimitry Andric   // An unspecified type only has a name attribute.
735ff0cc061SDimitry Andric   if (BTy->getTag() == dwarf::DW_TAG_unspecified_type)
73691bc56edSDimitry Andric     return;
73791bc56edSDimitry Andric 
73891bc56edSDimitry Andric   addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
739ff0cc061SDimitry Andric           BTy->getEncoding());
74091bc56edSDimitry Andric 
741ff0cc061SDimitry Andric   uint64_t Size = BTy->getSizeInBits() >> 3;
74291bc56edSDimitry Andric   addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
743*b5893f02SDimitry Andric 
744*b5893f02SDimitry Andric   if (BTy->isBigEndian())
745*b5893f02SDimitry Andric     addUInt(Buffer, dwarf::DW_AT_endianity, None, dwarf::DW_END_big);
746*b5893f02SDimitry Andric   else if (BTy->isLittleEndian())
747*b5893f02SDimitry Andric     addUInt(Buffer, dwarf::DW_AT_endianity, None, dwarf::DW_END_little);
74891bc56edSDimitry Andric }
74991bc56edSDimitry Andric 
constructTypeDIE(DIE & Buffer,const DIDerivedType * DTy)750ff0cc061SDimitry Andric void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) {
75191bc56edSDimitry Andric   // Get core information.
752ff0cc061SDimitry Andric   StringRef Name = DTy->getName();
753ff0cc061SDimitry Andric   uint64_t Size = DTy->getSizeInBits() >> 3;
75491bc56edSDimitry Andric   uint16_t Tag = Buffer.getTag();
75591bc56edSDimitry Andric 
75691bc56edSDimitry Andric   // Map to main type, void will not have a type.
757ff0cc061SDimitry Andric   const DIType *FromTy = resolve(DTy->getBaseType());
75891bc56edSDimitry Andric   if (FromTy)
75991bc56edSDimitry Andric     addType(Buffer, FromTy);
76091bc56edSDimitry Andric 
76191bc56edSDimitry Andric   // Add name if not anonymous or intermediate type.
76291bc56edSDimitry Andric   if (!Name.empty())
76391bc56edSDimitry Andric     addString(Buffer, dwarf::DW_AT_name, Name);
76491bc56edSDimitry Andric 
76591bc56edSDimitry Andric   // Add size if non-zero (derived types might be zero-sized.)
76639d628a0SDimitry Andric   if (Size && Tag != dwarf::DW_TAG_pointer_type
7677d523365SDimitry Andric            && Tag != dwarf::DW_TAG_ptr_to_member_type
7687d523365SDimitry Andric            && Tag != dwarf::DW_TAG_reference_type
7697d523365SDimitry Andric            && Tag != dwarf::DW_TAG_rvalue_reference_type)
77091bc56edSDimitry Andric     addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
77191bc56edSDimitry Andric 
77291bc56edSDimitry Andric   if (Tag == dwarf::DW_TAG_ptr_to_member_type)
773ff0cc061SDimitry Andric     addDIEEntry(
774ff0cc061SDimitry Andric         Buffer, dwarf::DW_AT_containing_type,
775ff0cc061SDimitry Andric         *getOrCreateTypeDIE(resolve(cast<DIDerivedType>(DTy)->getClassType())));
77691bc56edSDimitry Andric   // Add source line info if available and TyDesc is not a forward declaration.
777ff0cc061SDimitry Andric   if (!DTy->isForwardDecl())
77891bc56edSDimitry Andric     addSourceLine(Buffer, DTy);
7797a7e6055SDimitry Andric 
7807a7e6055SDimitry Andric   // If DWARF address space value is other than None, add it for pointer and
7817a7e6055SDimitry Andric   // reference types as DW_AT_address_class.
7827a7e6055SDimitry Andric   if (DTy->getDWARFAddressSpace() && (Tag == dwarf::DW_TAG_pointer_type ||
7837a7e6055SDimitry Andric                                       Tag == dwarf::DW_TAG_reference_type))
7847a7e6055SDimitry Andric     addUInt(Buffer, dwarf::DW_AT_address_class, dwarf::DW_FORM_data4,
7857a7e6055SDimitry Andric             DTy->getDWARFAddressSpace().getValue());
78691bc56edSDimitry Andric }
78791bc56edSDimitry Andric 
constructSubprogramArguments(DIE & Buffer,DITypeRefArray Args)788ff0cc061SDimitry Andric void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeRefArray Args) {
789ff0cc061SDimitry Andric   for (unsigned i = 1, N = Args.size(); i < N; ++i) {
790ff0cc061SDimitry Andric     const DIType *Ty = resolve(Args[i]);
79139d628a0SDimitry Andric     if (!Ty) {
79291bc56edSDimitry Andric       assert(i == N-1 && "Unspecified parameter must be the last argument");
79391bc56edSDimitry Andric       createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
79491bc56edSDimitry Andric     } else {
79591bc56edSDimitry Andric       DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
79639d628a0SDimitry Andric       addType(Arg, Ty);
797ff0cc061SDimitry Andric       if (Ty->isArtificial())
79891bc56edSDimitry Andric         addFlag(Arg, dwarf::DW_AT_artificial);
79991bc56edSDimitry Andric     }
80091bc56edSDimitry Andric   }
80191bc56edSDimitry Andric }
80291bc56edSDimitry Andric 
constructTypeDIE(DIE & Buffer,const DISubroutineType * CTy)803ff0cc061SDimitry Andric void DwarfUnit::constructTypeDIE(DIE &Buffer, const DISubroutineType *CTy) {
804ff0cc061SDimitry Andric   // Add return type.  A void return won't have a type.
805ff0cc061SDimitry Andric   auto Elements = cast<DISubroutineType>(CTy)->getTypeArray();
806ff0cc061SDimitry Andric   if (Elements.size())
807ff0cc061SDimitry Andric     if (auto RTy = resolve(Elements[0]))
808ff0cc061SDimitry Andric       addType(Buffer, RTy);
80991bc56edSDimitry Andric 
810ff0cc061SDimitry Andric   bool isPrototyped = true;
811ff0cc061SDimitry Andric   if (Elements.size() == 2 && !Elements[1])
812ff0cc061SDimitry Andric     isPrototyped = false;
813ff0cc061SDimitry Andric 
814ff0cc061SDimitry Andric   constructSubprogramArguments(Buffer, Elements);
815ff0cc061SDimitry Andric 
816ff0cc061SDimitry Andric   // Add prototype flag if we're dealing with a C language and the function has
817ff0cc061SDimitry Andric   // been prototyped.
818ff0cc061SDimitry Andric   uint16_t Language = getLanguage();
819ff0cc061SDimitry Andric   if (isPrototyped &&
820ff0cc061SDimitry Andric       (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
821ff0cc061SDimitry Andric        Language == dwarf::DW_LANG_ObjC))
822ff0cc061SDimitry Andric     addFlag(Buffer, dwarf::DW_AT_prototyped);
823ff0cc061SDimitry Andric 
8243ca95b02SDimitry Andric   // Add a DW_AT_calling_convention if this has an explicit convention.
8253ca95b02SDimitry Andric   if (CTy->getCC() && CTy->getCC() != dwarf::DW_CC_normal)
8263ca95b02SDimitry Andric     addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
8273ca95b02SDimitry Andric             CTy->getCC());
8283ca95b02SDimitry Andric 
829ff0cc061SDimitry Andric   if (CTy->isLValueReference())
830ff0cc061SDimitry Andric     addFlag(Buffer, dwarf::DW_AT_reference);
831ff0cc061SDimitry Andric 
832ff0cc061SDimitry Andric   if (CTy->isRValueReference())
833ff0cc061SDimitry Andric     addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
834ff0cc061SDimitry Andric }
835ff0cc061SDimitry Andric 
constructTypeDIE(DIE & Buffer,const DICompositeType * CTy)836ff0cc061SDimitry Andric void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) {
837ff0cc061SDimitry Andric   // Add name if not anonymous or intermediate type.
838ff0cc061SDimitry Andric   StringRef Name = CTy->getName();
839ff0cc061SDimitry Andric 
840ff0cc061SDimitry Andric   uint64_t Size = CTy->getSizeInBits() >> 3;
84191bc56edSDimitry Andric   uint16_t Tag = Buffer.getTag();
84291bc56edSDimitry Andric 
84391bc56edSDimitry Andric   switch (Tag) {
84491bc56edSDimitry Andric   case dwarf::DW_TAG_array_type:
84591bc56edSDimitry Andric     constructArrayTypeDIE(Buffer, CTy);
84691bc56edSDimitry Andric     break;
84791bc56edSDimitry Andric   case dwarf::DW_TAG_enumeration_type:
84891bc56edSDimitry Andric     constructEnumTypeDIE(Buffer, CTy);
84991bc56edSDimitry Andric     break;
8504ba319b5SDimitry Andric   case dwarf::DW_TAG_variant_part:
85191bc56edSDimitry Andric   case dwarf::DW_TAG_structure_type:
85291bc56edSDimitry Andric   case dwarf::DW_TAG_union_type:
85391bc56edSDimitry Andric   case dwarf::DW_TAG_class_type: {
8544ba319b5SDimitry Andric     // Emit the discriminator for a variant part.
8554ba319b5SDimitry Andric     DIDerivedType *Discriminator = nullptr;
8564ba319b5SDimitry Andric     if (Tag == dwarf::DW_TAG_variant_part) {
8574ba319b5SDimitry Andric       Discriminator = CTy->getDiscriminator();
8584ba319b5SDimitry Andric       if (Discriminator) {
8594ba319b5SDimitry Andric         // DWARF says:
8604ba319b5SDimitry Andric         //    If the variant part has a discriminant, the discriminant is
8614ba319b5SDimitry Andric         //    represented by a separate debugging information entry which is
8624ba319b5SDimitry Andric         //    a child of the variant part entry.
8634ba319b5SDimitry Andric         DIE &DiscMember = constructMemberDIE(Buffer, Discriminator);
8644ba319b5SDimitry Andric         addDIEEntry(Buffer, dwarf::DW_AT_discr, DiscMember);
8654ba319b5SDimitry Andric       }
8664ba319b5SDimitry Andric     }
8674ba319b5SDimitry Andric 
86891bc56edSDimitry Andric     // Add elements to structure type.
869ff0cc061SDimitry Andric     DINodeArray Elements = CTy->getElements();
870ff0cc061SDimitry Andric     for (const auto *Element : Elements) {
871ff0cc061SDimitry Andric       if (!Element)
872ff0cc061SDimitry Andric         continue;
873ff0cc061SDimitry Andric       if (auto *SP = dyn_cast<DISubprogram>(Element))
874ff0cc061SDimitry Andric         getOrCreateSubprogramDIE(SP);
875ff0cc061SDimitry Andric       else if (auto *DDTy = dyn_cast<DIDerivedType>(Element)) {
876ff0cc061SDimitry Andric         if (DDTy->getTag() == dwarf::DW_TAG_friend) {
87791bc56edSDimitry Andric           DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
878ff0cc061SDimitry Andric           addType(ElemDie, resolve(DDTy->getBaseType()), dwarf::DW_AT_friend);
879ff0cc061SDimitry Andric         } else if (DDTy->isStaticMember()) {
88091bc56edSDimitry Andric           getOrCreateStaticMemberDIE(DDTy);
8814ba319b5SDimitry Andric         } else if (Tag == dwarf::DW_TAG_variant_part) {
8824ba319b5SDimitry Andric           // When emitting a variant part, wrap each member in
8834ba319b5SDimitry Andric           // DW_TAG_variant.
8844ba319b5SDimitry Andric           DIE &Variant = createAndAddDIE(dwarf::DW_TAG_variant, Buffer);
8854ba319b5SDimitry Andric           if (const ConstantInt *CI =
8864ba319b5SDimitry Andric               dyn_cast_or_null<ConstantInt>(DDTy->getDiscriminantValue())) {
8874ba319b5SDimitry Andric             if (isUnsignedDIType(DD, resolve(Discriminator->getBaseType())))
8884ba319b5SDimitry Andric               addUInt(Variant, dwarf::DW_AT_discr_value, None, CI->getZExtValue());
8894ba319b5SDimitry Andric             else
8904ba319b5SDimitry Andric               addSInt(Variant, dwarf::DW_AT_discr_value, None, CI->getSExtValue());
8914ba319b5SDimitry Andric           }
8924ba319b5SDimitry Andric           constructMemberDIE(Variant, DDTy);
89391bc56edSDimitry Andric         } else {
89491bc56edSDimitry Andric           constructMemberDIE(Buffer, DDTy);
89591bc56edSDimitry Andric         }
896ff0cc061SDimitry Andric       } else if (auto *Property = dyn_cast<DIObjCProperty>(Element)) {
897ff0cc061SDimitry Andric         DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer);
898ff0cc061SDimitry Andric         StringRef PropertyName = Property->getName();
89991bc56edSDimitry Andric         addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
900ff0cc061SDimitry Andric         if (Property->getType())
9018f0fd8f6SDimitry Andric           addType(ElemDie, resolve(Property->getType()));
90291bc56edSDimitry Andric         addSourceLine(ElemDie, Property);
903ff0cc061SDimitry Andric         StringRef GetterName = Property->getGetterName();
90491bc56edSDimitry Andric         if (!GetterName.empty())
90591bc56edSDimitry Andric           addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
906ff0cc061SDimitry Andric         StringRef SetterName = Property->getSetterName();
90791bc56edSDimitry Andric         if (!SetterName.empty())
90891bc56edSDimitry Andric           addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
909ff0cc061SDimitry Andric         if (unsigned PropertyAttributes = Property->getAttributes())
91091bc56edSDimitry Andric           addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
91191bc56edSDimitry Andric                   PropertyAttributes);
9124ba319b5SDimitry Andric       } else if (auto *Composite = dyn_cast<DICompositeType>(Element)) {
9134ba319b5SDimitry Andric         if (Composite->getTag() == dwarf::DW_TAG_variant_part) {
9144ba319b5SDimitry Andric           DIE &VariantPart = createAndAddDIE(Composite->getTag(), Buffer);
9154ba319b5SDimitry Andric           constructTypeDIE(VariantPart, Composite);
9164ba319b5SDimitry Andric         }
917ff0cc061SDimitry Andric       }
91891bc56edSDimitry Andric     }
91991bc56edSDimitry Andric 
920ff0cc061SDimitry Andric     if (CTy->isAppleBlockExtension())
92191bc56edSDimitry Andric       addFlag(Buffer, dwarf::DW_AT_APPLE_block);
92291bc56edSDimitry Andric 
92339d628a0SDimitry Andric     // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
92439d628a0SDimitry Andric     // inside C++ composite types to point to the base class with the vtable.
9252cab237bSDimitry Andric     // Rust uses DW_AT_containing_type to link a vtable to the type
9262cab237bSDimitry Andric     // for which it was created.
9272cab237bSDimitry Andric     if (auto *ContainingType = resolve(CTy->getVTableHolder()))
92891bc56edSDimitry Andric       addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
92991bc56edSDimitry Andric                   *getOrCreateTypeDIE(ContainingType));
93091bc56edSDimitry Andric 
931ff0cc061SDimitry Andric     if (CTy->isObjcClassComplete())
93291bc56edSDimitry Andric       addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
93391bc56edSDimitry Andric 
93491bc56edSDimitry Andric     // Add template parameters to a class, structure or union types.
93591bc56edSDimitry Andric     // FIXME: The support isn't in the metadata for this yet.
93691bc56edSDimitry Andric     if (Tag == dwarf::DW_TAG_class_type ||
93791bc56edSDimitry Andric         Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
938ff0cc061SDimitry Andric       addTemplateParams(Buffer, CTy->getTemplateParams());
93991bc56edSDimitry Andric 
9404ba319b5SDimitry Andric     // Add the type's non-standard calling convention.
9414ba319b5SDimitry Andric     uint8_t CC = 0;
9424ba319b5SDimitry Andric     if (CTy->isTypePassByValue())
9434ba319b5SDimitry Andric       CC = dwarf::DW_CC_pass_by_value;
9444ba319b5SDimitry Andric     else if (CTy->isTypePassByReference())
9454ba319b5SDimitry Andric       CC = dwarf::DW_CC_pass_by_reference;
9464ba319b5SDimitry Andric     if (CC)
9474ba319b5SDimitry Andric       addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
9484ba319b5SDimitry Andric               CC);
94991bc56edSDimitry Andric     break;
95091bc56edSDimitry Andric   }
95191bc56edSDimitry Andric   default:
95291bc56edSDimitry Andric     break;
95391bc56edSDimitry Andric   }
95491bc56edSDimitry Andric 
95591bc56edSDimitry Andric   // Add name if not anonymous or intermediate type.
95691bc56edSDimitry Andric   if (!Name.empty())
95791bc56edSDimitry Andric     addString(Buffer, dwarf::DW_AT_name, Name);
95891bc56edSDimitry Andric 
95991bc56edSDimitry Andric   if (Tag == dwarf::DW_TAG_enumeration_type ||
96091bc56edSDimitry Andric       Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
96191bc56edSDimitry Andric       Tag == dwarf::DW_TAG_union_type) {
96291bc56edSDimitry Andric     // Add size if non-zero (derived types might be zero-sized.)
96391bc56edSDimitry Andric     // TODO: Do we care about size for enum forward declarations?
96491bc56edSDimitry Andric     if (Size)
96591bc56edSDimitry Andric       addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
966ff0cc061SDimitry Andric     else if (!CTy->isForwardDecl())
96791bc56edSDimitry Andric       // Add zero size if it is not a forward declaration.
96891bc56edSDimitry Andric       addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
96991bc56edSDimitry Andric 
97091bc56edSDimitry Andric     // If we're a forward decl, say so.
971ff0cc061SDimitry Andric     if (CTy->isForwardDecl())
97291bc56edSDimitry Andric       addFlag(Buffer, dwarf::DW_AT_declaration);
97391bc56edSDimitry Andric 
97491bc56edSDimitry Andric     // Add source line info if available.
975ff0cc061SDimitry Andric     if (!CTy->isForwardDecl())
97691bc56edSDimitry Andric       addSourceLine(Buffer, CTy);
97791bc56edSDimitry Andric 
97891bc56edSDimitry Andric     // No harm in adding the runtime language to the declaration.
979ff0cc061SDimitry Andric     unsigned RLang = CTy->getRuntimeLang();
98091bc56edSDimitry Andric     if (RLang)
98191bc56edSDimitry Andric       addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
98291bc56edSDimitry Andric               RLang);
983d88c1a5aSDimitry Andric 
984d88c1a5aSDimitry Andric     // Add align info if available.
985d88c1a5aSDimitry Andric     if (uint32_t AlignInBytes = CTy->getAlignInBytes())
986d88c1a5aSDimitry Andric       addUInt(Buffer, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
987d88c1a5aSDimitry Andric               AlignInBytes);
98891bc56edSDimitry Andric   }
98991bc56edSDimitry Andric }
99091bc56edSDimitry Andric 
constructTemplateTypeParameterDIE(DIE & Buffer,const DITemplateTypeParameter * TP)991ff0cc061SDimitry Andric void DwarfUnit::constructTemplateTypeParameterDIE(
992ff0cc061SDimitry Andric     DIE &Buffer, const DITemplateTypeParameter *TP) {
99391bc56edSDimitry Andric   DIE &ParamDIE =
99491bc56edSDimitry Andric       createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
99591bc56edSDimitry Andric   // Add the type if it exists, it could be void and therefore no type.
996ff0cc061SDimitry Andric   if (TP->getType())
997ff0cc061SDimitry Andric     addType(ParamDIE, resolve(TP->getType()));
998ff0cc061SDimitry Andric   if (!TP->getName().empty())
999ff0cc061SDimitry Andric     addString(ParamDIE, dwarf::DW_AT_name, TP->getName());
100091bc56edSDimitry Andric }
100191bc56edSDimitry Andric 
constructTemplateValueParameterDIE(DIE & Buffer,const DITemplateValueParameter * VP)1002ff0cc061SDimitry Andric void DwarfUnit::constructTemplateValueParameterDIE(
1003ff0cc061SDimitry Andric     DIE &Buffer, const DITemplateValueParameter *VP) {
1004ff0cc061SDimitry Andric   DIE &ParamDIE = createAndAddDIE(VP->getTag(), Buffer);
100591bc56edSDimitry Andric 
100691bc56edSDimitry Andric   // Add the type if there is one, template template and template parameter
100791bc56edSDimitry Andric   // packs will not have a type.
1008ff0cc061SDimitry Andric   if (VP->getTag() == dwarf::DW_TAG_template_value_parameter)
1009ff0cc061SDimitry Andric     addType(ParamDIE, resolve(VP->getType()));
1010ff0cc061SDimitry Andric   if (!VP->getName().empty())
1011ff0cc061SDimitry Andric     addString(ParamDIE, dwarf::DW_AT_name, VP->getName());
1012ff0cc061SDimitry Andric   if (Metadata *Val = VP->getValue()) {
101339d628a0SDimitry Andric     if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
1014ff0cc061SDimitry Andric       addConstantValue(ParamDIE, CI, resolve(VP->getType()));
101539d628a0SDimitry Andric     else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
10163ca95b02SDimitry Andric       // We cannot describe the location of dllimport'd entities: the
10173ca95b02SDimitry Andric       // computation of their address requires loads from the IAT.
10183ca95b02SDimitry Andric       if (!GV->hasDLLImportStorageClass()) {
10193ca95b02SDimitry Andric         // For declaration non-type template parameters (such as global values
10203ca95b02SDimitry Andric         // and functions)
102197bc6c73SDimitry Andric         DIELoc *Loc = new (DIEValueAllocator) DIELoc;
102291bc56edSDimitry Andric         addOpAddress(*Loc, Asm->getSymbol(GV));
10233ca95b02SDimitry Andric         // Emit DW_OP_stack_value to use the address as the immediate value of
10243ca95b02SDimitry Andric         // the parameter, rather than a pointer to it.
102591bc56edSDimitry Andric         addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
102691bc56edSDimitry Andric         addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
10273ca95b02SDimitry Andric       }
1028ff0cc061SDimitry Andric     } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param) {
102991bc56edSDimitry Andric       assert(isa<MDString>(Val));
103091bc56edSDimitry Andric       addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
103191bc56edSDimitry Andric                 cast<MDString>(Val)->getString());
1032ff0cc061SDimitry Andric     } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1033ff0cc061SDimitry Andric       addTemplateParams(ParamDIE, cast<MDTuple>(Val));
103491bc56edSDimitry Andric     }
103591bc56edSDimitry Andric   }
103691bc56edSDimitry Andric }
103791bc56edSDimitry Andric 
getOrCreateNameSpace(const DINamespace * NS)1038ff0cc061SDimitry Andric DIE *DwarfUnit::getOrCreateNameSpace(const DINamespace *NS) {
103991bc56edSDimitry Andric   // Construct the context before querying for the existence of the DIE in case
104091bc56edSDimitry Andric   // such construction creates the DIE.
1041ff0cc061SDimitry Andric   DIE *ContextDIE = getOrCreateContextDIE(NS->getScope());
104291bc56edSDimitry Andric 
104391bc56edSDimitry Andric   if (DIE *NDie = getDIE(NS))
104491bc56edSDimitry Andric     return NDie;
104591bc56edSDimitry Andric   DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
104691bc56edSDimitry Andric 
1047ff0cc061SDimitry Andric   StringRef Name = NS->getName();
104891bc56edSDimitry Andric   if (!Name.empty())
1049ff0cc061SDimitry Andric     addString(NDie, dwarf::DW_AT_name, NS->getName());
105091bc56edSDimitry Andric   else
105191bc56edSDimitry Andric     Name = "(anonymous namespace)";
1052*b5893f02SDimitry Andric   DD->addAccelNamespace(*CUNode, Name, NDie);
1053ff0cc061SDimitry Andric   addGlobalName(Name, NDie, NS->getScope());
1054d88c1a5aSDimitry Andric   if (NS->getExportSymbols())
1055d88c1a5aSDimitry Andric     addFlag(NDie, dwarf::DW_AT_export_symbols);
105691bc56edSDimitry Andric   return &NDie;
105791bc56edSDimitry Andric }
105891bc56edSDimitry Andric 
getOrCreateModule(const DIModule * M)10593dac3a9bSDimitry Andric DIE *DwarfUnit::getOrCreateModule(const DIModule *M) {
10603dac3a9bSDimitry Andric   // Construct the context before querying for the existence of the DIE in case
10613dac3a9bSDimitry Andric   // such construction creates the DIE.
10623dac3a9bSDimitry Andric   DIE *ContextDIE = getOrCreateContextDIE(M->getScope());
10633dac3a9bSDimitry Andric 
10643dac3a9bSDimitry Andric   if (DIE *MDie = getDIE(M))
10653dac3a9bSDimitry Andric     return MDie;
10663dac3a9bSDimitry Andric   DIE &MDie = createAndAddDIE(dwarf::DW_TAG_module, *ContextDIE, M);
10673dac3a9bSDimitry Andric 
10683dac3a9bSDimitry Andric   if (!M->getName().empty()) {
10693dac3a9bSDimitry Andric     addString(MDie, dwarf::DW_AT_name, M->getName());
10703dac3a9bSDimitry Andric     addGlobalName(M->getName(), MDie, M->getScope());
10713dac3a9bSDimitry Andric   }
10723dac3a9bSDimitry Andric   if (!M->getConfigurationMacros().empty())
10733dac3a9bSDimitry Andric     addString(MDie, dwarf::DW_AT_LLVM_config_macros,
10743dac3a9bSDimitry Andric               M->getConfigurationMacros());
10753dac3a9bSDimitry Andric   if (!M->getIncludePath().empty())
10763dac3a9bSDimitry Andric     addString(MDie, dwarf::DW_AT_LLVM_include_path, M->getIncludePath());
10773dac3a9bSDimitry Andric   if (!M->getISysRoot().empty())
10783dac3a9bSDimitry Andric     addString(MDie, dwarf::DW_AT_LLVM_isysroot, M->getISysRoot());
10793dac3a9bSDimitry Andric 
10803dac3a9bSDimitry Andric   return &MDie;
10813dac3a9bSDimitry Andric }
10823dac3a9bSDimitry Andric 
getOrCreateSubprogramDIE(const DISubprogram * SP,bool Minimal)1083ff0cc061SDimitry Andric DIE *DwarfUnit::getOrCreateSubprogramDIE(const DISubprogram *SP, bool Minimal) {
108491bc56edSDimitry Andric   // Construct the context before querying for the existence of the DIE in case
108591bc56edSDimitry Andric   // such construction creates the DIE (as is the case for member function
108691bc56edSDimitry Andric   // declarations).
108739d628a0SDimitry Andric   DIE *ContextDIE =
1088ff0cc061SDimitry Andric       Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope()));
108991bc56edSDimitry Andric 
109091bc56edSDimitry Andric   if (DIE *SPDie = getDIE(SP))
109191bc56edSDimitry Andric     return SPDie;
109291bc56edSDimitry Andric 
1093ff0cc061SDimitry Andric   if (auto *SPDecl = SP->getDeclaration()) {
109439d628a0SDimitry Andric     if (!Minimal) {
109591bc56edSDimitry Andric       // Add subprogram definitions to the CU die directly.
109691bc56edSDimitry Andric       ContextDIE = &getUnitDie();
109791bc56edSDimitry Andric       // Build the decl now to ensure it precedes the definition.
109891bc56edSDimitry Andric       getOrCreateSubprogramDIE(SPDecl);
109991bc56edSDimitry Andric     }
110039d628a0SDimitry Andric   }
110191bc56edSDimitry Andric 
110291bc56edSDimitry Andric   // DW_TAG_inlined_subroutine may refer to this DIE.
110391bc56edSDimitry Andric   DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
110491bc56edSDimitry Andric 
110591bc56edSDimitry Andric   // Stop here and fill this in later, depending on whether or not this
110691bc56edSDimitry Andric   // subprogram turns out to have inlined instances or not.
1107ff0cc061SDimitry Andric   if (SP->isDefinition())
110891bc56edSDimitry Andric     return &SPDie;
110991bc56edSDimitry Andric 
111091bc56edSDimitry Andric   applySubprogramAttributes(SP, SPDie);
111191bc56edSDimitry Andric   return &SPDie;
111291bc56edSDimitry Andric }
111391bc56edSDimitry Andric 
applySubprogramDefinitionAttributes(const DISubprogram * SP,DIE & SPDie)1114ff0cc061SDimitry Andric bool DwarfUnit::applySubprogramDefinitionAttributes(const DISubprogram *SP,
111539d628a0SDimitry Andric                                                     DIE &SPDie) {
111691bc56edSDimitry Andric   DIE *DeclDie = nullptr;
111791bc56edSDimitry Andric   StringRef DeclLinkageName;
1118ff0cc061SDimitry Andric   if (auto *SPDecl = SP->getDeclaration()) {
111991bc56edSDimitry Andric     DeclDie = getDIE(SPDecl);
112091bc56edSDimitry Andric     assert(DeclDie && "This DIE should've already been constructed when the "
112191bc56edSDimitry Andric                       "definition DIE was created in "
112291bc56edSDimitry Andric                       "getOrCreateSubprogramDIE");
1123d88c1a5aSDimitry Andric     // Look at the Decl's linkage name only if we emitted it.
1124d88c1a5aSDimitry Andric     if (DD->useAllLinkageNames())
1125ff0cc061SDimitry Andric       DeclLinkageName = SPDecl->getLinkageName();
11264ba319b5SDimitry Andric     unsigned DeclID = getOrCreateSourceID(SPDecl->getFile());
11274ba319b5SDimitry Andric     unsigned DefID = getOrCreateSourceID(SP->getFile());
11287d523365SDimitry Andric     if (DeclID != DefID)
11297d523365SDimitry Andric       addUInt(SPDie, dwarf::DW_AT_decl_file, None, DefID);
11307d523365SDimitry Andric 
11317d523365SDimitry Andric     if (SP->getLine() != SPDecl->getLine())
11327d523365SDimitry Andric       addUInt(SPDie, dwarf::DW_AT_decl_line, None, SP->getLine());
113391bc56edSDimitry Andric   }
113491bc56edSDimitry Andric 
113591bc56edSDimitry Andric   // Add function template parameters.
1136ff0cc061SDimitry Andric   addTemplateParams(SPDie, SP->getTemplateParams());
113791bc56edSDimitry Andric 
113891bc56edSDimitry Andric   // Add the linkage name if we have one and it isn't in the Decl.
1139ff0cc061SDimitry Andric   StringRef LinkageName = SP->getLinkageName();
114091bc56edSDimitry Andric   assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
114191bc56edSDimitry Andric           LinkageName == DeclLinkageName) &&
114291bc56edSDimitry Andric          "decl has a linkage name and it is different");
11433ca95b02SDimitry Andric   if (DeclLinkageName.empty() &&
11443ca95b02SDimitry Andric       // Always emit it for abstract subprograms.
11453ca95b02SDimitry Andric       (DD->useAllLinkageNames() || DU->getAbstractSPDies().lookup(SP)))
1146ff0cc061SDimitry Andric     addLinkageName(SPDie, LinkageName);
114791bc56edSDimitry Andric 
114839d628a0SDimitry Andric   if (!DeclDie)
114939d628a0SDimitry Andric     return false;
115039d628a0SDimitry Andric 
115191bc56edSDimitry Andric   // Refer to the function declaration where all the other attributes will be
115291bc56edSDimitry Andric   // found.
115391bc56edSDimitry Andric   addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
115439d628a0SDimitry Andric   return true;
115591bc56edSDimitry Andric }
115691bc56edSDimitry Andric 
applySubprogramAttributes(const DISubprogram * SP,DIE & SPDie,bool SkipSPAttributes)1157ff0cc061SDimitry Andric void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie,
11587a7e6055SDimitry Andric                                           bool SkipSPAttributes) {
11597a7e6055SDimitry Andric   // If -fdebug-info-for-profiling is enabled, need to emit the subprogram
11607a7e6055SDimitry Andric   // and its source location.
11617a7e6055SDimitry Andric   bool SkipSPSourceLocation = SkipSPAttributes &&
11627a7e6055SDimitry Andric                               !CUNode->getDebugInfoForProfiling();
11637a7e6055SDimitry Andric   if (!SkipSPSourceLocation)
116439d628a0SDimitry Andric     if (applySubprogramDefinitionAttributes(SP, SPDie))
116539d628a0SDimitry Andric       return;
116639d628a0SDimitry Andric 
116791bc56edSDimitry Andric   // Constructors and operators for anonymous aggregates do not have names.
1168ff0cc061SDimitry Andric   if (!SP->getName().empty())
1169ff0cc061SDimitry Andric     addString(SPDie, dwarf::DW_AT_name, SP->getName());
117091bc56edSDimitry Andric 
11717a7e6055SDimitry Andric   if (!SkipSPSourceLocation)
117291bc56edSDimitry Andric     addSourceLine(SPDie, SP);
117391bc56edSDimitry Andric 
11747a7e6055SDimitry Andric   // Skip the rest of the attributes under -gmlt to save space.
11757a7e6055SDimitry Andric   if (SkipSPAttributes)
11767a7e6055SDimitry Andric     return;
11777a7e6055SDimitry Andric 
117891bc56edSDimitry Andric   // Add the prototype if we have a prototype and we have a C like
117991bc56edSDimitry Andric   // language.
118091bc56edSDimitry Andric   uint16_t Language = getLanguage();
1181ff0cc061SDimitry Andric   if (SP->isPrototyped() &&
118291bc56edSDimitry Andric       (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
118391bc56edSDimitry Andric        Language == dwarf::DW_LANG_ObjC))
118491bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_prototyped);
118591bc56edSDimitry Andric 
11863ca95b02SDimitry Andric   unsigned CC = 0;
11877d523365SDimitry Andric   DITypeRefArray Args;
11883ca95b02SDimitry Andric   if (const DISubroutineType *SPTy = SP->getType()) {
11897d523365SDimitry Andric     Args = SPTy->getTypeArray();
11903ca95b02SDimitry Andric     CC = SPTy->getCC();
11913ca95b02SDimitry Andric   }
11923ca95b02SDimitry Andric 
11933ca95b02SDimitry Andric   // Add a DW_AT_calling_convention if this has an explicit convention.
11943ca95b02SDimitry Andric   if (CC && CC != dwarf::DW_CC_normal)
11953ca95b02SDimitry Andric     addUInt(SPDie, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1, CC);
119691bc56edSDimitry Andric 
119791bc56edSDimitry Andric   // Add a return type. If this is a type like a C/C++ void type we don't add a
119891bc56edSDimitry Andric   // return type.
1199ff0cc061SDimitry Andric   if (Args.size())
1200ff0cc061SDimitry Andric     if (auto Ty = resolve(Args[0]))
1201ff0cc061SDimitry Andric       addType(SPDie, Ty);
120291bc56edSDimitry Andric 
1203ff0cc061SDimitry Andric   unsigned VK = SP->getVirtuality();
120491bc56edSDimitry Andric   if (VK) {
120591bc56edSDimitry Andric     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
12063ca95b02SDimitry Andric     if (SP->getVirtualIndex() != -1u) {
120791bc56edSDimitry Andric       DIELoc *Block = getDIELoc();
120891bc56edSDimitry Andric       addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1209ff0cc061SDimitry Andric       addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
121091bc56edSDimitry Andric       addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
12113ca95b02SDimitry Andric     }
121291bc56edSDimitry Andric     ContainingTypeMap.insert(
1213ff0cc061SDimitry Andric         std::make_pair(&SPDie, resolve(SP->getContainingType())));
121491bc56edSDimitry Andric   }
121591bc56edSDimitry Andric 
1216ff0cc061SDimitry Andric   if (!SP->isDefinition()) {
121791bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_declaration);
121891bc56edSDimitry Andric 
121991bc56edSDimitry Andric     // Add arguments. Do not add arguments for subprogram definition. They will
122091bc56edSDimitry Andric     // be handled while processing variables.
122191bc56edSDimitry Andric     constructSubprogramArguments(SPDie, Args);
122291bc56edSDimitry Andric   }
122391bc56edSDimitry Andric 
1224f37b6182SDimitry Andric   addThrownTypes(SPDie, SP->getThrownTypes());
1225f37b6182SDimitry Andric 
1226ff0cc061SDimitry Andric   if (SP->isArtificial())
122791bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_artificial);
122891bc56edSDimitry Andric 
1229ff0cc061SDimitry Andric   if (!SP->isLocalToUnit())
123091bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_external);
123191bc56edSDimitry Andric 
12323ca95b02SDimitry Andric   if (DD->useAppleExtensionAttributes()) {
1233ff0cc061SDimitry Andric     if (SP->isOptimized())
123491bc56edSDimitry Andric       addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
123591bc56edSDimitry Andric 
1236ff0cc061SDimitry Andric     if (unsigned isa = Asm->getISAEncoding())
123791bc56edSDimitry Andric       addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
12383ca95b02SDimitry Andric   }
123991bc56edSDimitry Andric 
1240ff0cc061SDimitry Andric   if (SP->isLValueReference())
124191bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_reference);
124291bc56edSDimitry Andric 
1243ff0cc061SDimitry Andric   if (SP->isRValueReference())
124491bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
124591bc56edSDimitry Andric 
1246d88c1a5aSDimitry Andric   if (SP->isNoReturn())
1247d88c1a5aSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_noreturn);
1248d88c1a5aSDimitry Andric 
1249ff0cc061SDimitry Andric   if (SP->isProtected())
125091bc56edSDimitry Andric     addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
125191bc56edSDimitry Andric             dwarf::DW_ACCESS_protected);
1252ff0cc061SDimitry Andric   else if (SP->isPrivate())
125391bc56edSDimitry Andric     addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
125491bc56edSDimitry Andric             dwarf::DW_ACCESS_private);
1255ff0cc061SDimitry Andric   else if (SP->isPublic())
125691bc56edSDimitry Andric     addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
125791bc56edSDimitry Andric             dwarf::DW_ACCESS_public);
125891bc56edSDimitry Andric 
1259ff0cc061SDimitry Andric   if (SP->isExplicit())
126091bc56edSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_explicit);
1261d88c1a5aSDimitry Andric 
1262d88c1a5aSDimitry Andric   if (SP->isMainSubprogram())
1263d88c1a5aSDimitry Andric     addFlag(SPDie, dwarf::DW_AT_main_subprogram);
126491bc56edSDimitry Andric }
126591bc56edSDimitry Andric 
constructSubrangeDIE(DIE & Buffer,const DISubrange * SR,DIE * IndexTy)1266ff0cc061SDimitry Andric void DwarfUnit::constructSubrangeDIE(DIE &Buffer, const DISubrange *SR,
1267ff0cc061SDimitry Andric                                      DIE *IndexTy) {
126891bc56edSDimitry Andric   DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
126991bc56edSDimitry Andric   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
127091bc56edSDimitry Andric 
127191bc56edSDimitry Andric   // The LowerBound value defines the lower bounds which is typically zero for
127291bc56edSDimitry Andric   // C/C++. The Count value is the number of elements.  Values are 64 bit. If
127391bc56edSDimitry Andric   // Count == -1 then the array is unbounded and we do not emit
127439d628a0SDimitry Andric   // DW_AT_lower_bound and DW_AT_count attributes.
1275ff0cc061SDimitry Andric   int64_t LowerBound = SR->getLowerBound();
127691bc56edSDimitry Andric   int64_t DefaultLowerBound = getDefaultLowerBound();
12774ba319b5SDimitry Andric   int64_t Count = -1;
12784ba319b5SDimitry Andric   if (auto *CI = SR->getCount().dyn_cast<ConstantInt*>())
12794ba319b5SDimitry Andric     Count = CI->getSExtValue();
128091bc56edSDimitry Andric 
128191bc56edSDimitry Andric   if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
128291bc56edSDimitry Andric     addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
128391bc56edSDimitry Andric 
12844ba319b5SDimitry Andric   if (auto *CV = SR->getCount().dyn_cast<DIVariable*>()) {
12854ba319b5SDimitry Andric     if (auto *CountVarDIE = getDIE(CV))
12864ba319b5SDimitry Andric       addDIEEntry(DW_Subrange, dwarf::DW_AT_count, *CountVarDIE);
12874ba319b5SDimitry Andric   } else if (Count != -1)
128839d628a0SDimitry Andric     addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
128939d628a0SDimitry Andric }
129039d628a0SDimitry Andric 
getIndexTyDie()129139d628a0SDimitry Andric DIE *DwarfUnit::getIndexTyDie() {
129239d628a0SDimitry Andric   if (IndexTyDie)
129339d628a0SDimitry Andric     return IndexTyDie;
129439d628a0SDimitry Andric   // Construct an integer type to use for indexes.
1295d88c1a5aSDimitry Andric   IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, getUnitDie());
12964ba319b5SDimitry Andric   StringRef Name = "__ARRAY_SIZE_TYPE__";
12974ba319b5SDimitry Andric   addString(*IndexTyDie, dwarf::DW_AT_name, Name);
129839d628a0SDimitry Andric   addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
129939d628a0SDimitry Andric   addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
130039d628a0SDimitry Andric           dwarf::DW_ATE_unsigned);
1301*b5893f02SDimitry Andric   DD->addAccelType(*CUNode, Name, *IndexTyDie, /*Flags*/ 0);
130239d628a0SDimitry Andric   return IndexTyDie;
130391bc56edSDimitry Andric }
130491bc56edSDimitry Andric 
13054ba319b5SDimitry Andric /// Returns true if the vector's size differs from the sum of sizes of elements
13064ba319b5SDimitry Andric /// the user specified.  This can occur if the vector has been rounded up to
13074ba319b5SDimitry Andric /// fit memory alignment constraints.
hasVectorBeenPadded(const DICompositeType * CTy)13084ba319b5SDimitry Andric static bool hasVectorBeenPadded(const DICompositeType *CTy) {
13094ba319b5SDimitry Andric   assert(CTy && CTy->isVector() && "Composite type is not a vector");
13104ba319b5SDimitry Andric   const uint64_t ActualSize = CTy->getSizeInBits();
13114ba319b5SDimitry Andric 
13124ba319b5SDimitry Andric   // Obtain the size of each element in the vector.
13134ba319b5SDimitry Andric   DIType *BaseTy = CTy->getBaseType().resolve();
13144ba319b5SDimitry Andric   assert(BaseTy && "Unknown vector element type.");
13154ba319b5SDimitry Andric   const uint64_t ElementSize = BaseTy->getSizeInBits();
13164ba319b5SDimitry Andric 
13174ba319b5SDimitry Andric   // Locate the number of elements in the vector.
13184ba319b5SDimitry Andric   const DINodeArray Elements = CTy->getElements();
13194ba319b5SDimitry Andric   assert(Elements.size() == 1 &&
13204ba319b5SDimitry Andric          Elements[0]->getTag() == dwarf::DW_TAG_subrange_type &&
13214ba319b5SDimitry Andric          "Invalid vector element array, expected one element of type subrange");
13224ba319b5SDimitry Andric   const auto Subrange = cast<DISubrange>(Elements[0]);
13234ba319b5SDimitry Andric   const auto CI = Subrange->getCount().get<ConstantInt *>();
13244ba319b5SDimitry Andric   const int32_t NumVecElements = CI->getSExtValue();
13254ba319b5SDimitry Andric 
13264ba319b5SDimitry Andric   // Ensure we found the element count and that the actual size is wide
13274ba319b5SDimitry Andric   // enough to contain the requested size.
13284ba319b5SDimitry Andric   assert(ActualSize >= (NumVecElements * ElementSize) && "Invalid vector size");
13294ba319b5SDimitry Andric   return ActualSize != (NumVecElements * ElementSize);
13304ba319b5SDimitry Andric }
13314ba319b5SDimitry Andric 
constructArrayTypeDIE(DIE & Buffer,const DICompositeType * CTy)1332ff0cc061SDimitry Andric void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, const DICompositeType *CTy) {
13334ba319b5SDimitry Andric   if (CTy->isVector()) {
133491bc56edSDimitry Andric     addFlag(Buffer, dwarf::DW_AT_GNU_vector);
13354ba319b5SDimitry Andric     if (hasVectorBeenPadded(CTy))
13364ba319b5SDimitry Andric       addUInt(Buffer, dwarf::DW_AT_byte_size, None,
13374ba319b5SDimitry Andric               CTy->getSizeInBits() / CHAR_BIT);
13384ba319b5SDimitry Andric   }
133991bc56edSDimitry Andric 
134091bc56edSDimitry Andric   // Emit the element type.
1341ff0cc061SDimitry Andric   addType(Buffer, resolve(CTy->getBaseType()));
134291bc56edSDimitry Andric 
134391bc56edSDimitry Andric   // Get an anonymous type for index type.
134491bc56edSDimitry Andric   // FIXME: This type should be passed down from the front end
134591bc56edSDimitry Andric   // as different languages may have different sizes for indexes.
134691bc56edSDimitry Andric   DIE *IdxTy = getIndexTyDie();
134791bc56edSDimitry Andric 
134891bc56edSDimitry Andric   // Add subranges to array type.
1349ff0cc061SDimitry Andric   DINodeArray Elements = CTy->getElements();
1350ff0cc061SDimitry Andric   for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1351ff0cc061SDimitry Andric     // FIXME: Should this really be such a loose cast?
1352ff0cc061SDimitry Andric     if (auto *Element = dyn_cast_or_null<DINode>(Elements[i]))
1353ff0cc061SDimitry Andric       if (Element->getTag() == dwarf::DW_TAG_subrange_type)
1354ff0cc061SDimitry Andric         constructSubrangeDIE(Buffer, cast<DISubrange>(Element), IdxTy);
135591bc56edSDimitry Andric   }
135691bc56edSDimitry Andric }
135791bc56edSDimitry Andric 
constructEnumTypeDIE(DIE & Buffer,const DICompositeType * CTy)1358ff0cc061SDimitry Andric void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, const DICompositeType *CTy) {
13594ba319b5SDimitry Andric   const DIType *DTy = resolve(CTy->getBaseType());
13604ba319b5SDimitry Andric   bool IsUnsigned = DTy && isUnsignedDIType(DD, DTy);
13614ba319b5SDimitry Andric   if (DTy) {
13624ba319b5SDimitry Andric     if (DD->getDwarfVersion() >= 3)
13634ba319b5SDimitry Andric       addType(Buffer, DTy);
1364*b5893f02SDimitry Andric     if (DD->getDwarfVersion() >= 4 && (CTy->getFlags() & DINode::FlagEnumClass))
13654ba319b5SDimitry Andric       addFlag(Buffer, dwarf::DW_AT_enum_class);
13664ba319b5SDimitry Andric   }
13674ba319b5SDimitry Andric 
1368ff0cc061SDimitry Andric   DINodeArray Elements = CTy->getElements();
136991bc56edSDimitry Andric 
137091bc56edSDimitry Andric   // Add enumerators to enumeration type.
1371ff0cc061SDimitry Andric   for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
1372ff0cc061SDimitry Andric     auto *Enum = dyn_cast_or_null<DIEnumerator>(Elements[i]);
1373ff0cc061SDimitry Andric     if (Enum) {
137491bc56edSDimitry Andric       DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
1375ff0cc061SDimitry Andric       StringRef Name = Enum->getName();
137691bc56edSDimitry Andric       addString(Enumerator, dwarf::DW_AT_name, Name);
13774ba319b5SDimitry Andric       auto Value = static_cast<uint64_t>(Enum->getValue());
13784ba319b5SDimitry Andric       addConstantValue(Enumerator, IsUnsigned, Value);
137991bc56edSDimitry Andric     }
138091bc56edSDimitry Andric   }
138191bc56edSDimitry Andric }
138291bc56edSDimitry Andric 
constructContainingTypeDIEs()138391bc56edSDimitry Andric void DwarfUnit::constructContainingTypeDIEs() {
1384ff0cc061SDimitry Andric   for (auto CI = ContainingTypeMap.begin(), CE = ContainingTypeMap.end();
138591bc56edSDimitry Andric        CI != CE; ++CI) {
138691bc56edSDimitry Andric     DIE &SPDie = *CI->first;
1387ff0cc061SDimitry Andric     const DINode *D = CI->second;
138891bc56edSDimitry Andric     if (!D)
138991bc56edSDimitry Andric       continue;
139091bc56edSDimitry Andric     DIE *NDie = getDIE(D);
139191bc56edSDimitry Andric     if (!NDie)
139291bc56edSDimitry Andric       continue;
139391bc56edSDimitry Andric     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
139491bc56edSDimitry Andric   }
139591bc56edSDimitry Andric }
139691bc56edSDimitry Andric 
constructMemberDIE(DIE & Buffer,const DIDerivedType * DT)13974ba319b5SDimitry Andric DIE &DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) {
1398ff0cc061SDimitry Andric   DIE &MemberDie = createAndAddDIE(DT->getTag(), Buffer);
1399ff0cc061SDimitry Andric   StringRef Name = DT->getName();
140091bc56edSDimitry Andric   if (!Name.empty())
140191bc56edSDimitry Andric     addString(MemberDie, dwarf::DW_AT_name, Name);
140291bc56edSDimitry Andric 
1403954b921dSDimitry Andric   if (DIType *Resolved = resolve(DT->getBaseType()))
1404954b921dSDimitry Andric     addType(MemberDie, Resolved);
140591bc56edSDimitry Andric 
140691bc56edSDimitry Andric   addSourceLine(MemberDie, DT);
140791bc56edSDimitry Andric 
1408ff0cc061SDimitry Andric   if (DT->getTag() == dwarf::DW_TAG_inheritance && DT->isVirtual()) {
140991bc56edSDimitry Andric 
141091bc56edSDimitry Andric     // For C++, virtual base classes are not at fixed offset. Use following
141191bc56edSDimitry Andric     // expression to extract appropriate offset from vtable.
141291bc56edSDimitry Andric     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
141391bc56edSDimitry Andric 
141497bc6c73SDimitry Andric     DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc;
141591bc56edSDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
141691bc56edSDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
141791bc56edSDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1418ff0cc061SDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT->getOffsetInBits());
141991bc56edSDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
142091bc56edSDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
142191bc56edSDimitry Andric     addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
142291bc56edSDimitry Andric 
142391bc56edSDimitry Andric     addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
142491bc56edSDimitry Andric   } else {
1425ff0cc061SDimitry Andric     uint64_t Size = DT->getSizeInBits();
14263ca95b02SDimitry Andric     uint64_t FieldSize = DD->getBaseTypeSize(DT);
1427d88c1a5aSDimitry Andric     uint32_t AlignInBytes = DT->getAlignInBytes();
142891bc56edSDimitry Andric     uint64_t OffsetInBytes;
142991bc56edSDimitry Andric 
14303ca95b02SDimitry Andric     bool IsBitfield = FieldSize && Size != FieldSize;
14313ca95b02SDimitry Andric     if (IsBitfield) {
143291bc56edSDimitry Andric       // Handle bitfield, assume bytes are 8 bits.
14333ca95b02SDimitry Andric       if (DD->useDWARF2Bitfields())
143491bc56edSDimitry Andric         addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
143591bc56edSDimitry Andric       addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
14363ca95b02SDimitry Andric 
1437ff0cc061SDimitry Andric       uint64_t Offset = DT->getOffsetInBits();
1438d88c1a5aSDimitry Andric       // We can't use DT->getAlignInBits() here: AlignInBits for member type
1439d88c1a5aSDimitry Andric       // is non-zero if and only if alignment was forced (e.g. _Alignas()),
1440d88c1a5aSDimitry Andric       // which can't be done with bitfields. Thus we use FieldSize here.
1441d88c1a5aSDimitry Andric       uint32_t AlignInBits = FieldSize;
1442d88c1a5aSDimitry Andric       uint32_t AlignMask = ~(AlignInBits - 1);
14433dac3a9bSDimitry Andric       // The bits from the start of the storage unit to the start of the field.
14443dac3a9bSDimitry Andric       uint64_t StartBitOffset = Offset - (Offset & AlignMask);
14453dac3a9bSDimitry Andric       // The byte offset of the field's aligned storage unit inside the struct.
14463dac3a9bSDimitry Andric       OffsetInBytes = (Offset - StartBitOffset) / 8;
14473ca95b02SDimitry Andric 
14483ca95b02SDimitry Andric       if (DD->useDWARF2Bitfields()) {
14493ca95b02SDimitry Andric         uint64_t HiMark = (Offset + FieldSize) & AlignMask;
14503ca95b02SDimitry Andric         uint64_t FieldOffset = (HiMark - FieldSize);
14513ca95b02SDimitry Andric         Offset -= FieldOffset;
14523ca95b02SDimitry Andric 
14533ca95b02SDimitry Andric         // Maybe we need to work from the other end.
14543ca95b02SDimitry Andric         if (Asm->getDataLayout().isLittleEndian())
14553ca95b02SDimitry Andric           Offset = FieldSize - (Offset + Size);
14563ca95b02SDimitry Andric 
14573ca95b02SDimitry Andric         addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
14583ca95b02SDimitry Andric         OffsetInBytes = FieldOffset >> 3;
14593ca95b02SDimitry Andric       } else {
14603ca95b02SDimitry Andric         addUInt(MemberDie, dwarf::DW_AT_data_bit_offset, None, Offset);
14613ca95b02SDimitry Andric       }
14623ca95b02SDimitry Andric     } else {
146391bc56edSDimitry Andric       // This is not a bitfield.
14643dac3a9bSDimitry Andric       OffsetInBytes = DT->getOffsetInBits() / 8;
1465d88c1a5aSDimitry Andric       if (AlignInBytes)
1466d88c1a5aSDimitry Andric         addUInt(MemberDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1467d88c1a5aSDimitry Andric                 AlignInBytes);
14683ca95b02SDimitry Andric     }
146991bc56edSDimitry Andric 
147091bc56edSDimitry Andric     if (DD->getDwarfVersion() <= 2) {
147197bc6c73SDimitry Andric       DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc;
147291bc56edSDimitry Andric       addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
147391bc56edSDimitry Andric       addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
147491bc56edSDimitry Andric       addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
14753ca95b02SDimitry Andric     } else if (!IsBitfield || DD->useDWARF2Bitfields())
147691bc56edSDimitry Andric       addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
147791bc56edSDimitry Andric               OffsetInBytes);
147891bc56edSDimitry Andric   }
147991bc56edSDimitry Andric 
1480ff0cc061SDimitry Andric   if (DT->isProtected())
148191bc56edSDimitry Andric     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
148291bc56edSDimitry Andric             dwarf::DW_ACCESS_protected);
1483ff0cc061SDimitry Andric   else if (DT->isPrivate())
148491bc56edSDimitry Andric     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
148591bc56edSDimitry Andric             dwarf::DW_ACCESS_private);
148691bc56edSDimitry Andric   // Otherwise C++ member and base classes are considered public.
1487ff0cc061SDimitry Andric   else if (DT->isPublic())
148891bc56edSDimitry Andric     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
148991bc56edSDimitry Andric             dwarf::DW_ACCESS_public);
1490ff0cc061SDimitry Andric   if (DT->isVirtual())
149191bc56edSDimitry Andric     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
149291bc56edSDimitry Andric             dwarf::DW_VIRTUALITY_virtual);
149391bc56edSDimitry Andric 
149491bc56edSDimitry Andric   // Objective-C properties.
149597bc6c73SDimitry Andric   if (DINode *PNode = DT->getObjCProperty())
149697bc6c73SDimitry Andric     if (DIE *PDie = getDIE(PNode))
14973dac3a9bSDimitry Andric       MemberDie.addValue(DIEValueAllocator, dwarf::DW_AT_APPLE_property,
14983dac3a9bSDimitry Andric                          dwarf::DW_FORM_ref4, DIEEntry(*PDie));
149991bc56edSDimitry Andric 
1500ff0cc061SDimitry Andric   if (DT->isArtificial())
150191bc56edSDimitry Andric     addFlag(MemberDie, dwarf::DW_AT_artificial);
15024ba319b5SDimitry Andric 
15034ba319b5SDimitry Andric   return MemberDie;
150491bc56edSDimitry Andric }
150591bc56edSDimitry Andric 
getOrCreateStaticMemberDIE(const DIDerivedType * DT)1506ff0cc061SDimitry Andric DIE *DwarfUnit::getOrCreateStaticMemberDIE(const DIDerivedType *DT) {
1507ff0cc061SDimitry Andric   if (!DT)
150891bc56edSDimitry Andric     return nullptr;
150991bc56edSDimitry Andric 
151091bc56edSDimitry Andric   // Construct the context before querying for the existence of the DIE in case
151191bc56edSDimitry Andric   // such construction creates the DIE.
1512ff0cc061SDimitry Andric   DIE *ContextDIE = getOrCreateContextDIE(resolve(DT->getScope()));
151391bc56edSDimitry Andric   assert(dwarf::isType(ContextDIE->getTag()) &&
151491bc56edSDimitry Andric          "Static member should belong to a type.");
151591bc56edSDimitry Andric 
151691bc56edSDimitry Andric   if (DIE *StaticMemberDIE = getDIE(DT))
151791bc56edSDimitry Andric     return StaticMemberDIE;
151891bc56edSDimitry Andric 
1519ff0cc061SDimitry Andric   DIE &StaticMemberDIE = createAndAddDIE(DT->getTag(), *ContextDIE, DT);
152091bc56edSDimitry Andric 
1521ff0cc061SDimitry Andric   const DIType *Ty = resolve(DT->getBaseType());
152291bc56edSDimitry Andric 
1523ff0cc061SDimitry Andric   addString(StaticMemberDIE, dwarf::DW_AT_name, DT->getName());
152491bc56edSDimitry Andric   addType(StaticMemberDIE, Ty);
152591bc56edSDimitry Andric   addSourceLine(StaticMemberDIE, DT);
152691bc56edSDimitry Andric   addFlag(StaticMemberDIE, dwarf::DW_AT_external);
152791bc56edSDimitry Andric   addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
152891bc56edSDimitry Andric 
152991bc56edSDimitry Andric   // FIXME: We could omit private if the parent is a class_type, and
153091bc56edSDimitry Andric   // public if the parent is something else.
1531ff0cc061SDimitry Andric   if (DT->isProtected())
153291bc56edSDimitry Andric     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
153391bc56edSDimitry Andric             dwarf::DW_ACCESS_protected);
1534ff0cc061SDimitry Andric   else if (DT->isPrivate())
153591bc56edSDimitry Andric     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
153691bc56edSDimitry Andric             dwarf::DW_ACCESS_private);
1537ff0cc061SDimitry Andric   else if (DT->isPublic())
153891bc56edSDimitry Andric     addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
153991bc56edSDimitry Andric             dwarf::DW_ACCESS_public);
154091bc56edSDimitry Andric 
1541ff0cc061SDimitry Andric   if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant()))
154291bc56edSDimitry Andric     addConstantValue(StaticMemberDIE, CI, Ty);
1543ff0cc061SDimitry Andric   if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant()))
154491bc56edSDimitry Andric     addConstantFPValue(StaticMemberDIE, CFP);
154591bc56edSDimitry Andric 
1546d88c1a5aSDimitry Andric   if (uint32_t AlignInBytes = DT->getAlignInBytes())
1547d88c1a5aSDimitry Andric     addUInt(StaticMemberDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1548d88c1a5aSDimitry Andric             AlignInBytes);
1549d88c1a5aSDimitry Andric 
155091bc56edSDimitry Andric   return &StaticMemberDIE;
155191bc56edSDimitry Andric }
155291bc56edSDimitry Andric 
emitCommonHeader(bool UseOffsets,dwarf::UnitType UT)15537a7e6055SDimitry Andric void DwarfUnit::emitCommonHeader(bool UseOffsets, dwarf::UnitType UT) {
155439d628a0SDimitry Andric   // Emit size of content not including length itself
1555ff0cc061SDimitry Andric   Asm->OutStreamer->AddComment("Length of Unit");
1556*b5893f02SDimitry Andric   if (!DD->useSectionsAsReferences()) {
1557*b5893f02SDimitry Andric     StringRef Prefix = isDwoUnit() ? "debug_info_dwo_" : "debug_info_";
1558*b5893f02SDimitry Andric     MCSymbol *BeginLabel = Asm->createTempSymbol(Prefix + "start");
1559*b5893f02SDimitry Andric     EndLabel = Asm->createTempSymbol(Prefix + "end");
1560*b5893f02SDimitry Andric     Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
1561*b5893f02SDimitry Andric     Asm->OutStreamer->EmitLabel(BeginLabel);
1562*b5893f02SDimitry Andric   } else
15634ba319b5SDimitry Andric     Asm->emitInt32(getHeaderSize() + getUnitDie().getSize());
156439d628a0SDimitry Andric 
1565ff0cc061SDimitry Andric   Asm->OutStreamer->AddComment("DWARF version number");
15667a7e6055SDimitry Andric   unsigned Version = DD->getDwarfVersion();
15674ba319b5SDimitry Andric   Asm->emitInt16(Version);
15687a7e6055SDimitry Andric 
15697a7e6055SDimitry Andric   // DWARF v5 reorders the address size and adds a unit type.
15707a7e6055SDimitry Andric   if (Version >= 5) {
15717a7e6055SDimitry Andric     Asm->OutStreamer->AddComment("DWARF Unit Type");
15724ba319b5SDimitry Andric     Asm->emitInt8(UT);
15737a7e6055SDimitry Andric     Asm->OutStreamer->AddComment("Address Size (in bytes)");
15744ba319b5SDimitry Andric     Asm->emitInt8(Asm->MAI->getCodePointerSize());
15757a7e6055SDimitry Andric   }
1576ff0cc061SDimitry Andric 
157791bc56edSDimitry Andric   // We share one abbreviations table across all units so it's always at the
157891bc56edSDimitry Andric   // start of the section. Use a relocatable offset where needed to ensure
157991bc56edSDimitry Andric   // linking doesn't invalidate that offset.
15807a7e6055SDimitry Andric   Asm->OutStreamer->AddComment("Offset Into Abbrev. Section");
1581ff0cc061SDimitry Andric   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
15823ca95b02SDimitry Andric   if (UseOffsets)
15834ba319b5SDimitry Andric     Asm->emitInt32(0);
15843ca95b02SDimitry Andric   else
15853ca95b02SDimitry Andric     Asm->emitDwarfSymbolReference(
15863ca95b02SDimitry Andric         TLOF.getDwarfAbbrevSection()->getBeginSymbol(), false);
1587ff0cc061SDimitry Andric 
15887a7e6055SDimitry Andric   if (Version <= 4) {
1589ff0cc061SDimitry Andric     Asm->OutStreamer->AddComment("Address Size (in bytes)");
15904ba319b5SDimitry Andric     Asm->emitInt8(Asm->MAI->getCodePointerSize());
159191bc56edSDimitry Andric   }
15927a7e6055SDimitry Andric }
159391bc56edSDimitry Andric 
emitHeader(bool UseOffsets)1594ff0cc061SDimitry Andric void DwarfTypeUnit::emitHeader(bool UseOffsets) {
15957a7e6055SDimitry Andric   DwarfUnit::emitCommonHeader(UseOffsets,
15967a7e6055SDimitry Andric                               DD->useSplitDwarf() ? dwarf::DW_UT_split_type
15977a7e6055SDimitry Andric                                                   : dwarf::DW_UT_type);
1598ff0cc061SDimitry Andric   Asm->OutStreamer->AddComment("Type Signature");
1599ff0cc061SDimitry Andric   Asm->OutStreamer->EmitIntValue(TypeSignature, sizeof(TypeSignature));
1600ff0cc061SDimitry Andric   Asm->OutStreamer->AddComment("Type DIE Offset");
160191bc56edSDimitry Andric   // In a skeleton type unit there is no type DIE so emit a zero offset.
1602ff0cc061SDimitry Andric   Asm->OutStreamer->EmitIntValue(Ty ? Ty->getOffset() : 0,
160391bc56edSDimitry Andric                                  sizeof(Ty->getOffset()));
160491bc56edSDimitry Andric }
160591bc56edSDimitry Andric 
1606a580b014SDimitry Andric DIE::value_iterator
addSectionDelta(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Hi,const MCSymbol * Lo)1607a580b014SDimitry Andric DwarfUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute,
1608a580b014SDimitry Andric                            const MCSymbol *Hi, const MCSymbol *Lo) {
1609a580b014SDimitry Andric   return Die.addValue(DIEValueAllocator, Attribute,
1610a580b014SDimitry Andric                       DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
1611a580b014SDimitry Andric                                                  : dwarf::DW_FORM_data4,
1612a580b014SDimitry Andric                       new (DIEValueAllocator) DIEDelta(Hi, Lo));
1613a580b014SDimitry Andric }
1614a580b014SDimitry Andric 
1615a580b014SDimitry Andric DIE::value_iterator
addSectionLabel(DIE & Die,dwarf::Attribute Attribute,const MCSymbol * Label,const MCSymbol * Sec)1616a580b014SDimitry Andric DwarfUnit::addSectionLabel(DIE &Die, dwarf::Attribute Attribute,
1617a580b014SDimitry Andric                            const MCSymbol *Label, const MCSymbol *Sec) {
1618a580b014SDimitry Andric   if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1619a580b014SDimitry Andric     return addLabel(Die, Attribute,
1620a580b014SDimitry Andric                     DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
1621a580b014SDimitry Andric                                                : dwarf::DW_FORM_data4,
1622a580b014SDimitry Andric                     Label);
1623a580b014SDimitry Andric   return addSectionDelta(Die, Attribute, Label, Sec);
1624a580b014SDimitry Andric }
1625a580b014SDimitry Andric 
isDwoUnit() const162639d628a0SDimitry Andric bool DwarfTypeUnit::isDwoUnit() const {
162739d628a0SDimitry Andric   // Since there are no skeleton type units, all type units are dwo type units
162839d628a0SDimitry Andric   // when split DWARF is being used.
162939d628a0SDimitry Andric   return DD->useSplitDwarf();
163091bc56edSDimitry Andric }
16317a7e6055SDimitry Andric 
addGlobalName(StringRef Name,const DIE & Die,const DIScope * Context)16327a7e6055SDimitry Andric void DwarfTypeUnit::addGlobalName(StringRef Name, const DIE &Die,
16337a7e6055SDimitry Andric                                   const DIScope *Context) {
16347a7e6055SDimitry Andric   getCU().addGlobalNameForTypeUnit(Name, Context);
16357a7e6055SDimitry Andric }
16367a7e6055SDimitry Andric 
addGlobalType(const DIType * Ty,const DIE & Die,const DIScope * Context)16377a7e6055SDimitry Andric void DwarfTypeUnit::addGlobalType(const DIType *Ty, const DIE &Die,
16387a7e6055SDimitry Andric                                   const DIScope *Context) {
16397a7e6055SDimitry Andric   getCU().addGlobalTypeUnitType(Ty, Context);
16407a7e6055SDimitry Andric }
164151690af2SDimitry Andric 
getCrossSectionRelativeBaseAddress() const164251690af2SDimitry Andric const MCSymbol *DwarfUnit::getCrossSectionRelativeBaseAddress() const {
164351690af2SDimitry Andric   if (!Asm->MAI->doesDwarfUseRelocationsAcrossSections())
164451690af2SDimitry Andric     return nullptr;
164551690af2SDimitry Andric   if (isDwoUnit())
164651690af2SDimitry Andric     return nullptr;
164751690af2SDimitry Andric   return getSection()->getBeginSymbol();
164851690af2SDimitry Andric }
16494ba319b5SDimitry Andric 
addStringOffsetsStart()16504ba319b5SDimitry Andric void DwarfUnit::addStringOffsetsStart() {
16514ba319b5SDimitry Andric   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
16524ba319b5SDimitry Andric   addSectionLabel(getUnitDie(), dwarf::DW_AT_str_offsets_base,
16534ba319b5SDimitry Andric                   DU->getStringOffsetsStartSym(),
16544ba319b5SDimitry Andric                   TLOF.getDwarfStrOffSection()->getBeginSymbol());
16554ba319b5SDimitry Andric }
16564ba319b5SDimitry Andric 
addRnglistsBase()16574ba319b5SDimitry Andric void DwarfUnit::addRnglistsBase() {
16584ba319b5SDimitry Andric   assert(DD->getDwarfVersion() >= 5 &&
16594ba319b5SDimitry Andric          "DW_AT_rnglists_base requires DWARF version 5 or later");
16604ba319b5SDimitry Andric   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
16614ba319b5SDimitry Andric   addSectionLabel(getUnitDie(), dwarf::DW_AT_rnglists_base,
16624ba319b5SDimitry Andric                   DU->getRnglistsTableBaseSym(),
16634ba319b5SDimitry Andric                   TLOF.getDwarfRnglistsSection()->getBeginSymbol());
16644ba319b5SDimitry Andric }
1665*b5893f02SDimitry Andric 
addLoclistsBase()1666*b5893f02SDimitry Andric void DwarfUnit::addLoclistsBase() {
1667*b5893f02SDimitry Andric   assert(DD->getDwarfVersion() >= 5 &&
1668*b5893f02SDimitry Andric          "DW_AT_loclists_base requires DWARF version 5 or later");
1669*b5893f02SDimitry Andric   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1670*b5893f02SDimitry Andric   addSectionLabel(getUnitDie(), dwarf::DW_AT_loclists_base,
1671*b5893f02SDimitry Andric                   DU->getLoclistsTableBaseSym(),
1672*b5893f02SDimitry Andric                   TLOF.getDwarfLoclistsSection()->getBeginSymbol());
1673*b5893f02SDimitry Andric }
1674