DwarfCompileUnit.cpp revision 62fdfb5fa7efdfd61339e4abe6fd87e60e939e58
1161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
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
14161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#define DEBUG_TYPE "dwarfdebug"
15161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
16161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfCompileUnit.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "DwarfAccelTable.h"
18161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/APFloat.h"
2016eeb6f5ebc978b03745177b9ac82684ab1c6932Bill Wendling#include "llvm/DIBuilder.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
25d61c34ba30888c49f4f223422f30b018a41594daEric Christopher#include "llvm/Support/Debug.h"
26d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Target/Mangler.h"
28161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetFrameLowering.h"
29161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetMachine.h"
30161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h"
31161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm;
33161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
34161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// CompileUnit - Compile unit constructor.
35d4a05e0c2c871a0acbadfe572abbdb99158871bdEli BenderskyCompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, AsmPrinter *A,
362e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher                         DwarfDebug *DW, DwarfUnits *DWU)
372e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher  : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
382e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher    IndexTyDie(0) {
39161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
40161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
41161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
42161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// ~CompileUnit - Destructor for compile unit.
43161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::~CompileUnit() {
44161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
45161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlocks[j]->~DIEBlock();
46161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
47161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
48161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
49161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry.
50161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
51161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
52161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Value;
53161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
54161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
556afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling/// getDefaultLowerBound - Return the default lower bound for an array. If the
56222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling/// DWARF version doesn't handle the language, return -1.
576afe478e005bf9f112b32b7ec25879475adc1915Bill Wendlingint64_t CompileUnit::getDefaultLowerBound() const {
58222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  switch (Language) {
59222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  default:
60222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
61222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
62222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C89:
63222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C99:
64222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C:
65222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_C_plus_plus:
66222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC:
67222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_ObjC_plus_plus:
68222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 0;
69222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
70222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran77:
71222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran90:
72222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Fortran95:
73222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    return 1;
74222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
75222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The languages below have valid values only if the DWARF version >= 4.
76222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Java:
77222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Python:
78222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_UPC:
79222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_D:
80222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
81222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 0;
82222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
83222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
84222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada83:
85222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Ada95:
86222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol74:
87222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Cobol85:
88222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Modula2:
89222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_Pascal83:
90222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  case dwarf::DW_LANG_PLI:
91222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    if (dwarf::DWARF_VERSION >= 4)
92222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling      return 1;
93222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    break;
94222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  }
95222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
96222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  return -1;
97222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling}
98222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
99873cf0a0d7906083578d9b793008348750636138Eric Christopher/// addFlag - Add a flag that is true.
100873cf0a0d7906083578d9b793008348750636138Eric Christophervoid CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
101873cf0a0d7906083578d9b793008348750636138Eric Christopher  if (!DD->useDarwinGDBCompat())
102873cf0a0d7906083578d9b793008348750636138Eric Christopher    Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
103873cf0a0d7906083578d9b793008348750636138Eric Christopher                  DIEIntegerOne);
104873cf0a0d7906083578d9b793008348750636138Eric Christopher  else
105873cf0a0d7906083578d9b793008348750636138Eric Christopher    addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
106873cf0a0d7906083578d9b793008348750636138Eric Christopher}
107873cf0a0d7906083578d9b793008348750636138Eric Christopher
108161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value.
109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
110161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addUInt(DIE *Die, unsigned Attribute,
111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, uint64_t Integer) {
112161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(false, Integer);
113161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = Integer == 1 ?
114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
116161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value.
119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSInt(DIE *Die, unsigned Attribute,
121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, int64_t Integer) {
122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(true, Integer);
123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1276a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a
1286a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have
1296a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// more predictable sizes.
130390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewyckyvoid CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
1312e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher  MCSymbol *Symb = DU->getStringPoolEntry(String);
1326a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  DIEValue *Value;
1336a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  if (Asm->needsRelocationsForDwarfStringPool())
1346a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIELabel(Symb);
1356a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  else {
1362e5d870b384f7cc20ba040e827d54fa473f60800Eric Christopher    MCSymbol *StringPool = DU->getStringPoolSym();
1376a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
138390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  }
1396a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
140161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
141161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
142161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addLabel - Add a Dwarf label attribute data and value.
143161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
144161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
145161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Label) {
146161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
147161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
148161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
149161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
150161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDelta - Add a label delta attribute data and value.
151161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
152161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
153161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Hi, const MCSymbol *Lo) {
154161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
155161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
156161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
157161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
158161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value.
159161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
160161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
161161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                              DIE *Entry) {
162161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, createDIEEntry(Entry));
163161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
164161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
165161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data.
166161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
167161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           DIEBlock *Block) {
169161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Block->ComputeSize(Asm);
170161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
171161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Block->BestForm(), Block);
172161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
173161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
174161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
175161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
176161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
177161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify variable.
178161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!V.Verify())
179161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
1808b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
181161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = V.getLineNumber();
182161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
183161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
1847ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
185161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                            V.getContext().getDirectory());
186161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
187161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
188161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
189161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
190161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
191161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
192161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
193161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
194161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify global variable.
195161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!G.Verify())
196161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
197161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
198161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = G.getLineNumber();
199161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
200161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2017ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory());
202161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
203161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
204161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
205161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
206161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
207161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
208161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
209161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
210161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify subprogram.
211161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!SP.Verify())
212161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
213161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2142125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  // If the line number is 0, don't add it.
215161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = SP.getLineNumber();
2162125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
217161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2182125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher
2197ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
220746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky                                            SP.getDirectory());
221161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
222161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
223161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
224161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
225161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
226161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
229161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify type.
230161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
231161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
232161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = Ty.getLineNumber();
2342125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
235161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
2367ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
237746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky                                            Ty.getDirectory());
238161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
239161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
240161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
242161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
243161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
244161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
245b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christophervoid CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
246b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  // Verify type.
247b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (!Ty.Verify())
248b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
249b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
250b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  unsigned Line = Ty.getLineNumber();
251b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  if (Line == 0)
252b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher    return;
253b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  DIFile File = Ty.getFile();
2547ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
2554d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher                                            File.getDirectory());
256b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  assert(FileID && "Invalid file id");
257b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
258b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
259b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher}
260b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher
261b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// addSourceLine - Add location information to specified debug information
262b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher/// entry.
263161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify namespace.
265161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!NS.Verify())
266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
267161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
268161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = NS.getLineNumber();
269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
271161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef FN = NS.getFilename();
272161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2737ee5f5d61f18deda7412fdff4c2729c59a436b27Eric Christopher  unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory());
274161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
275161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
276161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
2798b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// addVariableAddress - Add DW_AT_location attribute for a
280e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// DbgVariable based on provided MachineLocation.
2818b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christophervoid CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
282e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel                                     MachineLocation Location) {
283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DV->variableHasComplexAddress())
284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
285161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DV->isBlockByrefVariable())
286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
287161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addAddress(Die, dwarf::DW_AT_location, Location);
289161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
290161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
291116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand.
292116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
293116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
294116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
295116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (DWReg < 32)
296116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
297116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
298116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
299116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
300116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
301116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
302116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
303116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset.
304116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
305116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                                    int64_t Offset) {
306116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
307116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
308116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
309116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Reg == TRI->getFrameRegister(*Asm->MF))
310116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    // If variable offset is based in frame register then use fbreg.
311116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
312116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else if (DWReg < 32)
313116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
314116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
315116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
316116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
317116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
318116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
319116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
320116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
321116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addAddress - Add an address attribute to a die based on the location
322116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// provided.
323116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addAddress(DIE *Die, unsigned Attribute,
324116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                             const MachineLocation &Location) {
325116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
326116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
327116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Location.isReg())
328116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOp(Block, Location.getReg());
329116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
330116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
331116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
332116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  // Now attach the location information to the DIE.
333116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addBlock(Die, Attribute, 0, Block);
334116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
335116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
336161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addComplexAddress - Start with the address based on the location provided,
337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// and generate the DWARF information necessary to find the actual variable
338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given the extra address information encoded in the DIVariable, starting from
339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// the starting location.  Add the DWARF information to the die.
340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
341161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
342161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    unsigned Attribute,
343161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    const MachineLocation &Location) {
344161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
345c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned N = DV->getNumAddrElements();
346c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned i = 0;
347c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  if (Location.isReg()) {
348c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
349c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // If first address element is OpPlus then emit
350c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
351c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
352c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      i = 2;
353c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    } else
354c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOp(Block, Location.getReg());
355c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  }
356116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
357116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
359c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  for (;i < N; ++i) {
360161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Element = DV->getAddrElement(i);
361161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element == DIBuilder::OpPlus) {
362161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
363161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
364161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else if (Element == DIBuilder::OpDeref) {
365501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher      if (!Location.isReg())
366501207676c78fefcfc9eeeaa1e3dbe9ea857d33fEric Christopher        addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
367161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else llvm_unreachable("unknown DIBuilder Opcode");
368161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
369161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
371161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
372161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
373161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
374161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType
375161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
376161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   gives the variable VarName either the struct, or a pointer to the struct, as
377161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   its type.  This is necessary for various behind-the-scenes things the
378161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   compiler needs to do with by-reference variables in Blocks.
379161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
380161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However, as far as the original *programmer* is concerned, the variable
381161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   should still have type 'SomeType', as originally declared.
382161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
383161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The function getBlockByrefType dives into the __Block_byref_x_VarName
384161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to find the original type of the variable, which is then assigned to
385161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the variable's Debug Information Entry as its real type.  So far, so good.
386161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However now the debugger will expect the variable VarName to have the type
387161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   SomeType.  So we need the location attribute for the variable to be an
388161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   expression that explains to the debugger how to navigate through the
389161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   pointers and struct to find the actual variable of type SomeType.
390161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
391161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The following function does just that.  We start by getting
392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the "normal" location for the variable. This will be the location
393161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   of either the struct __Block_byref_x_VarName or the pointer to the
394161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName.
395161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The struct will look something like:
397161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
398161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName {
399161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various fields>
400161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     struct __Block_byref_x_VarName *forwarding;
401161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various other fields>
402161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     SomeType VarName;
403161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <maybe more fields>
404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   };
405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we are given the struct directly (as our starting point) we
407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   need to tell the debugger to:
408161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
409161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   1).  Add the offset of the forwarding field.
410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
411161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   2).  Follow that pointer to get the real __Block_byref_x_VarName
412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to use (the real one may have been copied onto the heap).
413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   3).  Add the offset for the field VarName, to find the actual variable.
415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
416161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we started with a pointer to the struct, then we need to
417161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   dereference that pointer first, before the other steps.
418161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   Translating this into DWARF ops, we will need to append the following
419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   to the current location description for the variable:
420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref                    -- optional, if we start with a pointer
422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <forward_fld_offset>
423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref
424161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <varName_fld_offset>
425161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   That is what this function does.  */
427161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location
429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the
430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the
431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location.  Add the DWARF information to the die.  For
432161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here.
433161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
434161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       unsigned Attribute,
436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       const MachineLocation &Location) {
437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType Ty = DV->getType();
438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType TmpTy = Ty;
439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = Ty.getTag();
440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool isPointer = false;
441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef varName = DV->getName();
443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_pointer_type) {
445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DTy = DIDerivedType(Ty);
446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    TmpTy = DTy.getTypeDerivedFrom();
447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    isPointer = true;
448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DICompositeType blockStruct = DICompositeType(TmpTy);
451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Find the __forwarding field and the variable field in the __Block_byref
453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct.
454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Fields = blockStruct.getTypeArray();
455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor varField = DIDescriptor();
456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor forwardingField = DIDescriptor();
457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Fields.getElement(i);
460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DT = DIDerivedType(Element);
461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    StringRef fieldName = DT.getName();
462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (fieldName == "__forwarding")
463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      forwardingField = Element;
464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (fieldName == varName)
465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      varField = Element;
466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the offsets for the forwarding field and the variable field.
469161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned forwardingFieldOffset =
470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned varFieldOffset =
472161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(varField).getOffsetInBits() >> 3;
473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Decode the original location, and use that as the start of the byref
475161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // variable's location.
476161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
478caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  if (Location.isReg())
479caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOp(Block, Location.getReg());
480caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher  else
481caba263c8e28474e3d6feb307af8fc4445645962Eric Christopher    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
482161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
483161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If we started with a pointer to the __Block_byref... struct, then
484161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // the first thing we need to do is dereference the pointer (DW_OP_deref).
485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (isPointer)
486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Next add the offset for the '__forwarding' field:
489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // adding the offset if it's 0.
491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (forwardingFieldOffset > 0) {
492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now dereference the __forwarding field to get to the real __Block_byref
497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct:  DW_OP_deref.
498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now that we've got the real __Block_byref... struct, add the offset
501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // for the variable's field to get to the location of the actual variable:
502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (varFieldOffset > 0) {
504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
5124ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel/// isTypeSigned - Return true if the type is signed.
5134ec14b0dee433a4f134d832e326a20839b1f777eDevang Patelstatic bool isTypeSigned(DIType Ty, int *SizeInBits) {
5144ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isDerivedType())
5154ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
5164ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isBasicType())
5174ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
5184ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel        || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
5194ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      *SizeInBits = Ty.getSizeInBits();
5204ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      return true;
5214ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    }
5224ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  return false;
5234ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel}
5244ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel
525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
526b58128e2b2375173aafb07905bd53014d622e4baDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
527b58128e2b2375173aafb07905bd53014d622e4baDevang Patel                                   DIType Ty) {
528746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  assert(MO.isImm() && "Invalid machine operand!");
529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
5304ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  int SizeInBits = -1;
5314ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
5324ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
5334ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  switch (SizeInBits) {
5344ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 8:  Form = dwarf::DW_FORM_data1; break;
5354ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 16: Form = dwarf::DW_FORM_data2; break;
5364ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 32: Form = dwarf::DW_FORM_data4; break;
5374ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 64: Form = dwarf::DW_FORM_data8; break;
538045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel    default: break;
539045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel  }
5408b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
5414ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    : addUInt(Block, 0, Form, MO.getImm());
54272f0d9cdefa3086715e1e2547a9843321690b4d9Devang Patel
543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
547161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE.
548161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelbool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
549390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  assert (MO.isFPImm() && "Invalid machine operand!");
550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
551161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  APFloat FPImm = MO.getFPImm()->getValueAPF();
552161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the floating point.
554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt FltVal = FPImm.bitcastToAPInt();
555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const char *FltPtr = (const char*)FltVal.getRawData();
556161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
5583574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
559161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Incr = (LittleEndian ? 1 : -1);
560161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Start = (LittleEndian ? 0 : NumBytes - 1);
561161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Stop = (LittleEndian ? NumBytes : -1);
562161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
563161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
564161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (; Start != Stop; Start += Incr)
565161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1,
566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            (unsigned char)0xFF & FltPtr[Start]);
567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
570161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
571161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
5738594d429e02c688d428036f8563f09572da3fbffDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                   bool Unsigned) {
575d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  unsigned CIBitWidth = CI->getBitWidth();
576d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  if (CIBitWidth <= 64) {
577d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    unsigned form = 0;
578d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    switch (CIBitWidth) {
579d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 8: form = dwarf::DW_FORM_data1; break;
580d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 16: form = dwarf::DW_FORM_data2; break;
581d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 32: form = dwarf::DW_FORM_data4; break;
582d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 64: form = dwarf::DW_FORM_data8; break;
5838b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher    default:
584d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
585d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    }
586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Unsigned)
587d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
588161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else
589d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
590161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return true;
591161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
592161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
593161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
594161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the large APInt.
596161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt Val = CI->getValue();
597c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  const uint64_t *Ptr64 = Val.getRawData();
598161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
599161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
6003574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  bool LittleEndian = Asm->getDataLayout().isLittleEndian();
601161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
602161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
603c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  for (int i = 0; i < NumBytes; i++) {
604c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    uint8_t c;
605c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    if (LittleEndian)
606c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[i / 8] >> (8 * (i & 7));
607c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    else
608c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
609c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    addUInt(Block, 0, dwarf::DW_FORM_data1, c);
610c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  }
611161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
612161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
613161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
614161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
615161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
616161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addTemplateParams - Add template parameters in buffer.
617161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
618161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add template parameters.
619161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
620161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = TParams.getElement(i);
621161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.isTemplateTypeParameter())
622161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
623161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateTypeParameter(Element)));
624161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (Element.isTemplateValueParameter())
625161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
626161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateValueParameter(Element)));
627161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
628161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
629746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky
630161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addToContextOwner - Add Die into the list of its context owner's children.
631161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
632161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Context.isType()) {
633161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
634161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
635161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (Context.isNameSpace()) {
636161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
637161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
638161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (Context.isSubprogram()) {
639dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
640161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (DIE *ContextDIE = getDIE(Context))
642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
643161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
644161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(Die);
645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType.
64994c7ddb6f52a5200983fed0ce74dc602a7737879Devang PatelDIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
65094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  DIType Ty(TyNode);
65194c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  if (!Ty.Verify())
65294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel    return NULL;
653161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *TyDIE = getDIE(Ty);
654161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (TyDIE)
655161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return TyDIE;
656161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
657161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Create new type.
658161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  TyDIE = new DIE(dwarf::DW_TAG_base_type);
659161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIE(Ty, TyDIE);
660161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Ty.isBasicType())
661161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIBasicType(Ty));
662161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (Ty.isCompositeType())
663161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DICompositeType(Ty));
664161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else {
665161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    assert(Ty.isDerivedType() && "Unknown kind of DIType");
666161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
667161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
6681b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // If this is a named finished type then include it in the list of types
6691b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // for the accelerator tables.
670c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
671c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    bool IsImplementation = 0;
672c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    if (Ty.isCompositeType()) {
673c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      DICompositeType CT(Ty);
674e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // A runtime language of 0 actually means C/C++ and that any
675e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // non-negative value is some version of Objective-C/C++.
676c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      IsImplementation = (CT.getRunTimeLang() == 0) ||
677e2dc9336d15ad3ca4f38d296d17f6682829b80b4Eric Christopher        CT.isObjcClassComplete();
678c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    }
679e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    unsigned Flags = IsImplementation ?
680e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher                     DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
681e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
682c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  }
6838b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
684161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addToContextOwner(TyDIE, Ty.getContext());
685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return TyDIE;
686161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
687161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
688161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity.
6894d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
690161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
691161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
692161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
693161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Check for pre-existence.
694161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Entry = getDIEEntry(Ty);
695161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If it exists then use the existing value.
696161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Entry) {
697663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher    Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
698161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
699161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
700161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
701161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Construct type.
702161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Buffer = getOrCreateTypeDIE(Ty);
703161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
704161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Set up proxy.
705161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Entry = createDIEEntry(Buffer);
706161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIEEntry(Ty, Entry);
707663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher  Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
708e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel
709e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // If this is a complete composite type then include it in the
710e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // list of global types.
711c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel  addGlobalType(Ty);
71266658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel}
71366658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel
71466658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// addGlobalType - Add a new global type to the compile unit.
71566658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel///
716c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patelvoid CompileUnit::addGlobalType(DIType Ty) {
717e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  DIDescriptor Context = Ty.getContext();
7188b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
7198b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      && (!Context || Context.isCompileUnit() || Context.isFile()
72094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel          || Context.isNameSpace()))
721c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    if (DIEEntry *Entry = getDIEEntry(Ty))
722c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel      GlobalTypes[Ty.getName()] = Entry->getEntry();
723161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
724161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
72531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// addPubTypes - Add type for pubtypes section.
72631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patelvoid CompileUnit::addPubTypes(DISubprogram SP) {
72731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DICompositeType SPTy = SP.getType();
72831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  unsigned SPTag = SPTy.getTag();
72931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (SPTag != dwarf::DW_TAG_subroutine_type)
73031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return;
73131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
73231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIArray Args = SPTy.getTypeArray();
73331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
73431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    DIType ATy(Args.getElement(i));
73531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    if (!ATy.Verify())
73631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel      continue;
737c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    addGlobalType(ATy);
73831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  }
73931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
74031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType.
742161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
743161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
744161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = BTy.getName();
745161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
746161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
747390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
748734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
749734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
750734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    Buffer.setTag(dwarf::DW_TAG_unspecified_type);
751734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    // Unspecified types has only name, nothing else.
752734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    return;
753734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  }
754734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
755734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  Buffer.setTag(dwarf::DW_TAG_base_type);
756746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
75730d409ca097e35c51964c9dac642804e5e495906Devang Patel          BTy.getEncoding());
758734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
759161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = BTy.getSizeInBits() >> 3;
760161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
761161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
762161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
763161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType.
764161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
765161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
766161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DTy.getName();
767161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DTy.getSizeInBits() >> 3;
768161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = DTy.getTag();
769161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
770161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // FIXME - Workaround for templates.
771161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
773161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
774161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
775161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Map to main type, void will not have a type.
776161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType FromTy = DTy.getTypeDerivedFrom();
777161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, FromTy);
778161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
779161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
780161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
781390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
782161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
783161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add size if non-zero (derived types might be zero-sized.)
78435f225aa2c04ca2420161cca812cb3eb611bde51Eric Christopher  if (Size && Tag != dwarf::DW_TAG_pointer_type)
785161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
786161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
78762fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie  if (Tag == dwarf::DW_TAG_ptr_to_member_type)
78862fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
78962fdfb5fa7efdfd61339e4abe6fd87e60e939e58David Blaikie                  getOrCreateTypeDIE(DTy.getClassType()));
790161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add source line info if available and TyDesc is not a forward declaration.
791161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!DTy.isForwardDecl())
792161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addSourceLine(&Buffer, DTy);
793161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
794161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
795161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType.
796161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
797161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
798161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = CTy.getName();
799161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
800161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = CTy.getSizeInBits() >> 3;
801161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = CTy.getTag();
802161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
803161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
804161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  switch (Tag) {
805161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_vector_type:
806161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_array_type:
807161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructArrayTypeDIE(Buffer, &CTy);
808161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
809161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_enumeration_type: {
810161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
811161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
812161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add enumerators to enumeration type.
813161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
814161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
815161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Enum(Elements.getElement(i));
816161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Enum.isEnumerator()) {
817161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
818161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(ElemDie);
819161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
820161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
821bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    DIType DTy = CTy.getTypeDerivedFrom();
822bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    if (DTy.Verify()) {
823bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addType(&Buffer, DTy);
824bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher      addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
825bb0f6eac1f2d04e485607f0726c31a84ce9b8cedEric Christopher    }
826161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
827161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
828161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_subroutine_type: {
829161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add return type.
830161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
831161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor RTy = Elements.getElement(0);
832161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addType(&Buffer, DIType(RTy));
833161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
834161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    bool isPrototyped = true;
835161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add arguments.
836161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
837161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Ty = Elements.getElement(i);
838161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Ty.isUnspecifiedParameter()) {
839161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
840161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
841161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        isPrototyped = false;
842161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      } else {
843161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
844161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(Arg, DIType(Ty));
845161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
846161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
847161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
8488b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // Add prototype flag if we're dealing with a C language and the
8498b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // function has been prototyped.
8508b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    if (isPrototyped &&
8514d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        (Language == dwarf::DW_LANG_C89 ||
8524d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_C99 ||
8534d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher         Language == dwarf::DW_LANG_ObjC))
854873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_prototyped);
855161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
856161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
857161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_structure_type:
858161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_union_type:
859161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_class_type: {
860161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
861161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
862161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
863161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // A forward struct declared type may not have elements available.
864161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    unsigned N = Elements.getNumElements();
865161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (N == 0)
866161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      break;
867161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
868161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
869161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0; i < N; ++i) {
870161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Element = Elements.getElement(i);
871161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
872161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Element.isSubprogram()) {
873161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DISubprogram SP(Element);
874dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
875161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isProtected())
87613aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
877161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_protected);
878161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else if (SP.isPrivate())
87913aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
880161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_private);
8818b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher        else
88213aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
883161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
884161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isExplicit())
885873cf0a0d7906083578d9b793008348750636138Eric Christopher          addFlag(ElemDie, dwarf::DW_AT_explicit);
886161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
887161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      else if (Element.isVariable()) {
888161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIVariable DV(Element);
889161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = new DIE(dwarf::DW_TAG_variable);
890390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky        addString(ElemDie, dwarf::DW_AT_name, DV.getName());
891161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(ElemDie, DV.getType());
892873cf0a0d7906083578d9b793008348750636138Eric Christopher        addFlag(ElemDie, dwarf::DW_AT_declaration);
893873cf0a0d7906083578d9b793008348750636138Eric Christopher        addFlag(ElemDie, dwarf::DW_AT_external);
894161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addSourceLine(ElemDie, DV);
895663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isDerivedType()) {
8964d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        DIDerivedType DDTy(Element);
8974d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        if (DDTy.getTag() == dwarf::DW_TAG_friend) {
8984d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          ElemDie = new DIE(dwarf::DW_TAG_friend);
8994d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
9004d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        } else
9014d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher          ElemDie = createMemberDIE(DIDerivedType(Element));
902663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isObjCProperty()) {
90330d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIObjCProperty Property(Element);
90430d409ca097e35c51964c9dac642804e5e495906Devang Patel        ElemDie = new DIE(Property.getTag());
90530d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef PropertyName = Property.getObjCPropertyName();
90630d409ca097e35c51964c9dac642804e5e495906Devang Patel        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
9074d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addType(ElemDie, Property.getType());
9084d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher        addSourceLine(ElemDie, Property);
90930d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef GetterName = Property.getObjCPropertyGetterName();
91030d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!GetterName.empty())
91130d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
91230d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef SetterName = Property.getObjCPropertySetterName();
91330d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!SetterName.empty())
91430d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
91530d409ca097e35c51964c9dac642804e5e495906Devang Patel        unsigned PropertyAttributes = 0;
9169e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadOnlyObjCProperty())
9179e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
9189e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadWriteObjCProperty())
9199e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
9209e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isAssignObjCProperty())
9219e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
9229e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isRetainObjCProperty())
9239e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
9249e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isCopyObjCProperty())
9259e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
9269e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isNonAtomicObjCProperty())
9279e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
9289e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (PropertyAttributes)
9298b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
9309e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel                 PropertyAttributes);
9316588abf377b7381274236e651462ec83052f6013Devang Patel
93230d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIEEntry *Entry = getDIEEntry(Element);
93330d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!Entry) {
93430d409ca097e35c51964c9dac642804e5e495906Devang Patel          Entry = createDIEEntry(ElemDie);
93530d409ca097e35c51964c9dac642804e5e495906Devang Patel          insertDIEEntry(Element, Entry);
93630d409ca097e35c51964c9dac642804e5e495906Devang Patel        }
9379e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel      } else
938161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        continue;
939161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(ElemDie);
940161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
941161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
942161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (CTy.isAppleBlockExtension())
943873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
944161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
945161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DICompositeType ContainingType = CTy.getContainingType();
946161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (DIDescriptor(ContainingType).isCompositeType())
947161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
948161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  getOrCreateTypeDIE(DIType(ContainingType)));
949161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
950161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Context = CTy.getContext();
951161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addToContextOwner(&Buffer, Context);
952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
953161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
954201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel    if (CTy.isObjcClassComplete())
955873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
956b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel
9571a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // Add template parameters to a class, structure or union types.
9581a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // FIXME: The support isn't in the metadata for this yet.
9591a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    if (Tag == dwarf::DW_TAG_class_type ||
9601a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_structure_type ||
9611a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_union_type)
962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addTemplateParams(Buffer, CTy.getTemplateParams());
963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
964161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
965161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
966161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  default:
967161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
968161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
969161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
970161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
971161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
972390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
973161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
9744a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher  if (Tag == dwarf::DW_TAG_enumeration_type ||
9754a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_class_type ||
9764a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_structure_type ||
9774a5d839dfa07fd6a187581b00c1a09ece30d9a08Eric Christopher      Tag == dwarf::DW_TAG_union_type) {
978161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add size if non-zero (derived types might be zero-sized.)
979fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // TODO: Do we care about size for enum forward declarations?
980161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Size)
981161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
982fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    else if (!CTy.isForwardDecl())
983161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      // Add zero size if it is not a forward declaration.
984fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
985fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher
986fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    // If we're a forward decl, say so.
987fc4199bf4add3422ce6470ca47bbe6bff2d70ea5Eric Christopher    if (CTy.isForwardDecl())
988873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(&Buffer, dwarf::DW_AT_declaration);
989161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
990161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add source line info if available.
991161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (!CTy.isForwardDecl())
992161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addSourceLine(&Buffer, CTy);
9938938895a8338e6084eb12a2bb4bf044928436173Eric Christopher
9948938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    // No harm in adding the runtime language to the declaration.
9958938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    unsigned RLang = CTy.getRunTimeLang();
9968938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    if (RLang)
9978938895a8338e6084eb12a2bb4bf044928436173Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
9988938895a8338e6084eb12a2bb4bf044928436173Eric Christopher              dwarf::DW_FORM_data1, RLang);
999161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1000161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1001161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10028b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1003161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateTypeParameter.
1004161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
1005161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1006161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TP);
1007161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
1008161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
1009161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1010161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1011161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TP.getType());
1012390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
1013161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
1014161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1015161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
10168b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1017161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateValueParameter.
1018161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
10194d069bf8ec726570d668e59fda993a33dfb7cb0bEric ChristopherCompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
1020161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TPV);
1021161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
1022161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
1023161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1024161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1025161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TPV.getType());
1026161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!TPV.getName().empty())
1027390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
10288b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1029161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel          TPV.getValue());
1030161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
1031161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1032161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
103331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace.
103431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang PatelDIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
103531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIE *NDie = getDIE(NS);
103631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (NDie)
103731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return NDie;
103831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  NDie = new DIE(dwarf::DW_TAG_namespace);
103931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  insertDIE(NS, NDie);
104009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  if (!NS.getName().empty()) {
1041390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(NDie, dwarf::DW_AT_name, NS.getName());
104209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace(NS.getName(), NDie);
104309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  } else
104409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace("(anonymous namespace)", NDie);
104531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addSourceLine(NDie, NS);
104631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addToContextOwner(NDie, NS.getContext());
104731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  return NDie;
104831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
104931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
1050dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1051dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// printer to not emit usual symbol prefix before the symbol name is used then
1052dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// return linkage name after skipping this special LLVM prefix.
1053dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelstatic StringRef getRealLinkageName(StringRef LinkageName) {
1054dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  char One = '\1';
1055dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (LinkageName.startswith(StringRef(&One, 1)))
1056dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return LinkageName.substr(1);
1057dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return LinkageName;
1058dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1059dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1060dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP.
1061dbc64af76d769596903485668a1dfc2d6640c4fbDevang PatelDIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1062dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIE *SPDie = getDIE(SP);
1063dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SPDie)
1064dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
1065dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
106627302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  SPDie = new DIE(dwarf::DW_TAG_subprogram);
106727302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
106827302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  // DW_TAG_inlined_subroutine may refer to this DIE.
106927302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne  insertDIE(SP, SPDie);
107027302f07393d4db22e8ad06ac2ad4e7f01370b17Peter Collingbourne
107101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DISubprogram SPDecl = SP.getFunctionDeclaration();
107201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DIE *DeclDie = NULL;
107301b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (SPDecl.isSubprogram()) {
107401b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    DeclDie = getOrCreateSubprogramDIE(SPDecl);
107501b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
107601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1077dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add to context owner.
1078dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addToContextOwner(SPDie, SP.getContext());
1079dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1080dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add function template parameters.
1081dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addTemplateParams(*SPDie, SP.getTemplateParams());
1082dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1083e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // Unfortunately this code needs to stay here instead of below the
1084e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // AT_specification code in order to work around a bug in older
1085e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // gdbs that requires the linkage name to resolve multiple template
1086e9722e1e8ba43bff2dc8ee3ae948e31f3fb0e370Eric Christopher  // functions.
1087cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // TODO: Remove this set of code when we get rid of the old gdb
1088cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // compatibility.
10898d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  StringRef LinkageName = SP.getLinkageName();
1090cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  if (!LinkageName.empty() && DD->useDarwinGDBCompat())
10918d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
10928d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher              getRealLinkageName(LinkageName));
10938d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher
1094dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // If this DIE is going to refer declaration info using AT_specification
1095dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // then there is no need to add other attributes.
109601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (DeclDie) {
109701b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    // Refer function declaration directly.
109801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
109901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola                DeclDie);
110001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1101dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
110201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
1103dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1104cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  // Add the linkage name if we have one.
1105cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher  if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
1106cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1107cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher              getRealLinkageName(LinkageName));
1108cbbd5b1d86e0d06c804f4cdd61e0676b2d2f5c85Eric Christopher
1109dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Constructors and operators for anonymous aggregates do not have names.
1110dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.getName().empty())
1111390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(SPDie, dwarf::DW_AT_name, SP.getName());
1112dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1113dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addSourceLine(SPDie, SP);
1114dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
11158b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // Add the prototype if we have a prototype and we have a C like
11168b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // language.
11178b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  if (SP.isPrototyped() &&
11188b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher      (Language == dwarf::DW_LANG_C89 ||
11198b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_C99 ||
11208b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_ObjC))
1121873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_prototyped);
1122dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1123dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add Return Type.
1124dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DICompositeType SPTy = SP.getType();
1125dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIArray Args = SPTy.getTypeArray();
1126dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned SPTag = SPTy.getTag();
1127dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1128dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1129dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addType(SPDie, SPTy);
1130dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  else
1131dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addType(SPDie, DIType(Args.getElement(0)));
1132dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1133dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned VK = SP.getVirtuality();
1134dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (VK) {
1135798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1136dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIEBlock *Block = getDIEBlock();
1137dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1138dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1139dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1140dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    ContainingTypeMap.insert(std::make_pair(SPDie,
1141dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel                                            SP.getContainingType()));
1142dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1143dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1144dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isDefinition()) {
1145873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_declaration);
11468b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
1147dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // Add arguments. Do not add arguments for subprogram definition. They will
1148dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // be handled while processing variables.
1149dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DICompositeType SPTy = SP.getType();
1150dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIArray Args = SPTy.getTypeArray();
1151dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    unsigned SPTag = SPTy.getTag();
1152dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1153dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (SPTag == dwarf::DW_TAG_subroutine_type)
1154dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1155dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
11565c38de99f104daaf1624b28def2c8375a702466dEric Christopher        DIType ATy = DIType(Args.getElement(i));
1157dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        addType(Arg, ATy);
1158dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        if (ATy.isArtificial())
1159873cf0a0d7906083578d9b793008348750636138Eric Christopher          addFlag(Arg, dwarf::DW_AT_artificial);
1160dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        SPDie->addChild(Arg);
1161dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel      }
1162dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1163dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1164dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isArtificial())
1165873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_artificial);
1166dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1167dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isLocalToUnit())
1168873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_external);
1169dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1170dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isOptimized())
1171873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1172dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1173dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (unsigned isa = Asm->getISAEncoding()) {
1174dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1175dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1176dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1177dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return SPDie;
1178dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1179dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
11806f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// Return const expression if value is a GEP to access merged global
11816f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// constant. e.g.
11826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
11836f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelstatic const ConstantExpr *getMergedGlobalExpr(const Value *V) {
11846f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
11856f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CE || CE->getNumOperands() != 3 ||
11866f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      CE->getOpcode() != Instruction::GetElementPtr)
11876f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11886f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11896f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // First operand points to a global struct.
11906f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  Value *Ptr = CE->getOperand(0);
11916f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<GlobalValue>(Ptr) ||
11926f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
11936f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Second operand is zero.
11966f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
11976f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CI || !CI->isZero())
11986f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12006f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Third operand is offset.
12016f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<ConstantInt>(CE->getOperand(2)))
12026f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
12036f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12046f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return CE;
12056f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
12066f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12076f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel/// createGlobalVariableDIE - create global variable DIE.
12086f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelvoid CompileUnit::createGlobalVariableDIE(const MDNode *N) {
12096f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Check for pre-existence.
121049e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  if (getDIE(N))
12116f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return;
12126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
121349e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIGlobalVariable GV(N);
121428bea08e531452992ff1e25e8584883dfbd4c232Devang Patel  if (!GV.Verify())
121528bea08e531452992ff1e25e8584883dfbd4c232Devang Patel    return;
121628bea08e531452992ff1e25e8584883dfbd4c232Devang Patel
12176f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  DIE *VariableDIE = new DIE(GV.getTag());
121849e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  // Add to map.
121949e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  insertDIE(N, VariableDIE);
12206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add name.
1222390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
12236f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  StringRef LinkageName = GV.getLinkageName();
122449e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  bool isGlobalVariable = GV.getGlobal() != NULL;
12256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!LinkageName.empty() && isGlobalVariable)
1226746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky    addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1227390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky              getRealLinkageName(LinkageName));
12286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add type.
122949e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIType GTy = GV.getType();
12306f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addType(VariableDIE, GTy);
12316f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
12326f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add scoping info.
1233dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher  if (!GV.isLocalToUnit())
1234873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(VariableDIE, dwarf::DW_AT_external);
1235dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher
12366f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add line number info.
12376f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addSourceLine(VariableDIE, GV);
12386f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add to context owner.
12396f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  DIDescriptor GVContext = GV.getContext();
12406f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addToContextOwner(VariableDIE, GVContext);
12416f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add location.
124209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  bool addToAccelTable = false;
1243d61c34ba30888c49f4f223422f30b018a41594daEric Christopher  DIE *VariableSpecDIE = NULL;
12446f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (isGlobalVariable) {
124509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
12466f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
12476f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
12486f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addLabel(Block, 0, dwarf::DW_FORM_udata,
12496f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel             Asm->Mang->getSymbol(GV.getGlobal()));
12506f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // Do not create specification DIE if context is either compile unit
12516f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // or a subprogram.
12521dd4e56d5565d59e9d40ad9e088a05e06f4b70f8Devang Patel    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
12536f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
12546f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      // Create specification DIE.
1255d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
12566f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
12576f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                  dwarf::DW_FORM_ref4, VariableDIE);
12586f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1259873cf0a0d7906083578d9b793008348750636138Eric Christopher      addFlag(VariableDIE, dwarf::DW_AT_declaration);
12606f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDie(VariableSpecDIE);
12616f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    } else {
12626f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
126309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    }
12648b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  } else if (const ConstantInt *CI =
12656f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel             dyn_cast_or_null<ConstantInt>(GV.getConstant()))
12666f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
12676f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
126809ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
12696f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // GV is a merged global.
12706f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
12716f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    Value *Ptr = CE->getOperand(0);
12726f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
12736f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addLabel(Block, 0, dwarf::DW_FORM_udata,
12746f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                    Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
12756f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
12766f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
12778b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher    addUInt(Block, 0, dwarf::DW_FORM_udata,
12783574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow                   Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
12796f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
12806f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
12816f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  }
12826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1283d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  if (addToAccelTable) {
1284d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1285d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    addAccelName(GV.getName(), AddrDIE);
128609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher
1287d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // If the linkage name is different than the name, go ahead and output
1288d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // that as well into the name table.
1289d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1290d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      addAccelName(GV.getLinkageName(), AddrDIE);
1291d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  }
129274d8a87f40dd89ec263071c0af4d77104b166f4aEric Christopher
12936f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return;
12946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
12956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1296161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
12974d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christophervoid CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
12984d069bf8ec726570d668e59fda993a33dfb7cb0bEric Christopher                                       DIE *IndexTy) {
1299161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1300161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
13019493dae613847b01b79914502f337814fe3e00acBill Wendling
1302222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // The LowerBound value defines the lower bounds which is typically zero for
1303222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // C/C++. The Count value is the number of elements.  Values are 64 bit. If
1304222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == -1 then the array is unbounded and we do not emit
1305222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1306222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // Count == 0, then the array has zero elements in which case we do not emit
1307222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  // an upper bound.
1308222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  int64_t LowerBound = SR.getLo();
13096afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  int64_t DefaultLowerBound = getDefaultLowerBound();
1310a7645a3c66668da5e2bc772a8e5ab03dc301610cBill Wendling  int64_t Count = SR.getCount();
1311161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
13126afe478e005bf9f112b32b7ec25879475adc1915Bill Wendling  if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
1313222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1314222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling
1315222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling  if (Count != -1 && Count != 0)
13169493dae613847b01b79914502f337814fe3e00acBill Wendling    // FIXME: An unbounded array should reference the expression that defines
13179493dae613847b01b79914502f337814fe3e00acBill Wendling    // the array.
1318222c2fd60d0cbe676f3f316a4d62a75762a83c40Bill Wendling    addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
13199493dae613847b01b79914502f337814fe3e00acBill Wendling
1320161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.addChild(DW_Subrange);
1321161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1322161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1323161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1324161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                        DICompositeType *CTy) {
1326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(dwarf::DW_TAG_array_type);
1327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1328873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
1329161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1330161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Emit derived type.
1331161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, CTy->getTypeDerivedFrom());
1332161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Elements = CTy->getTypeArray();
1333161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1334161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get an anonymous type for index type.
13358cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // FIXME: This type should be passed down from the front end
13368cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher  // as different languages may have different sizes for indexes.
1337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *IdxTy = getIndexTyDie();
1338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!IdxTy) {
1339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Construct an anonymous type for index type.
1340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    IdxTy = new DIE(dwarf::DW_TAG_base_type);
13418cab6edf4fa46d9bd06ff3ce0e1dd4557be58b65Eric Christopher    addString(IdxTy, dwarf::DW_AT_name, "int");
1342161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1343161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1344161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ATE_signed);
1345161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(IdxTy);
1346161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    setIndexTyDie(IdxTy);
1347161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1348161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1349161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add subranges to array type.
1350161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1351161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Elements.getElement(i);
1352161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1353161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1354161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1355161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1357161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1359161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1360161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = ETy.getName();
1361390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(Enumerator, dwarf::DW_AT_name, Name);
1362161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int64_t Value = ETy.getEnumValue();
1363161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1364161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Enumerator;
1365161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1366161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1367dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain
1368dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables.
1369dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelvoid CompileUnit::constructContainingTypeDIEs() {
1370dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1371dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1372dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *SPDie = CI->first;
1373dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    const MDNode *N = CI->second;
1374dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!N) continue;
1375dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *NDie = getDIE(N);
1376dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!NDie) continue;
1377dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1378dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1379dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1380dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1381d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1382d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang PatelDIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1383d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  StringRef Name = DV->getName();
1384d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1385d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Translate tag to proper Dwarf tag.
1386d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Tag = DV->getTag();
1387d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1388d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Define variable debug information entry.
1389d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *VariableDie = new DIE(Tag);
1390d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DbgVariable *AbsVar = DV->getAbstractVariable();
1391d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1392d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (AbsDIE)
1393d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1394d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                            dwarf::DW_FORM_ref4, AbsDIE);
1395d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  else {
1396390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(VariableDie, dwarf::DW_AT_name, Name);
1397d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addSourceLine(VariableDie, DV->getVariable());
1398d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addType(VariableDie, DV->getType());
1399d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1400d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1401d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (DV->isArtificial())
1402873cf0a0d7906083578d9b793008348750636138Eric Christopher    addFlag(VariableDie, dwarf::DW_AT_artificial);
1403d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1404d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (isScopeAbstract) {
1405d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1406d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1407d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1408d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1409d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Add variable address.
1410d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1411d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Offset = DV->getDotDebugLocOffset();
1412d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Offset != ~0U) {
1413d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addLabel(VariableDie, dwarf::DW_AT_location,
1414d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         dwarf::DW_FORM_data4,
1415d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         Asm->GetTempSymbol("debug_loc", Offset));
1416d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1417d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1418d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1419d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
14208cf5e74a9cc7482901125b810f1e482d24e9404dEric Christopher  // Check if variable is described by a DBG_VALUE instruction.
1421d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (const MachineInstr *DVInsn = DV->getMInsn()) {
1422d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    bool updated = false;
1423d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (DVInsn->getNumOperands() == 3) {
1424d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      if (DVInsn->getOperand(0).isReg()) {
1425d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        const MachineOperand RegOp = DVInsn->getOperand(0);
1426d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1427d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        if (DVInsn->getOperand(1).isImm() &&
1428d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel            TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1429d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          unsigned FrameReg = 0;
1430d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
14318b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher          int Offset =
14328b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher            TFI->getFrameIndexReference(*Asm->MF,
14338b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher                                        DVInsn->getOperand(1).getImm(),
1434d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                        FrameReg);
1435d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          MachineLocation Location(FrameReg, Offset);
1436d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addVariableAddress(DV, VariableDie, Location);
14378b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher
1438d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        } else if (RegOp.getReg())
14398b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher          addVariableAddress(DV, VariableDie,
1440d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                         MachineLocation(RegOp.getReg()));
1441d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated = true;
1442d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      }
1443d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isImm())
14448b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher        updated =
1445d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantValue(VariableDie, DVInsn->getOperand(0),
1446d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DV->getType());
1447d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isFPImm())
1448d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1449d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1450d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isCImm())
1451d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
14528b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher          addConstantValue(VariableDie,
1453d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DVInsn->getOperand(0).getCImm(),
1454d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DV->getType().isUnsignedDIType());
1455d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    } else {
14568b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      addVariableAddress(DV, VariableDie,
1457d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                     Asm->getDebugValueLocation(DVInsn));
1458d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      updated = true;
1459d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1460d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (!updated) {
1461d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // If variableDie is not updated then DBG_VALUE instruction does not
1462d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // have valid variable info.
1463d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      delete VariableDie;
1464d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      return NULL;
1465d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1466d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1467d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1468d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  } else {
1469d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    // .. else use frame index.
1470d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    int FI = DV->getFrameIndex();
1471d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (FI != ~0) {
1472d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      unsigned FrameReg = 0;
1473d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
14748b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      int Offset =
1475d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1476d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      MachineLocation Location(FrameReg, Offset);
1477d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      addVariableAddress(DV, VariableDie, Location);
1478d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1479d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1480d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1481d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DV->setDIE(VariableDie);
1482d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  return VariableDie;
1483d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel}
1484d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createMemberDIE - Create new member DIE.
1486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *MemberDie = new DIE(DT.getTag());
1488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DT.getName();
1489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1490390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_name, Name);
1491161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(MemberDie, DT.getTypeDerivedFrom());
1493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSourceLine(MemberDie, DT);
1495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DT.getSizeInBits();
1500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t FieldSize = DT.getOriginalTypeSize();
1501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Size != FieldSize) {
1503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Handle bitfield.
1504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Offset = DT.getOffsetInBits();
1508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t FieldOffset = (HiMark - FieldSize);
1511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Offset -= FieldOffset;
1512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Maybe we need to work from the other end.
15143574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    if (Asm->getDataLayout().isLittleEndian())
1515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Offset = FieldSize - (Offset + Size);
1516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1517161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1518161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Here WD_AT_data_member_location points to the anonymous
1519161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // field that includes this bit field.
1520161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1521161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1522161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1523161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // This is not a bitfield.
1524161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1525161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1526161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.getTag() == dwarf::DW_TAG_inheritance
1527161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      && DT.isVirtual()) {
1528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1529161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // For C++, virtual base classes are not at fixed offset. Use following
1530161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // expression to extract appropriate offset from vtable.
1531161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1537161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1538161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1539161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1541161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1542161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel             VBaseLocationDie);
1544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1545161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1546161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1547161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isProtected())
154813aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1549161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_protected);
1550161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DT.isPrivate())
155113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1552161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_private);
1553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Otherwise C++ member and base classes are considered public.
15548b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher  else
155513aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1556161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
1557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isVirtual())
1558798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1559161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_VIRTUALITY_virtual);
1560e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel
1561e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  // Objective-C properties.
15626588abf377b7381274236e651462ec83052f6013Devang Patel  if (MDNode *PNode = DT.getObjCProperty())
15636588abf377b7381274236e651462ec83052f6013Devang Patel    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
15648b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
15656588abf377b7381274236e651462ec83052f6013Devang Patel                          PropertyDie);
15666588abf377b7381274236e651462ec83052f6013Devang Patel
156701bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie  if (DT.isArtificial())
156801bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie    addFlag(MemberDie, dwarf::DW_AT_artificial);
156901bc2b39a4cbe76537e11411038bb834bceaf8a0David Blaikie
15709e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel  // This is only for backward compatibility.
1571e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  StringRef PropertyName = DT.getObjCPropertyName();
1572e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  if (!PropertyName.empty()) {
1573390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1574e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    StringRef GetterName = DT.getObjCPropertyGetterName();
1575e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (!GetterName.empty())
1576390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1577e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    StringRef SetterName = DT.getObjCPropertySetterName();
1578e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (!SetterName.empty())
1579390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1580e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    unsigned PropertyAttributes = 0;
1581e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isReadOnlyObjCProperty())
1582e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1583e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isReadWriteObjCProperty())
1584e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1585e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isAssignObjCProperty())
1586e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1587e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isRetainObjCProperty())
1588e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1589e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isCopyObjCProperty())
1590e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1591e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isNonAtomicObjCProperty())
1592e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1593e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (PropertyAttributes)
15948b4310b8061d3d5ef26a4a313f53804a8ad02fc9Eric Christopher      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1595e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel              PropertyAttributes);
1596e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  }
1597161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return MemberDie;
1598161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1599