DwarfCompileUnit.cpp revision 663e0cf73dcf2bfbbfc22b49c739d54916652d1c
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//
10161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel// This file contains support for writing dwarf compile unit.
11161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//
12161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel//===----------------------------------------------------------------------===//
13161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
14161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#define DEBUG_TYPE "dwarfdebug"
15161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
16c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher#include "DwarfAccelTable.h"
17161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfCompileUnit.h"
18161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "DwarfDebug.h"
19161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Constants.h"
206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/GlobalVariable.h"
216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Instructions.h"
22161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Analysis/DIBuilder.h"
23d61c34ba30888c49f4f223422f30b018a41594daEric Christopher#include "llvm/Support/Debug.h"
246f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel#include "llvm/Target/Mangler.h"
25161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetData.h"
26161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetFrameLowering.h"
27161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetMachine.h"
28161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Target/TargetRegisterInfo.h"
29161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/ADT/APFloat.h"
30161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel#include "llvm/Support/ErrorHandling.h"
31161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
32161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelusing namespace llvm;
33161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
34161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// CompileUnit - Compile unit constructor.
35438b092a4bba8d766316542ced10b7b028bad82cEric ChristopherCompileUnit::CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A,
36438b092a4bba8d766316542ced10b7b028bad82cEric Christopher			 DwarfDebug *DW)
37438b092a4bba8d766316542ced10b7b028bad82cEric Christopher  : ID(I), Language(L), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
38161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
39161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
40161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
41161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// ~CompileUnit - Destructor for compile unit.
42161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::~CompileUnit() {
43161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlocks[j]->~DIEBlock();
45161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
46161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
47161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// information entry.
49161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Value;
52161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
53161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
54161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addUInt - Add an unsigned integer attribute data and value.
55161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
56161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addUInt(DIE *Die, unsigned Attribute,
57161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, uint64_t Integer) {
58161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(false, Integer);
59161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = Integer == 1 ?
60161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
61161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
62161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
63161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
64161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSInt - Add an signed integer attribute data and value.
65161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
66161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSInt(DIE *Die, unsigned Attribute,
67161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                          unsigned Form, int64_t Integer) {
68161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Form) Form = DIEInteger::BestForm(true, Integer);
69161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
70161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
71161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
72161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
736a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// addString - Add a string attribute data and value. We always emit a
746a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// reference to the string pool instead of immediate strings so that DIEs have
756a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky/// more predictable sizes.
76390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewyckyvoid CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
776a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  MCSymbol *Symb = DD->getStringPoolEntry(String);
786a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  DIEValue *Value;
796a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  if (Asm->needsRelocationsForDwarfStringPool())
806a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIELabel(Symb);
816a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  else {
826a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    MCSymbol *StringPool = DD->getStringPool();
836a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
84390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  }
856a7efcfc02ea5370fb0da66d750165a3ffe93ab7Nick Lewycky  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
86161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
87161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
88161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addLabel - Add a Dwarf label attribute data and value.
89161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
90161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
91161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Label) {
92161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
93161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
94161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
95161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
96161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDelta - Add a label delta attribute data and value.
97161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
98161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
99161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           const MCSymbol *Hi, const MCSymbol *Lo) {
100161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
101161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, Value);
102161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
103161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
104161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addDIEEntry - Add a DIE attribute data and value.
105161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
106161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
107161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                              DIE *Entry) {
108161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Form, createDIEEntry(Entry));
109161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
110161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
111161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlock - Add block data.
112161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
113161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
114161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                           DIEBlock *Block) {
115161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Block->ComputeSize(Asm);
116161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
117161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Die->addValue(Attribute, Block->BestForm(), Block);
118161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
119161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
120161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
121161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
122161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
123161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify variable.
124161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!V.Verify())
125161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
126161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
127161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = V.getLineNumber();
128161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
129161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
130161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
131161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                            V.getContext().getDirectory());
132161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
133161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
134161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
135161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
136161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
137161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
138161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
139161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
140161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify global variable.
141161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!G.Verify())
142161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
143161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
144161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = G.getLineNumber();
145161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
146161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
147746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
148161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
149161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
150161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
151161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
152161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
153161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
154161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
155161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
156161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify subprogram.
157161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!SP.Verify())
158161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
159161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1602125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  // If the line number is 0, don't add it.
161161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = SP.getLineNumber();
1622125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
163161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
1642125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher
165746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
166746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky                                            SP.getDirectory());
167161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
168161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
169161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
170161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
171161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
172161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
173161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
174161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
175161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify type.
176161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
177161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
178161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
179161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = Ty.getLineNumber();
1802125d5a7e58eb21f34c2a21913d6f1074c63b5cdEric Christopher  if (Line == 0)
181161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
182746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
183746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky                                            Ty.getDirectory());
184161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  assert(FileID && "Invalid file id");
185161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
186161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
187161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
188161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
189161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addSourceLine - Add location information to specified debug information
190161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// entry.
191161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
192161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Verify namespace.
193161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!NS.Verify())
194161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
195161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
196161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Line = NS.getLineNumber();
197161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Line == 0)
198161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
199161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef FN = NS.getFilename();
200161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
201161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned FileID = DD->GetOrCreateSourceID(FN, NS.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
207e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// addVariableAddress - Add DW_AT_location attribute for a
208e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel/// DbgVariable based on provided MachineLocation.
209e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patelvoid CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
210e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel                                     MachineLocation Location) {
211161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DV->variableHasComplexAddress())
212161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
213161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DV->isBlockByrefVariable())
214161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
215161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
216161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addAddress(Die, dwarf::DW_AT_location, Location);
217161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
218161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
219116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOp - Add register operand.
220116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
221116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
222116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
223116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (DWReg < 32)
224116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
225116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
226116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
227116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
228116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
229116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
230116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
231116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addRegisterOffset - Add register offset.
232116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
233116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                                    int64_t Offset) {
234116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
235116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
236116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
237116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Reg == TRI->getFrameRegister(*Asm->MF))
238116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    // If variable offset is based in frame register then use fbreg.
239116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
240116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else if (DWReg < 32)
241116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
242116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else {
243116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
244116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
245116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  }
246116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
247116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
248116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
249116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// addAddress - Add an address attribute to a die based on the location
250116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel/// provided.
251116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patelvoid CompileUnit::addAddress(DIE *Die, unsigned Attribute,
252116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel                             const MachineLocation &Location) {
253116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
254116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
255116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  if (Location.isReg())
256116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOp(Block, Location.getReg());
257116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
258116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
259116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
260116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  // Now attach the location information to the DIE.
261116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  addBlock(Die, Attribute, 0, Block);
262116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel}
263116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel
264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addComplexAddress - Start with the address based on the location provided,
265161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// and generate the DWARF information necessary to find the actual variable
266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given the extra address information encoded in the DIVariable, starting from
267161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// the starting location.  Add the DWARF information to the die.
268161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    unsigned Attribute,
271161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                    const MachineLocation &Location) {
272161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
273c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned N = DV->getNumAddrElements();
274c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  unsigned i = 0;
275c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  if (Location.isReg()) {
276c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
277c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // If first address element is OpPlus then emit
278c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
279c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
280c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      i = 2;
281c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel    } else
282c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel      addRegisterOp(Block, Location.getReg());
283c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  }
284116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel  else
285116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
286161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
287c26f5447e39b43a6dd9c1a9d88227f4adf3b5600Devang Patel  for (;i < N; ++i) {
288161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Element = DV->getAddrElement(i);
289161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element == DIBuilder::OpPlus) {
290161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
291161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
292161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else if (Element == DIBuilder::OpDeref) {
293161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
294161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    } else llvm_unreachable("unknown DIBuilder Opcode");
295161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
296161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
297161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
298161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
299161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
300161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
301161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/* Byref variables, in Blocks, are declared by the programmer as "SomeType
302161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
303161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   gives the variable VarName either the struct, or a pointer to the struct, as
304161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   its type.  This is necessary for various behind-the-scenes things the
305161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   compiler needs to do with by-reference variables in Blocks.
306161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
307161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However, as far as the original *programmer* is concerned, the variable
308161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   should still have type 'SomeType', as originally declared.
309161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
310161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The function getBlockByrefType dives into the __Block_byref_x_VarName
311161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to find the original type of the variable, which is then assigned to
312161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the variable's Debug Information Entry as its real type.  So far, so good.
313161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   However now the debugger will expect the variable VarName to have the type
314161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   SomeType.  So we need the location attribute for the variable to be an
315161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   expression that explains to the debugger how to navigate through the
316161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   pointers and struct to find the actual variable of type SomeType.
317161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
318161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The following function does just that.  We start by getting
319161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   the "normal" location for the variable. This will be the location
320161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   of either the struct __Block_byref_x_VarName or the pointer to the
321161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName.
322161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
323161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   The struct will look something like:
324161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
325161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct __Block_byref_x_VarName {
326161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various fields>
327161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     struct __Block_byref_x_VarName *forwarding;
328161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <various other fields>
329161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     SomeType VarName;
330161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel     ... <maybe more fields>
331161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   };
332161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
333161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we are given the struct directly (as our starting point) we
334161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   need to tell the debugger to:
335161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
336161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   1).  Add the offset of the forwarding field.
337161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
338161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   2).  Follow that pointer to get the real __Block_byref_x_VarName
339161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   struct to use (the real one may have been copied onto the heap).
340161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
341161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   3).  Add the offset for the field VarName, to find the actual variable.
342161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
343161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   If we started with a pointer to the struct, then we need to
344161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   dereference that pointer first, before the other steps.
345161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   Translating this into DWARF ops, we will need to append the following
346161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   to the current location description for the variable:
347161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
348161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref                    -- optional, if we start with a pointer
349161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <forward_fld_offset>
350161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_deref
351161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   DW_OP_plus_uconst <varName_fld_offset>
352161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
353161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel   That is what this function does.  */
354161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
355161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addBlockByrefAddress - Start with the address based on the location
356161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// provided, and generate the DWARF information necessary to find the
357161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// actual Block variable (navigating the Block struct) based on the
358161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// starting location.  Add the DWARF information to the die.  For
359161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// more information, read large comment just above here.
360161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel///
361161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
362161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       unsigned Attribute,
363161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                       const MachineLocation &Location) {
364161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType Ty = DV->getType();
365161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType TmpTy = Ty;
366161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = Ty.getTag();
367161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool isPointer = false;
368161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
369161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef varName = DV->getName();
370161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
371161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_pointer_type) {
372161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DTy = DIDerivedType(Ty);
373161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    TmpTy = DTy.getTypeDerivedFrom();
374161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    isPointer = true;
375161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
376161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
377161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DICompositeType blockStruct = DICompositeType(TmpTy);
378161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
379161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Find the __forwarding field and the variable field in the __Block_byref
380161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct.
381161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Fields = blockStruct.getTypeArray();
382161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor varField = DIDescriptor();
383161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIDescriptor forwardingField = DIDescriptor();
384161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
385161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
386161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Fields.getElement(i);
387161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType DT = DIDerivedType(Element);
388161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    StringRef fieldName = DT.getName();
389161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (fieldName == "__forwarding")
390161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      forwardingField = Element;
391161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (fieldName == varName)
392161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      varField = Element;
393161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
394161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
395161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the offsets for the forwarding field and the variable field.
396161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned forwardingFieldOffset =
397161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
398161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned varFieldOffset =
399161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDerivedType(varField).getOffsetInBits() >> 3;
400161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
401161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Decode the original location, and use that as the start of the byref
402161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // variable's location.
403161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
404161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
405161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Location.isReg()) {
408161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Reg < 32)
409161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
411161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else {
415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Reg < 32)
416161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
417161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
418161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
424161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
425161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If we started with a pointer to the __Block_byref... struct, then
426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // the first thing we need to do is dereference the pointer (DW_OP_deref).
427161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (isPointer)
428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Next add the offset for the '__forwarding' field:
431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
432161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // adding the offset if it's 0.
433161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (forwardingFieldOffset > 0) {
434161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now dereference the __forwarding field to get to the real __Block_byref
439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // struct:  DW_OP_deref.
440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now that we've got the real __Block_byref... struct, add the offset
443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // for the variable's field to get to the location of the actual variable:
444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (varFieldOffset > 0) {
446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Now attach the location information to the DIE.
451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, Attribute, 0, Block);
452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
4544ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel/// isTypeSigned - Return true if the type is signed.
4554ec14b0dee433a4f134d832e326a20839b1f777eDevang Patelstatic bool isTypeSigned(DIType Ty, int *SizeInBits) {
4564ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isDerivedType())
4574ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
4584ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  if (Ty.isBasicType())
4594ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
4604ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel        || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
4614ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      *SizeInBits = Ty.getSizeInBits();
4624ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel      return true;
4634ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    }
4644ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  return false;
4654ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel}
4664ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel
467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
468b58128e2b2375173aafb07905bd53014d622e4baDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
469b58128e2b2375173aafb07905bd53014d622e4baDevang Patel                                   DIType Ty) {
470746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  assert(MO.isImm() && "Invalid machine operand!");
471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
4724ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  int SizeInBits = -1;
4734ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
4744ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
4754ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  switch (SizeInBits) {
4764ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 8:  Form = dwarf::DW_FORM_data1; break;
4774ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 16: Form = dwarf::DW_FORM_data2; break;
4784ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 32: Form = dwarf::DW_FORM_data4; break;
4794ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    case 64: Form = dwarf::DW_FORM_data8; break;
480045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel    default: break;
481045c1d4e48e5e06ca05d04af340f7c487bc9975dDevang Patel  }
4824ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel  SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
4834ec14b0dee433a4f134d832e326a20839b1f777eDevang Patel    : addUInt(Block, 0, Form, MO.getImm());
48472f0d9cdefa3086715e1e2547a9843321690b4d9Devang Patel
485161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
486161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
487161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
488161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
489161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantFPValue - Add constant value entry in variable DIE.
490161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelbool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
491390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  assert (MO.isFPImm() && "Invalid machine operand!");
492161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
493161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  APFloat FPImm = MO.getFPImm()->getValueAPF();
494161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
495161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the floating point.
496161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt FltVal = FPImm.bitcastToAPInt();
497161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const char *FltPtr = (const char*)FltVal.getRawData();
498161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
499161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
500161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool LittleEndian = Asm->getTargetData().isLittleEndian();
501161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Incr = (LittleEndian ? 1 : -1);
502161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Start = (LittleEndian ? 0 : NumBytes - 1);
503161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int Stop = (LittleEndian ? NumBytes : -1);
504161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
505161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
506161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (; Start != Stop; Start += Incr)
507161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1,
508161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            (unsigned char)0xFF & FltPtr[Start]);
509161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
510161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
511161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
512161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
513161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
514161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addConstantValue - Add constant value entry in variable DIE.
5158594d429e02c688d428036f8563f09572da3fbffDevang Patelbool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                   bool Unsigned) {
517d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  unsigned CIBitWidth = CI->getBitWidth();
518d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel  if (CIBitWidth <= 64) {
519d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    unsigned form = 0;
520d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    switch (CIBitWidth) {
521d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 8: form = dwarf::DW_FORM_data1; break;
522d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 16: form = dwarf::DW_FORM_data2; break;
523d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 32: form = dwarf::DW_FORM_data4; break;
524d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    case 64: form = dwarf::DW_FORM_data8; break;
525d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    default:
526d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
527d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel    }
528161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Unsigned)
529d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
530161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else
531d6a8136e66f0095c7306cad022d792a57e88ba01Devang Patel      addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
532161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return true;
533161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
534161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
535161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
536161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
537161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get the raw data form of the large APInt.
538161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  const APInt Val = CI->getValue();
539c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  const uint64_t *Ptr64 = Val.getRawData();
540161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
541161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
542161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  bool LittleEndian = Asm->getTargetData().isLittleEndian();
543161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
544161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Output the constant to DWARF one byte at a time.
545c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  for (int i = 0; i < NumBytes; i++) {
546c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    uint8_t c;
547c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    if (LittleEndian)
548c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[i / 8] >> (8 * (i & 7));
549c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    else
550c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
551c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi    addUInt(Block, 0, dwarf::DW_FORM_data1, c);
552c3e48c38bf87ad081904eccf16e4ddd99c36d070NAKAMURA Takumi  }
553161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
554161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
555161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return true;
556161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
557161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
558161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addTemplateParams - Add template parameters in buffer.
559161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
560161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add template parameters.
561161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
562161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = TParams.getElement(i);
563161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.isTemplateTypeParameter())
564161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
565161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateTypeParameter(Element)));
566161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else if (Element.isTemplateValueParameter())
567161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
568161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                        DITemplateValueParameter(Element)));
569161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
570161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
571746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky
572161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addToContextOwner - Add Die into the list of its context owner's children.
573161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
574161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Context.isType()) {
575161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
576161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
577161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (Context.isNameSpace()) {
578161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
579161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
580161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (Context.isSubprogram()) {
581dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
582161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
583161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else if (DIE *ContextDIE = getDIE(Context))
584161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    ContextDIE->addChild(Die);
585161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else
586161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(Die);
587161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
588161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
589161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
590161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// given DIType.
59194c7ddb6f52a5200983fed0ce74dc602a7737879Devang PatelDIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
59294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  DIType Ty(TyNode);
59394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  if (!Ty.Verify())
59494c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel    return NULL;
595161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *TyDIE = getDIE(Ty);
596161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (TyDIE)
597161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return TyDIE;
598161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
599161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Create new type.
600161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  TyDIE = new DIE(dwarf::DW_TAG_base_type);
601161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIE(Ty, TyDIE);
602161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Ty.isBasicType())
603161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIBasicType(Ty));
604161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (Ty.isCompositeType())
605161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DICompositeType(Ty));
606161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else {
607161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    assert(Ty.isDerivedType() && "Unknown kind of DIType");
608161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
609161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
6101b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // If this is a named finished type then include it in the list of types
6111b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher  // for the accelerator tables.
612c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
613c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    bool IsImplementation = 0;
614c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    if (Ty.isCompositeType()) {
615c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      DICompositeType CT(Ty);
616e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // A runtime language of 0 actually means C/C++ and that any
617e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher      // non-negative value is some version of Objective-C/C++.
618c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher      IsImplementation = (CT.getRunTimeLang() == 0) ||
619e2dc9336d15ad3ca4f38d296d17f6682829b80b4Eric Christopher        CT.isObjcClassComplete();
620c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher    }
621e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    unsigned Flags = IsImplementation ?
622e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher                     DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
623e016789b7380b2a452f81ce15c2e382e62ede120Eric Christopher    addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
624c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher  }
6251b3f9198ab3880be34b6252423b9e388b5cd6a5eEric Christopher
626161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addToContextOwner(TyDIE, Ty.getContext());
627161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return TyDIE;
628161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
629161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
630161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// addType - Add a new type attribute to the specified entity.
631663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christophervoid CompileUnit::addType(DIE *Entity, DIType Ty,
632663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher			  unsigned Attribute) {
633161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Ty.Verify())
634161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
635161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
636161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Check for pre-existence.
637161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEEntry *Entry = getDIEEntry(Ty);
638161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // If it exists then use the existing value.
639161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Entry) {
640663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher    Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
641161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
642161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
643161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
644161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Construct type.
645161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Buffer = getOrCreateTypeDIE(Ty);
646161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
647161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Set up proxy.
648161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Entry = createDIEEntry(Buffer);
649161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  insertDIEEntry(Ty, Entry);
650663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher  Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
651e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel
652e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // If this is a complete composite type then include it in the
653e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  // list of global types.
654c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel  addGlobalType(Ty);
65566658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel}
65666658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel
65766658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel/// addGlobalType - Add a new global type to the compile unit.
65866658e4dff51664a53c56dd729b8abe4d57aadefDevang Patel///
659c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patelvoid CompileUnit::addGlobalType(DIType Ty) {
660e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  DIDescriptor Context = Ty.getContext();
661e9ae06ca987b6c3b6cfbcd50ab85386565a4e0caDevang Patel  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
66294c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel      && (!Context || Context.isCompileUnit() || Context.isFile()
66394c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel          || Context.isNameSpace()))
664c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    if (DIEEntry *Entry = getDIEEntry(Ty))
665c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel      GlobalTypes[Ty.getName()] = Entry->getEntry();
666161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
667161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
66831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// addPubTypes - Add type for pubtypes section.
66931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patelvoid CompileUnit::addPubTypes(DISubprogram SP) {
67031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DICompositeType SPTy = SP.getType();
67131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  unsigned SPTag = SPTy.getTag();
67231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (SPTag != dwarf::DW_TAG_subroutine_type)
67331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return;
67431c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
67531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIArray Args = SPTy.getTypeArray();
67631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
67731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    DIType ATy(Args.getElement(i));
67831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    if (!ATy.Verify())
67931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel      continue;
680c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel    addGlobalType(ATy);
68131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  }
68231c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
68331c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
684161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct basic type die from DIBasicType.
685161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
686161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
687161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = BTy.getName();
688161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
689161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
690390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
691734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
692734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
693734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    Buffer.setTag(dwarf::DW_TAG_unspecified_type);
694734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    // Unspecified types has only name, nothing else.
695734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel    return;
696734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  }
697734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
698734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel  Buffer.setTag(dwarf::DW_TAG_base_type);
699746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
70030d409ca097e35c51964c9dac642804e5e495906Devang Patel          BTy.getEncoding());
701734a67cda5a02be1654a2f89b811d7b6cbe3f5e5Devang Patel
702161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = BTy.getSizeInBits() >> 3;
703161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
704161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
705161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
706161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct derived type die from DIDerivedType.
707161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
708161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
709161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DTy.getName();
710161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DTy.getSizeInBits() >> 3;
711161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = DTy.getTag();
712161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
713161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // FIXME - Workaround for templates.
714161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
715161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
716161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
717161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
718161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Map to main type, void will not have a type.
719161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIType FromTy = DTy.getTypeDerivedFrom();
720161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, FromTy);
721161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
722161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
723161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
724390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
725161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
726161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add size if non-zero (derived types might be zero-sized.)
72735f225aa2c04ca2420161cca812cb3eb611bde51Eric Christopher  if (Size && Tag != dwarf::DW_TAG_pointer_type)
728161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
729161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
730161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add source line info if available and TyDesc is not a forward declaration.
731161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!DTy.isForwardDecl())
732161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addSourceLine(&Buffer, DTy);
733161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
734161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
735161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructTypeDIE - Construct type DIE from DICompositeType.
736161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
737161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get core information.
738161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = CTy.getName();
739161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
740161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = CTy.getSizeInBits() >> 3;
741161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  unsigned Tag = CTy.getTag();
742161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(Tag);
743161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
744161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  switch (Tag) {
745161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_vector_type:
746161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_array_type:
747161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    constructArrayTypeDIE(Buffer, &CTy);
748161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
749161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_enumeration_type: {
750161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
751161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
752161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add enumerators to enumeration type.
753161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
754161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
755161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Enum(Elements.getElement(i));
756161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Enum.isEnumerator()) {
757161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
758161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(ElemDie);
759161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
760161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
761161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
762161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
763161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_subroutine_type: {
764161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add return type.
765161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
766161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor RTy = Elements.getElement(0);
767161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addType(&Buffer, DIType(RTy));
768161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
769161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    bool isPrototyped = true;
770161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add arguments.
771161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
772161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Ty = Elements.getElement(i);
773161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Ty.isUnspecifiedParameter()) {
774161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
775161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
776161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        isPrototyped = false;
777161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      } else {
778161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
779161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(Arg, DIType(Ty));
780161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        Buffer.addChild(Arg);
781161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
782161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
7838b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // Add prototype flag if we're dealing with a C language and the
7848b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    // function has been prototyped.
7858b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher    if (isPrototyped &&
7868b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher	(Language == dwarf::DW_LANG_C89 ||
7878b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher	 Language == dwarf::DW_LANG_C99 ||
7888b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher	 Language == dwarf::DW_LANG_ObjC))
789161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
790161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
791161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
792161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_structure_type:
793161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_union_type:
794161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  case dwarf::DW_TAG_class_type: {
795161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
796161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIArray Elements = CTy.getTypeArray();
797161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
798161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // A forward struct declared type may not have elements available.
799161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    unsigned N = Elements.getNumElements();
800161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (N == 0)
801161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      break;
802161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
803161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add elements to structure type.
804161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    for (unsigned i = 0; i < N; ++i) {
805161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Element = Elements.getElement(i);
806161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIE *ElemDie = NULL;
807161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (Element.isSubprogram()) {
808161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DISubprogram SP(Element);
809dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
810161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isProtected())
81113aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
812161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_protected);
813161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else if (SP.isPrivate())
81413aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
815161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  dwarf::DW_ACCESS_private);
816161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        else
81713aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
818161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
819161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        if (SP.isExplicit())
820161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel          addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
821161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      }
822161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      else if (Element.isVariable()) {
823161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        DIVariable DV(Element);
824161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        ElemDie = new DIE(dwarf::DW_TAG_variable);
825390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky        addString(ElemDie, dwarf::DW_AT_name, DV.getName());
826161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addType(ElemDie, DV.getType());
827161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
828161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
829161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addSourceLine(ElemDie, DV);
830663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isDerivedType()) {
831663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher	DIDerivedType DDTy(Element);
832663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher	if (DDTy.getTag() == dwarf::DW_TAG_friend) {
833663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher	  ElemDie = new DIE(dwarf::DW_TAG_friend);
834663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher	  addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
835663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher	} else
836663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher	  ElemDie = createMemberDIE(DIDerivedType(Element));
837663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher      } else if (Element.isObjCProperty()) {
83830d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIObjCProperty Property(Element);
83930d409ca097e35c51964c9dac642804e5e495906Devang Patel        ElemDie = new DIE(Property.getTag());
84030d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef PropertyName = Property.getObjCPropertyName();
84130d409ca097e35c51964c9dac642804e5e495906Devang Patel        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
84230d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef GetterName = Property.getObjCPropertyGetterName();
84330d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!GetterName.empty())
84430d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
84530d409ca097e35c51964c9dac642804e5e495906Devang Patel        StringRef SetterName = Property.getObjCPropertySetterName();
84630d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!SetterName.empty())
84730d409ca097e35c51964c9dac642804e5e495906Devang Patel          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
84830d409ca097e35c51964c9dac642804e5e495906Devang Patel        unsigned PropertyAttributes = 0;
8499e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadOnlyObjCProperty())
8509e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
8519e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isReadWriteObjCProperty())
8529e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
8539e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isAssignObjCProperty())
8549e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
8559e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isRetainObjCProperty())
8569e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
8579e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isCopyObjCProperty())
8589e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
8599e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (Property.isNonAtomicObjCProperty())
8609e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
8619e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel        if (PropertyAttributes)
8629e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
8639e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel                 PropertyAttributes);
8646588abf377b7381274236e651462ec83052f6013Devang Patel
86530d409ca097e35c51964c9dac642804e5e495906Devang Patel        DIEEntry *Entry = getDIEEntry(Element);
86630d409ca097e35c51964c9dac642804e5e495906Devang Patel        if (!Entry) {
86730d409ca097e35c51964c9dac642804e5e495906Devang Patel          Entry = createDIEEntry(ElemDie);
86830d409ca097e35c51964c9dac642804e5e495906Devang Patel          insertDIEEntry(Element, Entry);
86930d409ca097e35c51964c9dac642804e5e495906Devang Patel        }
8709e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel      } else
871161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        continue;
872161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Buffer.addChild(ElemDie);
873161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
874161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
875161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (CTy.isAppleBlockExtension())
876161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
877161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
878161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DICompositeType ContainingType = CTy.getContainingType();
879161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (DIDescriptor(ContainingType).isCompositeType())
880161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
881161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                  getOrCreateTypeDIE(DIType(ContainingType)));
882161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
883161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      DIDescriptor Context = CTy.getContext();
884161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addToContextOwner(&Buffer, Context);
885161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
886161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
887201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel    if (CTy.isObjcClassComplete())
888201e6cdc39d5dca4e70cdd331f6f5055b3af3534Devang Patel      addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
889b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel              dwarf::DW_FORM_flag, 1);
890b11f80e94b590c90d07254dfa2406cf504e09cd3Devang Patel
8911a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // Add template parameters to a class, structure or union types.
8921a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    // FIXME: The support isn't in the metadata for this yet.
8931a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher    if (Tag == dwarf::DW_TAG_class_type ||
8941a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_structure_type ||
8951a8e8869cafa16d94afcb6f73bc3e0f2f72f70f1Eric Christopher        Tag == dwarf::DW_TAG_union_type)
896161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addTemplateParams(Buffer, CTy.getTemplateParams());
897161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
898161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
899161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
900161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  default:
901161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    break;
902161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
903161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
904161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add name if not anonymous or intermediate type.
905161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
906390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(&Buffer, dwarf::DW_AT_name, Name);
907161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
908161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
909161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
910746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky  {
911161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add size if non-zero (derived types might be zero-sized.)
912161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Size)
913161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
914161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    else {
915161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      // Add zero size if it is not a forward declaration.
916161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      if (CTy.isForwardDecl())
917161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
918161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      else
919161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel        addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
920161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    }
921161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
922161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Add source line info if available.
923161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (!CTy.isForwardDecl())
924161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      addSourceLine(&Buffer, CTy);
9258938895a8338e6084eb12a2bb4bf044928436173Eric Christopher
9268938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    // No harm in adding the runtime language to the declaration.
9278938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    unsigned RLang = CTy.getRunTimeLang();
9288938895a8338e6084eb12a2bb4bf044928436173Eric Christopher    if (RLang)
9298938895a8338e6084eb12a2bb4bf044928436173Eric Christopher      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
9308938895a8338e6084eb12a2bb4bf044928436173Eric Christopher              dwarf::DW_FORM_data1, RLang);
931161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
932161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
933161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
934161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
935161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateTypeParameter.
936161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
937161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
938161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TP);
939161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
940161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
941161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
942161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
943161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TP.getType());
944390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
945161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
946161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
947161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
948161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
949161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// for the given DITemplateValueParameter.
950161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *
951161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelCompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
952161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *ParamDIE = getDIE(TPV);
953161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (ParamDIE)
954161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return ParamDIE;
955161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
956161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
957161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(ParamDIE, TPV.getType());
958161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!TPV.getName().empty())
959390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
960161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
961161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel          TPV.getValue());
962161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return ParamDIE;
963161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
964161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
96531c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel/// getOrCreateNameSpace - Create a DIE for DINameSpace.
96631c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang PatelDIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
96731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  DIE *NDie = getDIE(NS);
96831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  if (NDie)
96931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel    return NDie;
97031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  NDie = new DIE(dwarf::DW_TAG_namespace);
97131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  insertDIE(NS, NDie);
97209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  if (!NS.getName().empty()) {
973390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(NDie, dwarf::DW_AT_name, NS.getName());
97409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace(NS.getName(), NDie);
97509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  } else
97609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addAccelNamespace("(anonymous namespace)", NDie);
97731c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addSourceLine(NDie, NS);
97831c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  addToContextOwner(NDie, NS.getContext());
97931c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel  return NDie;
98031c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel}
98131c5d05a26b5b9eec88558d34e9c20d12e0d53d7Devang Patel
982dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
983dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// printer to not emit usual symbol prefix before the symbol name is used then
984dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// return linkage name after skipping this special LLVM prefix.
985dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelstatic StringRef getRealLinkageName(StringRef LinkageName) {
986dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  char One = '\1';
987dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (LinkageName.startswith(StringRef(&One, 1)))
988dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return LinkageName.substr(1);
989dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return LinkageName;
990dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
991dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
992dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// getOrCreateSubprogramDIE - Create new DIE using SP.
993dbc64af76d769596903485668a1dfc2d6640c4fbDevang PatelDIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
994dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIE *SPDie = getDIE(SP);
995dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SPDie)
996dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
997dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
99801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DISubprogram SPDecl = SP.getFunctionDeclaration();
99901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  DIE *DeclDie = NULL;
100001b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (SPDecl.isSubprogram()) {
100101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    DeclDie = getOrCreateSubprogramDIE(SPDecl);
100201b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
100301b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1004dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  SPDie = new DIE(dwarf::DW_TAG_subprogram);
1005dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1006dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // DW_TAG_inlined_subroutine may refer to this DIE.
1007dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  insertDIE(SP, SPDie);
1008dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1009dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add to context owner.
1010dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addToContextOwner(SPDie, SP.getContext());
1011dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1012dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add function template parameters.
1013dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addTemplateParams(*SPDie, SP.getTemplateParams());
1014dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
10158d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  // Unfortunately this code needs to stay here to work around
10168d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  // a bug in older gdbs that requires the linkage name to resolve
10178d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  // multiple template functions.
10188d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  StringRef LinkageName = SP.getLinkageName();
10198d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher  if (!LinkageName.empty())
10208d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
10218d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher              getRealLinkageName(LinkageName));
10228d101c31d293bcb8ece8fecdb3325cd0728bed08Eric Christopher
1023dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // If this DIE is going to refer declaration info using AT_specification
1024dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // then there is no need to add other attributes.
102501b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  if (DeclDie) {
102601b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    // Refer function declaration directly.
102701b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
102801b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola                DeclDie);
102901b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola
1030dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    return SPDie;
103101b55b4a808d04cbff7b62f55eaeb62019340bc0Rafael Espindola  }
1032dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1033dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Constructors and operators for anonymous aggregates do not have names.
1034dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.getName().empty())
1035390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(SPDie, dwarf::DW_AT_name, SP.getName());
1036dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1037dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  addSourceLine(SPDie, SP);
1038dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
10398b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // Add the prototype if we have a prototype and we have a C like
10408b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  // language.
10418b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher  if (SP.isPrototyped() &&
10428b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher      (Language == dwarf::DW_LANG_C89 ||
10438b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_C99 ||
10448b6fe6b651064da51bb9bc63ece8bf1f2a36d66aEric Christopher       Language == dwarf::DW_LANG_ObjC))
1045dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1046dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1047dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  // Add Return Type.
1048dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DICompositeType SPTy = SP.getType();
1049dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  DIArray Args = SPTy.getTypeArray();
1050dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned SPTag = SPTy.getTag();
1051dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1052dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1053dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addType(SPDie, SPTy);
1054dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  else
1055dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addType(SPDie, DIType(Args.getElement(0)));
1056dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1057dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  unsigned VK = SP.getVirtuality();
1058dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (VK) {
1059798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1060dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIEBlock *Block = getDIEBlock();
1061dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1062dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1063dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1064dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    ContainingTypeMap.insert(std::make_pair(SPDie,
1065dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel                                            SP.getContainingType()));
1066dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1067dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1068dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isDefinition()) {
1069dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1070dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1071dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // Add arguments. Do not add arguments for subprogram definition. They will
1072dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    // be handled while processing variables.
1073dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DICompositeType SPTy = SP.getType();
1074dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIArray Args = SPTy.getTypeArray();
1075dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    unsigned SPTag = SPTy.getTag();
1076dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1077dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (SPTag == dwarf::DW_TAG_subroutine_type)
1078dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1079dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1080dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        DIType ATy = DIType(DIType(Args.getElement(i)));
1081dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        addType(Arg, ATy);
1082dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        if (ATy.isArtificial())
1083dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel          addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1084dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel        SPDie->addChild(Arg);
1085dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel      }
1086dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1087dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1088dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isArtificial())
1089dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1090dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1091dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (!SP.isLocalToUnit())
1092dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1093dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1094dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (SP.isOptimized())
1095dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1096dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1097dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  if (unsigned isa = Asm->getISAEncoding()) {
1098dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1099dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1100dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1101dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  return SPDie;
1102dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1103dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
11046f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// Return const expression if value is a GEP to access merged global
11056f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// constant. e.g.
11066f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
11076f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelstatic const ConstantExpr *getMergedGlobalExpr(const Value *V) {
11086f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
11096f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CE || CE->getNumOperands() != 3 ||
11106f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      CE->getOpcode() != Instruction::GetElementPtr)
11116f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11126f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11136f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // First operand points to a global struct.
11146f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  Value *Ptr = CE->getOperand(0);
11156f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<GlobalValue>(Ptr) ||
11166f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
11176f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11186f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11196f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Second operand is zero.
11206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
11216f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!CI || !CI->isZero())
11226f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11236f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11246f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Third operand is offset.
11256f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!isa<ConstantInt>(CE->getOperand(2)))
11266f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return NULL;
11276f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11286f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return CE;
11296f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
11306f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11316f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel/// createGlobalVariableDIE - create global variable DIE.
11326f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patelvoid CompileUnit::createGlobalVariableDIE(const MDNode *N) {
11336f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Check for pre-existence.
113449e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  if (getDIE(N))
11356f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    return;
11366f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
113749e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIGlobalVariable GV(N);
113828bea08e531452992ff1e25e8584883dfbd4c232Devang Patel  if (!GV.Verify())
113928bea08e531452992ff1e25e8584883dfbd4c232Devang Patel    return;
114028bea08e531452992ff1e25e8584883dfbd4c232Devang Patel
11416f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  DIE *VariableDIE = new DIE(GV.getTag());
114249e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  // Add to map.
114349e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  insertDIE(N, VariableDIE);
11446f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11456f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add name.
1146390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
11476f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  StringRef LinkageName = GV.getLinkageName();
114849e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  bool isGlobalVariable = GV.getGlobal() != NULL;
11496f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (!LinkageName.empty() && isGlobalVariable)
1150746cb670c3cd4f79b288d56d8e9f195685a5381aNick Lewycky    addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1151390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky              getRealLinkageName(LinkageName));
11526f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add type.
115349e2f03849064d9dc26db3865ae419f17daadca6Devang Patel  DIType GTy = GV.getType();
11546f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addType(VariableDIE, GTy);
11556f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
11566f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add scoping info.
1157dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher  if (!GV.isLocalToUnit())
11586f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1159dfa30e1ab243990eda4732a6dffb91e965e7a755Eric Christopher
11606f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add line number info.
11616f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addSourceLine(VariableDIE, GV);
11626f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add to context owner.
11636f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  DIDescriptor GVContext = GV.getContext();
11646f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  addToContextOwner(VariableDIE, GVContext);
11656f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  // Add location.
116609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher  bool addToAccelTable = false;
1167d61c34ba30888c49f4f223422f30b018a41594daEric Christopher  DIE *VariableSpecDIE = NULL;
11686f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  if (isGlobalVariable) {
116909ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
11706f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
11716f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
11726f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addLabel(Block, 0, dwarf::DW_FORM_udata,
11736f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel             Asm->Mang->getSymbol(GV.getGlobal()));
11746f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // Do not create specification DIE if context is either compile unit
11756f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // or a subprogram.
11761dd4e56d5565d59e9d40ad9e088a05e06f4b70f8Devang Patel    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
11776f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
11786f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      // Create specification DIE.
1179d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
11806f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
11816f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                  dwarf::DW_FORM_ref4, VariableDIE);
11826f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
11836f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
11846f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                     1);
11856f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addDie(VariableSpecDIE);
11866f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    } else {
11876f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
118809ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    }
11896f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  } else if (const ConstantInt *CI =
11906f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel             dyn_cast_or_null<ConstantInt>(GV.getConstant()))
11916f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
11926f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
119309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher    addToAccelTable = true;
11946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    // GV is a merged global.
11956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
11966f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    Value *Ptr = CE->getOperand(0);
11976f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
11986f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addLabel(Block, 0, dwarf::DW_FORM_udata,
11996f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                    Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
12006f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
12016f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
12026f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_udata,
12036f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel                   Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
12046f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
12056f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
12066f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  }
12076f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1208d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  if (addToAccelTable) {
1209d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1210d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    addAccelName(GV.getName(), AddrDIE);
121109ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher
1212d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // If the linkage name is different than the name, go ahead and output
1213d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    // that as well into the name table.
1214d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1215d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher      addAccelName(GV.getLinkageName(), AddrDIE);
1216d117fbb2311f6b05770ee680135eaac4eb6d16d1Eric Christopher  }
121774d8a87f40dd89ec263071c0af4d77104b166f4aEric Christopher
12186f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel  return;
12196f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel}
12206f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel
1221161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1222161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1223161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1224161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1225ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel  uint64_t L = SR.getLo();
1226ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel  uint64_t H = SR.getHi();
1227161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1228161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // The L value defines the lower bounds which is typically zero for C/C++. The
1229161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
1230161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // of the array. If L > H then do not emit DW_AT_lower_bound and
1231161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1232161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // array has one element and in such case do not emit lower bound.
1233161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1234161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (L > H) {
1235161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Buffer.addChild(DW_Subrange);
1236161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    return;
1237161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1238161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (L)
1239ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1240ce35d8b5a1071bb8ccf70bf8be3952dd0c4f2f15Devang Patel  addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1241161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.addChild(DW_Subrange);
1242161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1243161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1244161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1245161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patelvoid CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1246161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel                                        DICompositeType *CTy) {
1247161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  Buffer.setTag(dwarf::DW_TAG_array_type);
1248161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1249161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1250161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1251161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Emit derived type.
1252161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(&Buffer, CTy->getTypeDerivedFrom());
1253161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIArray Elements = CTy->getTypeArray();
1254161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1255161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Get an anonymous type for index type.
1256161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *IdxTy = getIndexTyDie();
1257161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!IdxTy) {
1258161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Construct an anonymous type for index type.
1259161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    IdxTy = new DIE(dwarf::DW_TAG_base_type);
1260161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1261161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1262161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ATE_signed);
1263161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addDie(IdxTy);
1264161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    setIndexTyDie(IdxTy);
1265161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1266161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1267161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Add subranges to array type.
1268161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1269161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIDescriptor Element = Elements.getElement(i);
1270161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1271161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1272161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  }
1273161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1274161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1275161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1276161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1277161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1278161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = ETy.getName();
1279390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky  addString(Enumerator, dwarf::DW_AT_name, Name);
1280161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  int64_t Value = ETy.getEnumValue();
1281161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1282161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return Enumerator;
1283161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1284161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1285dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// constructContainingTypeDIEs - Construct DIEs for types that contain
1286dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel/// vtables.
1287dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patelvoid CompileUnit::constructContainingTypeDIEs() {
1288dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1289dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1290dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *SPDie = CI->first;
1291dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    const MDNode *N = CI->second;
1292dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!N) continue;
1293dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    DIE *NDie = getDIE(N);
1294dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    if (!NDie) continue;
1295dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1296dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel  }
1297dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel}
1298dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel
1299d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1300d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang PatelDIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1301d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  StringRef Name = DV->getName();
1302d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Name.empty())
1303d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return NULL;
1304d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1305d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Translate tag to proper Dwarf tag.
1306d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Tag = DV->getTag();
1307d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1308d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Define variable debug information entry.
1309d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *VariableDie = new DIE(Tag);
1310d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DbgVariable *AbsVar = DV->getAbstractVariable();
1311d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1312d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (AbsDIE)
1313d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1314d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                            dwarf::DW_FORM_ref4, AbsDIE);
1315d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  else {
1316390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(VariableDie, dwarf::DW_AT_name, Name);
1317d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addSourceLine(VariableDie, DV->getVariable());
1318d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addType(VariableDie, DV->getType());
1319d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1320d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1321d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (DV->isArtificial())
1322d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addUInt(VariableDie, dwarf::DW_AT_artificial,
1323d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                        dwarf::DW_FORM_flag, 1);
1324d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1325d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (isScopeAbstract) {
1326d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1327d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1328d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1329d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1330d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  // Add variable address.
1331d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1332d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  unsigned Offset = DV->getDotDebugLocOffset();
1333d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (Offset != ~0U) {
1334d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    addLabel(VariableDie, dwarf::DW_AT_location,
1335d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         dwarf::DW_FORM_data4,
1336d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                         Asm->GetTempSymbol("debug_loc", Offset));
1337d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1338d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1339d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1340d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
13418cf5e74a9cc7482901125b810f1e482d24e9404dEric Christopher  // Check if variable is described by a DBG_VALUE instruction.
1342d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  if (const MachineInstr *DVInsn = DV->getMInsn()) {
1343d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    bool updated = false;
1344d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (DVInsn->getNumOperands() == 3) {
1345d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      if (DVInsn->getOperand(0).isReg()) {
1346d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        const MachineOperand RegOp = DVInsn->getOperand(0);
1347d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1348d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        if (DVInsn->getOperand(1).isImm() &&
1349d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel            TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1350d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          unsigned FrameReg = 0;
1351d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1352d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          int Offset =
1353d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel            TFI->getFrameIndexReference(*Asm->MF,
1354d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                        DVInsn->getOperand(1).getImm(),
1355d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                        FrameReg);
1356d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          MachineLocation Location(FrameReg, Offset);
1357d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addVariableAddress(DV, VariableDie, Location);
1358d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1359d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        } else if (RegOp.getReg())
1360d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addVariableAddress(DV, VariableDie,
1361d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                         MachineLocation(RegOp.getReg()));
1362d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated = true;
1363d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      }
1364d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isImm())
1365d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1366d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantValue(VariableDie, DVInsn->getOperand(0),
1367d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DV->getType());
1368d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isFPImm())
1369d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1370d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1371d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      else if (DVInsn->getOperand(0).isCImm())
1372d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        updated =
1373d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel          addConstantValue(VariableDie,
1374d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DVInsn->getOperand(0).getCImm(),
1375d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                       DV->getType().isUnsignedDIType());
1376d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    } else {
1377d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      addVariableAddress(DV, VariableDie,
1378d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel                                     Asm->getDebugValueLocation(DVInsn));
1379d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      updated = true;
1380d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1381d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (!updated) {
1382d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // If variableDie is not updated then DBG_VALUE instruction does not
1383d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      // have valid variable info.
1384d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      delete VariableDie;
1385d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      return NULL;
1386d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1387d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    DV->setDIE(VariableDie);
1388d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    return VariableDie;
1389d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  } else {
1390d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    // .. else use frame index.
1391d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    int FI = DV->getFrameIndex();
1392d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    if (FI != ~0) {
1393d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      unsigned FrameReg = 0;
1394d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1395d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      int Offset =
1396d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1397d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      MachineLocation Location(FrameReg, Offset);
1398d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel      addVariableAddress(DV, VariableDie, Location);
1399d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel    }
1400d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  }
1401d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1402d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  DV->setDIE(VariableDie);
1403d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel  return VariableDie;
1404d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel}
1405d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel
1406161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel/// createMemberDIE - Create new member DIE.
1407161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang PatelDIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1408161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIE *MemberDie = new DIE(DT.getTag());
1409161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  StringRef Name = DT.getName();
1410161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (!Name.empty())
1411390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_name, Name);
1412161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1413161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addType(MemberDie, DT.getTypeDerivedFrom());
1414161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1415161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addSourceLine(MemberDie, DT);
1416161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1417161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1418161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1419161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1420161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t Size = DT.getSizeInBits();
1421161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  uint64_t FieldSize = DT.getOriginalTypeSize();
1422161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1423161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (Size != FieldSize) {
1424161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Handle bitfield.
1425161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1426161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1427161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1428161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t Offset = DT.getOffsetInBits();
1429161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1430161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1431161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    uint64_t FieldOffset = (HiMark - FieldSize);
1432161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    Offset -= FieldOffset;
1433161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1434161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Maybe we need to work from the other end.
1435161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    if (Asm->getTargetData().isLittleEndian())
1436161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      Offset = FieldSize - (Offset + Size);
1437161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1438161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1439161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // Here WD_AT_data_member_location points to the anonymous
1440161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // field that includes this bit field.
1441161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1442161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1443161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1444161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // This is not a bitfield.
1445161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1446161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1447161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.getTag() == dwarf::DW_TAG_inheritance
1448161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel      && DT.isVirtual()) {
1449161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1450161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // For C++, virtual base classes are not at fixed offset. Use following
1451161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // expression to extract appropriate offset from vtable.
1452161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1453161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1454161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1455161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1456161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1457161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1458161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1459161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1460161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1461161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1462161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1463161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1464161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel             VBaseLocationDie);
1465161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  } else
1466161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1467161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel
1468161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isProtected())
146913aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1470161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_protected);
1471161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  else if (DT.isPrivate())
147213aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1473161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_private);
1474161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  // Otherwise C++ member and base classes are considered public.
147594c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel  else
147613aaca5edf538f967c16b8bdbfe293e2f9d75fc1Nick Lewycky    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1477161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_ACCESS_public);
1478161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  if (DT.isVirtual())
1479798313d6c1f48634f0964d82c6b31364058a280fNick Lewycky    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1480161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel            dwarf::DW_VIRTUALITY_virtual);
1481e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel
1482e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  // Objective-C properties.
14836588abf377b7381274236e651462ec83052f6013Devang Patel  if (MDNode *PNode = DT.getObjCProperty())
14846588abf377b7381274236e651462ec83052f6013Devang Patel    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
14856588abf377b7381274236e651462ec83052f6013Devang Patel      MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
14866588abf377b7381274236e651462ec83052f6013Devang Patel                          PropertyDie);
14876588abf377b7381274236e651462ec83052f6013Devang Patel
14889e11eb1ddb2988d0a751fdcfe433bc816c83f1f2Devang Patel  // This is only for backward compatibility.
1489e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  StringRef PropertyName = DT.getObjCPropertyName();
1490e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  if (!PropertyName.empty()) {
1491390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1492e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    StringRef GetterName = DT.getObjCPropertyGetterName();
1493e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (!GetterName.empty())
1494390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1495e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    StringRef SetterName = DT.getObjCPropertySetterName();
1496e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (!SetterName.empty())
1497390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1498e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    unsigned PropertyAttributes = 0;
1499e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isReadOnlyObjCProperty())
1500e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1501e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isReadWriteObjCProperty())
1502e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1503e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isAssignObjCProperty())
1504e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1505e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isRetainObjCProperty())
1506e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1507e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isCopyObjCProperty())
1508e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1509e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (DT.isNonAtomicObjCProperty())
1510e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1511e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel    if (PropertyAttributes)
1512e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1513e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel              PropertyAttributes);
1514e9db5e29e3af91eec572bfeb8dcec908213298b0Devang Patel  }
1515161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel  return MemberDie;
1516161b2f45c2413a9aa3bb3003d043f58c21dfd319Devang Patel}
1517