136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===//
2161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
3161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//                     The LLVM Compiler Infrastructure
4161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
5161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// This file is distributed under the University of Illinois Open Source
6161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// License. See LICENSE.TXT for details.
7161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
8161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
9161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
10443c9ed7688e66c55c43819a75be681574b291deEric Christopher// This file contains support for constructing a dwarf compile unit.
11161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
12161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
13161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "DwarfUnit.h"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "DwarfAccelTable.h"
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "DwarfCompileUnit.h"
17161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h"
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "DwarfExpression.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/APFloat.h"
204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/CodeGen/MachineFunction.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DIBuilder.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h"
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAsmInfo.h"
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCContext.h"
291d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie#include "llvm/MC/MCSection.h"
301d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie#include "llvm/MC/MCStreamer.h"
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/CommandLine.h"
32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetFrameLowering.h"
3359eaa3874663f80ce111a4781b8f1db82995210cDavid Blaikie#include "llvm/Target/TargetLoweringObjectFile.h"
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetMachine.h"
35161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h"
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Target/TargetSubtargetInfo.h"
37161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
38161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm;
39161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "dwarfdebug"
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<bool>
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesGenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       cl::desc("Generate DWARF4 type units."),
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       cl::init(false));
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarDIEDwarfExpression::DIEDwarfExpression(const AsmPrinter &AP, DwarfUnit &DU,
484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                       DIELoc &DIE)
494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    : DwarfExpression(*AP.MF->getSubtarget().getRegisterInfo(),
504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                      AP.getDwarfDebug()->getDwarfVersion()),
514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      AP(AP), DU(DU), DIE(DIE) {}
524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) {
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DU.addUInt(DIE, dwarf::DW_FORM_data1, Op);
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DIEDwarfExpression::EmitSigned(int64_t Value) {
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value);
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DIEDwarfExpression::EmitUnsigned(uint64_t Value) {
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DU.addUInt(DIE, dwarf::DW_FORM_udata, Value);
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) {
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return MachineReg == TRI.getFrameRegister(*AP.MF);
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Unit - Unit constructor.
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(UnitTag == dwarf::DW_TAG_compile_unit ||
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines         UnitTag == dwarf::DW_TAG_type_unit);
74161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                             DwarfDebug *DW, DwarfFile *DWU,
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                             MCDwarfDwoLineTable *SplitLineTable)
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      CU(CU), SplitLineTable(SplitLineTable) {
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (SplitLineTable)
83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// ~Unit - Destructor for compile unit.
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDwarfUnit::~DwarfUnit() {
88161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
89161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlocks[j]->~DIEBlock();
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DIELocs[j]->~DIELoc();
92161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
93161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
94161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
95161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry.
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
97161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
98161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Value;
99161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1016afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling/// getDefaultLowerBound - Return the default lower bound for an array. If the
102222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling/// DWARF version doesn't handle the language, return -1.
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesint64_t DwarfUnit::getDefaultLowerBound() const {
104aedaa723c26c33d4f9497a79d9d74a3c197fa262David Blaikie  switch (getLanguage()) {
105222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  default:
106222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
107222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
108222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C89:
109222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C99:
110222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C:
111222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C_plus_plus:
112222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC:
113222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC_plus_plus:
114222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 0;
115222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
116222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran77:
117222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran90:
118222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran95:
119222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 1;
120222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
121222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The languages below have valid values only if the DWARF version >= 4.
122222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Java:
123222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Python:
124222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_UPC:
125222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_D:
126222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
127222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 0;
128222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
129222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
130222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada83:
131222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada95:
132222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol74:
133222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol85:
134222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Modula2:
135222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Pascal83:
136222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_PLI:
137222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
138222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 1;
139222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // The languages below have valid values only if the DWARF version >= 5.
142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_OpenCL:
143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Go:
144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Haskell:
145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_C_plus_plus_03:
146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_C_plus_plus_11:
147ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_OCaml:
148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Rust:
149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_C11:
150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Swift:
151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Dylan:
152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_C_plus_plus_14:
153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (dwarf::DWARF_VERSION >= 5)
154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 0;
155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Modula3:
158ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Julia:
159ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Fortran03:
160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case dwarf::DW_LANG_Fortran08:
161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (dwarf::DWARF_VERSION >= 5)
162ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 1;
163ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
164222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  }
165222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
166222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  return -1;
167222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling}
168222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
169b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// Check whether the DIE for this MDNode can be shared across CUs.
17086a33487376848a606fdc629ffce2a581ae45653David Blaikiestatic bool isShareableAcrossCUs(DIDescriptor D) {
17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // When the MDNode can be part of the type system, the DIE can be shared
17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // across CUs.
17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Combining type units and cross-CU DIE sharing is lower value (since
17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // cross-CU DIE sharing is used in LTO and removes type redundancy at that
17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // level already) but may be implementable for some value in projects
17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // building multiple independent libraries with LTO and then linking those
17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // together.
1782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  return (isa<MDType>(D) ||
1792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          (isa<MDSubprogram>(D) && !cast<MDSubprogram>(D)->isDefinition())) &&
18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         !GenerateDwarfTypeUnits;
181b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren}
182b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren
183b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// getDIE - Returns the debug information entry map slot for the
184b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// specified debug variable. We delegate the request to DwarfDebug
185b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// when the DIE for this MDNode can be shared across CUs. The mappings
186b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// will be kept in DwarfDebug for shareable DIEs.
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getDIE(DIDescriptor D) const {
188cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie  if (isShareableAcrossCUs(D))
18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return DU->getDIE(D);
190cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie  return MDNodeToDieMap.lookup(D);
191b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren}
192b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren
193b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
194b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// when the DIE for this MDNode can be shared across CUs. The mappings
195b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren/// will be kept in DwarfDebug for shareable DIEs.
19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
197cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie  if (isShareableAcrossCUs(Desc)) {
19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    DU->insertDIE(Desc, D);
199b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren    return;
200b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren  }
201cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie  MDNodeToDieMap.insert(std::make_pair(Desc, D));
202b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren}
203b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren
204873cf0a0d7906083578d9b793008348750636138Eric Christopher/// addFlag - Add a flag that is true.
205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
206dc42d031fb5787733d6765d6fefc76d46a7a4c9bMichael Gottesman  if (DD->getDwarfVersion() >= 4)
207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
208873cf0a0d7906083578d9b793008348750636138Eric Christopher  else
209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
210873cf0a0d7906083578d9b793008348750636138Eric Christopher}
211873cf0a0d7906083578d9b793008348750636138Eric Christopher
212161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value.
213161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        Optional<dwarf::Form> Form, uint64_t Integer) {
2166efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher  if (!Form)
2176efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher    Form = DIEInteger::BestForm(false, Integer);
2186efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher  DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
2196efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher                        DIEInteger(Integer);
220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, *Form, Value);
221770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie}
222770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie
223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
224770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addUInt(Block, (dwarf::Attribute)0, Form, Integer);
225161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
226161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value.
228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        Optional<dwarf::Form> Form, int64_t Integer) {
2316efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher  if (!Form)
2326efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher    Form = DIEInteger::BestForm(true, Integer);
233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, *Form, Value);
235770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie}
236770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie
237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        int64_t Integer) {
239770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addSInt(Die, (dwarf::Attribute)0, Form, Integer);
240161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2426a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a
2436a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have
2443cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// more predictable sizes. In the case of split dwarf we emit an index
2453cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// into another table which gets us the static offset into the string
2463cc42205600b2d3865efd1585d79663c41e048f1Eric Christopher/// table.
247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          StringRef String) {
24937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!isDwoUnit())
25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return addLocalString(Die, Attribute, String);
25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
25237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  addIndexedString(Die, Attribute, String);
25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
25437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
25537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute,
25637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                 StringRef String) {
257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned idx = DU->getStringPool().getIndex(*Asm, String);
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
2593dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
261dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher}
262dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher
263dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// addLocalString - Add a string attribute data and value. This is guaranteed
264dd8e9f395e881972b320d947de88102a0be04b70Eric Christopher/// to be in the local string pool instead of indirected.
265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               StringRef String) {
2674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
2696a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  DIEValue *Value;
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2711f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand    Value = new (DIEValueAllocator) DIELabel(Symb);
27237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  else
2734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Value = new (DIEValueAllocator)
2744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        DIEDelta(Symb, TLOF.getDwarfStrSection()->getBeginSymbol());
27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2791f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand/// addLabel - Add a Dwarf label attribute data and value.
2801f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand///
281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         const MCSymbol *Label) {
2831f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, Form, Value);
28595e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie}
28695e72c90e4e2ee64e12d898f6495e796ebcadaf8David Blaikie
287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
288770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addLabel(Die, (dwarf::Attribute)0, Form, Label);
289770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie}
290770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie
29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// addSectionOffset - Add an offset into a section attribute data and value.
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 uint64_t Integer) {
29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (DD->getDwarfVersion() >= 4)
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  else
29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        : getCU().getOrCreateSourceID(FileName, DirName);
30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3060969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// addOpAddress - Add a dwarf op address data and value using the
3070969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
3080969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher///
309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
3100969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  if (!DD->useSplitDwarf()) {
311770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie    addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
312770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie    addLabel(Die, dwarf::DW_FORM_udata, Sym);
3130969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  } else {
314770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie    addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines            DD->getAddressPool().getIndex(Sym));
3170969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher  }
3180969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher}
3190969ddf601c7cf9da2b01fe227005951c6af0cacEric Christopher
320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              const MCSymbol *Hi, const MCSymbol *Lo) {
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
324161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value.
327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
329b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren  addDIEEntry(Die, Attribute, createDIEEntry(Entry));
330b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren}
331b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren
332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Flag the type unit reference as a declaration so that if it contains
334dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // members (implicit special members, static data member definitions, member
335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // declarations for definitions in this CU, etc) consumers don't get confused
336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // and think this is a full definition.
337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addFlag(Die, dwarf::DW_AT_declaration);
338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines               new (DIEValueAllocator) DIETypeSignature(Type));
34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                            DIEEntry *Entry) {
345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const DIE *DieCU = Die.getUnitOrNull();
346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
347b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren  if (!DieCU)
348b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren    // We assume that Die belongs to this CU, if it is not linked to any CU yet.
349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    DieCU = &getUnitDie();
350b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren  if (!EntryCU)
351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EntryCU = &getUnitDie();
352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute,
353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines               EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines               Entry);
355161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
3571a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren/// Create a DIE with the given Tag, add the DIE to its parent, and
3581a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren/// call insertDIE if MD is not null.
359dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(Tag != dwarf::DW_TAG_auto_variable &&
361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines         Tag != dwarf::DW_TAG_arg_variable);
362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DIE &Die = *Parent.getChildren().back();
3641dc27239969889661115f40b293c83ab9ff3efd5David Blaikie  if (N)
365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    insertDIE(N, &Die);
3661a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren  return Die;
3671a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren}
3681a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren
369161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data.
370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Loc->ComputeSize(Asm);
37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         DIEBlock *Block) {
379161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Block->ComputeSize(Asm);
380161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Die.addValue(Attribute, Block->BestForm(), Block);
382161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
383161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
384161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
385161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              StringRef Directory) {
388161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
389161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned FileID = getOrCreateSourceID(File, Directory);
392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
393770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
394770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
395161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
397161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
398161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
4002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(V);
401161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
4022c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addSourceLine(Die, V->getLine(), V->getScope()->getFilename(),
4032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                V->getScope()->getDirectory());
404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
408dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
4092c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(G);
410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
4112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addSourceLine(Die, G->getLine(), G->getFilename(), G->getDirectory());
41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
4132125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher
41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// addSourceLine - Add location information to specified debug information
41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// entry.
416dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
4172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(SP);
41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addSourceLine(Die, SP->getLine(), SP->getFilename(), SP->getDirectory());
420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
424dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIType Ty) {
4252c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(Ty);
426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
4272c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory());
428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
4332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(Ty);
434b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
4352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory());
436b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher}
437b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
438b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information
439b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry.
440dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
4412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addSourceLine(Die, NS->getLine(), NS->getFilename(), NS->getDirectory());
442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
444116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand.
445ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
44637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                   unsigned SizeInBits, unsigned OffsetInBits) {
447ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DIEDwarfExpression Expr(*Asm, *this, TheDie);
448ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits);
449ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return true;
450116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
451116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
452116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset.
453ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  int64_t Offset) {
455ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DIEDwarfExpression Expr(*Asm, *this, TheDie);
456ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return Expr.AddMachineRegIndirect(Reg, Offset);
457116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
458116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType
460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   gives the variable VarName either the struct, or a pointer to the struct, as
462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   its type.  This is necessary for various behind-the-scenes things the
463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   compiler needs to do with by-reference variables in Blocks.
464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However, as far as the original *programmer* is concerned, the variable
466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   should still have type 'SomeType', as originally declared.
467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The function getBlockByrefType dives into the __Block_byref_x_VarName
469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to find the original type of the variable, which is then assigned to
470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the variable's Debug Information Entry as its real type.  So far, so good.
471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However now the debugger will expect the variable VarName to have the type
472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   SomeType.  So we need the location attribute for the variable to be an
473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   expression that explains to the debugger how to navigate through the
474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   pointers and struct to find the actual variable of type SomeType.
475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The following function does just that.  We start by getting
477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the "normal" location for the variable. This will be the location
478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   of either the struct __Block_byref_x_VarName or the pointer to the
479161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName.
480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
481161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The struct will look something like:
482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName {
484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various fields>
485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     struct __Block_byref_x_VarName *forwarding;
486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various other fields>
487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     SomeType VarName;
488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <maybe more fields>
489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   };
490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we are given the struct directly (as our starting point) we
492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   need to tell the debugger to:
493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   1).  Add the offset of the forwarding field.
495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   2).  Follow that pointer to get the real __Block_byref_x_VarName
497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to use (the real one may have been copied onto the heap).
498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   3).  Add the offset for the field VarName, to find the actual variable.
500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we started with a pointer to the struct, then we need to
502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   dereference that pointer first, before the other steps.
503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   Translating this into DWARF ops, we will need to append the following
504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   to the current location description for the variable:
505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref                    -- optional, if we start with a pointer
507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <forward_fld_offset>
508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref
509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <varName_fld_offset>
510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   That is what this function does.  */
512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location
514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the
515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the
516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location.  Add the DWARF information to the die.  For
517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here.
518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
52036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                     dwarf::Attribute Attribute,
52136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                     const MachineLocation &Location) {
522f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  DIType Ty = DV.getType();
523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType TmpTy = Ty;
5242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  uint16_t Tag = Ty->getTag();
525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool isPointer = false;
526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
527f61dbc15750f0b1a9a089ac91e6f5e7235335c25Eric Christopher  StringRef varName = DV.getName();
528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_pointer_type) {
5302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DIDerivedType DTy = cast<MDDerivedType>(Ty);
5312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    TmpTy = resolve(DTy->getBaseType());
532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    isPointer = true;
533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Find the __forwarding field and the variable field in the __Block_byref
536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct.
5372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIArray Fields = cast<MDCompositeTypeBase>(TmpTy)->getElements();
5384adba52570723c2e1654b1c01feddf759893f096David Blaikie  DIDerivedType varField;
5394adba52570723c2e1654b1c01feddf759893f096David Blaikie  DIDerivedType forwardingField;
540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
5412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  for (unsigned i = 0, N = Fields.size(); i < N; ++i) {
5422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DIDerivedType DT = cast<MDDerivedTypeBase>(Fields[i]);
5432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    StringRef fieldName = DT->getName();
544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (fieldName == "__forwarding")
5454adba52570723c2e1654b1c01feddf759893f096David Blaikie      forwardingField = DT;
546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (fieldName == varName)
5474adba52570723c2e1654b1c01feddf759893f096David Blaikie      varField = DT;
548161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
549161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the offsets for the forwarding field and the variable field.
5512c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  unsigned forwardingFieldOffset = forwardingField->getOffsetInBits() >> 3;
5522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  unsigned varFieldOffset = varField->getOffsetInBits() >> 2;
553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Decode the original location, and use that as the start of the byref
555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // variable's location.
55636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIELoc *Loc = new (DIEValueAllocator) DIELoc();
557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
558ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool validReg;
559caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  if (Location.isReg())
560ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    validReg = addRegisterOpPiece(*Loc, Location.getReg());
561caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  else
562ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
563ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
564ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (!validReg)
565ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return;
566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If we started with a pointer to the __Block_byref... struct, then
568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // the first thing we need to do is dereference the pointer (DW_OP_deref).
569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (isPointer)
570dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Next add the offset for the '__forwarding' field:
573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // adding the offset if it's 0.
575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (forwardingFieldOffset > 0) {
576dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
577dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
580161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now dereference the __forwarding field to get to the real __Block_byref
581161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct:  DW_OP_deref.
582dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
583161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
584161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now that we've got the real __Block_byref... struct, add the offset
585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // for the variable's field to get to the location of the actual variable:
586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (varFieldOffset > 0) {
588dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
589dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
590161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
591161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
592161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  addBlock(Die, Attribute, Loc);
594161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
596c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren/// Return true if type encoding is unsigned.
597c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Renstatic bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
5982c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DIDerivedType DTy = dyn_cast<MDDerivedTypeBase>(Ty)) {
5992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    dwarf::Tag T = (dwarf::Tag)Ty->getTag();
600dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Encode pointer constants as unsigned bytes. This is used at least for
601dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // null pointer constant emission.
602ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // (Pieces of) aggregate types that get hacked apart by SROA may also be
603ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // represented by a constant. Encode them as unsigned bytes.
604dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
605dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // here, but accept them for now due to a bug in SROA producing bogus
606dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // dbg.values.
607ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (T == dwarf::DW_TAG_array_type ||
608ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        T == dwarf::DW_TAG_class_type ||
609ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        T == dwarf::DW_TAG_pointer_type ||
610dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        T == dwarf::DW_TAG_ptr_to_member_type ||
611dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        T == dwarf::DW_TAG_reference_type ||
612ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        T == dwarf::DW_TAG_rvalue_reference_type ||
613ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        T == dwarf::DW_TAG_structure_type ||
614ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        T == dwarf::DW_TAG_union_type)
615c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren      return true;
616dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
617dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           T == dwarf::DW_TAG_volatile_type ||
618dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           T == dwarf::DW_TAG_restrict_type ||
619dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           T == dwarf::DW_TAG_enumeration_type);
6202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (DITypeRef Deriv = DTy->getBaseType())
621dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return isUnsignedDIType(DD, DD->resolve(Deriv));
622dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // FIXME: Enums without a fixed underlying type have unknown signedness
623dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // here, leading to incorrectly emitted constants.
6242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    assert(DTy->getTag() == dwarf::DW_TAG_enumeration_type);
625dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
626c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  }
627dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
6282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIBasicType BTy = cast<MDBasicType>(Ty);
6292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  unsigned Encoding = BTy->getEncoding();
630dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert((Encoding == dwarf::DW_ATE_unsigned ||
631dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          Encoding == dwarf::DW_ATE_unsigned_char ||
632dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          Encoding == dwarf::DW_ATE_signed ||
633dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          Encoding == dwarf::DW_ATE_signed_char ||
6342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          Encoding == dwarf::DW_ATE_float || Encoding == dwarf::DW_ATE_UTF ||
6352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          Encoding == dwarf::DW_ATE_boolean ||
6362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          (Ty->getTag() == dwarf::DW_TAG_unspecified_type &&
6372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar           Ty->getName() == "decltype(nullptr)")) &&
638dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines         "Unsupported encoding");
6392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  return Encoding == dwarf::DW_ATE_unsigned ||
6402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar         Encoding == dwarf::DW_ATE_unsigned_char ||
6412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar         Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
6422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar         Ty->getTag() == dwarf::DW_TAG_unspecified_type;
643c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren}
644c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
645c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren/// If this type is derived from a base type then return base type size.
64643251008c2ce836f47a6e4c8a64947069d6b268eManman Renstatic uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
6472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  unsigned Tag = Ty->getTag();
648c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
649c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
650c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren      Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
651c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren      Tag != dwarf::DW_TAG_restrict_type)
6522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return Ty->getSizeInBits();
653c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
6542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  auto *BaseType = DD->resolve(Ty->getBaseType());
655c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
6562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(BaseType && "Unexpected invalid base type");
657c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
658c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  // If this is a derived type, go ahead and get the base type, unless it's a
659c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  // reference then it's just the size of the field. Pointer types have no need
660c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren  // of this since they're a different type of qualification on the type.
6612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (BaseType->getTag() == dwarf::DW_TAG_reference_type ||
6622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      BaseType->getTag() == dwarf::DW_TAG_rvalue_reference_type)
6632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return Ty->getSizeInBits();
664c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
6652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *DT = dyn_cast<MDDerivedTypeBase>(BaseType))
6662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return getBaseTypeSize(DD, DT);
667c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
6682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  return BaseType->getSizeInBits();
669c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren}
670c664d76716ba87577b6c2a513ce4fe0712a2d3e2Manman Ren
671161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE.
672dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
6736efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher  assert(MO.isFPImm() && "Invalid machine operand!");
674161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
675161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  APFloat FPImm = MO.getFPImm()->getValueAPF();
676161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
677161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the floating point.
678161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt FltVal = FPImm.bitcastToAPInt();
6796efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher  const char *FltPtr = (const char *)FltVal.getRawData();
680161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
681161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
6823574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
683161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Incr = (LittleEndian ? 1 : -1);
684161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Start = (LittleEndian ? 0 : NumBytes - 1);
685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Stop = (LittleEndian ? NumBytes : -1);
686161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
687161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
688161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (; Start != Stop; Start += Incr)
689dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
690161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
691770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addBlock(Die, dwarf::DW_AT_const_value, Block);
692161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
693161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
69414268416720155d63f190a6143ee40b3b850e409David Blaikie/// addConstantFPValue - Add constant value entry in variable DIE.
695dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
6967b2ee399d9c1b2112962d29540c25b94fa98e8edEric Christopher  // Pass this down to addConstantValue as an unsigned bag of bits.
6977b2ee399d9c1b2112962d29540c25b94fa98e8edEric Christopher  addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
69814268416720155d63f190a6143ee40b3b850e409David Blaikie}
69914268416720155d63f190a6143ee40b3b850e409David Blaikie
700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
701dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
702dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addConstantValue(Die, CI->getValue(), Ty);
703dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
704dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
705dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// addConstantValue - Add constant value entry in variable DIE.
706dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
707dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 DIType Ty) {
708dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(MO.isImm() && "Invalid machine operand!");
709dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
710dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
711dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
712dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
713dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
714dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // FIXME: This is a bit conservative/simple - it emits negative values always
715dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // sign extended to 64 bits rather than minimizing the number of bytes.
716dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addUInt(Die, dwarf::DW_AT_const_value,
717dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
718dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
719dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
720dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
721dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
72214268416720155d63f190a6143ee40b3b850e409David Blaikie}
72314268416720155d63f190a6143ee40b3b850e409David Blaikie
72414268416720155d63f190a6143ee40b3b850e409David Blaikie// addConstantValue - Add constant value entry in variable DIE.
725dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
72614268416720155d63f190a6143ee40b3b850e409David Blaikie  unsigned CIBitWidth = Val.getBitWidth();
727d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  if (CIBitWidth <= 64) {
728dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addConstantValue(Die, Unsigned,
729dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     Unsigned ? Val.getZExtValue() : Val.getSExtValue());
730e4721495b68d770a529b6e1c6cc33655db29c0e2Eric Christopher    return;
731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
733161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
734161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
735161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the large APInt.
736c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  const uint64_t *Ptr64 = Val.getRawData();
737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
738161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
7393574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
740161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
742c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  for (int i = 0; i < NumBytes; i++) {
743c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    uint8_t c;
744c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    if (LittleEndian)
745c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[i / 8] >> (8 * (i & 7));
746c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    else
747c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
748dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Block, dwarf::DW_FORM_data1, c);
749c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  }
750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
751770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie  addBlock(Die, dwarf::DW_AT_const_value, Block);
752161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
753161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
7544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// Add a linkage name to the DIE.
7554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
7564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!LinkageName.empty())
7574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    addString(Die,
7584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar              DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
7594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                         : dwarf::DW_AT_MIPS_linkage_name,
7604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar              GlobalValue::getRealLinkageName(LinkageName));
7614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
7624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
7636c3bb94445305f8ee0be6d3c9457a411bf22b3ebEric Christopher/// addTemplateParams - Add template parameters into buffer.
76436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
765161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add template parameters.
7662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  for (unsigned i = 0, e = TParams.size(); i != e; ++i) {
7672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DIDescriptor Element = TParams[i];
7682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (auto *TTP = dyn_cast<MDTemplateTypeParameter>(Element))
7692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      constructTemplateTypeParameterDIE(Buffer, TTP);
7702c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    else if (auto *TVP = dyn_cast<MDTemplateValueParameter>(Element))
7712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      constructTemplateValueParameterDIE(Buffer, TVP);
772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
773161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
774746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky
7756b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher/// getOrCreateContextDIE - Get context owner's DIE.
77636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
7772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!Context || isa<MDFile>(Context))
778dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return &getUnitDie();
7792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *T = dyn_cast<MDType>(Context))
7802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return getOrCreateTypeDIE(T);
7812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *NS = dyn_cast<MDNamespace>(Context))
7822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return getOrCreateNameSpace(NS);
7832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *SP = dyn_cast<MDSubprogram>(Context))
7842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return getOrCreateSubprogramDIE(SP);
7850cbdb81de76274c3f1731d92dc09864d2277d690Adrian Prantl  return getDIE(Context);
7866b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher}
7876b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
78836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
7892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIScope Context = resolve(Ty->getScope());
79036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIE *ContextDIE = getOrCreateContextDIE(Context);
79136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
792dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DIE *TyDIE = getDIE(Ty))
79336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return TyDIE;
79436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
79536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Create new type.
7962c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
79736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
798dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  constructTypeDIE(TyDIE, Ty);
79936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
80036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  updateAcceleratorTables(Context, Ty, TyDIE);
801dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return &TyDIE;
80236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
80336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
804161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
805161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType.
80636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
80741e1a18885b8ef29219b7102ad25cd480c4a3f55David Blaikie  if (!TyNode)
808dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
809d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren
8102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  auto *Ty = cast<MDType>(TyNode);
8112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(Ty == resolve(Ty->getRef()) &&
81236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         "type was not uniqued, possible ODR violation.");
81341e1a18885b8ef29219b7102ad25cd480c4a3f55David Blaikie
814dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // DW_TAG_restrict_type is not supported in DWARF2
8152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (Ty->getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
8162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return getOrCreateTypeDIE(
8172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        resolve(DITypeRef(cast<MDDerivedType>(Ty)->getBaseType())));
818dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
819d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren  // Construct the context before querying for the existence of the DIE in case
820d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren  // such construction creates the DIE.
8212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIScope Context = resolve(Ty->getScope());
82236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIE *ContextDIE = getOrCreateContextDIE(Context);
8236bc810a49983e12006ba7a0dba61f7b2534b8f26Adrian Prantl  assert(ContextDIE);
824d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren
825dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DIE *TyDIE = getDIE(Ty))
826161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return TyDIE;
827161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
828161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Create new type.
8292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
830d498e5e960f237d3eb04ad7680bd093d1954c7feManman Ren
83136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  updateAcceleratorTables(Context, Ty, TyDIE);
83236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *BT = dyn_cast<MDBasicType>(Ty))
8342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    constructTypeDIE(TyDIE, BT);
8352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (DICompositeType CTy = dyn_cast<MDCompositeTypeBase>(Ty)) {
8362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (GenerateDwarfTypeUnits && !Ty->isForwardDecl())
8372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (MDString *TypeId = CTy->getRawIdentifier()) {
83836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        // Skip updating the accelerator tables since this is not the full type.
840dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return &TyDIE;
84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
842dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    constructTypeDIE(TyDIE, CTy);
84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  } else {
8442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    constructTypeDIE(TyDIE, cast<MDDerivedType>(Ty));
845161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
847dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return &TyDIE;
84836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
84936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
85036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
851dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                        const DIE &TyDIE) {
8522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!Ty->getName().empty() && !Ty->isForwardDecl()) {
853c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    bool IsImplementation = 0;
8542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (auto *CT = dyn_cast<MDCompositeTypeBase>(Ty)) {
855e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // A runtime language of 0 actually means C/C++ and that any
856e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // non-negative value is some version of Objective-C/C++.
8572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete();
858c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    }
859577056f89c840537b059ea4cef8d2ae18513cda0Eric Christopher    unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
8602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DD->addAccelType(Ty->getName(), TyDIE, Flags);
8618b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
8622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (!Context || isa<MDCompileUnit>(Context) || isa<MDFile>(Context) ||
8632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        isa<MDNamespace>(Context))
86437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      addGlobalType(Ty, TyDIE, Context);
86536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
866161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
867161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
868161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity.
869dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
870dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher  assert(Ty && "Trying to add a type that doesn't exist?");
871161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
872161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Check for pre-existence.
873161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Entry = getDIEEntry(Ty);
874161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If it exists then use the existing value.
875161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Entry) {
876b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren    addDIEEntry(Entity, Attribute, Entry);
877161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
878161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
879161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
880161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Construct type.
881161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Buffer = getOrCreateTypeDIE(Ty);
882161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
883161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Set up proxy.
884dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Entry = createDIEEntry(*Buffer);
885161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIEEntry(Ty, Entry);
886b8b70e10a2b3f252314e0d176379778fe8f3b582Manman Ren  addDIEEntry(Entity, Attribute, Entry);
88766658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel}
88866658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel
8899198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// getParentContextString - Walks the metadata parent chain in a language
8909198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// specific manner (using the compile unit language) and returns
8919198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// it as a string. This is done at the metadata level because DIEs may
8929198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// not currently have been added to the parent context and walking the
8939198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher/// DIEs looking for names is more expensive than walking the metadata.
89436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstd::string DwarfUnit::getParentContextString(DIScope Context) const {
8959198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  if (!Context)
8969198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher    return "";
8979198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher
8989198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  // FIXME: Decide whether to implement this for non-C++ languages.
8999198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
9009198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher    return "";
9019198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher
9020ab6439c3f0eef28b4b40f31f2d4d9732fe8cd15Eric Christopher  std::string CS;
9039198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  SmallVector<DIScope, 1> Parents;
9042c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  while (!isa<MDCompileUnit>(Context)) {
9059198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher    Parents.push_back(Context);
9062c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (Context->getScope())
9072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      Context = resolve(Context->getScope());
9089198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher    else
9099198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher      // Structure, etc types will have a NULL context if they're at the top
9109198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher      // level.
9119198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher      break;
9129198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  }
9139198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher
9149198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  // Reverse iterate over our list to go from the outermost construct to the
9159198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  // innermost.
9169198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
9179198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher                                                  E = Parents.rend();
9189198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher       I != E; ++I) {
9192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    const MDScope *Ctx = *I;
9202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    StringRef Name = Ctx->getName();
9212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (Name.empty() && isa<MDNamespace>(Ctx))
922c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      Name = "(anonymous namespace)";
9230ab6439c3f0eef28b4b40f31f2d4d9732fe8cd15Eric Christopher    if (!Name.empty()) {
9249198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher      CS += Name;
9259198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher      CS += "::";
9269198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher    }
9279198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  }
9289198657e1eb13ab717248cfacb2b504fd7e72719Eric Christopher  return CS;
929161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
930161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
931161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType.
93236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
933161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
9342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef Name = BTy->getName();
935161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
936161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
937dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addString(Buffer, dwarf::DW_AT_name, Name);
938734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
939916d49e77237c5aabfd5638b4e481c7ed9441608David Blaikie  // An unspecified type only has a name attribute.
9402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (BTy->getTag() == dwarf::DW_TAG_unspecified_type)
941734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    return;
942734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
943dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
9442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          BTy->getEncoding());
945734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
9462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  uint64_t Size = BTy->getSizeInBits() >> 3;
947dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
948161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
949161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
950161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType.
95136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
9532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef Name = DTy->getName();
9542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  uint64_t Size = DTy->getSizeInBits() >> 3;
955916d49e77237c5aabfd5638b4e481c7ed9441608David Blaikie  uint16_t Tag = Buffer.getTag();
956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Map to main type, void will not have a type.
9582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIType FromTy = resolve(DTy->getBaseType());
959dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher  if (FromTy)
960dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addType(Buffer, FromTy);
961161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
964dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addString(Buffer, dwarf::DW_AT_name, Name);
965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
966161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add size if non-zero (derived types might be zero-sized.)
967ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Size && Tag != dwarf::DW_TAG_pointer_type
968ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines           && Tag != dwarf::DW_TAG_ptr_to_member_type)
969dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
970161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
97162fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie  if (Tag == dwarf::DW_TAG_ptr_to_member_type)
9722c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addDIEEntry(
9732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        Buffer, dwarf::DW_AT_containing_type,
9742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        *getOrCreateTypeDIE(resolve(cast<MDDerivedType>(DTy)->getClassType())));
975161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add source line info if available and TyDesc is not a forward declaration.
9762c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!DTy->isForwardDecl())
977dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addSourceLine(Buffer, DTy);
978161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
979161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
98036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// constructSubprogramArguments - Construct function argument DIEs.
98137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
9822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  for (unsigned i = 1, N = Args.size(); i < N; ++i) {
9832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DIType Ty = resolve(Args[i]);
98437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!Ty) {
98536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      assert(i == N-1 && "Unspecified parameter must be the last argument");
98636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
98736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    } else {
988dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
98937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      addType(Arg, Ty);
9902c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (Ty->isArtificial())
99136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        addFlag(Arg, dwarf::DW_AT_artificial);
99236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
9933dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher  }
9943dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher}
9953dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
996161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType.
99736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
99836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Add name if not anonymous or intermediate type.
9992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef Name = CTy->getName();
1000161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10012c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  uint64_t Size = CTy->getSizeInBits() >> 3;
1002916d49e77237c5aabfd5638b4e481c7ed9441608David Blaikie  uint16_t Tag = Buffer.getTag();
1003161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1004161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  switch (Tag) {
1005161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_array_type:
1006883ed6bd9544e7fac36a66711132bf151fb734adEric Christopher    constructArrayTypeDIE(Buffer, CTy);
1007161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1008953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher  case dwarf::DW_TAG_enumeration_type:
1009953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher    constructEnumTypeDIE(Buffer, CTy);
1010953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher    break;
1011161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_subroutine_type: {
1012dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher    // Add return type. A void return won't have a type.
10132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    auto Elements = cast<MDSubroutineType>(CTy)->getTypeArray();
10142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (Elements.size())
10152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (auto RTy = resolve(Elements[0]))
10162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        addType(Buffer, RTy);
1017161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1018161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    bool isPrototyped = true;
10192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (Elements.size() == 2 && !Elements[1])
102036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      isPrototyped = false;
102136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
102236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    constructSubprogramArguments(Buffer, Elements);
102336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10248b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // Add prototype flag if we're dealing with a C language and the
10258b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // function has been prototyped.
1026aedaa723c26c33d4f9497a79d9d74a3c197fa262David Blaikie    uint16_t Language = getLanguage();
10278b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    if (isPrototyped &&
10286efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher        (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
10294d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_ObjC))
1030dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addFlag(Buffer, dwarf::DW_AT_prototyped);
103136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (CTy->isLValueReference())
1033dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addFlag(Buffer, dwarf::DW_AT_reference);
103436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (CTy->isRValueReference())
1036dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
10376efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher  } break;
1038161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_structure_type:
1039161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_union_type:
1040161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_class_type: {
1041161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
10422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DIArray Elements = CTy->getElements();
10432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
10442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      DIDescriptor Element = Elements[i];
10452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (!Element)
10462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        continue;
10472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (auto *SP = dyn_cast<MDSubprogram>(Element))
10482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        getOrCreateSubprogramDIE(SP);
10492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      else if (DIDerivedType DDTy = dyn_cast<MDDerivedTypeBase>(Element)) {
10502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        if (DDTy->getTag() == dwarf::DW_TAG_friend) {
1051dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
10522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          addType(ElemDie, resolve(DDTy->getBaseType()), dwarf::DW_AT_friend);
10532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        } else if (DDTy->isStaticMember()) {
105499addee7335441fe9bb6249eb9d5332cdbdf3c97Manman Ren          getOrCreateStaticMemberDIE(DDTy);
1055655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren        } else {
1056a1d25b6360a6f40bf1c5651950226640211dc6d0Manman Ren          constructMemberDIE(Buffer, DDTy);
1057655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren        }
10582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      } else if (DIObjCProperty Property = dyn_cast<MDObjCProperty>(Element)) {
10592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer);
10602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        StringRef PropertyName = Property->getName();
106130d409ca097e35c51964c9dac642804e5e495906Devang Patel        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
10622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        if (Property->getType())
10632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          addType(ElemDie, Property->getType());
10644d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addSourceLine(ElemDie, Property);
10652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        StringRef GetterName = Property->getGetterName();
106630d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!GetterName.empty())
106730d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
10682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        StringRef SetterName = Property->getSetterName();
106930d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!SetterName.empty())
107030d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
10712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        if (unsigned PropertyAttributes = Property->getAttributes())
1072770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
10736efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher                  PropertyAttributes);
10746588abf377b7381274236e651462ec83052f6013Devang Patel
107530d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIEEntry *Entry = getDIEEntry(Element);
107630d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!Entry) {
107730d409ca097e35c51964c9dac642804e5e495906Devang Patel          Entry = createDIEEntry(ElemDie);
107830d409ca097e35c51964c9dac642804e5e495906Devang Patel          insertDIEEntry(Element, Entry);
107930d409ca097e35c51964c9dac642804e5e495906Devang Patel        }
10802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      }
1081161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
1082161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (CTy->isAppleBlockExtension())
1084dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addFlag(Buffer, dwarf::DW_AT_APPLE_block);
1085161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1086ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
1087ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // inside C++ composite types to point to the base class with the vtable.
10882c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (DICompositeType ContainingType =
10892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar            dyn_cast_or_null<MDCompositeType>(resolve(CTy->getVTableHolder())))
1090dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
1091dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                  *getOrCreateTypeDIE(ContainingType));
1092161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10932c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (CTy->isObjcClassComplete())
1094dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1095b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel
10961a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // Add template parameters to a class, structure or union types.
10971a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // FIXME: The support isn't in the metadata for this yet.
10981a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    if (Tag == dwarf::DW_TAG_class_type ||
10996efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher        Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
11002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      addTemplateParams(Buffer, CTy->getTemplateParams());
1101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1103161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1104161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  default:
1105161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
1106161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1107161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1108161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
1109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addString(Buffer, dwarf::DW_AT_name, Name);
1111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
11124a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher  if (Tag == dwarf::DW_TAG_enumeration_type ||
11136efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher      Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
11144a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_union_type) {
1115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add size if non-zero (derived types might be zero-sized.)
1116fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // TODO: Do we care about size for enum forward declarations?
1117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Size)
1118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
11192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    else if (!CTy->isForwardDecl())
1120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      // Add zero size if it is not a forward declaration.
1121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
1122fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher
1123fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // If we're a forward decl, say so.
11242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (CTy->isForwardDecl())
1125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addFlag(Buffer, dwarf::DW_AT_declaration);
1126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add source line info if available.
11282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (!CTy->isForwardDecl())
1129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addSourceLine(Buffer, CTy);
11308938895a8338e6084eb12a2bb4bf044928436173Eric Christopher
11318938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    // No harm in adding the runtime language to the declaration.
11322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    unsigned RLang = CTy->getRuntimeLang();
11338938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    if (RLang)
1134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
11356efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher              RLang);
1136161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1137161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1138161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1139be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1140be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// DITemplateTypeParameter.
114136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
114236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                  DITemplateTypeParameter TP) {
1143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DIE &ParamDIE =
11441a5e787f701c45ac2487d400faf6f6d4def6dcefManman Ren      createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
114576ef79f410853a431c820cb5d0ee11cd66d4c90dEric Christopher  // Add the type if it exists, it could be void and therefore no type.
11462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (TP->getType())
11472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addType(ParamDIE, resolve(TP->getType()));
11482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!TP->getName().empty())
11492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addString(ParamDIE, dwarf::DW_AT_name, TP->getName());
1150161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1151161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1152be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// constructTemplateValueParameterDIE - Construct new DIE for the given
1153be87b69a5f2f0b66939cef4d107a2cb8e4f4f4dcManman Ren/// DITemplateValueParameter.
115499addee7335441fe9bb6249eb9d5332cdbdf3c97Manman Renvoid
115536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
115636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                              DITemplateValueParameter VP) {
11572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE &ParamDIE = createAndAddDIE(VP->getTag(), Buffer);
1158dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher
1159dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher  // Add the type if there is one, template template and template parameter
1160dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher  // packs will not have a type.
11612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (VP->getTag() == dwarf::DW_TAG_template_value_parameter)
11622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addType(ParamDIE, resolve(VP->getType()));
11632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!VP->getName().empty())
11642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addString(ParamDIE, dwarf::DW_AT_name, VP->getName());
11652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (Metadata *Val = VP->getValue()) {
1166ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
11672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      addConstantValue(ParamDIE, CI, resolve(VP->getType()));
1168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
11694de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // For declaration non-type template parameters (such as global values and
11704de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // functions)
117136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DIELoc *Loc = new (DIEValueAllocator) DIELoc();
1172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addOpAddress(*Loc, Asm->getSymbol(GV));
11734de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // Emit DW_OP_stack_value to use the address as the immediate value of the
11744de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie      // parameter, rather than a pointer to it.
1175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
117636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
11772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1178e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      assert(isa<MDString>(Val));
1179e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie      addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1180e88939cfebbc98133553c6fc03a52b8fb1adbb70David Blaikie                cast<MDString>(Val)->getString());
11812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
11822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      addTemplateParams(ParamDIE, cast<MDTuple>(Val));
11834de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie    }
11844de9d72883eebe4e86bffdaad89483dfe822e2a5David Blaikie  }
1185161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1186161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
118731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace.
118836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesDIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
11896b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren  // Construct the context before querying for the existence of the DIE in case
11906b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren  // such construction creates the DIE.
11912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE *ContextDIE = getOrCreateContextDIE(NS->getScope());
11926b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren
1193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DIE *NDie = getDIE(NS))
119431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return NDie;
1195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
11966b713800ff03fdbb1d770d1e00af0e76041f3c03Manman Ren
11972c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef Name = NS->getName();
1198c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (!Name.empty())
11992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addString(NDie, dwarf::DW_AT_name, NS->getName());
1200c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  else
1201c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Name = "(anonymous namespace)";
1202c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  DD->addAccelNamespace(Name, NDie);
12032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addGlobalName(Name, NDie, NS->getScope());
120431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addSourceLine(NDie, NS);
1205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return &NDie;
120631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
120731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
1208dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP.
120937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
1210c32f2332b065d0fb8de4db8b8ca0981564dae92bDavid Blaikie  // Construct the context before querying for the existence of the DIE in case
1211c32f2332b065d0fb8de4db8b8ca0981564dae92bDavid Blaikie  // such construction creates the DIE (as is the case for member function
1212c32f2332b065d0fb8de4db8b8ca0981564dae92bDavid Blaikie  // declarations).
121337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DIE *ContextDIE =
12142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP->getScope()));
121536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DIE *SPDie = getDIE(SP))
1217dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
1218dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *SPDecl = SP->getDeclaration()) {
122037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (!Minimal) {
122137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // Add subprogram definitions to the CU die directly.
122237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      ContextDIE = &getUnitDie();
122337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // Build the decl now to ensure it precedes the definition.
122437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      getOrCreateSubprogramDIE(SPDecl);
122537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
1226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
122727302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
122827302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  // DW_TAG_inlined_subroutine may refer to this DIE.
1229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
123001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1231c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Stop here and fill this in later, depending on whether or not this
1232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // subprogram turns out to have inlined instances or not.
12332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isDefinition())
1234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return &SPDie;
1235dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  applySubprogramAttributes(SP, SPDie);
1237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return &SPDie;
1238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
123901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
124037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
124137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                    DIE &SPDie) {
1242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DIE *DeclDie = nullptr;
1243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringRef DeclLinkageName;
12442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *SPDecl = SP->getDeclaration()) {
1245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    DeclDie = getDIE(SPDecl);
1246c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    assert(DeclDie && "This DIE should've already been constructed when the "
1247c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                      "definition DIE was created in "
1248c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                      "getOrCreateSubprogramDIE");
12492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    DeclLinkageName = SPDecl->getLinkageName();
125001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
1251dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Add function template parameters.
12532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addTemplateParams(SPDie, SP->getTemplateParams());
1254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Add the linkage name if we have one and it isn't in the Decl.
12562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef LinkageName = SP->getLinkageName();
1257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          LinkageName == DeclLinkageName) &&
1259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines         "decl has a linkage name and it is different");
12604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (DeclLinkageName.empty())
12614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    addLinkageName(SPDie, LinkageName);
1262cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher
126337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!DeclDie)
126437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return false;
126537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
126637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Refer to the function declaration where all the other attributes will be
126737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // found.
126837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
126937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return true;
127037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
127137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
127237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
127337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                          bool Minimal) {
127437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!Minimal)
127537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (applySubprogramDefinitionAttributes(SP, SPDie))
127637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return;
1277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1278dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Constructors and operators for anonymous aggregates do not have names.
12792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!SP->getName().empty())
12802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addString(SPDie, dwarf::DW_AT_name, SP->getName());
1281dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
128237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Skip the rest of the attributes under -gmlt to save space.
128337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Minimal)
128437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return;
128537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1286dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addSourceLine(SPDie, SP);
1287dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12888b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // Add the prototype if we have a prototype and we have a C like
12898b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // language.
1290aedaa723c26c33d4f9497a79d9d74a3c197fa262David Blaikie  uint16_t Language = getLanguage();
12912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isPrototyped() &&
12926efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher      (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
12938b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_ObjC))
1294873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_prototyped);
1295dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
12962c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DISubroutineType SPTy = SP->getType();
12972c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(SPTy->getTag() == dwarf::DW_TAG_subroutine_type &&
12983d33184d9da02fb699827249e0631106252f72faDavid Blaikie         "the type of a subprogram should be a subroutine");
1299dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  auto Args = SPTy->getTypeArray();
1301ef2d919f7f767b9d70bc44c4ac918b0a6b540cacEric Christopher  // Add a return type. If this is a type like a C/C++ void type we don't add a
1302ef2d919f7f767b9d70bc44c4ac918b0a6b540cacEric Christopher  // return type.
13032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (Args.size())
13042c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (auto Ty = resolve(Args[0]))
13052c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      addType(SPDie, Ty);
1306dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  unsigned VK = SP->getVirtuality();
1308dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (VK) {
1309798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
131036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DIELoc *Block = getDIELoc();
1311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
13122c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addUInt(*Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
1313770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
13146129002232c3dda7ca4ef95bba77a829ddf241f4Eric Christopher    ContainingTypeMap.insert(
13152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        std::make_pair(&SPDie, resolve(SP->getContainingType())));
1316dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1317dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13182c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!SP->isDefinition()) {
1319873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_declaration);
13208b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
1321dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // Add arguments. Do not add arguments for subprogram definition. They will
1322dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // be handled while processing variables.
1323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    constructSubprogramArguments(SPDie, Args);
1324dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1325dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isArtificial())
1327873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_artificial);
1328dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!SP->isLocalToUnit())
1330873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_external);
1331dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isOptimized())
1333873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1334dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (unsigned isa = Asm->getISAEncoding())
1336dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1337dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
13382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isLValueReference())
133936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addFlag(SPDie, dwarf::DW_AT_reference);
134036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isRValueReference())
134236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
134336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isProtected())
134536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
134636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            dwarf::DW_ACCESS_protected);
13472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (SP->isPrivate())
134836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
134936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            dwarf::DW_ACCESS_private);
13502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (SP->isPublic())
135136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
135236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            dwarf::DW_ACCESS_public);
135336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (SP->isExplicit())
135536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    addFlag(SPDie, dwarf::DW_AT_explicit);
1356dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1357dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
135936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
1360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
1361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
13629493dae613847b01b79914502f337814fe3e00acBill Wendling
1363222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The LowerBound value defines the lower bounds which is typically zero for
1364222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // C/C++. The Count value is the number of elements.  Values are 64 bit. If
1365222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == -1 then the array is unbounded and we do not emit
136637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // DW_AT_lower_bound and DW_AT_count attributes.
13672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  int64_t LowerBound = SR->getLowerBound();
13686afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  int64_t DefaultLowerBound = getDefaultLowerBound();
13692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  int64_t Count = SR->getCount();
1370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
13716afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1372770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
1373222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
137437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (Count != -1)
13759493dae613847b01b79914502f337814fe3e00acBill Wendling    // FIXME: An unbounded array should reference the expression that defines
13769493dae613847b01b79914502f337814fe3e00acBill Wendling    // the array.
137737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
137837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
137937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
138037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDIE *DwarfUnit::getIndexTyDie() {
138137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (IndexTyDie)
138237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return IndexTyDie;
138337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Construct an integer type to use for indexes.
138437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
138537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype");
138637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
138737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
138837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          dwarf::DW_ATE_unsigned);
138937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return IndexTyDie;
1390161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1391161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
139336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
13942c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (CTy->isVector())
1395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addFlag(Buffer, dwarf::DW_AT_GNU_vector);
1396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1397dc1363f5af47542a602c80e726749bc06d8ef3f8Eric Christopher  // Emit the element type.
13982c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addType(Buffer, resolve(CTy->getBaseType()));
1399161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1400161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get an anonymous type for index type.
14018cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // FIXME: This type should be passed down from the front end
14028cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // as different languages may have different sizes for indexes.
1403161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *IdxTy = getIndexTyDie();
1404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add subranges to array type.
14062c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIArray Elements = CTy->getElements();
14072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
14082c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    // FIXME: Should this really be such a loose cast?
14092c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (auto *Element = dyn_cast_or_null<DebugNode>(Elements[i]))
14102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (Element->getTag() == dwarf::DW_TAG_subrange_type)
14112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        constructSubrangeDIE(Buffer, cast<MDSubrange>(Element), IdxTy);
1412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1415953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
141636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
14172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIArray Elements = CTy->getElements();
1418953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher
1419953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher  // Add enumerators to enumeration type.
14202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
14212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    auto *Enum = dyn_cast_or_null<MDEnumerator>(Elements[i]);
14222c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (Enum) {
1423dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
14242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      StringRef Name = Enum->getName();
1425953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher      addString(Enumerator, dwarf::DW_AT_name, Name);
14262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      int64_t Value = Enum->getValue();
142736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
142836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              Value);
1429953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher    }
1430953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher  }
14312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIType DTy = resolve(CTy->getBaseType());
1432953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher  if (DTy) {
1433dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addType(Buffer, DTy);
1434dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addFlag(Buffer, dwarf::DW_AT_enum_class);
1435953398916cfd6ee035f6f4bd2dde25c21cdde1feEric Christopher  }
1436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1438dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain
1439dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables.
144036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid DwarfUnit::constructContainingTypeDIEs() {
1441dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
14426efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher                                                 CE = ContainingTypeMap.end();
14436efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher       CI != CE; ++CI) {
1444dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    DIE &SPDie = *CI->first;
1445cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie    DIDescriptor D(CI->second);
1446cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie    if (!D)
14476efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher      continue;
1448cbc85a270d2546c49fc09f700687de2ecd46bd87David Blaikie    DIE *NDie = getDIE(D);
14496efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher    if (!NDie)
14506efc043f0ba88d8415e729c63a27e886fb64830fEric Christopher      continue;
1451dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
1452dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1453dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1454dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1455a1d25b6360a6f40bf1c5651950226640211dc6d0Manman Ren/// constructMemberDIE - Construct member DIE from DIDerivedType.
14562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarvoid DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT_) {
14572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Downcast to MDDerivedType.
14582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  const MDDerivedType *DT = cast<MDDerivedType>(DT_);
14592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
14602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE &MemberDie = createAndAddDIE(DT->getTag(), Buffer);
14612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef Name = DT->getName();
1462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1463390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_name, Name);
1464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addType(MemberDie, resolve(DT->getBaseType()));
1466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSourceLine(MemberDie, DT);
1468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DT->getTag() == dwarf::DW_TAG_inheritance && DT->isVirtual()) {
1470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // For C++, virtual base classes are not at fixed offset. Use following
1472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // expression to extract appropriate offset from vtable.
1473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
147536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
1476dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1477dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1478dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
14792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT->getOffsetInBits());
1480dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1481dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1482dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1483770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie
1484770530babc78e444bb6d0aadc87702ef138293fdDavid Blaikie    addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
14859b93392185d3838cc438629981d7c3fee634176dDavid Blaikie  } else {
14862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    uint64_t Size = DT->getSizeInBits();
14879b93392185d3838cc438629981d7c3fee634176dDavid Blaikie    uint64_t FieldSize = getBaseTypeSize(DD, DT);
14889b93392185d3838cc438629981d7c3fee634176dDavid Blaikie    uint64_t OffsetInBytes;
14899b93392185d3838cc438629981d7c3fee634176dDavid Blaikie
1490ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (FieldSize && Size != FieldSize) {
149136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // Handle bitfield, assume bytes are 8 bits.
149236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
149336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
14949b93392185d3838cc438629981d7c3fee634176dDavid Blaikie
14952c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      uint64_t Offset = DT->getOffsetInBits();
14962c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      uint64_t AlignMask = ~(DT->getAlignInBits() - 1);
14979b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      uint64_t HiMark = (Offset + FieldSize) & AlignMask;
14989b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      uint64_t FieldOffset = (HiMark - FieldSize);
14999b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      Offset -= FieldOffset;
15009b93392185d3838cc438629981d7c3fee634176dDavid Blaikie
15019b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      // Maybe we need to work from the other end.
15029b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      if (Asm->getDataLayout().isLittleEndian())
15039b93392185d3838cc438629981d7c3fee634176dDavid Blaikie        Offset = FieldSize - (Offset + Size);
15049b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
15059b93392185d3838cc438629981d7c3fee634176dDavid Blaikie
150636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // Here DW_AT_data_member_location points to the anonymous
15079b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      // field that includes this bit field.
15089b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      OffsetInBytes = FieldOffset >> 3;
15099b93392185d3838cc438629981d7c3fee634176dDavid Blaikie    } else
15109b93392185d3838cc438629981d7c3fee634176dDavid Blaikie      // This is not a bitfield.
15112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      OffsetInBytes = DT->getOffsetInBits() >> 3;
151236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
151336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (DD->getDwarfVersion() <= 2) {
151436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
1515dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1516dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
151736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
151836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    } else
151936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
152036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines              OffsetInBytes);
15219b93392185d3838cc438629981d7c3fee634176dDavid Blaikie  }
1522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
15232c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DT->isProtected())
152413aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_protected);
15262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (DT->isPrivate())
152713aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_private);
1529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Otherwise C++ member and base classes are considered public.
15302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (DT->isPublic())
153113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
15332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DT->isVirtual())
1534798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_VIRTUALITY_virtual);
1536e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel
1537e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  // Objective-C properties.
15382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (MDNode *PNode = DT->getObjCProperty())
15396588abf377b7381274236e651462ec83052f6013Devang Patel    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1540dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1541dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         PropertyDie);
15426588abf377b7381274236e651462ec83052f6013Devang Patel
15432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DT->isArtificial())
154401bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie    addFlag(MemberDie, dwarf::DW_AT_artificial);
1545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
15466b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
1547655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
15482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga NainarDIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT_) {
15492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  const MDDerivedType *DT = cast_or_null<MDDerivedType>(DT_);
15502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!DT)
1551dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
15526b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
1553655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren  // Construct the context before querying for the existence of the DIE in case
1554655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren  // such construction creates the DIE.
15552c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE *ContextDIE = getOrCreateContextDIE(resolve(DT->getScope()));
15568c0fecc39fe7f0928a7592104b4419022ad4b54eDavid Blaikie  assert(dwarf::isType(ContextDIE->getTag()) &&
15578c0fecc39fe7f0928a7592104b4419022ad4b54eDavid Blaikie         "Static member should belong to a type.");
1558655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren
1559dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DIE *StaticMemberDIE = getDIE(DT))
1560655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren    return StaticMemberDIE;
1561655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren
15622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIE &StaticMemberDIE = createAndAddDIE(DT->getTag(), *ContextDIE, DT);
1563655a10d96cd79089fc949e9f98f8484c74ec4c90Manman Ren
15642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIType Ty = resolve(DT->getBaseType());
15656b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
15662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  addString(StaticMemberDIE, dwarf::DW_AT_name, DT->getName());
15676b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addType(StaticMemberDIE, Ty);
15686b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addSourceLine(StaticMemberDIE, DT);
15696b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addFlag(StaticMemberDIE, dwarf::DW_AT_external);
15706b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
15716b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
15726b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // FIXME: We could omit private if the parent is a class_type, and
15736b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher  // public if the parent is something else.
15742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DT->isProtected())
15756b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
15766b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_protected);
15772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (DT->isPrivate())
15786b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
15796b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_private);
15802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  else if (DT->isPublic())
15816b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher    addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
15826b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher            dwarf::DW_ACCESS_public);
15836b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
15842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant()))
1585dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addConstantValue(StaticMemberDIE, CI, Ty);
15862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant()))
158714268416720155d63f190a6143ee40b3b850e409David Blaikie    addConstantFPValue(StaticMemberDIE, CFP);
15886b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher
1589dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return &StaticMemberDIE;
15906b6061f01171bd3d4e32022efa45428d4f9941eeEric Christopher}
15911d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie
15924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DwarfUnit::emitHeader(bool UseOffsets) {
159337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Emit size of content not including length itself
159437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Asm->OutStreamer.AddComment("Length of Unit");
159537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
159637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15971d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie  Asm->OutStreamer.AddComment("DWARF version number");
15981d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie  Asm->EmitInt16(DD->getDwarfVersion());
15991d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie  Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
16004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
160136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // We share one abbreviations table across all units so it's always at the
160236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // start of the section. Use a relocatable offset where needed to ensure
160336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // linking doesn't invalidate that offset.
16044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
16054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!UseOffsets)
16064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Asm->emitSectionOffset(TLOF.getDwarfAbbrevSection()->getBeginSymbol());
160736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  else
160836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Asm->EmitInt32(0);
16094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
16101d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie  Asm->OutStreamer.AddComment("Address Size (in bytes)");
16111d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie  Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
16121d36113c05e611c0fba9b872b5f03eca9848bd69David Blaikie}
161336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
161437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid DwarfUnit::initSection(const MCSection *Section) {
161537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  assert(!this->Section);
161637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  this->Section = Section;
161736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
161836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid DwarfTypeUnit::emitHeader(bool UseOffsets) {
16204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  DwarfUnit::emitHeader(UseOffsets);
162136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Asm->OutStreamer.AddComment("Type Signature");
162236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
162336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Asm->OutStreamer.AddComment("Type DIE Offset");
162436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // In a skeleton type unit there is no type DIE so emit a zero offset.
162536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
162636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                sizeof(Ty->getOffset()));
162736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
162836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
162937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool DwarfTypeUnit::isDwoUnit() const {
163037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Since there are no skeleton type units, all type units are dwo type units
163137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // when split DWARF is being used.
163237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return DD->useSplitDwarf();
163336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
1634